新手在这里进步和自学,同时工作,非常抱歉,如果我错过了一些明显的东西。我昨天学习了buffers,我想知道是否有可能界定buffer将搜索的范围。下面是我想知道的一个例子。
DEFINE BUFFER ex1 FOR emit WHERE emit.id > 50000.
FOR EACH ex1:
DISP ex1.id ex1.name.
end.我知道我可以在本例中的FOR EACH部分中放置WHERE,但我想知道是否以及如何界定缓冲区,以便可以在这里的代码中执行我想要做的事情。
谢谢你的帮助。
编辑:我将把我写的代码放在这里,这样更容易理解我的意思。除了使用临时表之外,我真的看不到任何其他的解决方案,而且它会使一切变得如此缓慢。我会像这样保留我的代码,但如果有人知道更好的解决方案,请给我一个呼声。再次感谢您的宝贵时间。
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.发布于 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的记录。
所以至少在这里你不需要这个循环:
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上进行过滤:
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条记录:
FOR EACH Order BREAK BY Order.Salesrep:
IF FIRST-OF (Order.Salesrep) THEN
DO:
DISPLAY Order.Salesrep .
END.
END.这里的get是相同的结果,但只读取了10条记录(数据库中有10个Salesrep)。但这只有在Salesrep字段有索引时才有可能。
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模式和实际数据。
发布于 2021-03-26 19:43:00
您限制了查询中的结果,在您的案例中使用FOR EACH语句,因此
DEFINE BUFFER ex1 FOR emit .
FOR EACH ex1 WHERE ex1.id > 50000:
DISP ex1.id ex1.name.
end.发布于 2021-03-29 19:46:28
我之前发布的代码花了几分钟才编译完成。我设法通过将FOR EACH放入另一个中来减少它(现在只需要25秒)。不幸的是,我不能在第一个FOR EACH中过滤op-codigo <> 10,因为它会改变结果。我没有使用USE-INDEX,因为我读到Tom Bascom说它不好,但我们正在使用的表中有索引。我对表格了解不多,因为我在这里是新手,我还在学习很多东西。
因此,我的代码类似于下面的示例。我不知道把每个FOR放在另一个里面是否好,我总是避免这样做,但我所有的同事都这么做。
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.我不能找到我想要的缓冲区的解决方案,但我设法以一种我以前从未做过的方式做到了,所以我认为这是一次胜利。谢谢你的时间和建议,迈克,如果还有其他建议,我很乐意接受。
https://stackoverflow.com/questions/66816237
复制相似问题