« REDEFINES | トップページ | CSVファイルの保存(書き込み) »

2007年5月26日 (土)

COPY文

 COPY文を使うとレコード定義などを他のソースプログラムと共有する事で保守性を高めることができます。以下の例は2種類のレコードレイアウトを持つテキストファイルを読込んで項目を画面表示します。
ファイル内容(実行するには以下の6行をC:\TEST.TXTに書き込みます。)
R1=aaaaaaaaaA0005
R2=108-8558日本電気 株式会社           東京都 港区 芝浦 4丁目14-22大東田町ビル
R1=bbbbbbbbbB0005
R2=105-8001株式会社 東芝             東京都 港区 芝浦 1丁目1-1
R2=141-8514日本アイ・ビー・エム 株式会社     東京都 品川区 西五反田 8丁目1-5 
R1=cccccccccC0005

COBOL

親プログラムのソース
000011 ENVIRONMENT             DIVISION    .
000012 CONFIGURATION           SECTION     .
000013 INPUT-OUTPUT            SECTION.
000014 FILE-CONTROL.
000016     SELECT  TF
000017         ASSIGN                   "C:\TEST.TXT"
000019         ORGANIZATION    LINE SEQUENTIAL
000020     .
000093 DATA                    DIVISION.
000094 FILE                    SECTION.
000095*****************************************************************
000096 FD  TF      .
000097*****************************************************************
000098 01  TF-R        .
000100     03  RKEY            PIC  X(003).
000101     03  ITEMS           PIC  X(600).
       01  R1 REDEFINES TF-R.
       COPY "R1.CPY".
       01 R2 REDEFINES TF-R.
       COPY "R2.CPY".
       WORKING-STORAGE SECTION.
       01 I PIC 99.
       PROCEDURE DIVISION.
           OPEN INPUT TF.
           PERFORM UNTIL TF-R = HIGH-VALUE
             READ TF
               AT END
                   MOVE HIGH-VALUE TO TF-R
               NOT AT END
                 EVALUATE TRUE
                   WHEN RKEY OF TF-R = "R1="
                    DISPLAY "レコードレイアウトR1"
                    DISPLAY 品名
                    DISPLAY 数量
                   WHEN RKEY OF TF-R = "R2="
                    DISPLAY "レコードレイアウトR2"
                    DISPLAY 郵便番号
                    DISPLAY 会社名
                    DISPLAY 住所
                 END-EVALUATE
                 DISPLAY " "
           END-PERFORM.
           CLOSE TF.
           STOP RUN.

R1.CPYの内容
           03 RKEY             PIC  X(003).
           03 品名             PIC  X(010).
           03 数量             PIC  9(005).

R2.CPYの内容
           03 RKEY             PIC  X(003).
           03 郵便番号         PIC  X(008).
           03 会社名           PIC  N(020).
           03 住所             PIC  N(040).

VB.NET
 VB.NETにはCOPY文に該当する機能は有りません。Moduleを使ってCOBOL的にマネて見ましょう。
 Structureで定義したレコード部分を抜き出してModule2.vbに移動します。Module1からModule2を参照する形になり、Module2は他の親ソースプログラムからも同様に参照することがでるのでCOPY文と同じように保守性を高めた使い方が実現します。

親プログラム
Module Module1
    Sub Main()
        Dim sf As New System.IO.StreamReader("c:\test.txt", _
        System.Text.Encoding.GetEncoding(932))  'Shift JISを指定
        Dim i As Integer = 0
        Dim R1 As New R1
        Dim R2 As New R2

        Do Until sf.EndOfStream
            Dim sr As String
            sr = sf.ReadLine()
            i += 1
            R1.Redefines(sr)
            R2.Redefines(sr)
            Select Case Mid(sr, 1, 3)
                Case "R1="
                    Console.WriteLine(i.ToString + "レコードフォーマット R1")
                    Console.WriteLine(R1.品名)
                    Console.WriteLine(R1.数量)
                Case "R2="
                    Console.WriteLine(i.ToString + "レコードフォーマット R2")
                    Console.WriteLine(R2.郵便番号)
                    Console.WriteLine(R2.会社名)
                    Console.WriteLine(R2.住所)
            End Select
            Console.WriteLine(ControlChars.CrLf)    '改行
        Loop
        sf.Close()
    End Sub
End Module

Module2をプロジェクトに追加します。
Module Module2
    'レコードフォーマットR1
    Public Structure R1
        Public RKEY As String
        Public 品名 As String
        Public 数量 As String
        Public Sub Redefines(ByVal R0 As String)
            RKEY = Mid(R0, 1, 3)
            品名 = Mid(R0, 4, 10)
            数量 = Mid(R0, 14, 5)
        End Sub
    End Structure
    'レコードフォーマットR2
    Public Structure R2
        Dim RKEY As String
        Dim 郵便番号 As String
        Dim 会社名 As String
        Dim 住所 As String
        Public Sub Redefines(ByVal R0 As String)
            RKEY = Mid(R0, 1, 3)
            郵便番号 = Mid(R0, 4, 8)
            会社名 = Mid(R0, 12, 20)
            住所 = Mid(R0, 32, 40)
        End Sub
    End Structure
End Module

お役に立てましたか?
IT、プログラミングのランキングサイトはこちらです。

にほんブログ村 IT技術ブログへ 人気blogランキングへ FC2 Blog Rankingへ


最新記事の自動受信登録はこちらです。

はてなRSSに追加

livedoor Readerに追加
My Yahoo!に追加
Googleに追加
goo RSSリーダーに追加

|

« REDEFINES | トップページ | CSVファイルの保存(書き込み) »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/279803/6059566

この記事へのトラックバック一覧です: COPY文:

« REDEFINES | トップページ | CSVファイルの保存(書き込み) »