NC使用时的笔记.doc_第1页
NC使用时的笔记.doc_第2页
NC使用时的笔记.doc_第3页
NC使用时的笔记.doc_第4页
NC使用时的笔记.doc_第5页
免费预览已结束,剩余15页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

NC_技术技巧积累1 单据: NC单据开发步骤1 建立数据表2 导入数据字典3 选择GUI界面类型4 绑定数据模型设置主子表设置值对象关系5 模块下的Client 根据界面类型编写ClientUI ClientEH ClientCtrl6 定义表单程序的按钮,选择系统预置按钮,建立自定义按钮并选择7 定义业务动作脚本8 校验规则设定9 生成及部署代码1 建立数据表: 下面对每步开发过程中可能会碰到的疑难问题做下总结。1 建数据库表:1.1 此步操作会在数据库中注册相应的节点信息。1.2 命名规范:建议主表名称使用projectname_tablename_h,主表主键使用pk_tablename_h建议子表名称使用projectname_tablename_b,子表主键使用pk_tablename_b主表必须存在公司主键且公司主键必须使用pk_corp,数据库数据类型为CHAR(4)单据必须有ts、dr字段,对应数据库数据类型分别为CHAR(19)、SMALLINT下面是业务中用到的数据模型在数据库及NC中的对应模型:业务模型数据库模型NC数据类型主键型数据CHAR(20)Stringpk_corpCHAR(4)StringBoolean类型CHAR(1)UFBoolean日期类型CHAR(10)UFDate时间类型(ts)CHAR(19)UFDateTimedrSMALLINTInteger整数型INTInteger浮点型DECIMAL(20,8)UFDouble普通字符串VARCHAR(250)String1.3 建PDM的时候要注意不要遗漏主键标志,否则会造成单据保存时莫名的错误子表中必须包含主表主键,且名称必须同主表主键名称pk_tablename_h。2 导入数据字典:二次开发系统工具数据字典导入数据字典2.1 此步操作会将数据字典以大字段的形式保存入数据库中的数据字典表中。2.2 数据字典和单据模板中的字段并不是引用的关系,而是借助数据字典的内容自动生成的模板,因此数据字典变化不会引起单据模板变动,这点需要认知清楚。2.3 建议导入数据字典时导入到选定的目录里,不要放在根目录下。 2.4 导入过程中如碰到点击下一步没有反应,请首先检查PDM中信息是否有问题,比如DataType是否还是之类的问题。3 选择GUI界面类型:比如卡片、列表、管理、树3.1 此步操作未在数据库中储存关键性脚本,所有配置均用于生成框架代码。3.2 卡片界面、列表界面、管理界面的UI继承的类不同,一般单据管理界面即可。3.3 如无审批流则建议使用基本档案单据。业务单据中必须另外包含以下字段:单据主表:字段编码以及数据库模型都是固定的名称编码数据库模型公司主键pk_corpCHAR(4)单据号vbillnoCHAR(20)数据权限datalimitCHAR(20)制单人voperatoridCHAR(20)制单日期doperatordateCHAR(10)审批人vapproveidCHAR(20)审批日期dapprovedateCHAR(10)审核批语vapprovenoteVARCHAR(250)最后修改人vrevisoridCHAR(20)最后修改日期drevisedateCHAR(10)备注vnoteVARCHAR(250)单据类型pk_billtypeCHAR(20)单据状态vbillstatusSMALLINT业务类型pk_busitypeCHAR(20)单据子表:名称编码数据库模型来源单据类型vsourcebilltypeCHAR(20)来源单据IDvsourcebillidCHAR(20)来源单据行IDvsourcebillrowidCHAR(20)上层单据类型vlastbilltypeCHAR(20)上层单据IDvlastbillidCHAR(20)上层单据行IDvlastbillrowidCHAR(20)4 绑定数据模型:4.1 此步操作会在数据库dev_votable中注册VO的对应关系,但此部分信息与移植无太大关系。4.2 选择完主子表模型后如果子表关联主表主键名称处没有正常带出主表主键,则一般原因为子表中主表主键名称与主表中的主表主键不一致或主表中主键为设置为primary key;4.3 第一次绑定数据模型后如果删除重做,则会出现“主表值对象类”中VO路径为灰色不能修改的情况,这是因为第一次注册的时候在dev_votable表中写入了信息,将此表中相关信息删除后重新打开即可;由于整个UAP开发平台利用缓存处理的情况较多,如果暂时显示未生效,请重启客户端。5 使用表单设计器设计表单:5.1 此步操作中的所有信息均记录在数据库对应表中,与单据中代码无关。5.2 开启表头编辑公式:在UI的initSelfData()方法中增加this.getBillCardPanel().setAutoExecHeadEditFormula(true);5.3 开启卡片界面显示公式:在Ctrl类里的isLoadCardFormula()方法返回值设置为true5.4 增加新页签时应当注意,新增的页签顺序总是在最后,增加时应提前整理好思路按照显示的顺序逐次添加页签。5.5 BillItem的高级属性中的数据类型为小数型时,在参照类型处输入数字为控制小数点后位数。BillItem的高级属性中的数据类型为参照型时,在参照类型处输入自定义参照需用括起来。5.6 BillItem的高级属性中的“关键字名”勿随意使用,只有在表体参照配置公式时才会用到。5.7 保存按钮旁的生成其他模板功能为我们制作报表提供了极大的便利。由于报表模板生成工具操作不够直观化,制作报表的过程推荐使用配置单据模板然后生成报表模板的形式。6 定义表单程序的按钮:6.1 此步操作未在数据库中储存关键性脚本,所有配置均用于生成框架代码。6.2 建议在“单据的所有按钮”中将所有可能用到按钮都加进去,在“列表/卡片状态选择的按钮”中只选择当前需要的按钮,方便以后拓展。6.3 使用“删除”按钮时需在“单据的所有按钮”中同时选出“作废”按钮。7 定义业务动作脚本:7.1 此步操作未在数据库中储存关键性脚本,所有配置均用于生成框架代码。7.2 业务动作脚本生成在modules模块名META-INFVARsource下,在数据库中并未保存。生成代码时需同时把此部分代码导入项目工程的private包中的nc.bs.pub.action目录下,并在部署上线时一起移植。7.3 如果要修改业务动作脚本,业务动作脚本在修改后不能马上体现修改的内容。这时修改的内容已经成功提交,但由于NC中间件的问题需重启中间件才能显示出修改的内容。8 校验规则设定:8.1 此步操作未在数据库中储存关键性脚本,所有配置均用于生成框架代码。8.2 在此步最后保存时如果报ORA-01400错误时,如下:这是由于PDM中未设置主键造成的,UAP在第二步选择VO时会自动检测PDM中的主键列,出以上错误时,子表关联主表主键名称应该也是空的,如下:问题原因同绑定数据模型时。9 生成及部署代码:9.1 请不要完全相信UAP生成代码中的VO类,有时候没有问题的PDM是会生成出确实参数的VO类的。如果单据保存、主子表联动等出现问题却始终找不到问题原因,那么试着分析下对应的VO类是否存在问题。10 NC知识总结:10.1 代码结构:类似卡片界面下表头和表尾中每个Item对象的展现形式,在NC中是通过BillItem实现的。而类似卡片界面下的表体及整个列表界面的展现形式与BillItem是不同的,数据是承载在BillModel里的。表头表尾=BillItem 表体以及整个列表界面= BillModel下面是UI中几个比较关键的内容的介绍:BillCardPanel是界面类和边界类。它以卡片的形式提供单据的界面,并作为模板的边界类,封装了单据模板的数据和逻辑,提供了访问单据格式和数据的属性和方法。BillListPanel和BillCardPanel一样,只是提供的列表形式的界面。BillModel是一个实体类和控制类,具有维护列表数据的功能,用来维护卡片的表体数据(bodyModel),列表的表头和表体数据。因此如果要找表体内容的解决方案请先从BillModel这里入手,相反,如果是找表头的解决方案就不要在这里面费劲了。BillItem是一个实体类和元素类。代表单据中的单个数据元素,负责卡片和列表中数据项的格式,卡片中表头和表尾数据。BillData是一个实体类和集合类,用来维护BillItem的集合,以Hashtable的形式将BillItem组织成HeadItems,BodyItems,TailItems三组。BillCardPanel可以访问BillModel和BillData等,同时BillCardPanel对象由其他各个对象逐层组装而成。从上面的介绍我们可以看出,卡片界面下的表头和表体是使用的不同体制进行展现的,因此取数方式、显示编辑公式的运作原理甚至可处理的方法的数量都会有所不同,在开发中不要单纯的认为表头能实现的功能表体就一定能实现。11 开发过程中常见问题及解决办法:11.1 浏览器无法进入NC登录界面,浏览器有黄色叹号提示错误。这主要是因为该系统用户的java权限造成的,需要手动在Javajre1.5.0_07libsecurityjava.policy中添加如下代码:grant permission java.security.AllPermission;重新打开浏览器,问题解决。11.2 把制作完成的补丁文件部署到服务器上后,重启中间件。本地机器清理缓存,然后登录NC后,报VO错误。首先代码部署后的编译过程是这样的:首先进行public的编译,然后利用public进行client的编译,其次利用public、client代码进行private的编译。这个问题主要出在public端的VO类在进行了client端的编译后再进行private端的编译时产生了序列化不一致的问题。为了保证VO类的序列化一致,只需在VO类中加入private static final long serialVersionUID = -8940196742313994740L;这样的声明代码即可。这个在Eclipse的默认设置中是会以黄叹号的形式显示在类名出,点击叹号Eclipse提示The serializable class XXX does not declare a static final serialVersionUID field of type long,选择自动生成序列化代码即可让Eclipse自动生成代码。我们进一步思考,之所以会出现序列化问题,原因在于public端的VO类在client端及private端均进行了调用,且未书写序列化代码。而在前台client端及后台private端均会调用到的VO类最主要的无非是接口用的前后台数据传输VO。因此,接口用到的VO类或接口中承载所涉及的VO类应保证其一定有序列化代码。另外,前后台均会用到的public端其他类均需对此类问题引起注意。11.3 使用UAP集成开发工具的“生成VO代码”功能时报错。这个实际上是UAP平台的一个bug,当使用此工具时,如果未点击过“目标文件目录”、“作者名”,则有可能造成这两处内容读取失败。所以在使用时请确保至少点击一次“目标文件目录”和“作者名”后再点击确定按钮。另外,由于“主表VO名称”处限制了名称的长度,如果遇到路径过长的VO类,请先起一个临时路径,导出后再进行重命名。11.4 将测试数据库的节点脚本移植入正式环境后,为何找不到对应位置的节点?出现这种情况节点并未丢失。打开【二次开发工具】-【UAP集成开发工具】-【系统管理工具】-【自定义菜单】,点击“修改模块内结构”,会在“其他节点”中找到刚才导入的节点,通过调整位置可以将节点还原回原本位置。如果正式环境中原本没有做过节点位置的个性化调整,则直接使用“恢复默认结构”即可。11.5 在Eclipse中生成EJB时发现框中是空的,应当如何处理,如下:这个问题一般是由于Eclipse所在项目代码中的.module文件或module.xml文件与当前引用的nchomemodules模块名下的.module文件或module.xml文件中的不一致造成的。比如大小写不一致。Eclipse在每次启动的时候MDE插件都会自动将当前Eclipse里所有MDE项目的module与MDE指向的nchome中的modules进行匹配,如果在nchome中不存在该module信息,则会将项目中的module信息自动复制一份到nchome下,存在则不操作。因此如果当前MDE项目在建立后修改过模块名的话,需要注意项目中模块名与nchome中模块名是否一致。11.6 主子表单据录入完毕后发现无论选择哪条主表数据,子表数据显示的均为所有数据。出现这种问题一般是由于子表的VO类中getParentPKFieldName()方法返回空值造成的,其应当返回主表主键编码所组成的字符串。2、报表开发整理查询模板初始化 返回类型,显示类型的值代表的意思返回类型 0表示编码 1表示名称2表示主键显示类型0表示编码 1表示主键 2表示名称2 在报表上添加自定义按钮this.registerButton(new ButtonObject(返回,返回,0), new IButtonActionAndState() /定义点击按钮事件处理方法 public void execute() throws Exception /这里写事件方法 public int isButtonAvailable() /当有数据的时候按钮可用 return IButtonActionAndState.ENABLE_WHEN_HAS_DATA; );3 单据的全选全消方法/*全选方法*/ protected void onBoSelAll() throws Exception /表头数据的行数Int row = this.getPrintClientUI().getBillListPanel().getHeadBillModel().getRowCount();BillModel headModel = this.getPrintClientUI().getBillListPanel().getHeadBillModel(); for (int n = 0; n row; n+) /设置表头每行的状态 已选择 headModel.setRowState(n, BillModel.SELECTED); /更新页面 this.getPrintClientUI().getBillListPanel().updateUI(); /*取消全选方法*/ protected void onBoSelNone() throws Exception / 表头数据的行数 int row = this.getPrintClientUI().getBillListPanel().getHeadTable() .getRowCount(); BillModel headModel = this.getPrintClientUI().getBillListPanel() .getHeadBillModel(); for (int n = 0; n row; n+) / 设置表头每行的状态 未选择 headModel.setRowState(n, BillModel.UNSTATE); / 更新页面 this.getPrintClientUI().getBillListPanel().updateUI();/ 更新按钮状态 this.getPrintClientUI().updateButton(button); 4 获得单据的查询条件ConditionVO vo = (HYQueryConditionDLG) getQueryUI().getQryCondEditor() .getGeneralCondtionVOs();5 报表隐藏某一列getReportBase().hideColumn(列编码);6 报表某列可编辑getReportBase().getBody_Item(列名).setEdit(true);7 更改报表模板列的名称ColumnGroupcolums=(GroupableTableHeader)getReportBase().getBillTable().getTableHeader().getColumnGroups();/报表的所有列 colums列的序号.setText(新名称);8 报表有关的参数设置 /设置是否显示小数列的千分位 getReportBase().setShowThMark(true); /设置是否显示合计列 getReportBase().setTatolRowShow(true); /设置不显示零 getReportBase().getBodyPanel().getRendererVO().setShowZeroLikeNull(true); /设置是否显示行号 getReportBase().setRowNOShow(true); /点击一行时,选中的是整体一行 getReportBase().getBillTable().setColumnSelectionAllowed(false); /屏蔽表体中的右键菜单 getReportBase().setBodyMenuShow(false); /负数是否显示红字 getReportBase().getBodyPanel().getRendererVO().setShowRed(true); /负数是否显示符号 getReportBase().getBodyPanel().getRendererVO().setNegativeSign(true); 报表中,小数位数默认是两位,如果要修改,只能逐个子段进行修改 getReportBase().getBodyItem(msavenum).setDecimalDigits(4); /设置不显示的按钮 /设置合计列 getReportBase().getBodyItem(nfcsl).setTatol(true); /隐藏列 getReportBase().hideColumn(hideColumns); /显示隐藏的列 getReportBase().showHiddenColumn(showColumns); 如果要隐藏查询条件面板,可以在报表的Ctrl类(继承nc.ui.trade.report.controller.IReportCtl)里,通过isShowCondition()返回false来设置 /* * * 此方法为覆盖父类方法 * 是否显示查询条件面板,设置为false为不显示 * return * see nc.ui.trade.report.controller.IReportCtl#isShowCondition() */ public boolean isShowCondition() return false; 9 报表的查询条件参照,如何多选?在默认的情况下,报表的参照是不支持多选的。需要在代码里面控制一下。将init方法,在初始化时加入即可。public void init() UIRefPane deptid = new UIRefPane();/自定义参照模板dept this.deptid.setRefNodeName(部门档案);/*-=notranslate=-*/参照的名称 this.deptid.setReturnCode(false);/是否返回编码 this.deptid.setMultiSelectedEnabled(true);/是否多选 this.getQryDlg().setValueRef(dept,this.deptid);/给部门dept字段赋detpid参照 10 常用的一些方法CurTime.getCurrentTimeStampString(); /获取tsnew SequenceGenerator().generate(pkcorp, num)/主键FormulaParse;/服务器端公式解释器3、打印模板、开发整理(张广臣 付善飞)1、 打印模板的行高指的是什么?打印模板的行高的单位是磅(1cm=28.6磅),列宽使用单位为1/10英寸(既1个单位为2.54mm) 行高的单位和cm(厘米)可以这样转换:行高: 1毫米2.7682个单位 1厘米27.682个单位 1个单位0.3612毫米列宽: 1毫米0.4374个单位 1厘米4.374 个单位 1个单位2.2862毫米像素2、 在套打信封时,邮政编码中间需要有空格,如何实现?使用金额套打:_space_(String 变量,int 空格个数)函数如_space_(tostring(h_postCode3 ) , 2),假设h_postCode3 =100100将h_postCode3转换为1 0 0 1 0 0 这种形式.每个数字之间空两个格。3、 如何实现一张凭证固定打5行,没有的用空行代替?首先要把其他的行设成固定行,将场景设置为强制分页。场景通过设置“固定打印行数”,可以规定每页向下扩展的行数,以此决定每页打印的内容。4、 创建自定义纸张并应用于NC打印模板中需要对NC的打印模板和打印服务器端进行配置4.1 打印服务器端配置依次点击“开始/设置/打印机和传真”,在“打印机和传真”窗口中点击“文件/服务器属性”,打开“打印服务器属性”对话框然后选中“创建新格式”复选框,并在“表格名”中输入“max”(名称可随意),在“纸张大小:”的“单位”中选择“英制”,“宽度”中输入“8.30”(自定义的宽度),“高度”中输入“22.00”(自定义的高度)。最后要点击“保存格式”按钮,保存该自定义的格式。该格式就可以在打印机属性的纸张中就有了自定义的格式了。 右击打印机图标,选择“属性”,弹出“属性”对话框。选择“设备设置”将牵引送纸,手动送纸,进纸器都设置为“max”(自定义的纸张)。4.2 打印模板配置在NC模板编辑器下打开“页面设置”。选择“纸型”选项卡,单击打印机图标,弹出选择打印机对话框,选择打印机,然后单击“确定”。 “纸型”选项卡下,在“纸型”下拉菜单,选择“max”(自定义纸型)选择“页边距”选项卡,输入“左”“右”“上”“下”的边距。5、 如何对打印进行二次开发5.1 首先定义一个数据源对象,使其实现 IDataSource接口5.2 拼装打印数据源5.3 打印入口处理代码示例:PrintEntry pe = new PrintEntry(getBillUI(); / 设置打印模板ID的查询条件 pe.setTemplateID( getBillUI()._getCorp().getPrimaryKey(), getBillUI()._getModuleCode(), getBillUI()._getOperator(), getBillUI().getBusinessType(), getBillUI().getNodeKey();/ 如果分配了多个打印模板,可选择一个模板 pe.selectTemplate(); pe.beginBatchPrint();/开始批量打印 for (int i = 0; i 二次开发工具UAP集成开发工具。3 在UAP集成开发工具界面,点击UAP表单集成开发中心。4 在UAP集成开发工具DeveloperWorkshop界面,选择演示二次开发系统报销单管理。5 在菜单栏,选择外部交换平台插件开发。6 在单据插件信息注册界面,在模块名输入框中输入demo。7 在单据标识输入框中输入T1,在单据描述输入框中输入报销单,在业务操作下拉框中选择add,在导入范围下拉框中选择集团公司,在单据加锁级别下拉框中选择单据类型+公司(账簿)+流水号,在插件类名称输入框中输入nc.bs.demo.expensebill.T1Plugin。在选择VO类型单选按钮组中选择主子表,在主表名参照输入框中参照demo_expensebill,在子表名参照输入框中参照demo_expensedetail,在聚合VO名输入框中输入nc.vo.demo.expensebill.MyBillVO,在主表VO名输入框中输入nc.vo.demo.expensebill.DemoExpensebillVO,在子表VO名输入框中输入nc.vo.demo.expensebill.DemoExpensedetailVO。8 点击下一步。 单据转换规则定义9在校验文件生成规则界面上,选择重新生成校验文件多选框。10点击下一步。11在校验&对照文件维护界面上,对自动生成的单据转换规则进行定义,主要工作:首先剔出每个记录中不需要的字段,然后修改每个字段的“最大长度”、“允许为空”、“需要参照的NC基础档案”三个属性值。不需要字段主要有记录本身的主键字段(如表头记录billhead的pk_expensebill、primaryKey等,表体记录billbody的pk_expensedetail、primaryKey等),对字段属性的修改需要参照该单据的单据模版(如表头记录billhead的字段pk_cusdoc参照客商档案,字段pk_deptmanager和pk_drawpsn参照人员档案,字段vctrldeptid参照部门档案,字段vapproveid和voperatorid参照操作员)。表头记录billhead的pk_corp字段需要参照公司目录。右击左树pk_corp节点,在弹出的菜单中,选择需要与接收方一致,在右表修改需要与接收方一致的值为是。12点击下一步,保存单据转换规则(校验文件)。13点击下一步,跳过样本数据预览界面。14点击下一步,跳过辅助信息规则配置界面。(1)、手动加载界面:注意目标URL地址 配置Servlet的URL地址。将要发送至的帐套编码作为account属性值写入要发送到的Servlet的URL中(或者写入XML文件的头中),将接收公司和主体帐簿(如果带的话)的代码拼成接收方(接收公司编码接收主体账簿编码)作为receiver属性写入要发送到的Servlet的URL中(或者XML文件的头中)。 前半部分指定目标地址和端口上的Servlet服务。 后半部分是URL参数,其优先级高于数据文档头属性。(可选)(2)、自定义程序加载界面:? 还可以使用NC中PostFile类来进行发送 ? 还可以通过交换平台的后台任务来进行发送。(已经在预警平台注册)插件代码编写和部署15在插件代码维护界面上,选择代码导出路径,不必选择包含导出代码多选按钮。16点击生成按钮,开始编辑插件类T1Plugin的代码。17在方法processBill(Object, UfinterfaceVO, XsysregisterVO)中,编写如下代码:18点击编译按钮,将.java文件编译成.class文件。19点击下一步。20点击下一步,跳过交换平台测试界面。21点击完成,跳过导出和插件相关的配置文件界面,退出集成开发向导。修改单据转换规则22在NC主界面上,选择客户化外部交换平台维护交换规则定义。23在交换规则定义界面上,选择打开菜单。24在打开对话框上,在单据类型参照输入框中参照值T1。25在打开对话框上,点击确定按钮。26在左树右表的交换规则定义界面上,点击左树的交换文档节点,修改右表根标签值为expensebill。27在左树上,点击billhead节点,修改右表中外系统定义的表标签值为header。28在左树上,点击billbody节点,修改右表中外系统定义的表标签值为detail。29在左树上,双击b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论