如何在8.3c中执行动态查询?在V8.3c中我不能做的是拥有一个动态缓冲区,所以我可以像10.2b中的这些代码一样动态运行所有表 .
DEFINE VARIABLE QueryHandler AS HANDLE NO-UNDO.
DEFINE VARIABLE QueryBuffer AS HANDLE NO-UNDO.
DEFINE VARIABLE QueryString AS CHARACTER NO-UNDO.
DEFINE VARIABLE BufferFields AS CHARACTER NO-UNDO.
_TransactMain:
DO ON ERROR UNDO, LEAVE:
CREATE QUERY QueryHandler.
_TableLoop:
FOR EACH ttTableFields NO-LOCK /* filtered System Table */
BREAK BY tablename:
IF FIRST-OF(tablename) THEN DO:
ASSIGN
QueryString = "For each " + TableFields.TableName + ":"
BufferFields = "".
END.
/* Delimited Fields */
/* Loop through fields -1 to avoid null at end */
ASSIGN
BufferFields = TableFields.FieldName + ";" + BufferFields.
IF LAST-OF(TableName) THEN DO:
/* Create Buffer to selected group of fields */
CREATE BUFFER QueryBuffer FOR TABLE TableFields.TableName NO-ERROR.
IF ERROR-STATUS:ERROR = TRUE THEN DO:
NEXT _TableLoop.
END.
/* Set this as current buffer handled by Query */
QueryHandler:SET-BUFFERS(QueryBuffer) NO-ERROR.
IF ERROR-STATUS:ERROR = TRUE THEN DO:
NEXT _TableLoop.
END.
/* Prepare query string and also check if correct syntax */
QueryHandler:QUERY-PREPARE(QueryString) NO-ERROR.
IF ERROR-STATUS:ERROR = TRUE THEN DO:
NEXT _TableLoop.
END.
/* Execute Query and Check if valid query*/
QueryHandler:QUERY-OPEN() NO-ERROR.
IF ERROR-STATUS:ERROR = TRUE THEN DO:
NEXT _TableLoop.
END.
ELSE DO: /* If all above are correct */
IF QueryHandler:GET-FIRST(NO-LOCK) = TRUE THEN DO:
RUN DoReplace(BufferFields).
END.
ELSE DO:
NEXT _TableLoop.
END.
END.
END.
END.
END.
这是我的DoReplace程序:
DEFINE INPUT PARAMETER chkFields AS CHARACTER NO-UNDO.
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DO WHILE queryBuffer:AVAILABLE:
DO TRANSACTION i = 1 TO NUM-ENTRIES(chkFields,";") - 1:
/* Code Incomplete */
queryBuffer:BUFFER-FIELD(ENTRY(i,chkFields,";")):BUFFER-VALUE.
END.
QueryHandler:GET-CURRENT(NO-LOCK).
QueryHandler:GET-NEXT(NO-LOCK).
END.
这些代码在v8.3c中无法运行,因为它不支持动态查询 . 我在v8.3c中找不到解决方法 .
2 回答
版本8当然是史前的 .
在版本8及更早版本中,您将通过“即时编译”(需要编译器许可证)来实现此类操作 .
就像是:
然后你调用传递你的变量位作为参数,如下所示:
这比v9动态查询要困难得多,并且编译器要求会阻止很多用途,但对于你正在做的事情来说它可能已经足够了 .
动态查询直到9.0才可用,因此您的8. *应用程序运气不佳 .