Вставка записи в формы оракула

Я работаю с 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 мне нужно удалить текущую запись и вставить ее заново. Проблема не в удалении записи, а в ее повторной вставке. Любые идеи? Заранее спасибо.


person Nacho321    schedule 18.10.2012    source источник
comment
Почему вы хотите сделать эту необычную вещь, а не просто сделать обновление?   -  person APC    schedule 18.10.2012
comment
Я не уверен, обновит ли обновление зависимые поля... Но если обновления обновятся, тогда скажите мне, как сделать обновление: P   -  person Nacho321    schedule 18.10.2012


Ответы (2)


Я согласен с APC, вместо повторной вставки записи, что означает удаление, а затем вставку ее снова, более простым подходом было бы просто обновить поля в блоке БД (или не БД). Что-то типа-

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;
person AnBisw    schedule 18.10.2012
comment
Блок QOTLNDET_LINES, а элемент INVENTORY_ITEM... Я делаю следующее: :QOTLNDET_LINES.INVENTORY_ITEM = 'abc', но постоянно получаю сообщение об ошибке. - person Nacho321; 18.10.2012
comment
@ Nacho321: самое главное, что вы можете сделать сейчас, это прочитать сообщение об ошибке. Или вы хотите, чтобы мы догадались, какую ошибку вы получаете? Это может быть весело... - person Jeffrey Kemp; 19.10.2012

Я согласен с 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; 
person Peter Å    schedule 19.10.2012