2010年10月25日 星期一

price2Amount

pricedisc 裡面有一個 static 的 function price2Amount:
用來計算所有 AX 裡面的 price 基本上邏輯如下

price2Amount(PriceCur price,
PriceUnit priceUnit,
DiscAmount discAmount,
Qty qtyNow,
Qty qty,
MarkupAmount markup,
DiscPct discPercent,
CurrencyCode currencyCode,
Amount amount,
boolean forceAmountCalculation = false)


returnAmount = (qtyNow * ( (price - discAmount) / priceUnit) + (qtyNow >= 0 ? markup : -markup) ) * (100 - discPercent) / 100;

(price - discAmount) 計算減掉 discount 後的值 => / priceUnit => 除以單位數得到單價 =>(qtyNow >= 0 ? markup : -markup) 現在 Deliver Now 是多少 大於零 + markup 小於零 -markup =>得到真正的總單家 qtyNow * ( => 乘上 Deliver Now 的數量得到總價 => * (100 - discPercent) / 100 => 算出打折以後的值

2010年10月22日 星期五

基本的 template

Static void QueryTest(Args _args)
{
Query query;
QueryBuildDataSource qbds;
QueryBuildRange qbr;
QueryRun queryRun;
InventTable inventTable;

;
Query = new Query();
Qbds = query.addDataSource(tablenum(InventTable),’InventTable’);

//add range at here
Qbr = qbds.addRange(fieldnum(InventTable,ItemId));
Qbr.value(‘I-999,I-888,I-777’);

queryRun = new QueryRun(query);
while(queryRun.next())
{
inventTable = queryRun.get(tablenum(InventTable));
print inventTable.recId;
}

Pause;
}

QueryRange 有趣的 cases

當寫 custom Query Range 的時候, 可以使用任何一個 Table 的 Field 來取得 querybuildrange, 然後 querybuildrange 的 value 可以跟用來取得 querybuildrange 的 Field 豪不相關, 你可以使用通用的 field 來去得, 譬如說 RecId 或是 DataAreaId. 下面的例子使用, RecId 取得 querybuildrange 然後用 query 的 field 卻是 AccountNum 以及 Name

qbr = qbd.addRange(FieldNum(CustTable, RecId));
qbr.value(strFmt('((%1 == "4000") || (%2 == "Bob"))',
fieldStr(CustTable, AccountNum),
fieldStr(CustTable, Name)));

==================================================================

QueryBuild Range 裡面使用 OR 的例子:

例子1: 使用 ,

Query q;
QueryBuildDataSource qbd;
QueryBuildRange qbr;
q = new Query();
qbd = q.addDataSource(TableNum(CustTable));
qbr = qbd.addRange(FieldNum(CustTable, AccountNum));
qbr.value('100, 200');

結果:
SELECT * FROM CustTable WHERE ((((AccountNum == "100") || (AccountNum == "200"))))

例子2:

qbr = qbd.addRange(FieldNum(CustTable, DataAreaId));
qbr.value(strFmt('((%1.%2 == "1000") || (%1.%3 == "ABC"))',
qbd.name(),
fieldStr(CustTable, AccountNum),
fieldStr(CustTable, Name)));

結果:
SELECT * FROM CustTable WHERE ((((CustTable_1.AccountNum == "1000") || (CustTable_1.Name == "ABC"))))

==================================================================

基本型:
Qbr = qbds.addRange(fieldnum(InventTable,ItemId));
Qbr.value(‘I-999’);

Qbr = qbds.addRange(fieldnum(InventTable,RecId));
Qbr.value(5646876135);

可用queryvalue把 value 先包起來讓 AX 處理譬如說 NULL 或是 datetime 等特別型態以求安全
qbr.value(queryvalue(‘I-999’)

==================================================================
Query Expression:

Qbr = qbds.addRange(fieldnum(InventTable,ItemId));
Qbr.value(strfmt(‘(%1 == “%2”)’,fieldstr(InventTable,ItemId),queryvalue(‘I-999’));

strfmt 注意:
a) value should be inside ''
b) every expression should have ( )
‘((%1 == %2) || (%1 == %3))’
c) %n expression order is expressed by this format
d)if it is a string, it should use ""
Strfmt(‘(%1 == “%2”)’,fieldstr(InventTable,ItemId),queryvalue(‘I-999’));

