Вернуть значение inputText к предыдущему значению после сообщения об ошибке - PullRequest
0 голосов
/ 07 марта 2019

У меня есть 2 таблицы во фрагменте.

  1. Заголовок таблица
  2. Деталь таблица (Данные показаны на основе Заголовок таблица)

Вот в чем дело: таблица заголовков содержит заказанное количество, а таблица подробностей содержит общее количество разделения (деталь), которое должно <= общее заказанное количество (заголовок) </em>.

сценарий:

а.Запись A заказала количество 10 в Заголовок Таблица

b.есть две записи с разделенным количеством 5 и 4 в таблице Detail , которые объединяются вместе, равняется 9, что составляет <= заказанное количество (10) </p>

Требование: любой метод для сброса столбца inputText втаблица Detail к предыдущему значению после появления сообщения об ошибке.

(Это сделано для того, чтобы пользователь не мог перейти к другой записи в таблице Header и зафиксировать, после чего будет зафиксировано неверное значение в таблице Detail )

Код кнопки:

public void saveButton(ActionEvent actionEvent) {
    int aQuantity=0;
    DCIteratorBinding orderDtl = ADFUtils.findIterator("OrderView4Iterator");
    if (orderDtl.getViewObject().getRowCount()>0){

    for(Row dtlRow: orderDtl.getAllRowsInRange()){
        System.out.println(dtlRow.getAttribute("OrderDtlIid"));
        aQuantity = aQuantity +  Integer.parseInt(dtlRow.getAttribute("Quantity").toString());
    }
    int bQuantity = Integer.parseInt(orderDtl.getCurrentRow().getAttribute("OrderQuantity").toString());

    if(aQuantity > bQuantity){
        errorMessage(null, "Error.");
     return;
    }
//then commit function}}}

Код столбца (таблица сведений):

<af:column sortProperty="#{bindings.OrderView4.hints.Quantity.name}"
               filterable="true" sortable="false"
               headerText="#{bindings.OrderView4.hints.Quantity.label}"
               id="c3" width="182">
      <af:inputText value="#{row.bindings.Quantity.inputValue}"
                    label="#{bindings.OrderView4.hints.Quantity.label}"
                    required="#{bindings.OrderView4.hints.Quantity.mandatory}"
                    columns="#{bindings.OrderView4.hints.Quantity.displayWidth}"
                    maximumLength="#{bindings.OrderView4.hints.Quantity.precision}"
                    shortDesc="#{bindings.OrderView4.hints.Quantity.tooltip}"
                    id="it1" immediate="true" autoSubmit="true">
        <f:validator binding="#{row.bindings.Quantity.validator}"/>
      </af:inputText>
    </af:column>

Кнопка прошла проверку после нажатия.Но главная проблема здесь заключается в том, что неверное количество в таблице Detail остается тем же, когда я перехожу к другой записи Header и нажимаю кнопку saveButton и предыдущее неправильное количество в Detail таблица также передана в базу данных.

1 Ответ

0 голосов
/ 07 марта 2019

Вы можете создать собственный f: validator, чтобы он проверял введенные данные сразу после того, как пользователь их набрал, и не позволит пользователю отправить форму с помощью вашей кнопки, пока поле недействительно.

Подробнее: https://docs.oracle.com/cd/E15586_01/web.1111/b31973/af_validate.htm

Когда отправляется форма с данными, браузер отправляет значение запроса на сервер для каждого компонента пользовательского интерфейса, атрибут редактируемого значения которого привязан.Значения запроса декодируются во время фазы JSF Apply Request Values, и декодированное значение сохраняется локально на компоненте в атрибуте sumbitedValue.Если значение требует преобразования (например, если оно отображается как строковый тип, но сохраняется как объект DateTime), данные преобразуются в правильный тип на этапе проверки процесса для каждого компонента пользовательского интерфейса.

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

При возникновении ошибки проверки или преобразования компонент, чья проверка или преобразование не удалась, размещает связанныйсообщение об ошибке в очереди и делает его недействительным.Затем текущая страница снова отображается с сообщением об ошибке.Компоненты ADF Faces обеспечивают способ декларативной установки этих сообщений.

В вашем случае ваш jsf будет выглядеть следующим образом:

<af:column sortProperty="#{bindings.OrderView4.hints.Quantity.name}"
               filterable="true" sortable="false"
               headerText="#{bindings.OrderView4.hints.Quantity.label}"
               id="c3" width="182">
      <af:inputText value="#{row.bindings.Quantity.inputValue}"
                    label="#{bindings.OrderView4.hints.Quantity.label}"
                    required="#{bindings.OrderView4.hints.Quantity.mandatory}"
                    columns="#{bindings.OrderView4.hints.Quantity.displayWidth}"
                    maximumLength="#{bindings.OrderView4.hints.Quantity.precision}"
                    shortDesc="#{bindings.OrderView4.hints.Quantity.tooltip}"
                    id="it1" immediate="true" autoSubmit="true">
        <f:validator binding="#{YOUR_SCOPE.YOUR_BEAN.YOUR_CUSTOM_VALIDATOR}"/>
      </af:inputText>
    </af:column>

Это руководство может быть полезно, а также: http://www.catgovind.com/adf/adf-custom-validator-example/

...