Python列表插件批量修改单据字段-进阶版原创
金蝶云社区-CQ周玉立
CQ周玉立
71人赞赏了该文章 1.6万次浏览 未经作者许可,禁止转载编辑于2022年06月15日 17:13:15
summary-icon摘要由AI智能服务提供

本文介绍了使用Python列表插件在两种场景下批量更新单据明细字段的方法。场景一适用于明细字段值来源于系统,可基于单据字段自动关联批量更新;场景二适用于需用户手动录入值的情况,需设计自定义界面让用户录入后批量修改。文中提供了基于SQL直接更新数据库字段的示例代码,并提醒注意使用此方法时不会触发单据字段值更新和实体服务规则,需谨慎操作。同时,指出处理选中的数据行数量过多时需做额外处理,并展示了获取明细行ID并构造SQL语句进行更新的过程。

前面分享了:Python实现单据批改(单据头字段)有小伙伴问我:想批改明细字段怎么办呢?

我这里分享一下用Python列表插件如何批量更新明细字段。

对于明细字段的批量更新,我觉得根据批量更新明细字段值来源不同,主要分为两种场景:

1.明细字段的值来源于系统中,不需要用户手动录入,只需要根据单据上的字段即可关联过来批量更新。

例如,在物料里面新增了一个字段属性,需要批量更新历史单据,从明细物料关联过来,在列表对勾选的单据批量更新。

2.明细字段的值来源于用户录入,需要像批改表头字段一样,弹出界面,让用户录入,后批量修改勾选的单据。

此场景,由于不同场景,需要录入的字段类型不同,弹出的界面需要自定义设计,所以此功能只能定制化处理,无法通用。


注意:此方案是采用SQL直接更新数据库字段,没有校验控制,且不会触发单据字段值更新、实体服务规则,谨慎使用!

对于列表更新明细字段的关键问题是:需要获取到勾选的明细行ID

下面针对以上两种场景分享一下Python列表插件如何处理,不说太多,请看示例代码:


#引入clr运行库

import clr

#添加对cloud插件开发的常用组件的引用

clr.AddReference('System')

clr.AddReference('System.Data')

clr.AddReference('Kingdee.BOS')

clr.AddReference('Kingdee.BOS.Core')

clr.AddReference('Kingdee.BOS.App')

clr.AddReference('Kingdee.BOS.ServiceHelper')

#导入cloud基础库中的常用实体对象(分命名空间导入,不会递归导入)

from Kingdee.BOS import *

from Kingdee.BOS.Core import *

from Kingdee.BOS.Core.Bill import *

from Kingdee.BOS.Core.DynamicForm.PlugIn import *

from Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel import *

from System import *

from System.Data import *

from Kingdee.BOS.App.Data import *

from System.Collections.Generic import List

from Kingdee.BOS.ServiceHelper import *


def BarItemClick(e):

    btnKey = e.BarItemKey.ToUpper();

    if(btnKey=="BTNTTT"):#列表自定义菜单按钮大写

        #若需要加校验条件,可参考此代码处理

        #if(勾选的单据都允许修改(条件逻辑自行添加)):

            #this.View.ShowWarnningMessage("单据编号[XXX]第[x]行不允许修改,请重新勾选数据!");

            #e.Cancel=True;

            #return;

    selectedRowsInfo = this.ListView.SelectedRowsInfo;

    datas = this.ListModel.GetData(selectedRowsInfo);#这句代码似乎选中的数据行超过1000多行,会报错,请做处理!

    if (datas.Count <= 0):

        return;

    listEntryId=List[str]();

    for row in selectedRowsInfo:

        selectEntryId=str(row.EntryPrimaryKeyValue);

        entityKey=str(row.EntryEntityKey);

#列表一定要显示出需要更新的明细字段所在的单据体,不然无法获取明细行ID

        if(selectEntryId=="" or selectEntryId==None or entityKey<>"FEntity"):

            this.View.ShowWarnningMessage("请在过滤里面显示单据体[FEntity]!");

            return;

        listEntryId.Add(selectEntryId);

    rowIndexs = str.Join(",", listEntryId.ToArray());#将获取到的明细行ID构造成逗号隔开的字符串,

    #this.View.ShowMessage("当前选中行:" + rowIndexs);

    #场景1:下面就可以根据获取到的明细行ID构建SQL,更新明细字段(自行根据实际情况处理)

    updateSql=("/*dialect*/update BHU_GZFFCFD001_ENTRY set F_YXXYSWD='XXX'  where FENTRYID in ({0})").format(rowIndexs );

    x=DBServiceHelper.Execute(this.Context,updateSql);

    #场景2:弹出用户录入界面,让用户录入字段更新值,然后再更新字段

    #需要自己在BOS开发动态表单,然后返回录入值,在回调方法更新单据明细字段,(自行根据实际情况处理)

    #Python弹出动态表单,回调获取子页面返回值参考我另一篇文章:点击菜单弹出动态表单传递参数到子页面

    #动态表单子页面需要编写表单插件将用户录入的字段值返回父页面,可参考:子页面关闭返回数据到父页面

    #动态表单关闭返回到父页面,获取到用户录入值后,再结合场景1的方法,更新明细字段。

    #当然,也可以把获取到的明细ID传入子页面,在动态表单插件中处理直接更新单据!


【温馨提示】:网页复制代码,会有格式问题,Python讲究缩进对齐语法,关键代码已上传附件,按需下载!



发布于 金蝶云星空BOS开发交流圈 社群

图标赞 71
71人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!