【问题标题】:Returning to a text field block again from the query再次从查询返回到文本字段块
【发布时间】:2014-03-27 10:09:46
【问题描述】:

我有一个表单提示输入客户姓名并将该值传递给查询,

FORM compname 
            customer.cusname 
            WITH FRAME f1.
            UPDATE compname WITH FRAME f1.

此表单会将 compname 值传递给以下查询,

FOR EACH customer WHERE  customer.name = compname NO-LOCK :
               if available(company) then 
                do:
                CREATE temptt.
                assign temptt.num     = customer.kco
                       temptt.no  = string(customer.kco)
                       temptt.name  = customer.name
                       temptt.status = false.
                END.
              else 
              message "not matched " view-as alert-box.
              end. 

我想要做的是,如果搜索没有收到任何行,它应该再次提示输入客户姓名。我该怎么办??

我如何在“其他块”中再次调用该表单,而且,目前我在该字段中给出完整名称,但我想给出部分名称,例如,客户名称是“John Smith Doe”,如果我输入“Smith”,它应该检索相关的行。我应该如何为此更改“Where”子句?请帮帮我。

【问题讨论】:

    标签: progress-4gl openedge


    【解决方案1】:

    重复搜索

    这可以通过多种方式完成。这是一个例子:

    DEFINE TEMP-TABLE customer NO-UNDO
        FIELD cusname AS CHARACTER
        FIELD num     AS INTEGER.
    
    DEFINE VARIABLE compnum  AS INTEGER     NO-UNDO.
    DEFINE VARIABLE compname AS CHARACTER   NO-UNDO.
    
    DEFINE QUERY qSearch FOR customer.
    
    FORM compname compnum WITH FRAME f1. 
    
    /* Create some bogus data */
    CREATE customer.
    ASSIGN customer.cusname = "john doe"
           customer.num     = 1.
    CREATE customer.
    ASSIGN customer.cusname = "jane doe"
           customer.num     = 2.   
    CREATE customer.
    ASSIGN customer.cusname = "name name"
           customer.num     = 3.    
    
    loop:
    REPEAT:
    
        CLEAR FRAME f2 ALL.
    
        UPDATE compname compnum WITH FRAME f1.
    
        /* Quit if neither name or number is entered */
        IF compname = "" AND compnum = 0 THEN
            LEAVE loop.
    
        /* If num is entered - search by it, otherwise by name */
        IF compnum <> 0 THEN DO:
            OPEN QUERY qSearch FOR EACH customer NO-LOCK WHERE customer.num = compnum.
        END.
        ELSE DO:
            OPEN QUERY qSearch FOR EACH customer NO-LOCK WHERE customer.cusname MATCHES "*" + compname + "*".
        END.
        GET NEXT qSearch.
    
        DO WHILE AVAILABLE customer:
    
            IF AVAILABLE customer THEN DO:
                DISPLAY customer WITH FRAME f2 10 DOWN.
                DOWN WITH FRAME f2.
            END.
            GET NEXT qSearch.
        END.
    
        /* If we have results - leave the loop otherwise try again */
        IF QUERY qSearch:NUM-RESULTS = 0 THEN
            LEAVE loop.
    
    END.
    
    MESSAGE "Quitting" VIEW-AS ALERT-BOX.
    

    搜索部分名称

    有几个用于匹配字符串的运算符:

    开始

    测试一个字符表达式以查看该表达式是否以第二个字符表达式开头。

    语法:

    expression1 BEGINS expression2 
    

    例子:

    FOR EACH customer WHERE NO-LOCK customer.cusname BEGINS "john":
    

    比赛

    将字符表达式与模式进行比较,如果表达式满足模式条件,则计算结果为 TRUE。

    模式可以包含通配符:在特定位置的句点 (.) 表示该位置可以接受任何单个字符;星号 (*) 表示可接受任何字符组,包括空字符组。

    语法:

    expression1 MATCHES expression2 
    

    例子:

    FOR EACH customer NO-LOCK WHERE customer.cusname MATCHES "*doe*":
    

    MATCHES 听起来像您所追求的,但请注意: MATCHES 不会利用数据库中的索引,因此将扫描整个表。这可能/将影响性能,并可能使您的查询花费很长时间。

    上面用 MATCHES 替换的 WHERE 子句看起来像这样:

    FOR EACH customer NO-LOCK WHERE  customer.cusname MATCHES "*" + compname  + "*":
    

    包含

    还有第三个称为 CONTAINS 的运算符,它使用称为 WORD 索引的东西。这将要求您或您的 DBA 首先在数据库中创建此类索引。在在线帮助或此处的 PDF 中阅读有关单词索引和 CONTAINS 的更多信息:Progress ABL Reference(第 1004 页)。

    CONTAINS 可能比 MATCHES 更好,但也需要您对数据库进行更改。

    【讨论】:

    • Matches and Begins 将查找值的结束和开始部分。但我想检索结果“John Smith Doe”,所以输入可能是“John”“Doe”“Smith”,但我应该得到结果“John Smith Doe”。这是哪个运营商做的??
    • BEGINS 将查找开头,如果您这样做, MATCHES 将查找任何部分:字段 MATCHES "doe" - 请参阅开头和结尾的星号。如果您这样做:字段 MATCHES "john*" 它将像 BEGINS 一样工作(仅匹配开头) - 但仍然没有索引。像这样:字段 MATCHES "*smith" 只匹配结尾。我在上面的答案中添加了一个示例。
    • 但我的条件是 customer.num = cusnum 或 customer.name 匹配 "" + cusname + "" 。如果我给出 cusname,它会给出正确的结果,但它会在 cusnum 归档时出现问题。它正在检索太多行而不是一行,oif 我输入 cusnum。
    • 更改了示例以反映这一点...现在,如果您输入除 0 以外的任何数字作为数字,它将按它搜索 - 否则按名称搜索。既不输入姓名也不输入号码,它将退出。
    • 对不起,我没明白你的意思!
    猜你喜欢
    • 2016-04-02
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多