金蝶BOTP脚本转换,对SQL语句的支持

本文介绍了金蝶BOTP脚本如何使用短名称调用SQL函数,强调了SQL语句必须为小写且无空格。内容包括SQL函数的使用场景,性能优化建议,如利用对象线程缓存减少查询重复消耗。同时,提到了宏函数在特定场景下可能不生效的问题及其解决方案。

BOTP脚本中允许通过短名称调用常用函数调用(目前只支持SQL函数);

提供简单易用的sql函数,简化数据库访问。
SQL函数语法
假定,sql是表示SQL语句的变量。

1.#sql_val 从数据库获取一个值(OBJECT);
java.lang.Object value = #sql_value(sql); 

2.#sql_row 从数据库获取一行记录(MAP);
java.util.Map row = #sql_row(sql);
注:以SQL语句中的列名的小写形式作为Map的key,对应列的值作为与key关联的值。

3.#sql_col 从数据库表获取多行记录的某一列值(ARRAY);
java.lang.Object[] array = #sql_list(sql);

4.#sql_list 从数据库表获取结果集(由MAP组成的List);
java.util.ArrayList list = #sql_list(sql);
注:list中的每一个元素是一个java.util.Map对象,Map的内容以SQL语句中的列名的小写形式作为Map的key,对应列的值作为与
该key关联的值。

5.#sql_exec 执行修改/插入/删除SQL(返回影响的行数)。
int updated = #sql_exec(sql);
注意以上sql中,不能包含空格或其他字符,并且 必须使用小写形式(原文档上的注释,测试没发现空格的特殊影响)

需要#sql_val 几乎能实现目前所有业务函数!

1.函数举例:
a.弱类型关联函数
公式结果 = __BOTGetProperty(销售出库单.销售出库单分录.核心单据行ID,"entry.taxRate");
可以替换为:
公式结果 = #sql_val("select ftaxRate from **核心单据分录表名称 where fid ='"+销售出库单.销售出库单分录.核心单据行ID+"'");

2.利用sql的集合函数做一些之前没有实现

金蝶KIS旗舰版中,查询BOM(Bill of Material,物料清单)结构的SQL语句通常涉及递归查询,以便获取多级物料组成结构。金蝶KIS使用SQL Server作为数据库平台,因此可以使用CTE(Common Table Expression)递归查询来实现全阶BOM查询。 以下是一个典型的BOM结构查询SQL语句示例,基于存储过程实现,适用于金蝶KIS旗舰版: ```sql USE [AIS202005010001] -- 替换为实际账套数据库名称 GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- 存储过程定义 ALTER PROCEDURE [dbo].[P_GET_ICBOMCHILD] @FFNUMBER VARCHAR(50) -- 输入产品编码参数 AS BEGIN SET NOCOUNT ON; -- 定义CTE递归查询 WITH BOM_CTE AS ( -- 初始查询:获取顶层物料的BOM信息 SELECT 1 AS FLevel, -- 层级 CAST(FNumber AS NVARCHAR(200)) AS FSN, -- 序号路径 FItemID, -- 子项物料ID FParentItemID AS FParentID, -- 父项物料ID FQty -- 数量 FROM [dbo].[ICBOMEntry] WHERE FParentItemID IN ( SELECT FItemID FROM [dbo].[t_Item] WHERE FNumber = @FFNUMBER ) UNION ALL -- 递归查询:获取下一层级的BOM信息 SELECT b.FLevel + 1, CAST(b.FSN + '->' + c.FNumber AS NVARCHAR(200)), c.FItemID, c.FParentItemID, c.FQty FROM [dbo].[ICBOMEntry] c INNER JOIN BOM_CTE b ON c.FParentItemID = b.FItemID ) -- 输出最终结果 SELECT * FROM BOM_CTE ORDER BY FSN; END GO ``` 该SQL脚本定义了一个存储过程`P_GET_ICBOMCHILD`,通过CTE递归方式查询指定产品编码(`@FFNUMBER`)的完整BOM结构。查询结果包括层级(`FLevel`)、序号路径(`FSN`)、子项物料ID(`FItemID`)、父项物料ID(`FParentID`)和数量(`FQty`)等字段。 在调用该存储过程时,只需传入产品编码即可: ```sql EXEC [dbo].[P_GET_ICBOMCHILD] @FFNUMBER = 'A001'; ``` 上述查询结构清晰、层级分明,适用于需要获取完整BOM结构的场景[^3]。 ### 查询单表BOM结构(不带递归) 如果仅需查询单层BOM结构(不展开多级),可使用如下简单SQL语句: ```sql SELECT a.FNumber AS FParentNumber, b.FNumber AS FChildNumber, b.FQty FROM [dbo].[t_Item] a INNER JOIN [dbo].[ICBOMEntry] bom ON a.FItemID = bom.FParentItemID INNER JOIN [dbo].[t_Item] b ON bom.FItemID = b.FItemID WHERE a.FNumber = 'A001'; -- 替换为实际产品编码 ``` 此语句用于获取指定父项物料的直接子项物料列表,适用于单层BOM查询需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值