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,不過我總覺得有點類似於作弊,一般沒用。



狼翔月影 發表在 痞客邦 PIXNET 留言(0) 人氣()