D行說明
首行填“D”,然後按F4,會出現如下內容:
Declaration To /
Name E S/U Type From Length
Internal Decimal
Data Type Positions Keywords
Comment
內容說明
Name:
定義的變數的名字,該名字可以不頂格寫。(即允許有縮進)
E:
標識定義的變數是否源自外部資料結構。可以不填,或填“E”
上面的解釋可能有點饒口,其實這個地方的意思,就是說:
如果是程式內部自行定義一個臨時變數,此處不填;
如果是引用的一個外部檔作為資料結構,那麼這裡就要填“E” ;同時“Declaration Type”處,就要填“DS”,即定義為一個結構;“Keywords”處要使用EXTNAME關鍵字
所謂“引用一個外部檔作為資料結構”,也就是說定義一個結構,整個結構中的變數,參照外部檔來定義。
所謂結構,可以理解為一個“由多個變數組合而成的大變數”。
舉例而言:
D MYDS E DS EXTNAME(PFFHS)
和
D MYDS DS
D FHS01 1 2(1在From項;2在To / length 項)
D FHS02 3 4
D FHS03 5 6
是等價的,都是定義一個結構變數MYDS(名字可以自行定義),這個結構變數是由三個字元型變數FHS01,FHS02,FHS03拼成的。
第一種定義方法,就是引用外部檔“PFFHS”作為資料結構的定義,注意使用到了“EXTNAME”關鍵字,而且“E”項的值為“E”。
而第二種定義方法,就是直接定義一個結構“MYDS”。注意沒有使用外部檔時,“E”項的值為空。
S/U:
不知道,一般都填空。
Declaration Type:
定義變數的類型,允許的值如下:
不填: 非以下內容:資料結構、常量、獨立變數、陣列、表。此項為空時,好象只能用來表示當前定義的變數是屬於結構的一個變數。在下麵會舉例
DS: 資料結構,即定義一個結構變數,這個之前已講過
C: 常量
常量只能使用字元,不需要定義常量的長度、類型。常量的內容寫在“Keywords”處,並使用CONST關鍵字,在程式段中,不能對常量進行賦值操作。
D MYNUM C CONST('abcdefghijklmn')
就是定義一個叫做MYNUM的常量,這個常量包含字母a--n。
PI: 不知道,沒有用過
PR: 不知道,沒用過
S: 定義以下內容:獨立變數、陣列、表
定義一個叫MYFIELD1的變數,變數為1位元長的字元型
D MYFIELD1 S 1 //1在“To/length”項
定義一個叫MYARRAY的陣列,共含3條記錄,每條記錄為1位元字元型
D MYARRAY S 1 DIM(3) //DIM在“Keywords”項
表的定義沒有用過
總之,這一項,最常用的,就是“DS”、“S”與空。即結構體與獨立變數,其它選項較少用到。
From:
當“Declaration Type”項為“S”時,表示獨立變數、陣列,此項不填
當“Declaration Type”項為“DS”時,表示結構,此項仍然不填
當“Declaration Type”項為空時,表示當前定義的變數,屬於上面定義的結構,此時,此項可以填寫,也可以不填寫。
當填寫時,“From”項表示變數在結構中的起始位置,右對齊;“To/length”表示變數在結構中的結束位置,也是右對齊。
當不填寫時,“To/length”表示直接定義為變數長度。
舉例:
D MYDS DS
D DSFLD01 1 2 //1在“From”項,2在“To/length”項
D DSFLD02 3 4
與
D MYDS DS
D DSFLD01 2 //2在“To/length”項
D DSFLD02 2
其實是等價的,都是定義一個結構變數MYDS,這個結構變數中,包含了兩個變數DSFLD01,DSFLD02,這兩個變數都是兩位元長字元。所不同的是,第一種定義方法,是指定了變數在結構中的位置;而第二種方法,是直接指定變數的長度和類型
注意到上面的定義中,DSFLD01、DSFLD02的Declaration Type為空,也就是表示這兩個欄位是屬於上面定義的結構MYDS。如果此項為“S”,即表示這個變數與結構無關
D MYDS DS
D DSFLD01 2 //2在“To/length”項
D DSFLD02 S 2
在這個定義中,變數DSFLD02就是一個獨立的變數,與結構MYDS無關。
Length:
上面已講述在定義結構時的使用方法。
在定義非結構時,此項的內容即為定義變數的長度。右對齊
Internal Data Type:
定義變數的類型,允許的值有:
空:變數定義為字元型、壓縮型數位
A: 變數定義為字元型
B: 二進位?不知道
D: 變數定義為日期型
F: 變數定義為浮點型?
G: 變數定義為圖型?(非英文?漢字?)
I: 變數定義為帶符號的整數
N: 變數定義為指示器變數?(沒用過)
P: 變數定義為壓縮型數位
S: 變數定義為普通的數型
T: 變數定義為時間型
U: 變數定義為無符號的整數
Z: 變數定義為日期+時間型(格式:年-月-日-時.分.秒.微秒)
*: 變數定義為指標型
其實我最常用,就是不填,因為一般的程式,有字元和數位這兩種類型變數,就足夠了。
Decimal Positions:
當變數定義為數字型時,用來標誌小數的位元數。
當“To/Length”項為3,“Internal Data Type”項為空時
此項為空,表示定義的變數為3位元長的字元型
D MYFLD01 S 3 //定義為3位元字元型
此項不為空(右對齊),表示定義的變數為數字型
D MYFLD01 S 3 2 //定義數字型變數,1位元元整數,2位元小數(總長為3位)
Keywords:
關鍵字,可以不填,常用的值如下:(同樣,這裡我也只列出幾個常用的,這裡先不做詳細說明,僅供參考,在後面的例子,看看就知道用法了)
CONST: 定義常量的值
DIM: 定義陣列
EXTNAME:引用外部檔作為資料結構變數
EXTFLD: 對引用了外部檔作為資料結構的某個變數,進行重命名
LIKE: 定義變數時,參照已存在的變數定義
OCCURS: 定義結構體變數時,指定的結構體變數的記錄條數
INZ: 定義變數時,賦值初始值
DATFMT: 定義日期變數時,指定日期格式
*MDY (mm/dd/yy)
*DMY (dd/mm/yy)
*YMD (yy/mm/dd)
*JUL (yy/ddd)
*ISO (yyyy-mm-dd)
*USA (mm/dd/yyyy)
*EUR (dd.mm.yyyy)
*JIS (yyyy-mm-dd)
Comment
注釋項,源自RPG,不用填,因為填了也沒用。
常用例子
定義一個10位元長的字元型變數:
D MYFLD S 10
定義一個10位長,其中含2位元小數的字元型變數,並使其初始值為1
D MYFLD S 10 2 INZ(1)
定義一個每條記錄為5位元長字元型變數,共10條記錄的陣列
D MYFLD S 5 DIM(10)
定義一個10位元長的字元型變數,再定義一個變數,參照前一變數定義
D MYFLD01 S 10
D MYFLD02 S LIKE(MYFLD01)
定義一個結構,由一個3位元長的字元變數,和一個10位元長,其中2位元小數的數位變數組成
D MYDS DS
D MYDS01 3
D MYDS02 10 2
定義一個結構變數,結構內容參照外部檔PFFHS
D MYDS E DS EXTNAME(PFFHS)
定義一個結構變數,結構內容參照外部檔PFFHS,並且將第二個欄位重命名為FHS999
D MYDS E DS EXTNAME(PFFHS)
D FHS999 E DS EXTFLD(FHS02)
定義一個日期型變數,格式為yyyy-mm-dd
D MYDATE S D DATFMT(*ISO)
補充說明
變數的定義,除了在D行定義之外,還可以在C行通過設定陳述式直接定義
如
D FLD01 S 2 INZ(‘01’)
與
C MOVE ‘01’ FLD01 2 //2在length處,右對齊
是等價的
定義結構之後,可以將結構變數視為一個普通的變數進行賦值來改變結構變數的值,也可以通過對組成結構變數的變數進行賦值,來達到修改結構變數的值的目的。
如:
D MYDS DS
D MYFLD01 2
D MYFLD02 2
在C行中,這兩句是等價的
C EVAL %SUBST(MYDS:3:2)=’01’
C EVAL MYFLD02=’01’
第一句是直接改結構變數MYDS的後兩位元的值(當然,此時MYFLD02的值也變化了)
第二句是對MYFLD02進行賦值,同樣,賦完值之後,MYDS的後兩位也變為’01’
在需要頻繁進行數位與字元之間轉換時,偷懶的人會通過定義這樣的結構來達到目的:
D MYDS DS
D MYFLD01 1 8
D MYFLD02 1 8 0
比如說,給MYFLD01賦值為’20070208’之後,MYFLD02也就自動等於20070208;然後給MYFLD02加1之後,MYFLD02等於20070209,MYFLD01的值也自動等於’20070209’。可以認為結構變數MYDS是字元型(即一直等於MYFLD01的值)
這種方法,當需要字元型變數時,就使用MYFLD01;當需要數位元變數時,就使用MYFLD02,不過我總覺得有點類似於作弊,一般沒用。
- May 29 Tue 2007 10:33
D行定義說明
全站熱搜
留言列表
發表留言