2016-05-16 10 views
0

プログラム:これは単なる保守プログラムで、これは1つのフレームにアイテムコードを表示し、入力を促します。アイテムコードを入力すると、pt_mstrにそのレコードの空白のフィールドが表示され、1つのフレームに表示されます(すべての空白フィールドを表示する必要はありません。また、そのフレーム内では、ユーザーがメインテーブルpt_mstrに直接更新を更新したい場合にのみ使用します。フィールド名を動的に取得し、それを進行中のメインテーブルに更新する方法

私はちょうどバッファハンドルを使用して空のフィールドを取得するためのコードを書いて、その後私は1つのテンポラリテーブルを作成し、フィールドを表示すると、私はそれ自身を打ち、フィールドを更新できません。

マイコード:

/*Sample Item master Maintenance Program*/ 
/* DISPLAY TITLE */ 
{us/mf/mfdtitle.i "3+ "} 
DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO. 
DEFINE VARIABLE i  AS INTEGER NO-UNDO. 
DEFINE VARIABLE j  AS INTEGER NO-UNDO. 
DEFINE VARIABLE hField AS HANDLE NO-UNDO. 
define variable fldnm as character extent 10 no-undo. 
define temp-table tt_temp no-undo 
    field tt_part like pt_part 
    field field1 as char extent 10. 
form 
    pt_part colon 25 
    with frame a side-labels width 80. 
    setFrameLabels(frame a:handle). 
/* DISPLAY */ 
view frame a. 
repeat with frame a: 
    prompt-for pt_part 
     editing: 
    /* FIND NEXT/PREVIOUS RECORD */ 
    {us/mf/mfnp.i pt_mstr pt_part "pt_mstr.pt_domain = global_domain and pt_part" pt_part pt_part pt_part } 
    if recno <> ? then 
      do: 
display pt_part. 
      find pt_mstr where pt_part = input pt_part and pt_domain=global_domain no-lock no-error. 
       ASSIGN hBuffer = BUFFER pt_mstr:HANDLE. 
       empty temp-table tt_temp. 
       j = 1. 
       DO i = 1 TO 10: 
       ASSIGN hField = hBuffer:BUFFER-FIELD(i).                    
        IF ((hField:BUFFER-VALUE = "")) THEN       
          do:   
          /* message hField:NAME "test" view-as alert-box.*/ 
          find first tt_temp where tt_part = pt_part no-lock no-error. 
          if not avail tt_temp then 
           do: 
           create tt_temp. 
           assign 
           tt_part = pt_part 
           field1[j] = hField:NAME. 
           j = j + 1. 
           end. 
else do: 
        assign 
         field1[j] = hField:NAME. 
         j = j + 1. 
       end. 
      end. 
        end. 
      end. 
       for each tt_temp: 
       display field1[1] field1[2] field1[3] field1[4]. 
       end. 
    end.                                  
end. 

答えて

0

は、あなたがこれを行うには、あなたの一時-テーブルを必要とするあなたは確かにいますか?私は、実際のテーブルだけを使用して(しかし、代わりに偽の一時テーブルを作成した)例を作成しました。これを実稼働環境に組み込む前に、データエラー処理、データ検証、トランザクション、ロックなどを調べなければなりません。

/*First we need some fake data */ 
DEFINE TEMP-TABLE ttMockedData NO-UNDO 
    FIELD id AS INTEGER 
    FIELD dataName   AS CHARACTER FORMAT "x(8)" 
    FIELD dataType   AS CHARACTER FORMAT "x(8)" 
    FIELD dataDescrioption AS CHARACTER FORMAT "x(32)". 

DEFINE VARIABLE iId  AS INTEGER  NO-UNDO. 
DEFINE VARIABLE iSearch AS INTEGER NO-UNDO LABEL "Search". 

PROCEDURE createData: 
    DEFINE INPUT PARAMETER pcName AS CHARACTER NO-UNDO. 
    DEFINE INPUT PARAMETER pcType AS CHARACTER NO-UNDO. 
    DEFINE INPUT PARAMETER pcDesc AS CHARACTER NO-UNDO. 

    iId = iId + 1. 

    CREATE ttMockedData. 
    ASSIGN 
     ttMockedData.id  = iId 
     ttMockedData.dataName = pcName 
     ttMockedData.dataType = pcType 
     ttMockedData.dataDesc = pcDesc. 

END PROCEDURE. 

RUN createData("Test 1", "TESTTYPE", "A TEST"). 
RUN createData("Test 2", "", "ANOTHER TEST"). 
RUN createData("", "TESTTYPE 2", ""). 
RUN createData("4", "", ""). 

/* Program starts here */ 
updating: 
REPEAT: 

    UPDATE iSearch WITH FRAME x0. 
    IF iSearch > 0 THEN DO: 
     FIND FIRST ttMockedData NO-LOCK WHERE ttMockedData.id = iSearch NO-ERROR. 
     IF NOT AVAILABLE ttMockedData THEN DO: 
      MESSAGE "Not found" VIEW-AS ALERT-BOX ERROR. 
      RETURN ERROR. 
     END. 
     ELSE DO: 

      DISP ttMockedData WITH FRAME x1 1 COLUMNS SIDE-LABELS. 

      /* Is there an empty field? - Then we update! */ 
      IF ttMockedData.dataName   = "" 
      OR ttMockedData.dataType   = "" 
      OR ttMockedData.dataDescrioption = "" THEN DO: 

       DISPLAY 
        ttMockedData.dataName 
        ttMockedData.DataType 
        ttMockedData.dataDesc 
        WITH FRAME x2 1 COLUMN SIDE-LABELS TITLE "Complete the data...". 

       /* This isn't working with temp-tables of course! */ 
       /* Just here to make sure you handle locking! */ 
       FIND CURRENT ttMockedData EXCLUSIVE-LOCK. 

       UPDATE                
        ttMockedData.dataName WHEN ttMockedData.dataName = ""    
        ttMockedData.DataType WHEN ttMockedData.DataType = ""    
        ttMockedData.dataDesc WHEN ttMockedData.dataDesc = ""    
        WITH FRAME x2. 

       /* This isn't working with temp-tables of course! */ 
       /* Just here to make sure you handle locking! */ 
       FIND CURRENT ttMockedData NO-LOCK. 
      END. 


     END. 
    END. 
    ELSE LEAVE updating. 
END. 
+0

こんにちは@Jensd、あなたは私の明確なポイントを得ましたか?アイテムコードを入力すると、そのアイテムのpt_mstrを検索し、そのレコードの空白フィールドとそのフィールドを表示します。更新するとpt_mstrに反映されます。 –

+0

@LovelyBobby私は、私の例がそうしていると言います - フィールドの動的マッチングなしで(それはもちろん追加することができます)。 – Jensd

+0

フィールドの動的マッチングでは不可能ですか? bczあなたのソリューション私は自分のコードで使用することはできません、私の問題のために私に最高のソリューションをsuggetしますか? –

関連する問題