录入核算维度时,有可能两个维度之间存在某个关联关系,如员工和部门,银行和银行账号之间,为了提高录入效率,需要在它们之间建议联动关系,当选择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组件,注册到维度数据录入元数据上,进行调试,插件注册方法略。
注意:上述代码只是演示示意,提示开发思路,其并不严谨,缺少一些必要的数据检查,开发人员在进行二开时应根据实际情况完善相关逻辑,防止程序出错。
推荐阅读