目录
1.3、xml配置按钮何时可见:示例编辑(新增和修改)下可见
前言
NC6系列及之前版本重量端添加按钮,一般有三种方法。接下来我们将详细介绍添加按钮功能的三种方法。
1、在原始XML文件里配置
1.1、添加类,继承NCAction
###参考java类
package nc.ui.ts.ts_adcountage.action;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.HashMap;
import nc.bs.framework.common.NCLocator;
import nc.itf.uap.IUAPQueryBS;
import nc.jdbc.framework.processor.ArrayListProcessor;
import nc.ui.pub.beans.MessageDialog;
import nc.ui.pubapp.uif2app.view.ShowUpableBillForm;
import nc.ui.uif2.NCAction;
import nc.ui.uif2.UIState;
import nc.ui.uif2.model.AbstractAppModel;
import nc.vo.ts.adcountage.AdCountAgeBVO;
/**
* 自定义按钮:预收账龄查询
* @author Monkey
*
*/
public class AdCountageQueryAction extends NCAction{
//初始化构造函数
public AdCountageQueryAction(){
setBtnName("预收账龄查询");
setCode("adCountageQuery");
}
private ShowUpableBillForm editor;
private AbstractAppModel model;
public ShowUpableBillForm getEditor() {
return editor;
}
public void setEditor(ShowUpableBillForm editor) {
this.editor = editor;
}
public AbstractAppModel getModel() {
return model;
}
public void setModel(AbstractAppModel model) {
this.model = model;
}
// 设置按钮可用
@Override
protected boolean isActionEnable() {
return this.model.getUiState() == UIState.EDIT;
}
@Override
public void doAction(ActionEvent e) throws Exception {
//得到所有行
int rowCount =this.editor.getBillCardPanel().getRowCount();
//判断是否有数据
if(rowCount>0){
if(MessageDialog.showYesNoDlg(new Container(), "提示", "表体已经存在预收账龄,是否重置?")!=nc.ui.pub.beans.UIDialog.ID_YES){
return;
}
}
// 重置表体数据
this.getEditor().getBillCardPanel().getBillModel().clearBodyData();
//拼接sql查询相应数据
StringBuffer sql = new StringBuffer()
.append(" select org_dept.name as dept2,")//部门2
.append(" bd_cust_supplier.pk_areacl as larea,")//区域
.append(" bd_psndoc.name as mktrept,")//销售代表
.append(" bd_cust_supplier.name as ctmname,")//客户名称
.append(" gl_detail.debitamount as lbalance,")//余额
.append(" gl_detail.prepareddatev as makedate")//制单日期
.append(" from gl_detai")//凭证明细
.append(" left join gl_docfree1 on gl_detail.assid = gl_docfree1.assid")//assid 辅助核算
.append(" left join org_dept on gl_docfree1.f1 = org_dept.pk_dept")//HR部门
.append(" left join bd_cust_supplier on gl_docfree1.f4 = bd_cust_supplier.pk_cust_sup")//客商
.append(" left join bd_psndoc on gl_docfree1.f2 = bd_psndoc.pk_psndoc")//人员基本信息
;
// 预收
String sql1 = sql.toString() + " where gl_detail.accountcode like '1123%'" +
" order by bd_cust_supplier.pk_cust_sup,gl_detail.prepareddatev";
// 应收
String sql2 = sql.toString() + " where gl_detail.accountcode like '1122%'" +
" order by bd_cust_supplier.pk_cust_sup,gl_detail.prepareddatev";
IUAPQueryBS bs =(IUAPQueryBS)NCLocator.getInstance().lookup(IUAPQueryBS.class);
//查询预收数据
ArrayList<HashMap<String, Object>> list1 = (ArrayList<HashMap<String, Object>>) bs.executeQuery(sql1, new ArrayListProcessor());
//查询应收数据
ArrayList<HashMap<String, Object>> list2 = (ArrayList<HashMap<String, Object>>) bs.executeQuery(sql1, new ArrayListProcessor());
//新建表体VO,用于存放数据
AdCountAgeBVO[] bodyvos1 = null;//用于存放预收数据
AdCountAgeBVO[] bodyvos2 = null;//用于存放应收数据
AdCountAgeBVO[] bodyvos = null;//用于存放最终数据
//list存入vo
bodyvos1 = getVos(list1);
bodyvos2 = getVos(list2);
//预收、应收数据核销,生成最终结果数据
bodyvos = getBodyVOs(bodyvos1,bodyvos2);
}
/**
* 预收、应收数据核销,生成最终结果数据
* @param bodyvos1 预收数据
* @param bodyvos2 应收数据
* @return bodyvos 最终数据
* @核销规则:先按照合同号,核销;再按照客户核销;最后每个客户生成一条数据
* @天数=当前-业务日期
*/
private AdCountAgeBVO[] getBodyVOs(AdCountAgeBVO[] bodyvos1,
AdCountAgeBVO[] bodyvos2) {
AdCountAgeBVO[] bodyvos = null;//用于存放最终数据
if(bodyvos1 == null){//如果预收数据为空
bodyvos = bodyvos2;
}
if(bodyvos2 == null){ //如果应收数据为空
bodyvos = bodyvos1;
}
if(bodyvos1 != null && bodyvos2 != null){
}
return bodyvos;
}
/**
* list 转换 vo
* ArrayList<HashMap<String, Object> 转换成AdCountAgeBVO[]
* @param list1
* @return
*/
private AdCountAgeBVO[] getVos(ArrayList<HashMap<String, Object>> list) {
// list 存放的是多个bodyvo,map里String是字段编码,object是值
AdCountAgeBVO[] bodyvos = null;
if(list != null && list.size() > 0){
bodyvos = new AdCountAgeBVO[list.size()];
for(int i = 0; i < list.size(); i++){
AdCountAgeBVO bodyvo = new AdCountAgeBVO();
HashMap<String, Object> map = list.get(i);
String[] itemNames = bodyvo.getAttributeNames();
for(String itemName : itemNames){
bodyvo.setAttributeValue(itemName, map.get(itemName));
}
bodyvos[i] = bodyvo;
}
}
return bodyvos;
}
}
1.2、XML注册自定义按钮
###参考XML
<bean id="AdCountageQueryAction" class="nc.ui.ts.ts_adcountage.action.AdCountageQueryAction">
<property name="model" ref="manageAppModel"/>
<property name="editor" ref="billFormEditor"/>
</bean>
1.3、xml配置按钮何时可见:示例编辑(新增和修改)下可见
<!-- 此处配置的Action编辑态始终可见 -->
<property name="editActions">
<list>
<ref bean="saveAction" />
<ref bean="cancelAction" />
<ref bean="separatorAction"/>
<!--分割按钮-->
<ref bean="AdCountageQueryAction"/>
<ref bean="separatorAction"/>
</list>
</property>
2、重写XML
重写一个xml文件,使用xml 的import方法将外面的xml文件导入进去。
3、重新对应Action类
据xml的配置文件,重写这个类。
结语
NC6添加按钮功能并不复杂,但是经常会出现单据打不开或者打开后列表按钮消失的问题,这个时候就需要去检查XML和Action类,可以通过录日志查看具体失败原因。

本文详细介绍了在NC6系列软件中通过三种方法添加自定义按钮,包括在原始XML文件中配置、重写XML以及对应Action类的实现,特别关注了如何在编辑状态下显示按钮并处理SQL查询逻辑。
971





