首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Progress-4GL中创建缓冲区时,可以指定缓冲区的内容吗?

在Progress-4GL中创建缓冲区时,可以指定缓冲区的内容吗?
EN

Stack Overflow用户
提问于 2021-03-26 19:39:33
回答 3查看 56关注 0票数 1

新手在这里进步和自学,同时工作,非常抱歉,如果我错过了一些明显的东西。我昨天学习了buffers,我想知道是否有可能界定buffer将搜索的范围。下面是我想知道的一个例子。

代码语言:javascript
复制
DEFINE BUFFER ex1 FOR emit WHERE emit.id > 50000.

FOR EACH ex1:
    DISP ex1.id ex1.name.
end.

我知道我可以在本例中的FOR EACH部分中放置WHERE,但我想知道是否以及如何界定缓冲区,以便可以在这里的代码中执行我想要做的事情。

谢谢你的帮助。

编辑:我将把我写的代码放在这里,这样更容易理解我的意思。除了使用临时表之外,我真的看不到任何其他的解决方案,而且它会使一切变得如此缓慢。我会像这样保留我的代码,但如果有人知道更好的解决方案,请给我一个呼声。再次感谢您的宝贵时间。

代码语言:javascript
复制
def var contador as int.
def var contador2 as int.
def var contador3 as int.

def temp-table tt-min-oper 
field it-codigo like operacao.it-codigo
field num-id-operacao like operacao.num-id-operacao
field op-codigo like operacao.op-codigo
.

def temp-table tt-oper 
field it-codigo like operacao.it-codigo
field op-codigo like operacao.op-codigo
.

def temp-table tt-valida-oper 
field it-codigo like operacao.it-codigo
.

for each operacao NO-LOCK
break by operacao.it-codigo by operacao.num-id-operacao:
    IF FIRST-OF (operacao.it-codigo) THEN DO:
        
        CREATE tt-min-oper.
        ASSIGN
        tt-min-oper.it-codigo = operacao.it-codigo
        tt-min-oper.num-id-operacao = operacao.num-id-operacao
        tt-min-oper.op-codigo = operacao.op-codigo
        .
    END.
END.

FOR EACH tt-min-oper WHERE tt-min-oper.op-codigo <> 10 NO-LOCK:
    create tt-oper.
    assign tt-oper.it-codigo = tt-min-oper.it-codigo.
END.


FOR EACH operacao NO-LOCK,
    EACH tt-oper
    WHERE operacao.it-codigo = tt-oper.it-codigo
    AND operacao.op-codigo = 10 NO-LOCK:
       
        create tt-valida-oper.
        assign
        tt-valida-oper.it-codigo = operacao.it-codigo.
    
END.
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-03-27 15:24:51

对OP的扩展问题的回答。

在不知道用例和表关系细节的情况下回答这个问题总是很困难的。但是从你的代码来看:

在最后的FOR EACH中,您只需迭代其中it-codigo唯一的operacao记录(然后将其放入tt-min-oper中)。然后,为op-codigo <> 10过滤tt-min-oper,并将结果记录添加到tt-oper中。

因此,此时tt-oper应该包含具有唯一it-codigo值和op-codigo <> 10的记录。

所以至少在这里你不需要这个循环:

代码语言:javascript
复制
FOR EACH tt-min-oper WHERE tt-min-oper.op-codigo <> 10 NO-LOCK:
    create tt-oper.
    assign tt-oper.it-codigo = tt-min-oper.it-codigo.
END.

就像在初始版本中一样,你也可以在op-codigo <> 10上进行过滤:

代码语言:javascript
复制
for each operacao WHERE operacao.op-codigo <> 10 NO-LOCK
break by operacao.it-codigo by operacao.num-id-operacao:

在可操作的操作中有多少条记录?有没有一个索引把它-codigo作为第一个字段?FOR EACH with BREAK-BY仍将检索表中的所有记录,但只处理第一个(it-codigo)记录。这可能是一个非常繁重的操作。

