分类:
2011-07-22 14:56:52
ARRAY
一 array与table的区别
Array:可以使用下标,进行顺序访问或随即访问
Table:不可以使用下标,只能顺序访问。只能以TABxxx开头。
注:table虽然和array的功能相似,但是array要比table灵活很多。Table可以淘汰了,了解table的原因是维护老的代码时可能会用到。以后就不说table了。
二 array的类型和key word
1有三种类型的array,分别是compile time array、run time array、pre-run time array。
2与array相关的key word:
DIM(number) 定义数组中元素的数量
ASCEND/DESCEND 元素在数组中升序/降序排序
PERRCD(number) 对于compile time array每一行中元素的个数
CTDATA 定义compile time array
FROMFILE/TOFILE pre-run time array
EXTFMT
举例:
//array1定义10个元素,每个长度为5
D Array1 S 5 0 DIM(10)
//array2是compile time array,共6行,每行3个元素,每个元素10个长度,升序排序
D Array2 S 10 DIM(6) PERRCD(3) CTDATA ASCEND
//compile time array要在程序的结尾定义数据
** CTDATA ARRAY2
Element1 Element2 Element3
Element4 Element5 Element6
Element7 Element8 Element9
Element10
注:如果compile time array的数据发生变化,那么要更改程序源代码中的元素值,并要重新编译程序。
在程序的末尾要有** CTDATA 。建议使用** CTDATA array_name的方式,但是要注意array_name要与D-spec 定义的array_name要一致;仅用**CTDATA(不指定array_name)时要注意** CTDATA的数据按照D-spec定义的array的顺序进行匹配。并且两者不能混着用。
3 Index:index不能为0或负数,不能大于元素个数。
三 array相关的%BIF
1 %Xfoot 数组求和
Sum = %Xfoot(array_name)
2 %LookUpxx 查找(%TLookUpxx for table)
Index = %LookUpXX(argument:array{:satrtindex})
%LookUp 查找第一个=argument元素的index
%LookUpLE 查找第一个<=argument的元素index
%LookUpLT 查找第一个
%LookUpGE 查找第一个>=argument的元素的index
%LookUpGT 查找第一个>argument的元素的index
注:除了%LookUp外,使用其他的%LookUpxx的数组必须是排过序的。
3 %Size 返回变量或常量所占的字节数
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 单个元素的size
Arraysize = %Size(Myarray:*all) //Arraysize = 150 所有元素的size
4 %Elem 返回数组中元素的个数
Number = %Elem(array_name)
Data Structure
一 DS的key word
OCCURS(number) 定义DS数组
OVERLAY(name:{pos}) 在DS中重定义sub-filed
PREFIX(prefix) 为外部的字段增加前缀。
EXTNAME(name:{fmt_name}) 参照的外部文件格式,文件不需要在F-spec定义
EXTFLD(field_name) 将外部数据格式的字段重命名
QUALIFIED 指定引用
LIKEDS 引用DS的格式,隐含自动声明QUALIFIED
LIKEREC 引用外部文件,文件要在F-spec中定义,隐含自动声明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
D id 10i 0
*
D part DS QUALIFIED
D name
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的默认类型是S和A。还可以定义成P和B
数 数组和DS配合使用
DS和ARRAY配合使用,属于编程方面的小技巧,使用得当的话,会大大简化程序代码。
1 DS数组:
D ARR DS DIM(10) QUALIFIED
D SUB1 5A
D SUB2 5S 0
2 二维数组:
D ARR DS DIM(10) QUALIFIED
D SUBARR 10 0 DIM(20)
相当于定义了一个arr[10][20]的二维数组
使用方法:
C FOR i=1 to %elem(arr)
C FOR j=1 to %elem(subarr)
C eval sum += arr(i).subarr(j)
3 如果PF有一些连续的相同属性的字段,可以考虑把他们放到array中来处理,比如:
1)连续的字段位于文件的最开始:
A R REC
A FLD1 5P 0
A FLD2 5P 0
A FLD3 5P 0
A OTHER
处理代码:
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)连续的字段位于文件的中间:
A R REC
A OTHER1
A FLD1 5P 0
A FLD2 5P 0
A FLD3 5P 0
A OTHER2
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
这种情况下,先定义一个指针,获取第一个重复字段的地址,相当于获取数组的首地址,也就相当于获取了这个数组。
3)如果PF中的字段有周期性重复的,比如:
A R REC
A FIELD 5P 0
A OTHER1
A FLD1 5P 0
A OTHER2
A FLD2 5P 0
A OTHER3
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
把重复出现的字段看成一个整体,来作为array的元素,然后再拆分。