Axapta 如何将select查询绑定为报表中的数据源?

Axapta 如何将select查询绑定为报表中的数据源?,axapta,microsoft-dynamics,x++,dynamics-ax-2009,Axapta,Microsoft Dynamics,X++,Dynamics Ax 2009,我有一个select语句,要将其绑定为报表中的数据源。 我还没有找到设计适当AOT查询的方法 这就是它在X中的样子++ public void insertData(date data = today()) { BHNEmployeesOnDay ins; EmplTable tbl; CompanyInfo info; BHNEmplAgreements Agreemnt; BH

我有一个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);

    }
}
public void insertData(日期数据=今天())
{
BHNEmployeesOnDay-ins;
可雇佣的tbl;
公司信息;
BHN协议;
BHN协议2;
bhnemplhistory公司历史;
bhnemplhistory公司历史_测试;
必和必拓分部;
bhnpositionable位置;
SysCompanyUserInfo sys1;
SysUserInfo sys2;
UserInfo-usrInfo;
无限期日期=mkdate(1,11900);
; 
从ins中删除_;
同时从tbl中选择*
连接信息,其中Info.dataAreaId==tbl.dataAreaId&&Info.BLX\u companyForDW==1
加入sys1,其中sys1.EmplId==tbl.EmplId&&sys1.dataAreaId==tbl.dataAreaId
加入sys2,其中sys1.UserId==sys2.Id
加入usrInfo,其中usrInfo.id==sys1.UserId
存在连接历史\u测试
其中history\u test.EmplId==tbl.EmplId&&history\u test.dataAreaId==tbl.dataAreaId
加入Agreemnt,其中Agreemnt.HistoryId==history\u test.HistoryId
&&(agreemnt.DateTo>=数据| | agreemnt.DateTo==无穷大)
{
仅选择第一个*
从历史顺序按history.DateFrom desc,Agreemnt2.DateFrom desc
其中history.EmplId==tbl.EmplId&&history.dataAreaId==tbl.dataAreaId
加入Agreemnt2,其中Agreemnt2.HistoryId==history.HistoryId
&&Agreemnt2.DateFrom=数据| | Agreemnt2.DateTo==无穷大)
加入division,其中division.DivisionId==agreemnt.DivisionId
连接位置,其中position.PositionId==agreemnt.PositionId;
附加记录(tbl.EmplId,tbl.Name_BHN,tbl.BirthDate,division.Name,position.FullName);
}
}
目前我[在报告的
run()
方法期间]将数据生成到一个表中,然后从该表中进行选择。到目前为止,只有一个人使用这个报告,所以这不是一个问题,但是如果两个人同时运行同一个报告,我将得到肮脏的阅读

我知道这是个糟糕的方法,但我已经没有主意了。我想在T-SQL端创建一个视图,并尝试从中进行选择——但我被告知,在导出过程中,它可能不会被检测到,或者根本不会传输到AX的其他实例,因此必须在AX端进行

我怎样才能解决这个问题


如果这是T-SQL中的查询,您可以覆盖报表的
获取
方法,只需按原样使用X++代码获取记录,然后使用报表的
发送
方法处理记录

有关示例,请参见。
该示例使用了一个
query
对象,但您可以轻松地将其与自己的X++代码交换—您最终只需调用
send
,以获取您希望由报表处理的记录

更新:

例如,您可以获取
SalesTable
的任何记录,然后调用
send

在本例中,假定一个成员变量
salesTable
,以便在需要时可以在显示方法中访问当前记录

public boolean fetch()
{
    boolean ret;
    //ret = super();
    ;

    select firstOnly salesTable;

    this.send(salesTable);

    return true;
}

您可以覆盖报表的
fetch
方法,只需按原样使用X++代码获取记录,然后使用报表的
send
方法处理记录

有关示例,请参见。
该示例使用了一个
query
对象,但您可以轻松地将其与自己的X++代码交换—您最终只需调用
send
,以获取您希望由报表处理的记录

更新:

例如,您可以获取
SalesTable
的任何记录,然后调用
send

在本例中,假定一个成员变量
salesTable
,以便在需要时可以在显示方法中访问当前记录

public boolean fetch()
{
    boolean ret;
    //ret = super();
    ;

    select firstOnly salesTable;

    this.send(salesTable);

    return true;
}

但是不是为查询中的每个现有记录调用fetch吗?在这种情况下,覆盖它对我来说是无用的。但是如果我在run()方法中运行select并在那里调用send(),它应该可以做到这一点。我要试试。不-你可以在
fetch
中做任何你想做的事,而不需要查询-看我的更新。不,我最终使用了临时表。您的方法只运行一次,在fetch()中的while循环中使用send()不会产生任何效果。我对c#dev很有经验,但我对x++还不熟悉,所以很可能我做错了什么。我将尝试用一些屏幕和解决方案来回答这个问题,这些屏幕和解决方案在本周的某个时候起到了作用。但是,对于查询中的每个现有记录,不是都调用fetch吗?在这种情况下,覆盖它对我来说是无用的。但是如果我在run()方法中运行select并在那里调用send(),它应该可以做到这一点。我要试试。不-你可以在
fetch
中做任何你想做的事,而不需要查询-看我的更新。不,我最终使用了临时表。您的方法只运行一次,在fetch()中的while循环中使用send()不会产生任何效果。我对c#dev很有经验,但我对x++还不熟悉,所以很可能我做错了什么。我将尝试用一些屏幕和本周某个时候有效的解决方案来回答这个问题。