0

私は Oracle Forms Builder を使用しており、複数のレコードを含むブロックがあります。コードは次のようになります

first_record;
IF NAME_IN('SYSTEM.LAST_RECORD') != 'TRUE' THEN                                 
  LOOP                  
    IF name_in('QOTLNDET_LINES.SERIAL_NUMBER') IS NOT NULL THEN                         
      QOTLNDET_LINES_REMOVE.Delete_Row;
      clear_record;     
    ELSE                    
      next_record;
    END IF;
    EXIT WHEN NAME_IN('SYSTEM.LAST_RECORD') = 'TRUE';

  END LOOP;
  execute_query;
  COMMIT;
  go_block('QOTHDDET_MAIN');
END IF; 

ELSE セグメント内の next_record の直前で、現在のレコードを削除して再挿入する必要があります。問題はレコードを削除することではなく、再挿入することです。何か案は?前もって感謝します。

4

2 に答える 2

2

私はAPCに同意します。レコードを再挿入することは、レコードを削除してから再度挿入することを意味しますが、より簡単なアプローチは、DB(または非DB)ブロックのフィールドを更新することです。何かのようなもの-

Go_Block('Block_B1');
Last_Record;
L_num_records := :system.cursor_record;
FOR i in 1..L_num_records
LOOP    
     Go_Block('Block_B1');
     Go_Record(i);
     --update the fields in the row
     :Block_B1.item1 := 'Set your value';
     :Block_B1.item2 := 'Set your value';
     ...
     ...
     Next_Record;
END LOOP;
First_Record;
于 2012-10-18T19:17:32.313 に答える
0

APC と Annjawn の意見に同意しますが、アップデートは正しい方法だと思われます。コードを見ると、コードが pll ライブラリにあるようです。これは、アイテムを直接参照する代わりに name_in() を使用している場合です。これが真の場合、値をアイテムに割り当てるときに直接参照を当然使用できないことを意味します。代わりに、copy() を使用する必要があります。name_in() と copy() を使用してからしばらく経ちましたが、次のようなものが機能するはずです。

IF NAME_IN('SYSTEM.LAST_RECORD') != 'TRUE' THEN                                 
  LOOP                  
    IF name_in('QOTLNDET_LINES.SERIAL_NUMBER') IS NOT NULL THEN                         
      QOTLNDET_LINES_REMOVE.Delete_Row;
      clear_record;     
    ELSE        
      Copy('new value', 'QOTLNDET_LINES.INVENTORY_ITEM');

      next_record;
    END IF;
    EXIT WHEN NAME_IN('SYSTEM.LAST_RECORD') = 'TRUE';

  END LOOP;
  execute_query;
  COMMIT;
  go_block('QOTHDDET_MAIN');
END IF; 
于 2012-10-19T08:02:12.467 に答える