zoukankan      html  css  js  c++  java
  • 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的,在后面的文章中详细介绍一下.
  • 相关阅读:
    YUM安装MySQL 8.0
    linux 设置 别名 全局命令
    2018.3.12校内互测总结-生成函数-bitset-二次剩余
    Dirichlet 前缀和与快速莫比乌斯变换(FMT)
    CSP-S2 赛后总结
    概率和期望
    【题解】[洛谷 P4396 / bzoj 3236] 作业【莫队 分块 根号平衡】
    【题解】[LOJ 2736] 「JOISC 2016 Day 3」回转寿司【分块 堆】
    【题解】[UOJ 228] 基础数据结构练习题【线段树 均摊数据结构】
    【题解】[Codeforces 438D] The Child and Sequence【线段树 均摊数据结构】
  • 原文地址:https://www.cnblogs.com/Farseer1215/p/529675.html
Copyright © 2011-2022 走看看