学习心得1

本文介绍了在NC系统中增加自定义项的步骤,以及在保存校验时如何判断合同状态和保存类型。详细阐述了新增、修改和删除回写的过程,特别是涉及集合和数组的操作。同时,探讨了NC系统的数据保存原理,包括主子表数据如何传到数据库,以及元数据在保持字段一致性中的作用。此外,还讨论了回写机制、克隆aggvo的原因和并发控制策略。
摘要由CSDN通过智能技术生成

一、增加自定义项

1.元数据、实体VO、数据库增加自定义项

2.在MDP资源管理器右边点击刷新按钮,在包资源管理器的窗口中右键–>UAP Tools–>Update Classpath

3.重启服务器,登录集团管理员,调单据模板,从表体和表头分别从左边拉到右边

二、保存校验遇到的问题

1.怎么判断该贷款合同被参照过?
答:合同号不为空,说明该贷款合同被参照过

2.怎么判断是新增保存还是修改保存?
答:主键不为空,说明不是新增保存,是修改保存

3.怎么判断修改保存不算当前单子?
答:当为修改保存时,选择主键不等于当前主键的单据号

三、新增回写、数组或集合的拼接、集合转数组

1.for(Object[] objects:list) //for(容器中元素类型 临时变量 : 容器变量)

2.怎么实现放款单表体某行的数量字段与合同表体对应行的累计放款单数量字段累加?
答:判断放款单来源单据子表主键是否等于合同子表主键,如果相等则进行累加

3.StringUtils.join(任意类型数组或集合,拼接符):将集合或数组以某拼接符拼接到一起形成新的字符串

4.list.toArray(new String[0]):返回集合中所有元素的一个数组表示形式

四、修改回写、删除回写

1.修改保存后回写的代码跟新增保存的代码基本一致,新增保存后回写的逻辑是合同中的累计放款单数量+放款单中的数量,而修改保存后回写的逻辑是先把合同中的累计放款单数量-修改前的放款单中的数量,在用减完之后的结果加上修改后的放款单中的数量

2.删除后回写的代码跟新增保存的代码基本一致,新增保存后回写的逻辑是合同中的累计放款单数量+放款单中的数量,而删除后回写的逻辑是合同中的累计放款单数量-放款单中的数量

五、NC原理

1.假设前台有一张主子表的单子,点保存的时候是怎么样传到数据库的???
答:client端点保存之后传到private端,private端每个单据都有保存的服务,当在前端点保存的时候会让界面上的值转换成aggvo(把表头封装成headvo,把表体封装成多个bodyvo的一个数组,表体的一行就是一个bodyvo),最后传到数据库。

2.为什么aggvo上的字段、数据库里主表和子表的字段能够和元数据能保持一致,并且前端单据的数据能够保存到数据库???
答:因为aggvo字段的编码和数据库表里面字段的编码都来源于同一个地方------元数据,这种一致性在新建元数据的时候平台都做好的。

3.,新增单据维护完点保存,单据状态默认为自由态,提交后变为提交态,审批完以后是审批通过态,为什么一点提交的时候会更新单据状态是提交态,一点审批的时候会更新单据状态是审批通过态,他它怎么知道是更新单据状态字段,包括审批完后的审批人是当前的用户,它怎么知道把这些值写到单据上的哪个字段上来???
答:业务接口属性映射指定了元数据的字段映射到单据上是什么字段。

4.所有单据点提交点审批都是走的同一个相同的代码,所有的单子方法都是一样的,只是对象类型不一样,那怎么知道哪个单子该往哪个地方回写???
答:因为元数据里业务接口属性映射指定了该往哪里回写,所以这个映射关系一定要配置对,不然后面的增删改查审批就会有未知的错误,所以元数据一定要做对。

5.client端保存完给aggvo,aggvo调用private端的接口保存到数据库。client端保存完给aggvo的过程不需要了解,aggvo怎么调用private端的接口保存到数据库里去的???
答:后端增删改查操作的所有数据都是来自aggvo,除了是自己写一个接口,传参的时候参数可以随便定义,其他所有的增删改查的数据都是来自aggvo。

