оракул образуют много записей - PullRequest
0 голосов
/ 09 мая 2018

Мне нужно, чтобы все записи таблицы возвращались в основных деталях, для этого я использую триггер WHEN-VALIDATE-ITEM и использую этот код

DECLARE 
    CURSOR N IS 
          SELECT B.CODIGO_BARRA, B.REFER, B.DESC_PROD, B.CANT, B.PRECIO
          FROM PS62 B
          WHERE B.NRODOCTO = :E.NRO_DOCTO_PEDIDO
          AND B.CODCIA = :E.CODCIA;

BEGIN 
      GO_BLOCK('D');
      FIRST_RECORD;
             FOR I IN N  LOOP
                      :D.CODIGO_BARRA := I.CODIGO_BARRA;
                      :D.REFER := I.REFER;
                      :D.DESC_PROD := I.DESC_PROD;
                      :D.CANT := I.CANT;
                      :D.COSTO := I.PRECIO;
        NEXT_RECORD;
    END LOOP;
    COMMIT;
END;

это только возвращает мне одну запись. пожалуйста, помогите мне!

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Это, конечно, не способ заполнять блок данных в Oracle Forms.Даже если вам удастся это сделать, формы будут рассматривать эти строки new и - если вы попытаетесь их сохранить - вы получите нарушение первичного / уникального ключа.

Вы должны были использоватьМастер блоков данных, который проведет вас через процесс создания мастер-блока (который обычно находится в макете формы с отображением одной записи).

Затем снова запустите мастер, чтобы создать блок сведений (который обычно отображается в виде таблицы с несколькими записями).Убедитесь, что создали отношения между этими двумя блоками.

Если эти таблицы созданы надлежащим образом (т.е. имеют первичные ключи, а также внешний ключ, который устанавливает отношение мастер-подробности), формы автоматически предложат, какие столбцы следует объединить.

Как толькоМастер готов, эта форма будет работать во всех отношениях - вам не нужно писать ни одной строки кода.Таким образом, вы можете

  • запросить эти таблицы
    • запрашивающий мастер получит свои данные автоматически , без каких-либо циклов, записанных в вашей собственной программной единице
  • введите новые значения,
  • обновите или удалите существующие.

В коде, который вы написали: Барбарос сказал вам, как это исправить, ноон все равно не будет работать в триггере WHEN-VALIDATE-ITEM, поскольку вы не можете использовать в нем ограниченные процедуры (например, GO_BLOCK или FIRST_RECORD).Это действительно не имеет значения, так как то, как вы хотите это сделать, совершенно неверно.

0 голосов
/ 09 мая 2018

Зачем вам нужно COMMIT, чтобы вернуть записи.

Блок цели всегда должен быть очищен (CLEAR_BLOCK(NO_VALIDATE) необходимо для выполнения этой цели без всплывающих окон),

и, снова используя FIRST_RECORD, наведите курсор на вершину записей в конце возврата всех.

Итак, вы можете использовать следующее:

DECLARE 
    CURSOR N IS 
          SELECT B.CODIGO_BARRA, B.REFER, B.DESC_PROD, B.CANT, B.PRECIO
          FROM PS62 B
          WHERE B.NRODOCTO = :E.NRO_DOCTO_PEDIDO
          AND B.CODCIA = :E.CODCIA;

BEGIN 
      GO_BLOCK('D');
      CLEAR_BLOCK(NO_VALIDATE);
      FIRST_RECORD;
             FOR I IN N  LOOP
                      :D.CODIGO_BARRA := I.CODIGO_BARRA;
                      :D.REFER := I.REFER;
                      :D.DESC_PROD := I.DESC_PROD;
                      :D.CANT := I.CANT;
                      :D.COSTO := I.PRECIO;
        NEXT_RECORD;
    END LOOP;
   FIRST_RECORD;
END;
...