二开案例.表单插件.执行SQL

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

二开案例.表单插件.执行SQL

【应用场景】在插件中执行SQL语句。

【案例演示】采购订单,菜单集合添加多个菜单,用于执行不同类型的SQL语句。

【实现步骤】

<1>编写表单插件(代码可从文末附件中下载),代码如下。

using Kingdee.BOS;

using Kingdee.BOS.App.Data;

using Kingdee.BOS.Core.DynamicForm.PlugIn;

using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;

using Kingdee.BOS.Util;

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Linq;


namespace Jac.XkDemo.BOS.Business.PlugIn

{

    /// <summary>

    /// 【表单插件】执行SQL

    /// </summary>

    [Description("【表单插件】执行SQL"), HotUpdate]

    public class ExecuteSQLFormPlugIn : AbstractDynamicFormPlugIn

    {

        public override void BarItemClick(BarItemClickEventArgs e)

        {

            base.BarItemClick(e);

            if (e.BarItemKey.Equals("tbExecuteStoreProcedure", StringComparison.OrdinalIgnoreCase))

            {

                // 执行存储过程

                var procedureName = "P_Pur_Order";

                var sqlParameterList = new List<SqlParam>();

                sqlParameterList.Add(new SqlParam("@P1", KDDbType.AnsiString, "CGDD"));

                sqlParameterList.Add(new SqlParam("@P2", KDDbType.AnsiString, "") { Size = 200, Direction = ParameterDirection.InputOutput });

                sqlParameterList.Add(new SqlParam("@ReturnValue", KDDbType.Decimal, 0) { Direction = ParameterDirection.ReturnValue });

                # 不管是Out参数还是Return参数,都放入returnParameterList集合中了

                var returnParameterList = DBUtils.ExecuteStoreProcedure(this.Context, procedureName, sqlParameterList);

                var msg = string.Join(";", returnParameterList.Select(o => o.Name + ":" + o.Value));

                this.View.ShowMessage(msg);

                return;

            }


            if (e.BarItemKey.Equals("tbExecute", StringComparison.OrdinalIgnoreCase))

            {

                // 执行SQL并返回受影响行数

                var sql = "UPDATE T_PUR_POORDER SET FCHANGEREASON=N'货物破损' WHERE FBILLNO=@BillNo";

                var sqlParameterList = new List<SqlParam>();

                sqlParameterList.Add(new SqlParam("@BillNo", KDDbType.AnsiString, "CGDD000519"));

                var returnValue = DBUtils.Execute(this.Context, sql, sqlParameterList);

                var msg = "受影响行数:" + returnValue.ToString();

                this.View.ShowMessage(msg);

                return;

            }


            if (e.BarItemKey.Equals("tbExecuteDataSet", StringComparison.OrdinalIgnoreCase))

            {

                // 执行SQL并返回DataSet

                var sql = "SELECT * FROM T_PUR_POORDER WHERE FBILLNO LIKE @BillNo";

                var sqlParameterList = new List<SqlParam>();

                sqlParameterList.Add(new SqlParam("@BillNo", KDDbType.AnsiString, "%CGDD%"));

                var ds = DBUtils.ExecuteDataSet(this.Context, sql, sqlParameterList);

                var idList = new List<string>();

                foreach (DataRow row in ds.Tables[0].Rows)

                {

                    idList.Add(row["FID"].ToString());

                }


                var msg = "满足条件的订单内码集合:" + string.Join(",", idList);

                this.View.ShowMessage(msg);

                return;

            }


            if (e.BarItemKey.Equals("tbExecuteReader", StringComparison.OrdinalIgnoreCase))

            {

                // 执行SQL并返回DataReader

                var sql = "SELECT * FROM T_PUR_POORDER WHERE FBILLNO LIKE @BillNo";

                var sqlParameterList = new List<SqlParam>();

                sqlParameterList.Add(new SqlParam("@BillNo", KDDbType.AnsiString, "%CGDD%"));

                var idList = new List<string>();

                using (var reader = DBUtils.ExecuteReader(this.Context, sql, sqlParameterList))

                {

                    while (reader.Read())

                    {

                        idList.Add(reader["FID"].ToString());

                    }

                }


                var msg = "满足条件的订单内码集合:" + string.Join(",", idList);

                this.View.ShowMessage(msg);

                return;

            }


            if (e.BarItemKey.Equals("tbExecuteScalar", StringComparison.OrdinalIgnoreCase))

            {

                // 执行SQL并返回首行首列的值

                var sql = "SELECT COUNT(*) FROM T_PUR_POORDER WHERE FBILLNO LIKE @BillNo";

                var sqlParam = new SqlParam("@BillNo", KDDbType.AnsiString, "%CGDD%");

                var orderCount = DBUtils.ExecuteScalar(this.Context, sql, 0, sqlParam);

                var msg = "满足条件的订单数量:" + orderCount.ToString();

                this.View.ShowMessage(msg);

                return;

            }

        }

    }

}


