NC开发常用代码

1,527 阅读5分钟

使用BaseDAO查询数据时,常用的几个查询策略。

ColumnListProcessor:返回一个字段,多条数据。

ColumnProcessor:返回一个字段,一条数据

MapListProcessor:返回多个字段,多条数据(List集合,元素是map集合)

MapProcessor:返回多个字段,一条数据

ArrayListProcessor:返回多个字段,多条数据(List集合,元素是Object数组)

BeanListProcessor:返回多条对象

BeanProcessor:返回单条对象

BillQuery:根据主键数组查询,返回聚合VO数组。所以查询所有聚合VO数组时,需要先查主表的所有主键:

BaseDAO dao = new BaseDAO(); String sql = "select pk_combination_h from so_combination_h where nvl(dr,0) = 0 and enablestate = 2";

List keys = (List) dao.executeQuery(sql, new ColumnListProcessor());

BillQuery query = new BillQuery(AggCombinationHVO.class);

if (keys == null || keys.size() == 0) return null;

//根据主键得到所有的聚合vo

AggCombinationHVO[] vos = query.query(keys.toArray(new String[0]));//参数就是主键数组

编辑事件:获取卡片下的数据:

1>获取表头选中行:

getEditor().getBillCardPanel().getSelected();
this.getModel().getSelectedOperaDatas();

2>获取表头选中行的行号:

int rowCount = getModel().getSelectedRow();

3>获取某子表页签:

e.getBillCardPanel().getBillTable(tablecode);

获取页签编码:getEditor().getTabCode();

4>获取参照组件:

UIRefPane ref = e.getBillCardPanel().getHeadItem("").getComponent();

UIRefPane ref = e.getBillCardPanel().getBodyItem("").getComponent();

ref.getRefCode();//编码

AbstractRefModel model = ref.getRefModel();

同理:ref.setRefModel(model );

增加过滤条件:

String sql = refModel.getWherePart();

sql = sql+" and 条件";

refModel.setWherePart(sql);

refModel.addWherePart(sql);

5>获取子表中的选中行下标:

在编辑前后事件中,可以通过getRow()获取;

int row = getCurrentSelectIndex();//下标

int[] rows = getCardPanel().getBillTable("页签编码").getSelectedRows();//多个下标

String pk_virtual = (String) getCardPanel().getBillModel(tabcode).getValueAt(i, "pk_virtual");//某一行的某个字段

6>事件中获取子表中的总行数:

e.getBillCardPanel().getRowCount();

e.getBillCardPanel().getRowCount(tableCode);

7>事件中获取表头某字段的值、设值:

e.getBillCardPanel().getHeadItem("").getValueObject();

e.getBillCardPanel().setHeadItem(strKey, Value);

UFDouble ssrecievflamount = (UFDouble) e.getBillCardPanel().getBillModel("ssrecievfldamate").getValueObjectAt(index, "ssrecievflamount");

8>事件中某表体某字段:获取或赋值

e.getBillCardPanel().getBodyItem(tableCode, strKey);

e.getBillCardPanel().getBodyValueAt(rowIndex, strKey);

e.getBillCardPanel().setBodyValueAt(aValue, row, strKey, tableCode);

e.getBillCardPanel().getBodyValueAt(rowIndex, strKey);

9>卡片是否显示:

getEditor().isShow();

10>获取表头表体所有数据

getBillCardPanel().getBillModel().getHeadValueVOs(LowerLimitHVO.class.getName());

getBillCardPanel().getBillModel("页签编码").getBodyValueVOs(LowerLimitBAVO.class.getName());

AggClaiminconHVO[] aggvos = (AggClaiminconHVO[]) getModel().getSelectedOperaDatas();

11>清空表体

panel.getBillModel().clearBodyData();

e.getBillCardPanel().getBillModel().clearBodyData();

e.getBillCardPanel().getBillModel("ssrecievfldainfo").clearBodyData();

两个清空表体的方式,前者是清空当前页签的表体数据,后者是清空制定页签的数据

12>获取枚举组件:

UIComboBox ref = (UIComboBox) e.getBillCardPanel().getHeadItem(Med_srflprotocol_148.VFLTYPES).getComponent();

DefaultConstEnum enumtype4 = new DefaultConstEnum(

Integer.valueOf(4), "调价返利(冲调价)");

ref.removeItem(enumtype4);

13>获取当前编辑的字段:

当前编辑的字段编码:e.getKey();

当前编辑字段的旧值:e.getOldValue();

当前编辑字段的新值:e.getValue();

点击按钮获取数据:

1>表体选中行下标:

int row = this.editor.getBillCardPanel().getBillTable().getSelectedRow();

int row = this.editor.getBillCardPanel().getBillTable("salecashmaterial").getSelectedRow()

2>表体选中行VO:

