X++ 学习 (五)

mac2022-06-30  170

X++中的SQL成分介绍

1.Tables数据类型

在MorphX中所有用AOT创建的表,都可以当做类的定义.要操作(增,删,改,查)表中的记录,至少要声明一个表变量.表变量和对象有如下不同之处:    a.不能为表变量分配空间.                   -----隐式分配

    b.不能从其他表变量中继承.       c.表变量中的字段是public的               ------可以在任何地方引用

    d.表变量中的字段可以被表达式引用

 

common之于tables就如object之于Objects,所以可以用common引用所有的表中的数据表变量的定义:

 

void  MyMethod(){    //  Declares and allocates space for one CustTable record    CustTable custtable;}

引用表表量中的字段

 

void  PrintAccountNo();{   CustTable CustTable;   Print CustTable.AccountNo;}

2.Select语句

a.While SelectWhile Select(按照一定规则)在一些记录中遍历并可以在每条记录上执行一定的语句,因此While Select可以执行数据操作.当用while select执行数据操作的时候,应该在一个transaction中操作以确保数据完整性.举例如下:

View Code static   void  deleteTransFromVoucher(JournalNum _journalNum,Voucher _voucher){  LedgerJournalTrans ledgerJournalTrans;  LedgerJournalTable ledgerJournalTable  =  LedgerJournalTable::find(_journalNum);  Counter counter;  ;  ttsBegin;   while  select forUpdate ledgerJournalTrans index hint NumVoucherIdx   where  ledgerJournalTrans.journalNum  ==  _journalNum  &&  ledgerJournalTrans.voucher  ==  _voucher  {      ledgerJournalTrans.doDelete();      counter ++ ;  }   if  (counter  &&  ledgerJournalTable.journalType  !=  LedgerJournalType::Periodic)      NumberSeq::release(ledgerJournalTable.voucherSeries,_voucher);  ttsCommit;} void  printTel(){  CustTable Cust;   while  select Cust order by NameRef   where  AccountNo  >   2000 ?&& AccountNo   {    print Cust.NameRef, Cust.TelephoneNo;  }}

 

 删除一组记录:delete_from

用while select可以用如下方式表述:

void  delete(){    record r;     while  select r     where  ...    {      r.delete();    }}

但是用delete_from可以减少交互次数,提高效率

void  delete(){   record r;   delete_from r  where  ....;}

3.X++和SQL在处理聚集函数时的不同

当一个查询的where条件不匹配任何行的时候,标准的SQL保证总有一行返回,count返回zero,其他的聚集函数列返回null。由于Axapta不支持null值的概念,所有有一些略微的不同之处:当聚集函数返回null的时候,就没有行返回给用户。如果只用了count这个聚集函数,那么将会返回zero。如果没有用聚集函数,但是某一列返回了null,将会抛出信息为不支持null的异常。尽管Axapta不支持DBMS意义上的null,但是有其他类型的数据包含一个特定的值在一定的环境下可以当做null值使用。

4.X++和SQL在处理Group by时的不同

X++不允许group by和order by出现在同一select语句中,这意味这显示的排序是不允许的。但是会按照group by中的元素列表自动隐式排序。

转载于:https://www.cnblogs.com/Kurodo/archive/2011/07/13/2105512.html

最新回复(0)