上游单据下推单据保存后,反写数据回去,当删除时,也反写上游数据
下推保存后操作的反写脚本
放在后置脚本
js
var ctx = pluginCtx.getContext();
//保存方法的入参是ObjectValue
var model = methodCtx.getParamValue(0);
//所以获取主键需要通过getId
var id = model.getId();
//当前单据表
var currentTb = "tb_current";
//上游源单据表
var srcTb = "tb_src";
//来源单据表类型,通过字段FSOURCEBILLTYPEID查看
var bosType = "bostype...";
//需要反写的字段名
var fieldName = "";
//该字段更新的值
var fieldNameVal = "";
//获取数据库值
if(id != null){
//根据FSOURCEBILLID获取上游单据id
var sql = "select FSOURCEBILLID,FSOURCEBILLTYPEID from " + currentTb + " where fid = '" + id + "'";
var rs = com.kingdee.eas.util.app.DbUtil.executeQuery(ctx,sql);
var editedId = null;
while( rs != null && rs.next()){
//来源单据为指定单据时,反写该单据
var srcBosType = rs.getString("FSOURCEBILLTYPEID");
if(srcBosType != null && srcBosType == bosType){
var srcId = rs.getString("FSOURCEBILLID");
//如果源单据已经被更新过
if(srcId != null && srcId != editedId){
//执行更新数据
var editSql = "UPDATE " + srcTb +" SET " + fieldName + " = " + fieldNameVal + " WHERE FID = '" + srcId + "'";
com.kingdee.eas.util.app.DbUtil.execute(ctx,editSql);
editedId = srcId;
}
}
}
}
删除操作
删除反写的脚本放在前置脚本
js
//在删除的前置脚本里填写
var ctx = pluginCtx.getContext();
//删除方法的入参是 IObjectPK
var model = methodCtx.getParamValue(0);
//所以直接toString就可以
var id = model.toString();
//当前单据表
var currentTb = "";
//源单据表
var srcTb = "";
//源单据表类型
var bosType = "";
//需要更新的字段
var fieldName = "";
//更新的值
var fieldNameVal = 0;
//获取数据库值
if(id != null){
var sql = "select FSOURCEBILLID,FSOURCEBILLTYPEID from " + currentTb + " where fid = '" + id + "'";
var rs = com.kingdee.eas.util.app.DbUtil.executeQuery(ctx,sql);
var editedId = null;
while( rs != null && rs.next()){
//来源单据为指定单据时,反写该单据
var srcBosType = rs.getString("FSOURCEBILLTYPEID");
if(srcBosType != null && srcBosType == bosType ){
var srcId = rs.getString("FSOURCEBILLID");
if(srcId != null && srcId != editedId){
//判断该源单据是否还存在其他下游单据(会存在可以多次生成下游单据的情况),如果存在,则不反写
var ifSql = "SELECT FID FROM " + currentTb + " WHERE FSOURCEBILLID = '"+srcId + "'";
var ifRs = com.kingdee.eas.util.app.DbUtil.executeQuery(ctx,ifSql);
//因为此时是前置脚本,还没有执行删除操作,所以应至少存在一条数据
if(ifRs.size() <= 1){
var editSql = "UPDATE " + srcTb +" SET " + fieldName + " = " + fieldNameVal + " WHERE FID = '" + srcId + "'";
com.kingdee.eas.util.app.DbUtil.execute(ctx,editSql);
editedId = srcId;
}
}
}
}
}
简单的反写上游单据某个字段值时,可以通过dep的实体扩展点进行。也就是实体的扩展定义,上述脚本是基于实体扩展点的,脚本可以直接粘贴使用,填充脚本中定义的变量即可,查询的sql可以根据实际情况做出调整,思路都是通过当前单据id查询出上游源单据id,在通过源单据id进行更新操作

注意:如果是在编辑界面的扩展定义中编写的脚本

js
com.kingdee.eas.util.app.DbUtil.executeQuery(ctx,sql);
该类DbUtil 不能在编辑界面的扩展点中使用,可以换成FMIsqlFacadeFactory
js
var fMIsqlFacade = com.kingdee.eas.fm.common.FMIsqlFacadeFactory.getRemoteInstance();
//查询方法
var rs = fMIsqlFacade.executeQuery(sql,null);
//更新方法
var rs = fMIsqlFacade.executeSgl(sql);
同样的,在编辑界面想要获取单据对象也需要不能通过methodCtx 来实现,需要换成pluginCtx.getDataObject()
js
var data = pluginCtx.getDataObject();
var id = date.getId();
补充:系统标准单据如何添加自定义的字段
打开动态扩展平台

如果需要的扩展方案未存在,需要引入

新增一个方案,其实就是一个目录

导入业务单元

在打开的页面选择需要调整的业务单元

导入完成后打开编辑页面,即可像bos开发工具一样添加控件,例如,添加一个文本控件,从右边控件栏中拖到页面即可。 注:对于脚本的更改可以无需反启用方案,对界面操作之后,如新增修改控件,需要反启用进行保存,在进行启用该方案,修改的内容才会更新。方案在未启用的时候,其中引用的单据是不能进行操作的