==================================================================


SOURCE #init
#public void init()
#{
# QueryBuildDataSource queryBuildDataSource;
# QueryBuildRange rangeHours;
#
# super();
#
# queryBuildDataSource = this.query().dataSourceName(tablestr(TSTimesheetLineWeek) );
# rangeHours = queryBuildDataSource.addRange(fieldid2ext(fieldnum(TSTimesheetLineWeek, Hours),1));
# rangeHours.value(strFmt('((%1.%2) != %9) || ((%1.%3) != %9) || ((%1.%4) != %9) || ((%1.%5) != %9) || ((%1.%6) != %9) || ((%1.%7) != %9) || ((%1.%8) != %9)',
# queryBuildDataSource.name(),
# fieldid2name(tablenum(TSTimesheetLineWeek),fieldid2ext( fieldnum(TSTimesheetLineWeek, Hours), 1 )),
# fieldid2name(tablenum(TSTimesheetLineWeek),fieldid2ext( fieldnum(TSTimesheetLineWeek, Hours), 2 )),
# fieldid2name(tablenum(TSTimesheetLineWeek),fieldid2ext( fieldnum(TSTimesheetLineWeek, Hours), 3 )),
# fieldid2name(tablenum(TSTimesheetLineWeek),fieldid2ext( fieldnum(TSTimesheetLineWeek, Hours), 4 )),
# fieldid2name(tablenum(TSTimesheetLineWeek),fieldid2ext( fieldnum(TSTimesheetLineWeek, Hours), 5 )),
# fieldid2name(tablenum(TSTimesheetLineWeek),fieldid2ext( fieldnum(TSTimesheetLineWeek, Hours), 6 )),
# fieldid2name(tablenum(TSTimesheetLineWeek),fieldid2ext( fieldnum(TSTimesheetLineWeek, Hours), 7 )),
# 0
# ));
#}
ENDSOURCE

2010年5月21日 星期五

QueryBuildRange.Value wildcard example

How to use "Like" operator in the QueryBuildRange.Value
To make something as the "LIKE" operator in a query, you should just assign a value to the queryRange including a wildcard.

The query framework will then change the statement into a LIKE statement. If the value does not contain a wildchard the query framework will change the statement to ==.

Example:


static void QueryBuildRange_Like(Args _args){ Query query = new Query(); QueryRun queryRun; QueryBuildDataSource queryDataSource; QueryBuildRange queryRange; CustTable custTable; ;
queryDataSource = query.addDataSource(tablenum(CustTable));
queryRange = queryDataSource.addRange(fieldnum(CustTable, Name)); queryRange.value('The*'); queryRun = new QueryRun(query); while (queryRun.next()) { custTable = queryRun.get(tablenum(CustTable)); info (custTable.Name); }}


This posting is provided "AS IS" with no warranties, and confers no rights.

2010年5月19日 星期三

TransactionTxt

http://www.cnblogs.com/Farseer1215/archive/2006/10/11.html

2010年5月18日 星期二

Docu:copy

Docu:copy(SalesLine, CustInvoiceTrans) is used to duplicate a document handling note's record in table DocuRef. This static method doesn't copy entire fields of SalesLine to CustInvoiceTrans, but it duplicates the document note's record belongs to salesLine to custInvoiceTrans' document note. It will then modify refTableId, refRecId, and refCompanyId (data area company account id) which was previously set specificto salesLine to CustInvoiceTrans

select docuRef index RefIdx
where docuRef.RefCompanyId == projProposalJour.DataAreaId &&
docuRef.RefTableId == projProposalJour.TableId &&
docuRef.RefRecId == projProposalJour.RecId;