<2>拷贝插件组件到应用站点的WebSite\Bin目录下,重启IIS。


<3>BOSIDE扩展采购订单,菜单集合新增多个菜单,如下图所示,注册表单插件,保存元数据。

如果使用Python插件,注册方式如下图。

#【Python】【表单插件】执行SQL
import clr
clr.AddReference("mscorlib")
clr.AddReference("Kingdee.BOS")
clr.AddReference("Kingdee.BOS.Core")
clr.AddReference("Kingdee.BOS.App")
clr.AddReference("System.Data")
from Kingdee.BOS import *
from Kingdee.BOS.App.Data import *
from Kingdee.BOS.Core.DynamicForm.PlugIn import *
from Kingdee.BOS.Core.DynamicForm.PlugIn.Args import *
from Kingdee.BOS.Util import *
from System import *
from System.Collections.Generic import *
from System.Data import *

def BarItemClick(e):
    if (e.BarItemKey.Equals("tbExecuteStoreProcedure", StringComparison.OrdinalIgnoreCase)):
        # 执行存储过程
        procedureName = "P_Pur_Order"
        sqlParameterList = List[SqlParam]()
        sqlParameterList.Add(SqlParam("@P1", KDDbType.AnsiString, "CGDD"))
        p2= SqlParam("@P2", KDDbType.AnsiString, "", ParameterDirection.InputOutput)
        p2.Size = 200
        sqlParameterList.Add(p2)
        sqlParameterList.Add(SqlParam("@ReturnValue", KDDbType.Decimal, 0, ParameterDirection.ReturnValue))
        returnParameterList = DBUtils.ExecuteStoreProcedure(this.Context, procedureName, sqlParameterList)
        #msg = string.Join(";", returnParameterList.Select(o => o.Name + ":" + o.Value))
        msg = "返回结果:" + ";".join((o.Name + ":" + o.Value.ToString()) for o in returnParameterList)
        this.View.ShowMessage(msg)
        return
    if (e.BarItemKey.Equals("tbExecute", StringComparison.OrdinalIgnoreCase)):
        # 执行SQL并返回受影响行数
        sql = "UPDATE T_PUR_POORDER SET FCHANGEREASON=N'货物破损' WHERE FBILLNO=@BillNo"
        sqlParameterList = List[SqlParam]()
        sqlParameterList.Add(SqlParam("@BillNo", KDDbType.AnsiString, "CGDD000519"))
        returnValue = DBUtils.Execute(this.Context, sql, sqlParameterList)
        msg = "受影响行数:" + returnValue.ToString()
        this.View.ShowMessage(msg)
        return
    if (e.BarItemKey.Equals("tbExecuteDataSet", StringComparison.OrdinalIgnoreCase)):
        # 执行SQL并返回DataSet
        sql = "SELECT * FROM T_PUR_POORDER WHERE FBILLNO LIKE @BillNo"
        sqlParameterList = List[SqlParam]()
        sqlParameterList.Add(SqlParam("@BillNo", KDDbType.AnsiString, "%CGDD%"))
        ds = DBUtils.ExecuteDataSet(this.Context, sql, sqlParameterList)
        idList = List[String]()
        for row in ds.Tables[0].Rows:
            idList.Add(row["FID"].ToString())
        msg = "满足条件的订单内码集合:" + ",".join(o for o in idList)
        this.View.ShowMessage(msg)
        return
    if (e.BarItemKey.Equals("tbExecuteReader", StringComparison.OrdinalIgnoreCase)):
        # 执行SQL并返回DataReader
        sql = "SELECT * FROM T_PUR_POORDER WHERE FBILLNO LIKE @BillNo"
        sqlParameterList = List[SqlParam]()
        sqlParameterList.Add(SqlParam("@BillNo", KDDbType.AnsiString, "%CGDD%"))
        reader = DBUtils.ExecuteReader(this.Context, sql, sqlParameterList)
        idList = List[String]()
        while reader.Read():
            idList.Add(reader["FID"].ToString())
        reader.Close()
        msg = "满足条件的订单内码集合:" + ",".join(o for o in idList)
        this.View.ShowMessage(msg)
        return
    if (e.BarItemKey.Equals("tbExecuteScalar", StringComparison.OrdinalIgnoreCase)):
        # 执行SQL并返回首行首列的值
        sql = "SELECT COUNT(*) FROM T_PUR_POORDER WHERE FBILLNO LIKE @BillNo"
        sqlParam = SqlParam("@BillNo", KDDbType.AnsiString, "%CGDD%");
        orderCount = DBUtils.ExecuteScalar(this.Context, sql, 0, sqlParam)
        msg = "满足条件的订单数量:" + orderCount.ToString();
        this.View.ShowMessage(msg)
        return

