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中操作以确保数据完整性.
举例如下:
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 <=3000?>
{
print Cust.NameRef, Cust.TelephoneNo;
}
}
删除一组记录:delete_from
用while select可以用如下方式表述:
{
record r;
while select r
where ...
{
r.delete();
}
}
但是用delete_from可以减少交互次数,提高效率
{
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中的元素列表自动隐式排序.