2014-02-13 1 views
0

У меня есть виджет со списком. Я хочу создать инструкцию WHERE, которая зависит от поля со списком.Прогресс Openedge Где пункт в зависимости от If Условие

Если значение поля со списком равно 0, все клиенты должны быть показаны. Если значение отличается от 0, должен отображаться только клиент, соответствующий значению со списком.

Пример:

Assign CB-Customer. 
For each Customer WHERE /* after that*/ 
/* something like this 
IF CB-CUstomer = 0 THEN ASSIGN Customer.CustNum >= 0 . 
ELSE     ASSIGN Customer.CustNum = CB-Customer . 
*/ 

Я видел код, как это раньше, но я не мог понять, как это работает.

ответ

3

Вместо сочетания обоих условий в ГДЕ фраза (которая, вероятно, убьет любую возможность использования индекса), почему бы не определить запрос и открыть его в зависимости от CB-клиента.

DEFINE QUERY q-Customer FOR Customer. 

IF CB-Customer = 0 THEN DO: 
    OPEN QUERY q-Customer 
    FOR EACH Customer 
     WHERE Customer.CustNum >= 0 
     NO-LOCK 
     . 
END. 
ELSE DO: 
    OPEN QUERY q-Customer 
    FOR EACH Customer 
     WHERE Customer.CustNum = CB-Customer 
     NO-LOCK 
     . 
END. 

GET FIRST q-Customer. 
REPEAT WHILE AVAILABLE Customer: 
    /* Whatever you want to do with the Customer record, for example: */ 
    DISPLAY Customer. 

    GET NEXT q-Customer. 
END. 

Вы можете сделать много фантазии трюки с запросами, особенно динамичных, но это должно работать в значительной степени все последние версии OpenEdge.

1
FOR EACH Customer 
    WHERE (CB-CUstomer = 0 AND Customer.CustNum >= 0) 
     OR Customer.CustNum = CB-CUstomer: 

END. 

Это должно делать то, что вы хотите, если я правильно понимаю ваш вопрос.

+0

Это фактически отображает всех клиентов, у которых есть CustNum> = 0 (первая часть предложения where) И все клиенты, у которых CustNum соответствует ComboBox (при условии, что CB-Customer - это ComboBox). Скорее всего, это будут все клиенты. – Jensd

+0

@Jensd Вы ошибаетесь. Предложение where будет соответствовать всем клиентам с CustNum> = 0 **, если CB-CUstomer = 0 **. И ** если CB-CUstomer <> 0 **, он будет соответствовать клиентам CB-CUstomer. Правильно, что OR убивает результат, но я хотел показать простейшее возможное решение. –

+0

Нет. Я действительно прав! Попробуй! – Jensd

1

Я понимаю ваш вопрос так:

Если комбо-бокс имеет нуль вы хотите отобразить все клиент значения. В противном случае вы хотите отображать только клиентов, соответствующих номеру клиента?

Вы можете сделать предложение WHERE с условием в нем, но я бы избегал этого. В этом случае запрос является очень простым, но когда они становятся более сложными (и они это делают), где предложения с условиями в них довольно трудно читать и понимать. Но я думаю, что это также касается личного выбора.

FOR EACH Customer NO-LOCK WHERE 
     Customer.CustNum = (IF CB-Customer = 0 THEN Customer.CustNum ELSE CB-Customer): 

    MESSAGE Customer.CustNum. 
END. 

я предпочел бы делать либо два отдельно для EACH'es:

IF CB-Customer = 0 THEN DO: 
    /* TABLE-SCAN is a quite new thing, might not work in your version */ 
    FOR EACH Customer NO-LOCK TABLE-SCAN: 

     MESSAGE Customer.CustNum. 
    END. 
END. 
ELSE DO: 
    FOR EACH Customer NO-LOCK WHERE Customer.CustNum = CB-Customer: 

     MESSAGE Customer.CustNum. 
    END. 
END. 

или запрос с отдельными операторами QUERY-Приготовьте:

DEFINE QUERY q FOR Customer. 
DEFINE VARIABLE cQuery AS CHARACTER NO-UNDO. 

ASSIGN CB-Customer. 

IF CB-Customer = 0 THEN DO: 
    cQuery = "FOR EACH Customer NO-LOCK". 
END. 
ELSE DO: 
    cQuery = "FOR EACH Customer NO-LOCK WHERE Customer.CustNum = " + QUOTER(cb-customer). 
END. 

MESSAGE cQuery. 

QUERY q:QUERY-PREPARE(cQuery). 

QUERY q:QUERY-OPEN(). 

GET FIRST q. 
REPEAT WHILE AVAILABLE Customer: 
    MESSAGE Customer.CustNum. 
    GET NEXT q. 
END. 

 Смежные вопросы

  • Нет связанных вопросов^_^