核算维度录入实现两个维度之间联动的二开方案原创
金蝶云社区-战斗的凯文
战斗的凯文
5人赞赏了该文章 1,741次浏览 未经作者许可,禁止转载编辑于2019年06月27日 17:03:45

        录入核算维度时,有可能两个维度之间存在某个关联关系,如员工和部门,银行和银行账号之间,为了提高录入效率,需要在它们之间建议联动关系,当选择A员工,自动带出该员工所在的部门,当录入了D部门时,如果该部门员工仅一人,则自动带出该员工。为了实现这一联动功能,二开时,关键是从DataChanged事件着手,通过代码来限定相关维度的取值。下面以二开银行与银行账号的联动功能为例。

        首先,二开插件应该继承AbstractDynamicFormPlugIn类,并覆写DataChanged方法,如下所示:

    [Description("凭证的维度数据录入 客户端插件核算维度联动演示")]

    public partial class ShowFlexGLCustomPageEdit_Demo : AbstractDynamicFormPlugIn

    {

        /// <summary>

        /// 数据改变时处理相关业务逻辑

        /// </summary>

        /// <param name="e"></param>

        public override void DataChanged(DataChangedEventArgs e)

        {

            //银行账号改变时自动带出银行

            this.BankAcntChanged(e);

            //银行改变的时候,如果只存在一个账号,则自动带出银行账号

            this.BankChanged(e);

            base.DataChanged(e);

        }

    }

        在BankAcntChanged方法中需要处理以下内容:
1,获取当前科目的维度 :
Dictionary<string, List<string>> dctSourceAndFelxNumber = GetFlexNumber(e.Field, e.Row, "BD_Bank", "CN_BANKACNT");

2,获得新的银行账号值:
long lBankCNTID = this.GetValueId(e.NewValue);
3,通过新的银行账号值,从数据库查出该账号对应的银行:
SELECT B.FMASTERID FBANKID FROM T_CN_BANKACNT BA JOIN T_BD_BANK B ON B.FBANKID=BA.FBANKID WHERE BA.FBANKACNTID=@FBANKACNTID
注意,核算维度用到的通过是基础资料的FMASTERID,而不是它的主键ID。
4,获得银行维度对应的界面上的字段:
var bankFields = GetFormFields(e, "BD_BANK", dctSourceAndFelxNumber["BD_BANK"]);

5,设置界面上的银行字段的值为查询出来的银行ID:
foreach (var bankField in bankFields)
{
        string key = string.Format("$${0}__{1}", e.Field.Key, bankField.Key);
        this.View.Model.SetValue(key, collections[0]["FBANKID"], e.Row);
}
        致此,根据银行账号自动带出对应银行的功能开发完成。


        当银行改变时,取对应的银行账号,如果只有一个账号,就自动带出。这一功能的思路和方法同上面基本一致,不同之处在于,由于银行对银行账号是一对多的关系,且银行是分配型基础资料,需要进行组织隔离。因此,首先要获得当前用户对银行这个基础资料有使用权限的所有组织。
List<long> lstOrgs = GetOrgIds(this.Context,lAcctSysId,lAcctOrgId);

带组织隔离的查询SQL如下:
string strSql = string.Format("SELECT FBANKACNTID,FMASTERID FROM T_CN_BANKACNT A WHERE FBANKID=@FBANKID AND FFORBIDSTATUS='A' AND FDOCUMENTSTATUS='C' AND A.FUSEORGID IN ({0}) ",string.Join(",",lstOrgs.ToArray()));
            lstParams.Add(new BOS.SqlParam("@FBANKID", BOS.KDDbType.Int64, lngNewBankIdValue));
查询出所有银行账号后,判断:如果只有一个账号,就用这个账号设置界面上银行账号字段的值,方法同前。
        注意:当基础资料是分配型或私有型时,一定要取有权的组织,对资料做组织隔离。

        插件开发完编译通过后,生成Dll组件,注册到维度数据录入元数据上,进行调试,插件注册方法略。

        注意:上述代码只是演示示意,提示开发思路,其并不严谨,缺少一些必要的数据检查,开发人员在进行二开时应根据实际情况完善相关逻辑,防止程序出错。

    

赞 5