2023年6月21日发(作者:)
NC65在⽇常开发中常⽤的代码写法标题版本1.0.1作者walton说明收集NC在⽇常开发中常⽤的代码写法,⽰例展⽰NC65开发相关代码1.查询1.1 通过BaseDAO查询结果集并转换//通过BaseDAO进⾏查询,并将查询结果转换为列表SqlBuilder sql = new SqlBuilder();(" select ");(" ,,2,3,4,5,6,rient,_accasoa,g");(" from BD_ACCASOA accasoa");(" inner join BD_ACCOUNT account on _ACCOUNT = _ACCOUNT ");if(subjType != null && (1)){// 查询往来类科⽬ (" and CSIGNS = 'Y' ");}(" inner join BD_ACCCHART accchart on _ACCCHART = _ACCCHART ");(" inner join BD_ACCTYPE acctype on _ACCTYPE = _ACCTYPE ");if(subjType != null && (2)){ // 查询损益类科⽬ (" and = 1 ");}(" inner join ORG_ACCOUNTINGBOOK book on _ACCCHART = _CURRACCCHART and _ACCOUNTINGBOOK =?");SQLParameter param = new SQLParameter();am(pk_accountbook);// BeanListProcessor 的参数VO不需要元数据,保证Sql查询出的列名与字段名⼀致即可(处理器可在同包下查看)List result = (List)eDAO().executeQuery(ng(), param, new BeanListProcessor());return result;1.2 通过VOQuery查询单表对象//查询条件以and开头,(String)null参数是order的语句,可为空SqlBuilder sql = new SqlBuilder();(" and ");(_ORG, pk_org);
(" and ");(IALVID,cmaterialvids);VOQuery query = new VOQuery();(ng(), (String)null);1.3 通过EfficientBillQuery查询聚合对象SqlBuilder headCond = new SqlBuilder(); (" from drugic_priceadjust_h where "); String pkGroup = (String) Map().get("pk_group"); ("pk_group", pkGroup); (" and "); String pkOrg = (String) Map().get("pk_org"); ("pk_org", pkOrg); (" and "); ("approvestatus", ndex()); (" and "); ("dr", 0); EfficientBillQuery query = new EfficientBillQuery(); AggPriceAdjustHeadVO[] vos = (AggPriceAdjustHeadVO[]) (ng());1.4 通过IUAPQueryBS查询结果集IUAPQueryBS iquery = (IUAPQueryBS)tance().lookup();ArrayList list = null;String sql =" select pk_dept from bd_psnjob where ismainjob ='Y' and pk_psndoc ='"+pk_psndoc+"' and dr = 0 ";list = (ArrayList) eQuery(sql, new ArrayListProcessor());1.5 通过IOnhandQry查询现存量信息OnhandQryCond onhandQryCond = new OnhandQryCond();//构造查询条件if(atch()){//可以根据条件来选择要查询的现存量维度字段 SelectFields();}else{ ectFields(new String[]{"pk_group", "pk_org", "cwarehouseid", "cmaterialvid", "cmaterialoid", "castunitid", "clocationid", "vchangerate", "cvmivenderid", "ctplcustomerid", "cstateid", "cvendorid", "cprojectid", "casscustid", "cproductorid", "cffileid", "vfree1", "vfree2", "vfree3", "vfree4", "vfree5", "vfree6", "vfree7", "vfree8", "vfree9", "vfree10"});}um(true);//设置现存量是否求和StringBuilder sbSelFields = new StringBuilder();(AME + ".").append(OUSEID).append("='") .append(Wh()).append("' AND ");// 仓库(AME + ".").append(_ORG).append("='") .append(_org()).append("' ");// 库存组织if (!oOnhand()) {//添加现存量是否需要⼤于0的查询条件 (" AND (").append(AME).append(".nonhandnum <> 0 or ") .append(AME).append(".nonhandastnum <> 0 ) ");}re(ng());nerWhere(true);try { OnhandVO[] onhandVOs = tance().lookup().queryOnhand(onhandQryCond); if (ORZeroLength(onhandVOs)) { return null; } return onhandVOs;//返回查询到的现存量信息} catch (BusinessException e) { xception(e);}1.6 客户端Client端查询(不建议使⽤)SqlBuilder whereSql = new SqlBuilder();(_STOCK,this.m_sWhID);(" and ");(TNAME, rray(set));MaintensDrugVO[] MaintensDrugVOs = (MaintensDrugVO[])HYPubBO_yCondition(,ng());2.更新2.1 通过VOUpdate更新单表对象//VO中的status必须设置为更新态 ,可以更新指定字段
VOUpdate updateOnhand = new VOUpdate();tus(D);(onhandNumVOs, new String[]{"nnum1"});2.1 通过BillUpdate更新单据(聚合对象)BillUpdate billUpd = new BillUpdate<>();(new AggPriceAdjustHeadVO[]{aggVO},new AggPriceAdjustHeadVO[]{originBill});2.1 通过IOnhandUpdate更新现存量IOnhandUpdate update = tance().lookup();OnhandNum(onhandVOs);3.界⾯操作3.1 根据model获取当前选中的表头表体数据AggPriceAdjustHeadVO aggVO = (AggPriceAdjustHeadVO)ectedData();PriceAdjustHeadVO parentVO = entVO();CircularlyAccessibleValueObject[] childVOs = ldrenVO();3.2 根据model获取当前选中数据的审批状态if(null != getModel().getSelectedData()){ NCObject obj = tance(getModel().getSelectedData()); if (obj != null) { Integer status = lStatus(obj); }}3.3 根据条件控制按钮是否可操作性//按钮的Action中,继承NCAction并重写isActionEnable⽅法是控制按钮是否可操作的⽅法,默认返回true(可以操作)@Overrideprotected boolean isActionEnable() {return true}//----------------------------------------------------------------------//点击新增,⾃动增⾏(在新增事件--addhandler实现implements IAppEventHandler)public void handleAppEvent(AddEvent e) { BillCardPanel panel = lForm().getBillCardPanel(); Action action = yPanel().getBillTableAction(0); if (action instanceof AbstractBodyTableExtendAction) { AbstractBodyTableExtendAction addAction = (AbstractBodyTableExtendAction)action; ActionEvent ae = null; ae = new ActionEvent(yPanel().getTable(), 1234, "AutoLine"); Performed(ae); }}3.4 根据BillCardPanel动态设置表头表体字段是否为必输项(固定则在单据模板中配置)getBillCardPanel().getHeadItem(_SALE).setNull(true);getBillCardPanel().getBodyItem("code").setNull(true);3.5 根据BillCardPanel获取当前页签及其billModelString tableCode = getBillCardPanel().getCurrentBodyTableCode();BillModel billModel = getBillCardPanel().getBillModel(tableCode);3.6 根据BillCardPanel获取界⾯的聚合对象,返回AggregatedValueObject需要传⼊三个VO的名字,返回值类型可强制转换AggregatedValueObject bill = lCardPanel().getBillValueVO(aggClassName, headClassName, bodyClassName);3.7 根据BillListPanel或者BillCardPanel处理界⾯精度//列表界⾯(在界⾯InitUI中加⼊)ListPaneScaleProcessor scaleProcessor = new ListPaneScaleProcessor(tance().getPkGroup(),lListPanel());String[] pricekeys = new String[]{"localdebitamount","localcreditamount","debitamount","creditamount"};PosEnum pos = ;ceCtlInfo(pricekeys, pos, (String)null, "pk_currtype", pos, (String)null);s();//卡⽚界⾯(在界⾯InitUI中加⼊)CardPaneScaleProcessor scaleProcessor = new CardPaneScaleProcessor(tance().getPkGroup(),lCardPanel());String[] pricekeys = new String[]{"amount"};PosEnum pos = ;ceCtlInfo(pricekeys, pos, (String)null, "currtype", pos, (String)null);s();3.8 根据BillCardPanel设置表体数据及加载参照显⽰信息(不加载则显⽰主键)DiffAdjustVO headVO = ((AggDiffAdjustVO)agg).getParentVO();DiffAdjustBodyVO bodyVO = new DiffAdjustBodyVO();_org(_org());_accountbook(_accountingbook());_voucher(_voucher());_detail(_detail());_accasoa(_accasoa());int row = getCardPanel().getBillModel().getRowCount()-1;dPanel().getBillModel().setBodyRowVO(bodyVO, row);dPanel().getBillModel().loadLoadRelationItemValue();3.9 禁⽌列表表头排序//重写列表界⾯的初始化⽅法,移除监听ableBillListViewpublic void initUI() { (); getBillListPanel().getHeadTable().removeSortListener();}3.10 根据BillCardPanel控制某个单元格是否可编辑getBillCardPanel().getBillModel().setCellEditable(int row,String key,Boolean editable);3.11 获取当前屏幕尺⼨Dimension screen=eenSize();4.窗⼝提⽰4.1 界⾯弹窗(成功、失败、警告等)//弹框提⽰,可以选择多种,根据⾃⼰的需求选择(提⽰界⾯标志flag:{是:4,否:8,取消:2})rningDlg(null, "选择提⽰", "请选择单据后再点击执⾏");4.2 界⾯底部提⽰信息//在界⾯底部提⽰信息atusBarMsg("执⾏成功!", getModel().getContext());//在界⾯底部弹出异常信息,中断当前操作(会出现失效情况,可配合上⾯提⽰信息使⽤,终⽌操作)usinessException("表体数据为空时,不能保存。");4.3 ⾃定义档案编码和名称的唯⼀性校验//可以在[基础数据管控模式]节点,配置规则,如果⽆法新增规则,可在数据库中插⼊数据select * from bd_uniquerule ;select * from bd_uniquerule_item;可以在[基础数据管控模式]节点中新增⼀条规则点击保存后,然后在此⽅法中进⾏断点调试,获取需要插⼊的VO信息(BDUniqueruleVO)5.单据模板公式5.1 单据模板根据公式获取值//公式可以直接获取返回值并赋值给下⼀条语句pk_onhandim->getcolvalue(IC_ONHANDDIM ,PK_ONHANDDIM ,CMATERIALVID ,code__source );num1->getcolvalue(IC_ONHANDNUM ,NNUM1 ,PK_ONHANDDIM ,pk_onhandim );//(表名,查询字段,条件字段,条件值)price->getcolvalue(drugic_priceadjust_b ,price_before ,pk_priceadjust_b ,pk_priceadjust_b );iif(price>0 ,price ,num1 );6.参照6.1 根据BillCardPanel获取界⾯参照类型字段并设置是否可多选BillItem item = lCardPanel().getBodyItem(()); if (item == null) return; JComponent componen = ponent(); if (componen instanceof UIRefPane){ UIRefPane refPane = (UIRefPane) componen; tiSelectedEnabled(true); }6.2 获取参照的值UIRefPane measdocRef = (UIRefPane) getBillCardPanel().getHeadItem(_MEASDOC).getComponent();PK(); //主键
Name(); //名称Code(); //编码6.3 设置参照过滤条件//可以添加在编辑前事件中UIRefPane refPane=(UIRefPane)lCardPanel().getHeadItem("def2").getComponent();AbstractRefModel refModel=(AbstractRefModel) Model();String wherePart=" and def5='1001H2100000004MJ7SV' ";//Sql以and开头rePart(wherePart, false);//第⼆个参数为是否刷新该数据tiCorpRef(false);//设置不能跨组织6.4 参照选择后显⽰主键或编码,不显⽰名称- 进⼊单据模板初始化节点,选择对应节点的模板并点击修改- 进⼊节点模板,点击要显⽰名称的参照字段,在左侧界⾯选择⾼级属性- 选中‘类型设置’⾏,双击值的位置会有⼀个参照按钮,点击参照会弹出⼀个界⾯- 在界⾯中勾选‘焦点离开后显⽰名称’7.其他7.1 查找多语信息在NCHOME中找到langlib⽂件夹,内部有多语jar;根据所属模块,在功能注册节点中找到对应的编码(如库存管理为ic);根据模块编码找到对应的多语jar;根据代码中的resdir信息,找到jar中对应的⽂件夹;
2023年6月21日发(作者:)
NC65在⽇常开发中常⽤的代码写法标题版本1.0.1作者walton说明收集NC在⽇常开发中常⽤的代码写法,⽰例展⽰NC65开发相关代码1.查询1.1 通过BaseDAO查询结果集并转换//通过BaseDAO进⾏查询,并将查询结果转换为列表SqlBuilder sql = new SqlBuilder();(" select ");(" ,,2,3,4,5,6,rient,_accasoa,g");(" from BD_ACCASOA accasoa");(" inner join BD_ACCOUNT account on _ACCOUNT = _ACCOUNT ");if(subjType != null && (1)){// 查询往来类科⽬ (" and CSIGNS = 'Y' ");}(" inner join BD_ACCCHART accchart on _ACCCHART = _ACCCHART ");(" inner join BD_ACCTYPE acctype on _ACCTYPE = _ACCTYPE ");if(subjType != null && (2)){ // 查询损益类科⽬ (" and = 1 ");}(" inner join ORG_ACCOUNTINGBOOK book on _ACCCHART = _CURRACCCHART and _ACCOUNTINGBOOK =?");SQLParameter param = new SQLParameter();am(pk_accountbook);// BeanListProcessor 的参数VO不需要元数据,保证Sql查询出的列名与字段名⼀致即可(处理器可在同包下查看)List result = (List)eDAO().executeQuery(ng(), param, new BeanListProcessor());return result;1.2 通过VOQuery查询单表对象//查询条件以and开头,(String)null参数是order的语句,可为空SqlBuilder sql = new SqlBuilder();(" and ");(_ORG, pk_org);
(" and ");(IALVID,cmaterialvids);VOQuery query = new VOQuery();(ng(), (String)null);1.3 通过EfficientBillQuery查询聚合对象SqlBuilder headCond = new SqlBuilder(); (" from drugic_priceadjust_h where "); String pkGroup = (String) Map().get("pk_group"); ("pk_group", pkGroup); (" and "); String pkOrg = (String) Map().get("pk_org"); ("pk_org", pkOrg); (" and "); ("approvestatus", ndex()); (" and "); ("dr", 0); EfficientBillQuery query = new EfficientBillQuery(); AggPriceAdjustHeadVO[] vos = (AggPriceAdjustHeadVO[]) (ng());1.4 通过IUAPQueryBS查询结果集IUAPQueryBS iquery = (IUAPQueryBS)tance().lookup();ArrayList list = null;String sql =" select pk_dept from bd_psnjob where ismainjob ='Y' and pk_psndoc ='"+pk_psndoc+"' and dr = 0 ";list = (ArrayList) eQuery(sql, new ArrayListProcessor());1.5 通过IOnhandQry查询现存量信息OnhandQryCond onhandQryCond = new OnhandQryCond();//构造查询条件if(atch()){//可以根据条件来选择要查询的现存量维度字段 SelectFields();}else{ ectFields(new String[]{"pk_group", "pk_org", "cwarehouseid", "cmaterialvid", "cmaterialoid", "castunitid", "clocationid", "vchangerate", "cvmivenderid", "ctplcustomerid", "cstateid", "cvendorid", "cprojectid", "casscustid", "cproductorid", "cffileid", "vfree1", "vfree2", "vfree3", "vfree4", "vfree5", "vfree6", "vfree7", "vfree8", "vfree9", "vfree10"});}um(true);//设置现存量是否求和StringBuilder sbSelFields = new StringBuilder();(AME + ".").append(OUSEID).append("='") .append(Wh()).append("' AND ");// 仓库(AME + ".").append(_ORG).append("='") .append(_org()).append("' ");// 库存组织if (!oOnhand()) {//添加现存量是否需要⼤于0的查询条件 (" AND (").append(AME).append(".nonhandnum <> 0 or ") .append(AME).append(".nonhandastnum <> 0 ) ");}re(ng());nerWhere(true);try { OnhandVO[] onhandVOs = tance().lookup().queryOnhand(onhandQryCond); if (ORZeroLength(onhandVOs)) { return null; } return onhandVOs;//返回查询到的现存量信息} catch (BusinessException e) { xception(e);}1.6 客户端Client端查询(不建议使⽤)SqlBuilder whereSql = new SqlBuilder();(_STOCK,this.m_sWhID);(" and ");(TNAME, rray(set));MaintensDrugVO[] MaintensDrugVOs = (MaintensDrugVO[])HYPubBO_yCondition(,ng());2.更新2.1 通过VOUpdate更新单表对象//VO中的status必须设置为更新态 ,可以更新指定字段
VOUpdate updateOnhand = new VOUpdate();tus(D);(onhandNumVOs, new String[]{"nnum1"});2.1 通过BillUpdate更新单据(聚合对象)BillUpdate billUpd = new BillUpdate<>();(new AggPriceAdjustHeadVO[]{aggVO},new AggPriceAdjustHeadVO[]{originBill});2.1 通过IOnhandUpdate更新现存量IOnhandUpdate update = tance().lookup();OnhandNum(onhandVOs);3.界⾯操作3.1 根据model获取当前选中的表头表体数据AggPriceAdjustHeadVO aggVO = (AggPriceAdjustHeadVO)ectedData();PriceAdjustHeadVO parentVO = entVO();CircularlyAccessibleValueObject[] childVOs = ldrenVO();3.2 根据model获取当前选中数据的审批状态if(null != getModel().getSelectedData()){ NCObject obj = tance(getModel().getSelectedData()); if (obj != null) { Integer status = lStatus(obj); }}3.3 根据条件控制按钮是否可操作性//按钮的Action中,继承NCAction并重写isActionEnable⽅法是控制按钮是否可操作的⽅法,默认返回true(可以操作)@Overrideprotected boolean isActionEnable() {return true}//----------------------------------------------------------------------//点击新增,⾃动增⾏(在新增事件--addhandler实现implements IAppEventHandler)public void handleAppEvent(AddEvent e) { BillCardPanel panel = lForm().getBillCardPanel(); Action action = yPanel().getBillTableAction(0); if (action instanceof AbstractBodyTableExtendAction) { AbstractBodyTableExtendAction addAction = (AbstractBodyTableExtendAction)action; ActionEvent ae = null; ae = new ActionEvent(yPanel().getTable(), 1234, "AutoLine"); Performed(ae); }}3.4 根据BillCardPanel动态设置表头表体字段是否为必输项(固定则在单据模板中配置)getBillCardPanel().getHeadItem(_SALE).setNull(true);getBillCardPanel().getBodyItem("code").setNull(true);3.5 根据BillCardPanel获取当前页签及其billModelString tableCode = getBillCardPanel().getCurrentBodyTableCode();BillModel billModel = getBillCardPanel().getBillModel(tableCode);3.6 根据BillCardPanel获取界⾯的聚合对象,返回AggregatedValueObject需要传⼊三个VO的名字,返回值类型可强制转换AggregatedValueObject bill = lCardPanel().getBillValueVO(aggClassName, headClassName, bodyClassName);3.7 根据BillListPanel或者BillCardPanel处理界⾯精度//列表界⾯(在界⾯InitUI中加⼊)ListPaneScaleProcessor scaleProcessor = new ListPaneScaleProcessor(tance().getPkGroup(),lListPanel());String[] pricekeys = new String[]{"localdebitamount","localcreditamount","debitamount","creditamount"};PosEnum pos = ;ceCtlInfo(pricekeys, pos, (String)null, "pk_currtype", pos, (String)null);s();//卡⽚界⾯(在界⾯InitUI中加⼊)CardPaneScaleProcessor scaleProcessor = new CardPaneScaleProcessor(tance().getPkGroup(),lCardPanel());String[] pricekeys = new String[]{"amount"};PosEnum pos = ;ceCtlInfo(pricekeys, pos, (String)null, "currtype", pos, (String)null);s();3.8 根据BillCardPanel设置表体数据及加载参照显⽰信息(不加载则显⽰主键)DiffAdjustVO headVO = ((AggDiffAdjustVO)agg).getParentVO();DiffAdjustBodyVO bodyVO = new DiffAdjustBodyVO();_org(_org());_accountbook(_accountingbook());_voucher(_voucher());_detail(_detail());_accasoa(_accasoa());int row = getCardPanel().getBillModel().getRowCount()-1;dPanel().getBillModel().setBodyRowVO(bodyVO, row);dPanel().getBillModel().loadLoadRelationItemValue();3.9 禁⽌列表表头排序//重写列表界⾯的初始化⽅法,移除监听ableBillListViewpublic void initUI() { (); getBillListPanel().getHeadTable().removeSortListener();}3.10 根据BillCardPanel控制某个单元格是否可编辑getBillCardPanel().getBillModel().setCellEditable(int row,String key,Boolean editable);3.11 获取当前屏幕尺⼨Dimension screen=eenSize();4.窗⼝提⽰4.1 界⾯弹窗(成功、失败、警告等)//弹框提⽰,可以选择多种,根据⾃⼰的需求选择(提⽰界⾯标志flag:{是:4,否:8,取消:2})rningDlg(null, "选择提⽰", "请选择单据后再点击执⾏");4.2 界⾯底部提⽰信息//在界⾯底部提⽰信息atusBarMsg("执⾏成功!", getModel().getContext());//在界⾯底部弹出异常信息,中断当前操作(会出现失效情况,可配合上⾯提⽰信息使⽤,终⽌操作)usinessException("表体数据为空时,不能保存。");4.3 ⾃定义档案编码和名称的唯⼀性校验//可以在[基础数据管控模式]节点,配置规则,如果⽆法新增规则,可在数据库中插⼊数据select * from bd_uniquerule ;select * from bd_uniquerule_item;可以在[基础数据管控模式]节点中新增⼀条规则点击保存后,然后在此⽅法中进⾏断点调试,获取需要插⼊的VO信息(BDUniqueruleVO)5.单据模板公式5.1 单据模板根据公式获取值//公式可以直接获取返回值并赋值给下⼀条语句pk_onhandim->getcolvalue(IC_ONHANDDIM ,PK_ONHANDDIM ,CMATERIALVID ,code__source );num1->getcolvalue(IC_ONHANDNUM ,NNUM1 ,PK_ONHANDDIM ,pk_onhandim );//(表名,查询字段,条件字段,条件值)price->getcolvalue(drugic_priceadjust_b ,price_before ,pk_priceadjust_b ,pk_priceadjust_b );iif(price>0 ,price ,num1 );6.参照6.1 根据BillCardPanel获取界⾯参照类型字段并设置是否可多选BillItem item = lCardPanel().getBodyItem(()); if (item == null) return; JComponent componen = ponent(); if (componen instanceof UIRefPane){ UIRefPane refPane = (UIRefPane) componen; tiSelectedEnabled(true); }6.2 获取参照的值UIRefPane measdocRef = (UIRefPane) getBillCardPanel().getHeadItem(_MEASDOC).getComponent();PK(); //主键
Name(); //名称Code(); //编码6.3 设置参照过滤条件//可以添加在编辑前事件中UIRefPane refPane=(UIRefPane)lCardPanel().getHeadItem("def2").getComponent();AbstractRefModel refModel=(AbstractRefModel) Model();String wherePart=" and def5='1001H2100000004MJ7SV' ";//Sql以and开头rePart(wherePart, false);//第⼆个参数为是否刷新该数据tiCorpRef(false);//设置不能跨组织6.4 参照选择后显⽰主键或编码,不显⽰名称- 进⼊单据模板初始化节点,选择对应节点的模板并点击修改- 进⼊节点模板,点击要显⽰名称的参照字段,在左侧界⾯选择⾼级属性- 选中‘类型设置’⾏,双击值的位置会有⼀个参照按钮,点击参照会弹出⼀个界⾯- 在界⾯中勾选‘焦点离开后显⽰名称’7.其他7.1 查找多语信息在NCHOME中找到langlib⽂件夹,内部有多语jar;根据所属模块,在功能注册节点中找到对应的编码(如库存管理为ic);根据模块编码找到对应的多语jar;根据代码中的resdir信息,找到jar中对应的⽂件夹;
发布评论