QUERY-PREPARE() 加载时间过长。这是最好的选择吗?

QUERY-PREPARE() taking too long to load. Is it the best option?

每个it-codigo都有1个或多个es-codigo。我试图找到 it-codigo 输入的所有 es-codigo,但它花费的时间太长了。我的代码有没有做错什么?对于我所看到的,没关系,除非有一些我不知道的事情我做错了。在这种情况下,QUERY-PREPARE() 是最佳选择吗?

    DEF VAR qEstrutura AS CHAR.

IF pi-cod-emitente <> 0 THEN DO:
    qEstrutura = " WHERE item-cli.cod-emitente = " + QUOTER(pi-cod-emitente).
END.

IF pc-it-codigo <> "" THEN DO:
    IF qEstrutura = "" THEN
        qEstrutura = " WHERE estrutura.it-codigo = " + QUOTER(pc-it-codigo).
    ELSE
        qEstrutura = qEstrutura + " AND estrutura.it-codigo = " + QUOTER(pc-it-codigo).
END.

IF pc-item-cli <> "" THEN DO:
    IF qEstrutura = "" THEN 
        qEstrutura = " WHERE item-cli.item-do-cli = " + QUOTER(pc-item-cli).
    ELSE
        qEstrutura = qEstrutura + " AND item-cli.item-do-cli = " + QUOTER(pc-item-cli).
END.


cQuery = cQuery + " FOR EACH item-cli, ".
cQuery = cQuery + " EACH estrutura ".
cQuery = cQuery + qEstrutura + " BREAK BY estrutura.es-codigo".


QUERY qConsulta:QUERY-PREPARE(cQuery).

QUERY qConsulta:QUERY-OPEN().

GET FIRST qConsulta.

DO WHILE AVAILABLE item-cli:

    IF QUERY qConsulta:FIRST-OF(1) THEN DO:
    
        CREATE tt-estrutura.
        ASSIGN
        tt-estrutura.it-codigo = estrutura.it-codigo
        tt-estrutura.es-codigo = estrutura.es-codigo
        .
        GET NEXT qConsulta.
    END.
END.

QUERY qConsulta:QUERY-CLOSE().


FOR EACH tt-estrutura:
    DISP tt-estrutura.
END.

我认为是 QUERY-OPEN() 需要时间。不是查询准备()。

您的查询仅在第二个 table 上执行选择 (WHERE) 和排序 (BY)。这使得难以利用印地安人。 OpenEdge ABL 查询引擎不支持翻转缓冲区序列。尝试扭转查询:

FOR EACH estrutura WHERE ......, FIRST item-cli.