修改采购订单付款执行视图——以新增付款金额本位币字段为例
@[TOC](目录)
## 〇、背景
2022年11月份的正式补丁采购订单发布了一个查看付款执行信息的功能,即在采购订单表头新增了【付款执行】相关字段在财务信息右侧,在采购订单表体新增了【付款执行明细】页签。
![image.webp](/download/01008b4e1243481349bab7825a3cb7f7533e.webp)
图1
【付款执行明细】中包含以下信息:申请付款金额、付款金额、退款金额等信息,而【付款执行】则是对表体的金额字段针对当前单据进行了汇总。
==需要说明的是==:这两个实体的后台表均为**视图**,因此这两个页签里的东西不支持普适的二开需要,但又难以避免部分客户具备二开资源并很需要进行一些字段的添加,用以满足其想要显示更多付款执行信息这种需求,所以就针对付款执行这块加字段的需要做个案例,仅供参考
![image.webp](/download/010035a7fe528dfe42c3bdd38def51373303.webp)
图2
![image.webp](/download/0100f8582d54e3714bf2b105fdaf7ed13615.webp)
图3
## 一、适用场景及后台视图说明
因为这两个表的后台表是个视图,所以增加字段除了在BOS上添加控件外,还得到指定的视图中新增字段。
视图是一种虚拟表,是一种显示SELECT语句的结果集构成的虚拟表,它在数据库内存储的是SELECT语句。
**修改视图实际上就是修改创建视图时的SELECT语句**,而SELECT语句是可以任意修改的,所以原则上这里的付款执行跟付款执行明细视图上想使用的字段与想联接的表可以任意加。**但执行视图修改之前需要先备份一下原视图的创建语句,并且修改前需要先执行一下新的SELECT语句是否正确**
## 二、操作步骤及示例
> 假设我们要在【付款执行明细】中新增一个付款金额本位币字段(FPAYAMOUNT_LC),并在【付款执行】中汇总为累计付款金额本位币(FALLPAYAMOUNT_LC)
这里可以先到BOS上添加好字段控件,也可以先往下走先创建好视图了最后再到BOS上添加字段控件
### 1、获取视图创建语句
先查出目前原有的V_FIN_PURORDERPAY视图脚本语句跟V_FIN_PURORDERPAYENTRY视图的脚本语句
- 方法一:在Microsoft SQL Server Management Studio(以下简称SSMS)中找到上面的两个视图位置,选择视图--右键--编写视图脚本为--CREATE到--新查询编辑器窗口。这样便得到了该视图的创建语句
![image.webp](/download/01002b3c60cf3edc4d72b384a09a356da438.webp)
图4
- 方法二:执行`sp_helptext '视图名'`语句也可查出视图的创建语句
![image.webp](/download/01004faae650a70f4df6a44bbfe93c5e359a.webp)
图5
### 2、备份原视图创建语句
先备份V_FIN_PURORDERPAYENTRY和V_FIN_PURORDERPAY的原语句
==这个地方根据【采购管理系统参数】中【采购订单显示付款视图】参数的勾选与否显示的是两套不同的视图,因此你需要备份下两套视图==
切换参数保存后再分别到数据库查询就可得到了。
### 3、修改V_FIN_PURORDERPAYENTRY的SQL脚本
以本帖子为例,我们要新增显示一个付款单的【付款金额本位币】字段
1. 先到上面第一步已经查出来的V_FIN_PURORDERPAYENTRY的sql语句中去找【付款金额】字段引用的是哪个表,因为【付款金额】跟【付款金额本位币】绝大多数情况这两个数据肯定是在同一张表上。已知采购订单付款执行明细的付款金额字段的字段名叫`FPAYAMOUNT`,我们到SSMS中Ctrl+F查找FPAYAMOUNT,然后就可以看到他是具体从哪张表里取值的了
![image.webp](/download/01005bcae16e651645c6871cf341aca2cf75.webp)
图6
2. 再到引用FPAYAMOUNT这个字段的表中去找付款金额本位币这个字段的**字段名**。以图7这个第一个片段为例:`FPAYAMOUNT`是来源与`sum(B.FPAYTOTALAMOUNTFOR)`,而`B`是`T_AP_PAYBILLENTRY`表的别名,`T_AP_PAYBILLENTRY`是付款单的订单明细,因此我们打开BOS就可以找到付款单明细中的付款金额本位币字段的字段名叫`FPAYTOTALAMOUNT`,现在我们就可以仿照当前这一段sql的书写形式,得到`FPAYAMOUNT_LC = sum(B.FPAYTOTALAMOUNT)`(在sql中会改写为sum(B.FPAYTOTALAMOUNT) AS FPAYAMOUNT_LC ),整合成sql就得到下面图8截图的形式
![image.webp](/download/010012e87ca757e046bb9c5c9a57118db983.webp)
图7
![image.webp](/download/0100503676ef0cc54e45974accc3f41e6056.webp)
图8
最外层的select记得也要查询出`FPAYAMOUNT_LC`,按照这个方法继续处理其他片段。
3. 有些部分用的是`0 AS FPAYAMOUNT`,这说明当前片段没有付款金额这个值,这些地方这样做只是为了给当前部分的FPAYAMOUNT设个0值,因为不管他有不有值,字段名是必须存在的,总之就是每个`union all`前后的两个查询语句的字段名称数量排列位置要一模一样。因此,我们的`FPAYAMOUNT_LC`也得这样处理,见图9
![image.webp](/download/0100b979fb21362e47af855c382bc2c45f75.webp)
图9
4. 至此,我们V_FIN_PURORDERPAYENTRY也就处理好了,记得每个`union all`片段都要处理噢
### 4、修改V_FIN_PURORDERPAY的SQL脚本
与上面的步骤类似,也是先找到我们我们要参考的【累计付款金额】字段是怎么处理的。用它的字段名`FALLPAYAMOUNT`到我们的SSMS中Ctrl+F查找,如图10,复制到最后来进行修改即可,见图11
![image.webp](/download/0100dec240b12fd94cf8b51d4aa5484c327b.webp)
图10
![image.webp](/download/0100cff52fa401284b718a583b0724ff98db.webp)
图11
### 5、执行脚本
如果使用创建语句修改脚本需要先删除原视图,再执行CREATE语句,并且CREATE语句不能之前不能有其他语句,所以删除和创建语句需要分开单独执行,不能全选直接运行
```SQL
--脚本执行顺序
--1、删除V_FIN_PURORDERPAYENTRY
IF EXISTS (SELECT 1 FROM KSQL_USERTABLES WHERE KSQL_TABNAME = 'V_FIN_PURORDERPAYENTRY')
DROP VIEW V_FIN_PURORDERPAYENTRY
--2、创建V_FIN_PURORDERPAYENTRY
CREATE VIEW......(具体脚本看你第三部分的)
--3、删除V_FIN_PURORDERPAY
IF EXISTS (SELECT 1 FROM KSQL_USERTABLES WHERE KSQL_TABNAME = 'V_FIN_PURORDERPAY')
DROP VIEW V_FIN_PURORDERPAY
--4、创建V_FIN_PURORDERPAY
CREATE VIEW......(具体脚本看你第四部分的)
```
### 6、根据新视图二开采购管理系统参数保存插件
因为【采购管理系统参数】会根据【采购订单显示付款视图】参数的启用与否切换不同的视图,而这个地方是通版写在保存插件代码里的,也就是说如果这个地方不跟着改的话,你上面哪怕执行了新的视图脚本,后面只要你触发了采购管理系统参数界面的保存,就又会重新重置视图了,因此这里需要根据新的视图二开保存插件
```python
import clr
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.Core')
clr.AddReference('Kingdee.BOS.App')
from Kingdee.BOS import *
from Kingdee.BOS.Core.DynamicForm.PlugIn import *
from Kingdee.BOS.Core.Base import *
from Kingdee.BOS.App.Data import *
from Kingdee.BOS.Core.DynamicForm.PlugIn.Args import *
orgId = 0
def BeginOperationTransaction(e):
global orgId
orgId = e.OrgId
def EndOperationTransaction(e):
SavePayEntrySystemParameter(e.DataEntitys)
def SavePayEntrySystemParameter(DataEntitys):
global orgId
if orgId != 0:
return
dialect = ""
if this.Context.DatabaseType == 3:
dialect = "/*dialect*/ "
if len(DataEntitys) > 0:
isCreatePayView = DataEntitys[0]["PurOrderCreatePayView"]
#如果勾选了显示付款视图参数
if isCreatePayView:
#删除采购订单执行明细视图
sql = """IF EXISTS (SELECT 1 FROM KSQL_USERTABLES WHERE KSQL_TABNAME = 'V_FIN_PURORDERPAYENTRY')
DROP VIEW V_FIN_PURORDERPAYENTRY"""
DBUtils.Execute(this.Context, sql)
#创建采购订单执行明细视图
sql = dialect + """CREATE VIEW V_FIN_PURORDERPAYENTRY(自己补全)"""
DBUtils.Execute(this.Context, sql)
#删除采购订单执行单据头视图
sql = """IF EXISTS (SELECT 1 FROM KSQL_USERTABLES WHERE KSQL_TABNAME = 'V_FIN_PURORDERPAY')
DROP VIEW V_FIN_PURORDERPAY"""
DBUtils.Execute(this.Context, sql)
#创建采购订单执行单据头视图
sql = dialect + """CREATE VIEW V_FIN_PURORDERPAY(自己补全)"""
DBUtils.Execute(this.Context, sql)
#如果没勾选显示付款视图参数
else:
#删除采购订单执行明细视图
sql = """IF EXISTS (SELECT 1 FROM KSQL_USERTABLES WHERE KSQL_TABNAME = 'V_FIN_PURORDERPAYENTRY')
DROP VIEW V_FIN_PURORDERPAYENTRY"""
DBUtils.Execute(this.Context, sql)
#创建采购订单执行明细视图
sql = dialect + """CREATE VIEW V_FIN_PURORDERPAYENTRY(自己补全)"""
DBUtils.Execute(this.Context, sql)
#删除采购订单执行单据头视图
sql = """IF EXISTS (SELECT 1 FROM KSQL_USERTABLES WHERE KSQL_TABNAME = 'V_FIN_PURORDERPAY')
DROP VIEW V_FIN_PURORDERPAY"""
DBUtils.Execute(this.Context, sql)
#创建采购订单执行单据头视图
sql = dialect + """CREATE VIEW V_FIN_PURORDERPAY(自己补全)"""
DBUtils.Execute(this.Context, sql)
```
二开插件后若无法一次性执行通过,可自行分步排查,根据报错提示,将上述脚本的干扰部分统统删掉后一步一步调试。也可以使用python二开高级技巧用vs附加进程调试puthon脚本。如何附加进程调试python脚本可参考社区文档:[Python插件调试示例](https://vip.kingdee.com/article/278933272208919552?productLineId=1)
修改采购订单付款执行视图——以新增付款金额本位币字段为例
@[TOC](目录)## 〇、背景2022年11月份的正式补丁采购订单发布了一个查看付款执行信息的功能,即在采购订单表头新增了【付款执行】相关字段...
点击下载文档
本文2024-09-23 02:38:47发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-153792.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章