我有一个select语句,我想在报告中绑定为数据源 我还没有找到一种方法来设计合适的AOT查询。
这就是它在X ++中的样子
public void insertData(date data = today())
{
BHNEmployeesOnDay ins;
EmplTable tbl;
CompanyInfo info;
BHNEmplAgreements Agreemnt;
BHNEmplAgreements Agreemnt2;
BHNEMPLHISTORYCOMPANY history;
BHNEMPLHISTORYCOMPANY history_test;
BHNDIVISIONTABLE division;
BHNPOSITIONTABLE position;
SysCompanyUserInfo sys1;
SysUserInfo sys2;
UserInfo usrInfo;
Date infinity = mkdate(1,1,1900);
;
delete_from ins;
while select * from tbl
join Info where info.dataAreaId == tbl.dataAreaId && info.BLX_companyForDW == 1
join sys1 where sys1.EmplId==tbl.EmplId && sys1.dataAreaId == tbl.dataAreaId
join sys2 where sys1.UserId==sys2.Id
join usrInfo where usrInfo.id==sys1.UserId
exists join history_test
where history_test.EmplId==tbl.EmplId && history_test.dataAreaId==tbl.dataAreaId
join Agreemnt where Agreemnt.HistoryId==history_test.HistoryId
&& (agreemnt.DateTo >= data || agreemnt.DateTo==infinity)
{
select firstonly *
from history order by history.DateFrom desc, Agreemnt2.DateFrom desc
where history.EmplId==tbl.EmplId && history.dataAreaId==tbl.dataAreaId
join Agreemnt2 where Agreemnt2.HistoryId==history.HistoryId
&& Agreemnt2.DateFrom<=data && (Agreemnt2.DateTo >= data || Agreemnt2.DateTo==infinity)
join division where division.DivisionId==agreemnt.DivisionId
join position where position.PositionId==agreemnt.PositionId;
ins.adddRecord(tbl.EmplId, tbl.Name_BHN, tbl.BirthDate, division.Name, position.FullName);
}
}
目前,我将数据生成到[在报告的run()
方法期间]的表中,然后只需从该表中进行选择。到目前为止只有一个人使用这个报告所以这不是问题,但如果两个人同时运行同一个报告,我会得到脏读。
我知道这是不好的方法,但我没有想法。我想在T-SQL端创建一个View并尝试从中进行选择 - 但我被告知在导出期间可能无法检测到或者根本没有将其转移到我们AX的其他实例,因此必须在AX端完成
我该如何解决这个问题?
以防这是T-SQL SQL query on pastebin
中的查询答案 0 :(得分:3)
您可以覆盖报告的fetch
方法,只需按原样使用X ++代码获取记录,然后使用报告的send
方法来处理它们。
有关示例,请参阅here
该示例使用query
对象,但您可以轻松地将其与您自己的X ++代码交换 - 您最终必须为要由报告处理的记录调用send
。
更新:
例如,您只需抓取SalesTable
的任何记录并致电send
在此示例中,假定使用成员变量salesTable
,以便您可以在需要时以显示方法访问当前记录。
public boolean fetch()
{
boolean ret;
//ret = super();
;
select firstOnly salesTable;
this.send(salesTable);
return true;
}