在大型表中,if最好这样做,而不是FOR EACH with BREAK-BY。我的Order表有700000条记录,所以这里处理所有700000条记录:

代码语言:javascript
复制
FOR EACH Order BREAK BY Order.Salesrep:
        
    IF FIRST-OF (Order.Salesrep) THEN
    DO:
        DISPLAY Order.Salesrep . 
    END.
END.

这里的get是相同的结果,但只读取了10条记录(数据库中有10个Salesrep)。但这只有在Salesrep字段有索引时才有可能。

代码语言:javascript
复制
DEFINE VARIABLE cPrevious-Salesrep AS CHARACTER NO-UNDO . 

FIND FIRST Order WHERE Order.Salesrep > cPrevious-Salesrep
    NO-LOCK NO-ERROR . 
    
DO WHILE AVAILABLE (Order):
    DISPLAY Order.Salesrep WITH DOWN . 
    DOWN 1 .
    
    ASSIGN cPrevious-Salesrep = Order.Salesrep. 

    FIND NEXT Order WHERE Order.Salesrep > cPrevious-Salesrep
        NO-LOCK NO-ERROR . 
END.

因此,要优化您的代码,您需要了解您的DB模式和实际数据。

票数 1
EN

Stack Overflow用户

发布于 2021-03-26 19:43:00

您限制了查询中的结果,在您的案例中使用FOR EACH语句,因此

代码语言:javascript
复制
DEFINE BUFFER ex1 FOR emit .

FOR EACH ex1 WHERE ex1.id > 50000:
    DISP ex1.id ex1.name.
end.
票数 1
EN

Stack Overflow用户

发布于 2021-03-29 19:46:28

我之前发布的代码花了几分钟才编译完成。我设法通过将FOR EACH放入另一个中来减少它(现在只需要25秒)。不幸的是,我不能在第一个FOR EACH中过滤op-codigo <> 10,因为它会改变结果。我没有使用USE-INDEX,因为我读到Tom Bascom说它不好,但我们正在使用的表中有索引。我对表格了解不多,因为我在这里是新手,我还在学习很多东西。

因此,我的代码类似于下面的示例。我不知道把每个FOR放在另一个里面是否好,我总是避免这样做,但我所有的同事都这么做。

代码语言:javascript
复制
DEF TEMP-TABLE tt-min-oper 
FIELD it-codigo         LIKE operacao.it-codigo
FIELD num-id-operacao   LIKE operacao.num-id-operacao
FIELD op-codigo         LIKE operacao.op-codigo
.

DEF TEMP-TABLE tt-valida-oper 
FIELD it-codigo LIKE operacao.it-codigo
FIELD num-id-operacao   LIKE operacao.num-id-operacao
.


FOR EACH operacao NO-LOCK
BREAK BY operacao.it-codigo BY operacao.num-id-operacao:
    IF FIRST-OF (operacao.it-codigo) THEN DO:
    CREATE tt-min-oper.
       ASSIGN
       tt-min-oper.it-codigo = operacao.it-codigo
       tt-min-oper.num-id-operacao = operacao.num-id-operacao
       tt-min-oper.op-codigo = operacao.op-codigo
       .          
     END.
 END.

FOR EACH tt-min-oper
WHERE tt-min-oper.op-codigo <> 10 NO-LOCK:
    FOR EACH operacao
    WHERE operacao.it-codigo = tt-min-oper.it-codigo
    AND operacao.op-codigo = 10 NO-LOCK:
        CREATE tt-valida-oper.
        ASSIGN
        tt-valida-oper.it-codigo = operacao.it-codigo
        tt-valida-oper.num-id-operacao = tt-min-oper.num-id-operacao
        .
    END.
END.

我不能找到我想要的缓冲区的解决方案,但我设法以一种我以前从未做过的方式做到了,所以我认为这是一次胜利。谢谢你的时间和建议,迈克,如果还有其他建议,我很乐意接受。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66816237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档