如何利用Python 实现单据体字段简单计算?
【业务场景】:前段时间,财务提了一个需求,想要在折旧调整单中显示资产本期发生额和累计折旧的和,来显示当期累计折旧。因为折旧调整单显示的为上期累计折旧值,觉得不够全面。
经分析后认为,可以在单据体新建字段“已累计折旧”=本期发生额+累计折旧,来显示当期累计折旧。
首先我想到的是用BOS中实体服务规则来解决,但熟悉BOS的朋友会发现,用用实体服务规则,可以实现首行计算,但不能遍历单据体,导致只有第一行“已累计折旧”字段有值,其他行是空白的。那就只能二开插件了,可是又觉得有些麻烦,写完还要部署,明明很简单的功能嘛。
忽然我想到了经常在社区看到的Python实现功能的帖子,虽然对Python也不懂,可是社区举到了很多例子,经过摸索,功能最终得以实现。分享如下:
【方法分享】脚本中用到的字段示例:
单据体标识:FA_DEPRADJUSTENTRY;
累计折旧:FACCUMDEPR;
本期折旧额:FDEPR;
已累计折旧:F_TH_YLJZJ;
【操作步骤】
1、在折旧汇总页签下,新增字段“已累计折旧”,标识为F_TH_YLJZJ。
2、在表单属性中找到【表单插件】,选择【注册Python脚本】。
输入脚本名后,输入代码如下:
#引入clr运行库
import clr
#添加对cloud插件开发的常用组件的引用
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.Core')
from Kingdee.BOS.Core import *
def BeforeBindData(e):
rows=this.Model.GetEntryRowCount("FA_DEPRADJUSTENTRY");#获取单据体行数
for i in range(0,rows,1):
a = this.Model.GetValue("FDEPR",i) + this.Model.GetValue("FACCUMDEPR",i);
this.Model.SetValue("F_TH_YLJZJ",a,i);
this.View.UpdateView("FA_DEPRADJUSTENTRY");
依次保存后退出,重新登陆云星空客户端。
3、实现效果如下:
用Python比较简单的语言实现了此功能。
此外打印时,新增的已累计折旧字段会显示空值,这是因为,脚本计算后未将最终值存储到数据库,可以在打印按钮下,打印操作之前增加一个保存操作,来解决此问题。
社区是一个大宝藏,深入挖掘,才能让我们更加善于用社区的知识来解决实际中遇到的问题。
【分享】分享社区Python实例:
实施过程中动态控制枚举项加载的方法(Python) (kingdee.com)
Python脚本实现单据体首行过滤【分享】 (kingdee.com)
Python脚本实现单据体背景色及字段前景色设置【分享】 (kingdee.com)
表单属性-菜单集合里面加个按钮,里面写公式,手工点一下按钮也可以实现计算明细所有行
我按照这个操作,保存插件时提示错误,计算的结果也没有
unexpected token ' '
在 Microsoft.Scripting.Hosting.ErrorListenerProxySink.Add(SourceUnit sourceUnit, String message, SourceSpan span, Int32 errorCode, Severity severity)
在 IronPython.Compiler.Parser.ReportSyntaxError(Int32 start, Int32 end, String message, Int32 errorCode)
在 IronPython.Compiler.Parser.ReportSyntaxError(Token t, IndexSpan span, Int32 errorCode, Boolean allowIncomplete)
在 IronPython.Compiler.Parser.ReportSyntaxError(TokenWithSpan t, Int32 errorCode)
在 IronPython.Compiler.Parser.ReadName()
在 IronPython.Compiler.Parser.ReadNames()
在 IronPython.Compiler.Parser.ParseModuleName()
在 IronPython.Compiler.Parser.ParseImportStmt()
在 IronPython.Compiler.Parser.ParseSimpleStmt()
在 IronPython.Compiler.Parser.ParseFileWorker(Boolean makeModule, Boolean returnValue)
在 IronPython.Compiler.Parser.ParseFile(Boolean makeModule, Boolean returnValue)
在 IronPython.Runtime.PythonContext.ParseAndBindAst(CompilerContext context)
在 IronPython.Runtime.PythonContext.CompilePythonCode(SourceUnit sourceUnit, CompilerOptions options, ErrorSink errorSink)
在 IronPython.Runtime.PythonContext.CompileSourceCode(SourceUnit sourceUnit, CompilerOptions options, ErrorSink errorSink)
在 Microsoft.Scripting.Hosting.ScriptSource.CompileInternal(CompilerOptions compilerOptions, ErrorListener errorListener)
在 Kingdee.BOS.DomainModelDesigner.PropertyEditor.frmPythonScriptEdit.GenerateCompiledPython()
在 Kingdee.BOS.DomainModelDesigner.PropertyEditor.frmPythonScriptEdit.InitializeScope()
在 Kingdee.BOS.DomainModelDesigner.PropertyEditor.frmPythonScriptEdit.ButtonItem_Click(Object sender, EventArgs e)
公有云多租房python插件不生效,是什么原因
请教下这种为什么实体服务规则,只能实现首行更新,其他行不能,需要点击事件才能触发
这种用值更新事件也可以
学习打卡
学习啦
如何利用Python 实现单据体字段简单计算?
本文2024-09-16 18:39:00发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-23504.html