1.单据-出口商品登记分录:F7字段“版本号”(versionNum)
2.基础资料-版本号:左树右表结构,编辑UI:VersionNumberEditUI,
序时薄UI: VersionNumberListUI
其中版本号包含商品、账册序号。
需求:根据分录的商品、账册序号过滤版本号。
尝试1:
字段“版本号”绑定分录对应的实体versionNum字段,单据抽象类方法jbInit()中自动生成如下代码:
final KDBizPromptBox prmtVersionNum = (KDBizPromptBox) kdtEntrys.getColumn("versionNum").getEditor().getComponent();
prmtVersionNum.addSelectorListener(new SelectorListener(){
VersionNumberListUI kdtEntrys_versionNum_PromptBox_F7ListUI = null;
public void willShow(SelectorEvent e) {
if (kdtEntrys_versionNum_PromptBox_F7ListUI == null) {
try {
kdtEntrys_versionNum_PromptBox_F7ListUI = new VersionNumberListUI();
HashMap ctx = new HashMap();
ctx.put("bizUIOwner",javax.swing.SwingUtilities.getWindowAncestor(kdtEntrys_versionNum_PromptBox_F7ListUI)); kdtEntrys_versionNum_PromptBox_F7ListUI.setF7Use(true,ctx); prmtVersionNum.setSelector(kdtEntrys_versionNum_PromptBox_F7ListUI);
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
});
上述代码语句无法在单据继承里面重写,因此无法将分录当前行的商品、账册序号传递给基础资料-版本号,无法实现条件过滤。
尝试2:
直接更改分录列“版本号”控件的queryInfo,调试得知:单据抽象类里面已经添加该列的SelectorListener事件,因此无法干涉其过滤。
尝试3:
在单据继承类重写该列的SelectorListener事件,同时将自定义的过滤条件传递给版本号ListUI,
逻辑貌似可以,经尝试,过滤条件能够正常传递过去,同时过滤条件也可以起作用。
缺点:打开单据界面,首次“版本号”F7选择时,过滤条件不起作用,其后的F7选择时都可以成功过滤。
原因:单据继承类重写了该列的SelectorListener事件,同时单据抽象类里面也实现了该列的SelectorListener事件。程序运行时首次加载重写的SelectorListener事件,其次加载抽象类实现的SelectorListener事件,此时将之前传递的自定义过滤冲掉了。
单据抽象类创建版本号ListUI实例是在willShow方法外面,其对应的实例为类变量。单据继承类创建版本号ListUI实例需要在willShow方法里面,其对应的实例为局部变量,每次调用都创建一个实例。虽然单据继承类多次创建ListUI实例,其实都是指向同一个存储地址(抽象类实现的SelectorListener事件时内存所分配的存储地址)。因此出现上述缺点(该缺点客户是无法容忍的)。
分析:
只要将字段“版本号”绑定分录对应的实体versionNum字段,单据抽象类就自动添加其SelectorListener事件,因此设想将其移除,在继承类里面添加SelectorListener事件,同时将自定义的过滤条件传递给版本号,就可以解决。
解决方案:
1. 手动绑定“版本号”、手动加载“版本号”:
单据继承类的loadFields方法中:
dataBinder.registerBinding("entrys.versionNum", com.kingdee.eas.hl.basedata.VersionNumberInfo.class,this.kdtEntrys, "versionNum.text");
//版本号需要手动加载
int rowCount = kdtEntrys.getRowCount();
for(int i =0;i<rowCount;i++){
IRow row = kdtEntrys.getRow(i);
ExpGoodsInputEntryInfo entryInfo = (ExpGoodsInputEntryInfo) row.getUserObject();
if(null == entryInfo)
continue;
row.getCell("versionNum").setValue(entryInfo.getVersionNum());
}
2. 手动创建F7控件:
单据继承类的onLoad方法中:
//版本号
KDBizPromptBox prmtVersionNum = new KDBizPromptBox();
prmtVersionNum.setQueryInfo("com.kingdee.eas.hl.basedata.app.VersionNumberQuery");
prmtVersionNum.setVisible(true);
prmtVersionNum.setEditable(true);
prmtVersionNum.setDisplayFormat("$name$");
prmtVersionNum.setEditFormat("$number$");
prmtVersionNum.setCommitFormat("$number$");
KDTDefaultCellEditor kdtEntrys_versionNum_CellEditor = new KDTDefaultCellEditor(prmtVersionNum);
kdtEntrys.getColumn("versionNum").setEditor(kdtEntrys_versionNum_CellEditor);
ObjectValueRender kdtEntrys_versionNum_OVR = new ObjectValueRender();
kdtEntrys_versionNum_OVR.setFormat(new BizDataFormat("$name$"));
kdtEntrys.getColumn("versionNum").setRenderer(kdtEntrys_versionNum_OVR);
3. 手动添加列“版本号”的SelectorListener事件:
单据继承类的initListener方法中:
final KDBizPromptBox prmtVersionNum = (KDBizPromptBox) kdtEntrys.getColumn("versionNum").getEditor().getComponent();
prmtVersionNum.addSelectorListener(new SelectorListener(){
public void willShow(SelectorEvent e) {
//切记该实例需在willShow方法里面创建,否则无法将各个分录行的过滤条件传递给基础资料ListUI
VersionNumberListUI kdtEntrys_versionNum_PromptBox_F7ListUI = null;
if (kdtEntrys_versionNum_PromptBox_F7ListUI == null) {
try {
kdtEntrys_versionNum_PromptBox_F7ListUI = new VersionNumberListUI();
HashMap ctx = new HashMap();
ctx.put("bizUIOwner",javax.swing.SwingUtilities.getWindowAncestor(kdtEntrys_versionNum_PromptBox_F7ListUI));
ctx.put("eviF7",versionNumevi);
kdtEntrys_versionNum_PromptBox_F7ListUI.setF7Use(true,ctx);
prmtVersionNum.setSelector(kdtEntrys_versionNum_PromptBox_F7ListUI);
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
});
其中versionNumevi为全局变量,由表kdtEntrys的editStarting触发“版本号”列时赋值。
4. 实现kdtEntrys的editStarting触发事件:
if(kdtEntrys.getColumnIndex("versionNum") == colIndex){//版本号
GoodsInfo goodsInfo = (GoodsInfo) row.getCell("goods").getValue();
if(null == goodsInfo){
MsgBox.showWarning(this,"商品编号不允许为空!");
kdtEntrys.getEditManager().editCellAt(rowIndex, kdtEntrys.getColumnIndex("goods"));
abort();
}
AccountBookSeqInfo accBookSeqInfo = (AccountBookSeqInfo) row.getCell("accBookSeq").getValue();
filter.getFilterItems().add(new FilterItemInfo("goods.id",goodsInfo.getId().toString()));
if(null != accBookSeqInfo && null != accBookSeqInfo.getId()){
filter.getFilterItems().add(new FilterItemInfo("accountBook.id",accBookSeqInfo.getId().toString()));
}
filter.getFilterItems().add(new FilterItemInfo("isUsed",new Integer(1)));
evi.setFilter(filter);
versionNumevi = evi;//为全局变量versionNumevi赋值
}
上述4步为单据继承类要实现的代码。
5. 基础资料-版本号ListUI需要添加的代码如下:
1> 重写方法setF7Use
@Override
public void setF7Use(boolean isF7Use, HashMap ctx) {
isF7ListUI = true;
EntityViewInfo evi = (EntityViewInfo) ctx.get("eviF7");//由单据传递过来的EVI
if(null !=evi){
eviF7 = evi;
}
super.setF7Use(isF7Use, ctx);
}
2> 重写方法getDefaultEntityViewInfo
@Override
protected EntityViewInfo getDefaultEntityViewInfo() {
if(isF7ListUI){
if(null == eviF7){
return super.getDefaultEntityViewInfo();
}else{
return eviF7;
}
}else{
return super.getDefaultEntityViewInfo();
}
}
其中isF7ListUI、eviF7均为全局变量。