AX und Query Expressions mit Outer Join - CRASH

10. Juli 2009 14:00

Hallo :)

Zum Wochenende noch was ganz was schön kniffliges... Also

Ich habe eine Query welche aus der InventTable und der CustVendExternalItem besteht
welche zueinander mit Outer Join Verknüpft werden.


Folgender Code lässt AX2009 einfach ohne Meldung abstürzen.
Interessant dabei ist jedoch, dass wenn ich genau diese Query über eine FormDataSource erstelle, diese einwandfrei Funktioniert. (Lookup)

Code:
static void __TEST(Args _args)
{
    QueryBuildDatasource    qbds;
    QueryBuildDatasource    qbdsBase;
    DictTable               dictTable;
    Query                   cQuerySearch;
    QueryRun                qr;
    int                     i;
    str                     sQueryExpression;
    ;

    cQuerySearch = new Query();

    dictTable = new dictTable(tablenum(InventTable));
    qbdsBase = cQuerySearch.addDataSource(tablenum(InventTable));
    qbdsBase.name(dictTable.name());

    dictTable = new dictTable(tablenum(CustVendExternalItem));
    qbds = qbdsBase.addDataSource(tablenum(CustVendExternalItem));
    qbds.name(dictTable.name());
   
    qbds.relations(true);

    qbds.joinMode(JoinMode::OuterJoin);

    sQueryExpression = "(ItemId Like \"MUTT*\") || (CustVendExternalItem.ExternalItemId Like \"MUTT*\")";
    sQueryExpression = "(" + sQueryExpression + ")";

    SysQuery::findOrCreateRange(cQuerySearch.dataSourceTable(tablenum(InventTable)), fieldname2id(tablenum(InventTable), "dataareaid")).value(strfmt(sQueryExpression));

    qr = new QueryRun(cQuerySearch);
    while(qr.next())
    {
        i++;
        print i;
        if(i > 10)
            break;
    }
    pause;
}


Das QBDS Select dazu sieht so aus...
Code:
SELECT * FROM InventTable WHERE ((((ItemId Like "MUTT*") || (CustVendExternalItem.ExternalItemId Like "MUTT*")))) OUTER JOIN * FROM CustVendExternalItem WHERE InventTable.ItemId = CustVendExternalItem.ItemId


Also habe ich mir gedacht.. na, drehst halt die Einschränkung mal etwas um, sodass diese auf der 2ten Tabelle (CustVendexternalItem) als Expression Ranges gesetzt werden.
Code:
static void __TEST2(Args _args)
{
    QueryBuildDatasource    qbds;
    QueryBuildDatasource    qbdsBase;
    DictTable               dictTable;
    Query                   cQuerySearch;
    QueryRun                qr;
    int                     i;
    str                     sQueryExpression;
    ;

    cQuerySearch = new Query();

    dictTable = new dictTable(tablenum(InventTable));
    qbdsBase = cQuerySearch.addDataSource(tablenum(InventTable));
    qbdsBase.name(dictTable.name());

    dictTable = new dictTable(tablenum(CustVendExternalItem));
    qbds = qbdsBase.addDataSource(tablenum(CustVendExternalItem));
    qbds.name(dictTable.name());
   
    qbds.relations(true);

    qbds.joinMode(JoinMode::OuterJoin);

    sQueryExpression = "(InventTable.ItemId Like \"MUTT*\") || (ExternalItemId Like \"MUTT*\")";
    sQueryExpression = "(" + sQueryExpression + ")";

    SysQuery::findOrCreateRange(cQuerySearch.dataSourceTable(tablenum(CustVendExternalItem)), fieldname2id(tablenum(CustVendExternalItem), "dataareaid")).value(strfmt(sQueryExpression));

    qr = new QueryRun(cQuerySearch);
    while(qr.next())
    {
        i++;
        print i;
        if(i > 10)
            break;
    }
    pause;
}


QBDS Select sieht in Ordnung aus
Code:
SELECT *
FROM InventTable OUTER JOIN * FROM CustVendExternalItem WHERE
InventTable.ItemId = CustVendExternalItem.ItemId AND
((((InventTable.ItemId Like "MUTT*") || (ExternalItemId Like "MUTT*"))))


Siehe da, kein Absturz, jedoch wird die Query im SQL komplett komisch interpretiert. Auf jeden fall nicht so wie ich mir einen outer Join
vorstellen würde und die Einschränkungen werden nicht berücksichtigt. D.h das zurückgelieferte ResultSet is falsch. (Liefert alles)

Code:
SELECT * FROM  {oj INVENTTABLE A LEFT OUTER JOIN CUSTVENDEXTERNALITEM B ON ((B.DATAAREAID=?) AND (((A.ITEMID LIKE ? ESCAPE '\' ) OR (B.EXTERNALITEMID LIKE ? ESCAPE '\' )) AND (A.ITEMID=B.ITEMID)))} WHERE (A.DATAAREAID=?) ORDER BY A.DATAAREAID,A.ITEMID [Kennung=471, Wiederverwendet=Nein]


Jemand schon mal sowas in der Richtung probiert oder ne Idee wie ich AX dazu bringen kann mir zu gehorchen ;)