我在Notes表单中有一个数字字段连接到xpage中的组合框。组合框中的值是十进制值列表,1,02,1,03等,但它们作为文本存储在关键字文档中
组合框的类型为" string" (没有转换器)但是如果我把它改成"十进制"它似乎并不重要。使用转换器。
逗号是瑞典的小数点分隔符
我使用@dbLookup
获取关键字值 像这样的事情。 @DbLookup(分贝," vwLookupCat""奖金""关键字&#34)当我保存文档时,关键字文档中的值将保存为应该的numric值。但组合框不再显示正确的选定值(在编辑模式下)并在我更改时显示验证错误,因为该值现在是数字而不是组合框关键字值中的文本。 或者因为该字段最初是一个文本字段,但保存时它是一个数字字段。
<xp:comboBox id="comboBox7" value="#{doc.bonus}">
<xp:this.converter>
<xp:convertNumber type="number"></xp:convertNumber>
</xp:this.converter>
<xp:eventHandler event="onchange" submit="true" refreshMode="partial" refreshId="tbl"></xp:eventHandler>
<xp:selectItem itemLabel="Välj Bonus" itemValue="0"></xp:selectItem>
<xp:selectItems>
<xp:this.value><![CDATA[#{javascript:@DbLookup(db,"vwLookupCat","BONUS","KeyWord")}]]></xp:this.value>
</xp:selectItems>
</xp:comboBox>
我应该如何解决这个问题?
提前致谢
托马斯
答案 0 :(得分:1)
我可以想到两种方法可以解决它,这两种方法都需要你使用豆子,希望你应该已经熟悉这个概念。
概念上正直
转换器保持原样。毕竟你想要处理一个数字,你就是在保存一个数字。转换器指示框架将POST中的返回字符串值转换为数字,这就是您想要的,因为与组件绑定的目标字段也会保存为数字。
问题是将此值与用于填充选项的值列表相匹配。为什么?这些值不是数字。
解决方案是自定义构建选项,而不是让框架从dblookup返回的字符串值数组中进行自动装箱。
编写ssjs +公式让我感到痛苦,但调用应该是这样的:
<xp:selectItems
value="${javascript:myBeanName.getSelectItems(@DbLookup(db,"vwLookupCat","BONUS","KeyWord"))}">
</xp:selectItems>
bean方法:
public List<SelectItem> getSelectItems(String[] values) {
List<SelectItem> options = new ArrayList<SelectItem>();
for (String value : values) {
options.add(new SelectItem(Double.valueOf(value), value));
}
return options;
}
通过执行此操作,您将创建具有可比较值的选项。
剩下的唯一问题是IBM提供的完全违反直觉的转换器。因为你不知道选择&#39;数字&#39;在内部,无论是Integer
,Double
还是BigDecimal
等等,您都会遇到比确定性更多的不确定性。我有自己的数字转换器但是因为我知道IBM的工作原理,我认为你可以通过为转换器指定一个额外的参数来解决问题。
<xp:this.converter>
<xp:convertNumber type="number" integerOnly="true" />
</xp:this.converter>
我知道,我知道,integerOnly
会让您认为它会将值转换为Integer
。它没有,它转换为Double
。幸运的你!想象一下,你需要一个整数!
概念上很糟糕
另一种方法是将组合框绑定到视图范围变量。 您将在页面加载时使用字符串转换的doc值初始化变量,然后使用它。在保存时,您将读取视图范围变量,将其转换回数字并在保存之前将数字推送到doc字段。