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、プログラミングのランキングサイトはこちらです。
最新記事の自動受信登録はこちらです。 |
![]() |
![]() |
![]() |
![]() |
| 固定リンク







コメント