- 論壇徽章:
- 0
|
既然是總結(jié)性的東東,就不寫的太詳細(xì)了。細(xì)節(jié)和簡單的東東就不提了。
ARRAY
一 array與table的區(qū)別
Array:可以使用下標(biāo),進(jìn)行順序訪問或隨即訪問
Table:不可以使用下標(biāo),只能順序訪問。只能以TABxxx開頭。
注:table雖然和array的功能相似,但是array要比table靈活很多。Table可以淘汰了,了解table的原因是維護(hù)老的代碼時(shí)可能會(huì)用到。
二 array的類型和key word
1有三種類型的array,分別是compile time array、run time array、pre-run time array。
2與array相關(guān)的key word:
DIM(number) 定義數(shù)組中元素的數(shù)量
ASCEND/DESCEND 元素在數(shù)組中升序/降序排序
PERRCD(number) 對(duì)于compile time array每一行中元素的個(gè)數(shù)
CTDATA 定義compile time array
FROMFILE/TOFILE 定義pre-run time array會(huì)用到
EXTFMT
舉例:
//array1定義10個(gè)元素,每個(gè)長度為5
D Array1 S 5 0 DIM(10)
//array2是compile time array,共6行,每行3個(gè)元素,每個(gè)元素10個(gè)長度,升序排序
D Array2 S 10 DIM(6) PERRCD(3) CTDATA ASCEND
//compile time array要在程序的結(jié)尾定義數(shù)據(jù)
** CTDATA ARRAY2
Element1 Element2 Element3
Element4 Element5 Element6
Element7 Element8 Element9
Element10
注:如果compile time array的數(shù)據(jù)發(fā)生變化,那么要更改程序源代碼中的元素值,并要重新編譯程序。
在程序的末尾要有** CTDATA 。建議使用** CTDATA array_name的方式,但是要注意array_name要與D-spec 定義的array_name要一致;僅用 **CTDATA(不指定array_name)時(shí)要注意** CTDATA的數(shù)據(jù)按照D-spec定義的array的順序進(jìn)行匹配。并且兩者不能混著用。
3 Index:index不能為0或負(fù)數(shù),不能大于元素個(gè)數(shù)。
三 array相關(guān)的%BIF
1 %Xfoot 數(shù)組求和
Sum = %Xfoot(array_name)
2 %LookUpxx 查找(%TLookUpxx for table)
Index = %LookUpXX(argument:array{:satrtindex})
%LookUp 查找第一個(gè)=argument元素的index
%LookUpLE 查找第一個(gè)<=argument的元素index
%LookUpLT 查找第一個(gè)<argument的元素的index
%LookUpGE 查找第一個(gè)>=argument的元素的index
%LookUpGT 查找第一個(gè)>argument的元素的index
注:除了%LookUp外,使用其他的%LookUpxx的數(shù)組必須是排過序的。
3 %Size 返回變量或常量所占的字節(jié)數(shù)
Size = %Size(name{:*all})
D SmallFiled S 5P 2
D MyArray S 5 DIM(%Size(Smallfield))
SizeSmall = %Size(SmallField) //SizeSmall = 3
ArraySize = %Size(MyArray) //ArraySize = 5 單個(gè)元素的size
Arraysize = %Size(Myarray:*all) //Arraysize = 150 所有元素的size
4 %Elem 返回?cái)?shù)組中元素的個(gè)數(shù)
Number = %Elem(array_name)
Data structure
Data structure是什么?答:數(shù)據(jù)結(jié)構(gòu)。評(píng):廢話。—_—!
一 DS的key word
OCCURS(number) 定義DS數(shù)組
OVERLAY(name:{pos}) 在DS中重定義sub-filed
PREFIX(prefix) 為外部的字段增加前綴。
EXTNAME(name:{fmt_name}) 參照的外部文件格式,文件不需要在F-spec定義
EXTFLD(field_name) 將外部數(shù)據(jù)格式的字段重命名
QUALIFIED 指定引用
LIKEDS 引用DS的格式,隱含自動(dòng)聲明QUALIFIED
LIKEREC 引用外部文件,文件要在F-spec中定義,隱含自動(dòng)聲明QUALIFIED
LIKE 參照字段定義
簡單的例子:
FItem_PF IF E K DISK
D keystr DS LIKEREC(Item_fmt)
*
D #lda E DS EXTNAME(lda)
*
D cust DS QUALIFIED
D name 50a
D id 10i 0
*
D part DS QUALIFIED
D name 25a
D id 10i 0
*
D part1 DS LIKEDS(part)
D part2 DS LIKEDS(part)
二 DS的用法
1 group field(字段組合使用)
D Stamp DS
D OrderNo 5
D OrderDate 6 0
D OperInit 3
2 subdivide field(字段拆分使用)
D DS
D ProductNo 16
D model 4 overlay(productNO:1)
D fabric 6 overlay(productno:*next)
D color 3 overlay(productno:*next)
D size 3 0 overlay(productno:*next)
注:Subfield的默認(rèn)類型是S和A。還可以定義成P和B
數(shù)組和DS配合使用
DS和ARRAY配合使用,屬于編程方面的小技巧,使用得當(dāng)?shù)脑,?huì)大大簡化程序代碼。
1 DS數(shù)組:
D ARR DS DIM(10) QUALIFIED
D SUB1 5A
D SUB2 5S 0
2 二維數(shù)組:
D ARR DS DIM(10) QUALIFIED
D SUBARR 10 0 DIM(20)
相當(dāng)于定義了一個(gè)arr[10][20]的二維數(shù)組
使用方法:
C FOR i=1 to %elem(arr)
C FOR j=1 to %elem(subarr)
C eval sum += arr(i).subarr(j)
3 如果PF有一些連續(xù)的相同屬性的字段,可以考慮把他們放到array中來處理,比如:
1)連續(xù)的字段位于文件的最開始:
A R REC
A FLD1 5P 0
A FLD2 5P 0
A FLD3 5P 0
A OTHER 10A
處理代碼:
FMYFILE IF E DISK
D myDS E DS EXTNAME(MYFILE)
D fldArray LIKE(FLD1) DIM(3)
D OVERLAY(myDs)
C READ MYFILE
C FOR i = 1 to %ELEM(fldArray)
C* ... process fldArray(i)
C ENDFOR
2)連續(xù)的字段位于文件的中間:
A R REC
A OTHER1 10A
A FLD1 5P 0
A FLD2 5P 0
A FLD3 5P 0
A OTHER2 10A
FMYFILE IF E DISK
D myDS E DS EXTNAME(MYFILE)
D fldArray S LIKE(FLD1) DIM(3)
D BASED(pFldArray)
D pFldArray S * INZ(%addr(FLD1))
C READ MYFILE
C FOR i = 1 to %ELEM(fldArray)
C* ... process fldArray(i)
C ENDFOR
這種情況下,先定義一個(gè)指針,獲取第一個(gè)重復(fù)字段的地址,相當(dāng)于獲取數(shù)組的首地址,也就相當(dāng)于獲取了這個(gè)數(shù)組。
3)如果PF中的字段有周期性重復(fù)的,比如:
A R REC
A FIELD 5P 0
A OTHER1 10A
A FLD1 5P 0
A OTHER2 10A
A FLD2 5P 0
A OTHER3 10A
A FLD3 5P 0
FMYFILE IF E DISK
D myDS E DS EXTNAME(MYFILE)
D fldArray DS DIM(3) BASED(pFldArray) QUALIFIED
D sub1 LIKE(OTHER1) OVERLAY(fldArray:1)
D sub2 LIKE(FLD1) OVERLAY(fldArray:*NEXT)
D pFldArray S * INZ(%addr(FLD1))
C READ MYFILE
C FOR i = 1 to %ELEM(fldArray)
C* ... process fldArray(i)
C ENDFOR
把重復(fù)出現(xiàn)的字段看成一個(gè)整體,來作為array的元素,然后再拆分。 |
|