2014-02-13 54 views
0

我有一个组合框小部件。我想创建一个依赖于组合框的WHERE语句。Progress Openedge条款取决于条件

如果组合框的值为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

而是结合在这两个条件的WHERE短语(这可能会导致使用索引的任何机会),为什么不定义查询并根据CB-Customer打开它。

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子句的第一部分)的所有客户以及具有与ComboBox匹配的CustNum的所有客户(假定CB-Customer是ComboBox)。最有可能的将是所有的客户。 – Jensd

+0

@Jensd你错了。如果CB-CUstomer = 0 **,where子句将只匹配CustNum> = 0 **的所有客户。如果CB-CUstomer <> 0 **,它将匹配来自CB-CUstomer的客户。 这是正确的或杀死性能,但我想展示最简单的可能的解决方案。 –

+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. 

我宁愿做任何两个不同的FOR 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. 

或用单独的查询,准备的语句的查询:

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.