6.新增保存时,假设主表有code,name,sumnum三个字段,分别是001,001,10;子表有code,sum两个字段,分别是0101,5;0102,5,后台是怎么把这些数据保存到数据库里面去的???
答:新增保存时,拿到001,001,10会生成一个insert into语句,返回一个主键;每个子表里面都要存一个主表主键,假设主键保存的是001,然后再用0101,5生成一个insert into语句,0102,5生成一个insert into语句,这样主表和子表都保存到了数据库里面。

7.修改保存时,假设主表有code,name,sumnum三个字段,分别是001,001,10;子表有code,sum两个字段,分别是0101,5;0102,5,查到数据以后点击修改,把子表第一行删掉,把第二行改为0102,4,又增加了一行0103,3,后台是怎么把这些数据保存到数据库里面去的???
答:修改保存肯定不是生成insert语句。对于主表来说,进行update;对于子表来说,删除的执行delete,修改的行执行update,新增的行执行insert,没有任何变化的执行unchange。
修改完点了保存后,传给后台一个aggvo,aggvo会有一个状态来标识这一行是删除、修改还是新增还是没有任何变化,有一个很重要的字段叫做VOStatus,表示VO的状态,aggvo根据状态字段的值就会判断该执行什么数据库操作。
8.下游单据回写上游单据,A单据的数量回写B单据的累计数量,既然就是updata语句,为什么不能直接在B中写update语句,而是要找到A,通过A找到A的aggvo,再把aggvo赋上值,然后更新上,再调用B的update服务,为什么要走这么复杂???
答:解释1:因为A单据本身它修改的时候可能会有一些业务逻辑,比如保存的时候,表头有一个字段叫总数量,表体有数量字段,假设这两个字段都是手填的,保存的时候需要校验表头的数量是否等于表体数量的和,这个校验写在A单据的update修改保存前规则里面。如果是直接在B中写update语句,就不能走到A的update规则里面。所以A单据的字段回写B单据的信息,都是通过调B单据的修改保存的服务。单据修改保存本身就是传给后台一个aggvo,又保存的,因此我们也要模拟单据修改保存的步骤,这样A单据的验证,回写等都可以在B单据中去执行。
答:解释2:A单据有个数量,B单据有个数量,比如咱俩同时保存的,他有可能你的把我的给冲掉,有并发冲突。执行update语句这种冲突是解决不了的,这样就直接更新了,但是如果走单据的aggvo的update这种方式,它本身就有并发处理,在update方法里面,通过ts时间戳来控制。因此在NC的开发中永远都是调用上游服务的方式来更新数据。

9.回写的原理是什么???
答:主表不说了,只说子表;A采购申请单: code,下游单据数量

										001,     100
										002,     100

假设A是采购申请单(申请采购),B是采购单: code,下游单据数量

											001,     50
											002,     50

保存时B回写A,100变为50,
修改保存,根据vo的状态来判断是修改,所以过程为:拿到aggvo,通过修改完一行给这一行一个update的状态,B调A单据本身的update的服务。下游单据回写上游单据一定是找到上游单据的aggvo,对这个aggvo进行处理,处理完以后赋值一个状态。

10.为什么要克隆???
答:update有两个参数,拿到aggvo以后,克隆出来一个一模一样的aggvo1;aggvo和数据库里面的数据匹配,aggvo1是要修改的数据并且打了状态,NC会拿aggvo1去数据库里面校验,用于处理并发,判断在改之前数据库是不是已经变了,所以说要保证aggvo和数据库里面的数据一致,aggvo1是修改后的,一旦发现aggvo1和数据库里面的不一样,就说明已经被别人改过了,这时改就失败了。

11.回写的时候怎么知道哪行对应哪行???
答:通过Map和List。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

和安韩Pro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值