Как динамически добавить одно или несколько текстовых полей в область в Oracle Apex 5.1?

Я использую Oracle Apex 5.1 для создания примера приложения. Я пытаюсь создать новые текстовые поля на основе числа, введенного в поле. На данный момент актеры в этой пьесе:

  • P11_TESTBOX: текстовое поле, содержащее количество необходимых новых полей.
  • ТЕСТ: кнопка, которая при нажатии запускает необходимые динамические действия.
  • Процедура TEST_THIS: процедура PL/SQL, которая при нажатии на кнопку запускается и создает необходимые поля.

Процедура, как написано сейчас (просто пытаюсь проверить, смогу ли я заставить ее работать перед полной реализацией):

CREATE OR REPLACE PROCEDURE TEST_THIS (
    HOW_MANY        IN NUMBER)
IS
BEGIN
    FOR I IN 1..HOW_MANY LOOP
        HTP.P('<input class="dynamicBoxes" id="P11_BOX_' || I || '" type="text" value="" />');
        HTP.P('<br/>');
    END LOOP;
END;

Как обычно, я устанавливаю динамическое действие на TEST: для события установлено значение «Click», тип выбора — «Button», кнопка — «TEST», область действия — «Static». Истинное действие — «Выполнить код PL/SQL», которое представляет собой простой вызов процедуры HOW_MANY с передачей :P11_TESTBOX в качестве номера. Я продолжал получать ошибку

Вызов Ajax вернул ошибку сервера ORA-06502: PL/SQL: ошибка числового значения или значения для выполнения кода PL/SQL

Думая, что я схожу с ума (что, честно говоря, не так уж далеко от истины на данный момент), я добавил функцию «Выполнение кода JavaScript»:

alert(document.getElementById('P11_TESTBOX').value);

Неудивительно, что число, введенное в ящик, было возвращено. К сожалению, ошибка все равно появилась.

Стремясь убедиться, что я испробовал все, я изменил синтаксис процедуры PL/SQL:

CREATE OR REPLACE PROCEDURE TEST_THIS (
    HOW_MANY        IN NUMBER)
IS
BEGIN
    FOR I IN 1..HOW_MANY LOOP
        HTP.P(
            apex_item.text(
                p_idx => 'P11_NEWBOX_0' || I,
                p_Value => ''
            )
        );
    END LOOP;
END;

Результат: оповещение по-прежнему дает мне номер; ошибка все еще следует.

Идея попробовать обе версии возникла на этом сайте.

Просто чтобы опередить себя, как только я смогу разобраться с этой проблемой, мне нужно будет захватить все значения, введенные в созданные текстовые поля, и вставить их в базу данных. Я надеюсь, что это так же просто, как использование любых созданных идентификаторов, но я не оптимистичен после этой проблемы. Любая помощь будет принята с благодарностью.


person fireside68    schedule 12.04.2018    source источник
comment
Есть ли причина не использовать интерактивную сетку?   -  person romeuBraga    schedule 12.04.2018
comment
Да, хотя есть вероятность, что для достижения моей конечной цели я могу использовать интерактивную сетку.   -  person fireside68    schedule 12.04.2018
comment
Я не уверен, но я думаю, что htp.p работает только при загрузке страницы, вы пытаетесь использовать событие клика, я думаю, что это не работает. Попробуйте поместить этот код в регион, который выполняет код pl/sql в качестве источника.   -  person romeuBraga    schedule 12.04.2018
comment
По сути, конечный результат состоит в том, чтобы позволить кому-то создать экземпляр объекта с некоторыми атрибутами. Эта сущность также может иметь несколько версий, но исходные атрибуты не меняются с каждой версией. Вместо таблицы с пятью различными копиями атрибутов для каждой версии версии представляют собой таблицу соединения, использующую идентификатор объекта в качестве внешнего ключа.   -  person fireside68    schedule 12.04.2018
comment
Ошибка сообщения, вероятно, связана с параметром p_idx, он должен быть числом. посмотрите документацию docs.oracle.com/cd/ E14373_01/apirefs.32/e13369/   -  person romeuBraga    schedule 12.04.2018
comment
Я, вероятно, должен был упомянуть, что я читал документы и не пришел к выводу, который я нашел достаточно удовлетворительным. Я также провел тест, используя htp.p, чтобы создать неупорядоченный список одной из моих таблиц базы данных, просто чтобы посмотреть, смогу ли я каким-либо образом заставить его работать; это было успешно. Что касается p_idx, если переменной, которая сама является числом, недостаточно, то, вероятно, мне придется использовать другие средства для достижения этой цели.   -  person fireside68    schedule 12.04.2018
comment
Извините, я думал, что функция htp.p работает только при рендеринге страницы, если вам удалось заставить ее работать в событии, которое не рендерит страницу, то проблема должна быть другой, которую я не вижу.   -  person romeuBraga    schedule 12.04.2018
comment
Другая возможность выдать эту ошибку заключается в том, что значение не находится в сеансе. Рядом с кодом pl/sql в вашем динамическом действии есть элементы поля для отправки, если вы не поместите туда элемент P11_TESTBOX, поэтому значение не передается в вашу процедуру.   -  person romeuBraga    schedule 12.04.2018


Ответы (1)


Вам не нужно писать процедуру PL/SQL. Просто скройте поля на странице загрузки, а при нажатии кнопки динамическое действие показывает их? Итак, вы переходите к действию на стороне сервера и элементу = значение, а также устанавливаете это в DA

person oracletest    schedule 12.04.2018