1

我正在尝试编写一个模块化过程,在其中传入表名的字符串表示形式,并查询/更新该表。

我尝试的是对此产生影响的东西:

PROCEDURE foo:
    DEFINE INPUT PARAMETER chTableName AS CHARACTER NO-UNDO.
    FIND FIRST VALUE(chTableName) NO-LOCK
    WHERE blahblahblah NO-ERROR.

    IF AVAIL VALUE(chTableName) THEN
    ASSIGN
         VALUE(chTableName).value = foo.
END PROCEDURE.

这显然是行不通的,但希望这能说明我想要完成的事情。

任何有关此事的帮助或信息将不胜感激。谢谢。

4

2 回答 2

3

希望您在可以使用动态查询的情况下运行版本 9 或更高版本。

procedure x:

  define input parameter tbl as character no-undo.
  define input parameter fld as character no-undo.
  define input parameter xyz as character no-undo.

  define variable qh as handle no-undo.
  define variable bh as handle no-undo.
  define variable fh as handle no-undo.

  create buffer bh for table tbl.
  create query qh.
  qh:set-buffers( bh ).
  qh:query-prepare( "for each " + tbl ).
  qh:query-open.

  do transaction:
    qh:get-first( exclusive-lock ).
    fh = bh:buffer-field( fld ).
    display fh:buffer-value.
    fh:buffer-value = xyz.
  end.

  delete object bh.
  delete object qh.

  return.

end.

run x ( "customer", "name", "fred" ).

find first customer no-lock.
display name.
于 2013-08-30T13:47:47.860 回答
2

这可以让你开始:

DEFINE TEMP-TABLE tt NO-UNDO
    FIELD a AS INTEGER.

PROCEDURE foo:
    DEFINE INPUT  PARAMETER pcTable AS CHARACTER   NO-UNDO.
    DEFINE INPUT  PARAMETER pcWhere AS CHARACTER   NO-UNDO.
    DEFINE INPUT  PARAMETER pcField AS CHARACTER   NO-UNDO.
    DEFINE INPUT  PARAMETER piValue AS INTEGER     NO-UNDO.

    DEFINE VARIABLE hBuffer AS HANDLE      NO-UNDO.
    DEFINE VARIABLE hQuery  AS HANDLE      NO-UNDO.

    CREATE BUFFER hBuffer FOR TABLE pcTable.
    CREATE QUERY hQuery.   

    hQuery:SET-BUFFERS(hBuffer).

    hQuery:QUERY-PREPARE("FOR EACH " + pcTable + " WHERE " + pcWhere).

    hQuery:QUERY-OPEN().
    hQuery:GET-FIRST().

    IF hBuffer:AVAILABLE THEN DO:
        ASSIGN 
            hBuffer:BUFFER-FIELD(pcField):BUFFER-VALUE = piValue NO-ERROR.
        IF ERROR-STATUS:ERROR THEN DO:
            MESSAGE "Failed" VIEW-AS ALERT-BOX ERROR.
        END.
    END.

    DELETE OBJECT hBuffer.
    DELETE OBJECT hQuery.


END PROCEDURE.

CREATE tt.
ASSIGN tt.a = 1.


RUN foo( INPUT "tt"
       , INPUT "tt.a = 1"
       , INPUT "a"
       , INPUT 2).

DISPLAY tt.
于 2013-08-30T13:43:25.403 回答