>>Med_salecashMaterial_148 leftVo = (Med_salecashMaterial_148) this.editor.getBillCardPanel().getBillModel().getBodyValueRowVO( row,Med_salecashMaterial_148.class.getName());

>>Med_salecashMaterial_148 leftVo = (Med_salecashMaterial_148) this.editor.getBillCardPanel().getBillModel("页签编码").getBodyValueRowVO( row,Med_salecashMaterial_148.class.getName());

3>选中Aggvo:

 Object obj = this.model.getSelectedData();

获取当前单据聚合VO(不是数组):

Object obj = this.editor.getValue();

在继承某些按钮action时,要注意某些按钮是不要再声明editor属性:

例如:因为ScriptPFlowAction类中已经定义了model和editor,并提供了get/set方法,我们只需要继承,调用即可,不要再自己定义。

后台对数据进行更新操作后,必须设置setStatus();例如:VOStatus.UPDATED

工具类:

import org.apache.commons.lang.StringUtils;

字符串判断:StringUtils.isNotBlank(pk_virtual)

字符串数组判断:StringUtils.isNotEmpty(数组)

数组转集合:Arrays.asList(数组);

集合转数组:Collection集合.toArray();

集合去重:利用set:Set set = new HashSet(List<>)

通用工具类:PubAppTool

前后台通用的环境变量:AppContext.getInstance()

数组是否为空:ArrayUtils.isEmpty(aggvo):空对象返回false

合并数组:resultVO = ArrayUtils.mergeArrays(resultVO3, resultVO4);

将多批字符串形成一个List集合:Arrays.asList("cmaterialvid","redprice","vlotno","vfree6")

检查集合是否为空:VOChecker.isEmpty(newvos)

集合工具类:CollectionUtils.addAll(集合,数组或集合或迭代器);

org.apache.commons.collections.CollectionUtils:

//并集 Collection union = CollectionUtils.union(a, b);

//交集 Collection intersection = CollectionUtils.intersection(a, b);

//交集的补集 Collection disjunction = CollectionUtils.disjunction(a, b);

//集合相减 Collection subtract = CollectionUtils.subtract(a, b);

根据表名、字段、查询条件查询:

String channeltype_name = (String) HYPubBO_Client.findColValue("hw_clientgroup_148","name" , " pk_clientgroup = '"+channeltype+"';");

HYPubBO_Client实在client包下使用,HYPubBO在后台使用。

调试参照类

在nc.ui.bd.ref.AbstractRefModel抽象类的getRefSql和对应的参照类中调试。

加载表体显示公式

editor.getBillCardPanel().getBillModel().execLoadFormula();

加载元数据关联项

e.getBillCardPanel().getBillModel().loadLoadRelationItemValue();

执行显示公式

formalus = new String[] {

"vname->getColValue(bd_material,name,pk_material,pk_level)",

"vcode->getColValue(bd_material,code,pk_material,pk_level)"

};

getBillCardPanel().execBodyFormulas(i, formalus);

该段公式等价于:select 参数2 from 参数1 where 参数3 = 参数4;

根据单据类型获取主键字段

String pkField = PfUtilBaseTools.findPkField(billType);

查询模板的基类:

nc.ui.pubapp.billref.src.DefaultBillReferQuery

public Object[] queryByQueryScheme(IQueryScheme paramIQueryScheme) throws Exception 方法:

返回值是聚合VO数组,条件添加如下:

QuerySchemeProcessor processor = new QuerySchemeProcessor(paramIQueryScheme);

processor.appendWhere(" and (med_flprotocol_148.vfltypes in (6,7))");

processor.appendWhere(" and (med_flprotocol_148.fstatusflag =1) ");

processor.appendWhere(" and (nvl(med_flprotocol_148.vdef14,'N') <> 'Y' ) ");

根XML(XML就在这个类的附近)

例如:classpath:/nc/ui/mmgp/uif2/config/billmanage2.xml

nc.ui.mmgp.uif2.components.grand.MMGPMainGrandNotDelValueAdapter

获取当前服务器时间、登录用户、集团、组织:

UFDateTime date = AppContext.getInstance().getServerTime();//获取服务器时间

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

String formatdate = format.format(date.getDate().toDate());

this.model.getContext().getPk_group();//集团

this.model.getContext().getPk_org();//组织

this.model.getContext().getPk_loginUser();//当前操作人

还有一种方式:ServerTimeProxy.getInstance().getServerTime();//当前操作时间

派发事件:

Object value值 = billCardPanel.getBodyValueAt(row, itemkey);
BillEditEvent billEditEvent = new BillEditEvent(billCardPanel, null, value值, 字段,row, 1);
billEditEvent.setTableCode(页签编码);
CardBodyAfterEditEvent event = new CardBodyAfterEditEvent(billCardPanel, billEditEvent, null);
model.fireEvent(event);

