Как построить или условие на datasorce в коде? - PullRequest
1 голос
/ 11 февраля 2020

У меня есть две таблицы. Давайте назовем их Table1 и Table2. Мне нужно создать в коде запрос, как.

Select * from Table1 
    exists join Table2 where 
    Table1.Key == Table2.Key &&
    (Table1.A == '1' || Table2.C == '2')

Таким образом, чтобы перейти к коду я пытался:

Query                   q;
QueryBuildDataSource    qbd;
QueryBuildDataSource    ofQbds;
QueryBuildRange         qbr;
str range;
Table1 test;    
QueryRun                    qr;

q = new Query();
qbd = q.addDataSource(tableNum(Table1));
qbd .name('Table1');
ofQbds = qbd.addDataSource(tableNum(Table2));
ofQbds.name('Table2');
ofQbds.addLink(fieldNum(Table1, Key), fieldNum(Table2, Key));

ofQbds.joinMode(JoinMode::InnerJoin);
range = strFmt('%1.%2 == %3 OR %4.%5 == %6', qbd.name(), 'A', '1', 
ofQbds.name(), 'C', '5');
info(range);    
ofQbds.addRange(fieldName2id(tableNum(Table1 ), 'A')).value(range);
qr = new QueryRun(q);
while (qr.next())
{
    test = qr.get(test.TableId);
    info(test.A + ','+test.Key);
}
info('done');

Но условие или не работает должным образом. Например, если у меня есть значения

Table1
A,Key
1,1
2,2
3,3

Table2
C,Key
2,2

, я ожидал бы 2 результата из таблицы 1

1,1
2,2

, но я получаю только первый

Message 
Table1.A == 1 OR Table2.C == 2
2,2
done

Я пробовал разные Режимы соединения и переключения || и ИЛИ, но ничего из того, что я пробовал, пока не работает.

Что мне нужно изменить, чтобы иметь возможность иметь условия в коде?

1 Ответ

3 голосов
/ 11 февраля 2020

Попробуйте изменить эту строку:

range = strFmt('%1.%2 == %3 OR %4.%5 == %6', qbd.name(), 'A', '1', ofQbds.name(), 'C', '5');

на

range = strFmt('((%1.%2 == %3) || (%4.%5 == %6))', qbd.name(), 'A', '1', ofQbds.name(), 'C', '5');

Не используйте sql "или", вместо этого используйте x ++ "||"

Редактировать: см. http://www.axaptapedia.com/Expressions_in_query_ranges для получения дополнительной информации.

Редактировать 2: Этот код выполняется для меня требуемым образом. Я бы порекомендовал использовать самые современные функции времени компиляции, такие как tableNum() и fieldNum() et c.

    Query                   q;
    QueryBuildDataSource    qbd;
    QueryBuildDataSource    ofQbds;
    QueryBuildRange         qbr;
    str range;
    QueryRun                qr;
    CustTable custTable;
    CustGroup custGroup;

    q = new Query();
    qbd = q.addDataSource(tableNum(CustTable));
    ofQbds = qbd.addDataSource(tableNum(CustGroup));
    ofQbds.addLink(fieldNum(CustTable, CustGroup), fieldNum(CustGroup, CustGroup));
    ofQbds.joinMode(JoinMode::InnerJoin);

    range = strFmt('((%1.%2 == %3) || (%4.%5 == %6))',
        tableStr(CustTable), 
        fieldStr(CustTable, AccountNum), 
        '000001', 
        tableStr(CustGroup), 
        fieldStr(CustGroup, CustGroup), 
        'UAC');

    info(range);
    ofQbds.addRange(fieldNum(CustTable, AccountNum)).value(range);
    qr = new QueryRun(q);

    while (qr.next())
    {
        custTable = qr.get(tableNum(CustTable));
        info(custTable.AccountNum + ',' +custTable.CustGroup);
    }
...