• X++ 学习 (五)


    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 Select
    While 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中的元素列表自动隐式排序。

  • 相关阅读:
    补:冲刺Day1
    需求规格说明书2.0
    补:冲刺Day2
    冲刺Day3
    Base64上传图片
    C#怎样通过url调用接口
    js键盘控制DIV移动
    利用MVC的过滤器实现url的参数加密和解密
    在.net MVC中异步上传图片或者文件
    mvc url路由参数的加密和解密
  • 原文地址:https://www.cnblogs.com/Kurodo/p/2105512.html
Copyright © 2020-2023  润新知