我在一个片段中有2个表。
这是东西: 表头表包含订购数量,明细表包含总拆分数量(详细信息),必须<=总订购数量(表头)。
场景:
a。记录A在抬头表
中的订购数量为10b。 详细信息表中有2条记录,其拆分数量分别为5和4,它们合起来是9,即<=订购数量(10)
要求: 出现错误消息后,可以将 Detail 表中的inputText列重置为先前值的任何方法。
(这是为了防止用户转到 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>
单击该按钮即可进行验证。但是这里的主要问题是,当我转到另一个 Header 记录并单击saveButton和 Detail中的先前错误数量时, Detail 表中的错误数量保持不变表也已提交到数据库。
答案 0 :(得分:0)
您可以创建一个自定义f:validator,以便在用户键入数据时立即验证输入的数据,并且在该字段无效时不允许用户使用您的按钮提交表单。
了解更多:https://docs.oracle.com/cd/E15586_01/web.1111/b31973/af_validate.htm
提交包含数据的表单时,浏览器发送请求值 每个可编辑值属性为 界。在JSF Apply Request Values中对请求值进行解码 相位和解码值本地保存在组件中 sumbittedValue属性。如果该值需要转换(对于 例如,如果它显示为字符串类型但存储为DateTime 对象),则在处理过程中数据将转换为正确的类型 在每个UI组件的基础上进行验证阶段。
如果验证或转换失败,则生命周期将转到 渲染响应阶段,并显示相应的错误消息 在页面上。如果转换和验证成功,则 更新模型阶段开始,转换后的值和经过验证的值是 用于更新模型。
发生验证或转换错误时,其组件 验证或转换失败将相关的错误消息放入 队列并使其自身无效。然后重新显示当前页面 错误消息。 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/