2016-10-27 2 views
1

Sales 테이블과 Sales Line 테이블을 쿼리의 데이터 소스로 사용하는 쿼리가 있습니다 (덕분에 도움이 된 모든 사람들 덕분에!). 쿼리 실행 섹션에서 판매 주문에 둘 이상의 판매 라인이 연결되어있는 경우 판매 라인에 대한 결과를 반복하는 방법은 무엇입니까? 당신이 InnerJoin를 사용해야하는 경우에X ++ QueryBuilder 중첩 된 결과

static void TestQuery(Args _args) 

{ 

    SalesTable salesTable; 
    SalesLine salesLine; 
    QueryBuildRange  querybuildrange; 
    utcDateTime   mutcDateTime; 
    date     mDate; 

    QueryRun queryrun = new QueryRun(new Query()); 
    QueryBuildDataSource datasourceA = queryrun.query().addDataSource(tableNum(SalesTable)); 
    QueryBuildDataSource datasourceB = datasourceA.addDataSource(tableNum(SalesLine)); 

    mDate  = str2Date("25/09/2016", 123); 
    mutcDateTime = DateTimeUtil::newDateTime(mDate,0); 
    querybuildrange = datasourceA.addRange(FieldNum(SalesTable, CreatedDateTime)); 
    querybuildrange.value(strFmt('>%1', mutcDateTime)); 

    datasourceB.relations(true); // Link on SalesId 
    datasourceB.joinMode(JoinMode::ExistsJoin); 

    info(datasourceA.toString());  // This is the full query 

    while (queryrun.next()) 
    { 
     salesTable = queryrun.get(tableNum(SalesTable)); 
     salesLine = queryrun.get(tableNum(SalesLine)); 
     info(salesTable.SalesId); 
     info(salesline.Name); 
    } 
} 

답변

2

당신은 ExistsJoins을 사용하고 있습니다.

변경

datasourceB.joinMode(JoinMode::ExistsJoin);

datasourceB.joinMode(JoinMode::InnerJoin);

또한이 라인, 당신은 때 기록 하 확인하기 위해 queryRun.changed(...) 방법을 사용할 수 있습니다 변경되었습니다. 이와 같이 :

while (queryrun.next()) 
{ 
    if (queryrun.changed(tableNum(SalesTable))) 
    { 
     salesTable = queryrun.get(tableNum(SalesTable)); 
    } 

    salesLine = queryrun.get(tableNum(SalesLine)); 
    info(salesTable.SalesId); 
    info(salesline.Name); 
} 
+0

답장을 보내 주시면 감사하겠습니다. –

+0

당신을 진심으로 환영합니다. 맞으면 올바른 답을 표시 할 수 있습니다 ... –