使用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(单据号)