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.
每个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.