本例是用来触发当前节点的编辑后事件。

数据库增删改查帮助接口:

nc.itf.uap.IUAPQueryBS

public final class BaseDAO implements IVOPersistence, IUAPQueryBS

数据库执行数据变更的实现类:nc.bs.dao.BaseDAO

单据的查询、增删改操作的工具类:

BillDelete、BillDeleteItem、BillInsert、BillLazyQuery、BillOperator、BillQuery、BillUpdate、EfficientBillQuery、IAttributeOrderConvert、SchemeBillQuery

nc.impl.pubapp.pattern.data.view.SchemeViewQuery

向数据库插入自定义类型的数据时,可以用BaseDAO,例如:

this.getBaseDao().insertVOArray(linkList.toArray(new BPCVoucherDO[0]));

不过,需在自定义的VO里,加上dr,ts等字段,并自己赋值,如果有主键,也要自己复制

单据转换规则执行类:

public abstract interface IPfExchangeService

比如:runChangeDataAry方法:参数:来源单据类型、目的单据类型、来源aggvo,目的aggvo、null、不分类(PfButtonClickContext.NoClassify)

删除流程信息:

NCLocator.getInstance().lookup(IWorkflowMachine.class).deleteCheckFlow("4626", "BillNo", vos[0], null);

动作脚本接口(动作脚本):

nc.itf.uap.pf.IplatFormEntry

IplatFormEntry operator = NCLocator.getInstance().lookup(IplatFormEntry.class);

operator.processAction("SAVE","HFV1", null, aggvo_HFV1, null, null);

动作脚本表:pub_busiclass、pub_billaction

SELECT p.actiontype,p.classname FROM pub_busiclass p WHERE p.pk_billtype = 'HFP5';

SELECT p.actiontype,p.actionnote FROM pub_billaction p WHERE p.pk_billtype = '25';

后台前后规则接口

1、nc.impl.pubapp.pattern.rule.ICompareRule

2、nc.impl.pubapp.pattern.rule.IRule

建临时表工具类:nc.impl.am.common.TempTableDAO

参数分别为:表名、字段名数组、字段类型数组

TempData resultTemp = TempTableDAO.getInstance().createTable(RESULTTABLE, resultcolumnNames, resultcolumnTypes, resultdata);

String tablename = resultTemp.getTableName();

深度克隆工具类

nc.vo.pubapp.pattern.tool.performance.DeepCloneTool

DeepCloneTool tool = new DeepCloneTool ();//克隆工具

抛异常:

import nc.vo.pubapp.pattern.exception.ExceptionUtils;

ExceptionUtils.wrappBusinessException(message);

ExceptionUtils.wrappBusinessException(String.format("兑付明细第[%s]行原单数量大于0,兑付数量也要大于0", vo.getVrowno()));

return;

6.弹框提示信息:import nc.ui.pub.beans.MessageDialog;

错误提示:MessageDialog.showErrorDlg(e.getBillCardPanel(),"提示","提示信息")

成功提示:MessageDialog.showHintDlg(e.getBillCardPanel(),"提示","提示信息")

确认提示:MessageDialog.showOkCancelDlg(parent, title, question);//是否确认提示

if(result == 1):是

选择提示:int result = MessageDialog.showYesNoCancelDlg(billForm.getBillCardPanel(), "提示", "是否为换品种冲差");

if(result == 4):是

MessageDialog.showUnknownErrorDlg(parent, e)

MessageDialog.showWarningDlg(parent, title, warning);//警告提示

MessageDialog.showSelectDlg(parent, type, title, message, allValue, maximumRowCount);

MessageDialog.showErrorDlg(e.getContext().getEntranceUI(), "提示", "请先输入客户!");

客户端黑字提示:

ShowStatusBarMsgUtil.showStatusBarMsg("评审单生成成功", getModel().getContext());

提示信息常量类:nc.ui.uif2.IShowMsgConstant

保存成功:getSaveSuccessInfo()

删除成功:getDelSuccessInfo()

已取消:getCancelInfo()

审批成功:getApproveSuccessInfo()

一般用于客户端黑字提示,例如:

ShowStatusBarMsgUtil.showStatusBarMsg(IShowMsgConstant.getSaveSuccessInfo(), getModel().getContext());

后台日志打印:nc.bs.logging.Logger

用Logger.error(e.getMessage(),e)将捕捉的异常打印出来,平时尽量使用Logger.debug("");

调用接口(使用这种方式调用接口)

接口名 query = NCLocator.getInstance().lookup(接口名.class);

窗口状态:nc.ui.uif2.UIState

ADD, BUSY, COPY_ADD, DISABLE, EDIT, INIT, NOT_EDIT;

事务处理:nc.itf.uap.pf.IPFBusiAction

单据加锁:

boolean isLock= PKLock.getInstance().addDynamicLock(单据号)