############################################################


<4>连接业务账套所在数据库,创建测试用存储过程,开发完毕。

-- 创建存储过程

DROP PROCEDURE P_Pur_Order

GO

CREATE PROCEDURE P_Pur_Order

(

@P1 VARCHAR(200), -- 这是传入参数

@P2 VARCHAR(200) OUT -- 这是传出参数

)

AS

BEGIN

DECLARE @ReturnValue INT -- 这是返回值

SELECT @P2=CAST(MAX(FID)AS VARCHAR(200)),@ReturnValue=COUNT(*) FROM T_PUR_POORDER WHERE FBILLNO LIKE '%'+@P1+'%'

RETURN @ReturnValue

END

GO


-- 执行存储过程

DECLARE @RVal INT

DECLARE @P1 VARCHAR(200)

DECLARE @P2 VARCHAR(200)

SET @P1= 'CGDD'

SET @P2 = ''

EXEC @RVal=P_Pur_Order @P1,@P2 OUT

SELECT @P2 AS P2,@RVal AS ReturnValue

-----------------------------------------------------------------------------------------




现在可以登录业务站点,打开采购订单,检验一下插件的运行效果啦。



温馨提醒

<1>BOSIDE提示的各种Python错误无需理会,一切以运行时的表现为准

<2>如果您不是Python程序员,请勿尝试直接写Python插件,前人已反复多次证明,非专业人士的尝试结果,通常都是让人奔溃的,会浪费您宝贵的开发时间和好脾气,如果您有一定的C#编程基础,建议您先写C#插件,待一切运行正常后,再把C#代码一句一句翻译成Python代码,变成Python插件,如果拿着一堆各种错误的Python插件来寻求帮忙,估计大部分人都不会想看这种代码的。

<3>复制此案例的代码后,如果本地运行不过的,请认真仔细核对代码,本示例的代码需要完整拷贝后才能正常运行,运行报错时,建议优先分析自己的代码是否出了其它问题。

<4>关于存储过程的参数类型,如不清楚的,建议百度先把概念高清楚。

IN:传入参数

OUT:传出参数

RETURN:返回值














【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696

【表单插件】执行SQL.rar

【Python插件】【表单插件】执行SQL.rar

二开案例.表单插件.执行SQL

【应用场景】在插件中执行SQL语句。【案例演示】采购订单,菜单集合添加多个菜单,用于执行不同类型的SQL语句。【实现步骤】<1>编写表单插...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息