Farseer

导航

X++中的数组

最近跟数组打交道必较多,期间遇到了一些问题,在这里做一下总结.
X++中的数组分为两类:基础类型和AFC中的Array,区别在于前者只能存放X++基础类型(比如int,real)而不能存放class对象和Table,本文只讨论前者.
这里只叙述跟C#中不同的部分:
1.只支持一维数组;
不支持多维数组也没办法,只能说是编译器限制.
2.定义分为dynamic, fixed length, and partly on disk等三种不同类型;
3.索引从1开始;
索引0也可以用,给索引为0的元素赋值,将导致数组中所有的元素被清空.
    str aa[2];
    ;
    aa[
1]="aaa";
    aa[
2]="bbb";
    print    aa[
1]+" "+aa[2] ;
    aa[
0]="ccc";
    print aa[
1]+ " "+ aa[2];
    pause;
4.可用Array类型的EDT定义全局Array类型;
这样定义的数组类型,可以用来定义变量,也可以做为数据库的字段.
如果做为表的字段,在数据库中表现为跟数组EDT元素个数相同的字段,依次为 字段名称,字段名称1_,字段名称2_,比如系统中如果某个表中包含了Dimension类型的字段,取名为Dim,则依次有Dim,Dim1_和Dim2_,其类型为Dimension的基类型string.
数据库中的任何一个字段都可以用FiledNum函数取得某个字段的fieldId,对于数组类型的EDT,FiledNum取得的只是数组的第0个元素,不会对应具体的值,具体的值需要用
static FieldId fieldId2Ext(FieldId fieldId, int arrayIndex)
这个函数取得,另外还有几个函数
static FieldId fieldExt2Id(FieldId fieldExtId)
取得Fieldid即数组的第0个元素;
static int fieldExt2Idx(FieldId fieldExtId)
取得arrayIdx;
好象说不明白,看代码吧.
static void ArrayFieldId(Args _args)
{
   FieldId arraryFieldId;
   FieldId arrayElementFieldId;
   
int arrayIndex;
   ;
   
//取得Dimension的FieldId
   arraryFieldId =  fieldNum(custTable,dimension);
   print  arraryFieldId;
   arraryFieldId 
= FieldId2Ext(fieldNum(custTable,dimension),0);
   print  arraryFieldId;

   
//取得CostCenter对应的FieldId,CostCenter是第二个元素
   arrayElementFieldId = FieldId2Ext(arraryFieldId,2);
   print    arrayElementFieldId;

   
//取得CostCenter所在数组的FiledId,即Dimension的FieldId;
   print FieldExt2Id(arrayElementFieldId);
   
//取得CostCenter在数组中的索引
   arrayIndex = FieldExt2Idx(arrayElementFieldId);
   print  arrayIndex;

   pause;

}
如何用表变量引用数组EDT的某个字段值那?跟普通的Array操作是一样的,用[]来引用.
static void Array(Args _args)
{
    CustTable cust;
     ;
    select Dimension[
1] from cust
    where cust.AccountNum 
== '      4000';
    print cust.Dimension[
1];

    select Dimension from cust
    where cust.AccountNum 
== '      4000';
    print cust.Dimension[
1];

    pause;
}

5.不能做返回参数;
这应该是编译器的缺陷,当然可以有变通的做法,采用AFC中的Array,这样就看不出Array的葫芦里卖的什么药了,有些,再说我只想返回一个整型数组,却非要我包成一个类,bt......
对于在EDT里定义的数组倒是可以做函数的返回参数,不过要注意一点,如果定义的数组EDT的基类型不是string,那么返回类型只能是Anytype,如果返回在EDT中定义的类型,编译通过不了,会报类型不匹配,真是bt到家了......
6.做入参时的约束.
这个也够BT的,在后面的文章中详细介绍一下.

posted on 2006-10-16 19:21  佛西亚  阅读(640)  评论(0编辑  收藏  举报