在基础资料上面增加复选框,复选框打钩就是允许多次下推,复选框不打勾,该基础资料在单据中,该项只能下推一次。
导包:
封装类
using System;
namespace SenGe.k3cloud.Util
{
/// <summary>
/// 类名:Upper
/// 描述:工具类
/// 作者:SenGe
/// 创建时间:<2019-01-09>
/// 最后修改人:无
/// 最后修改时间:<YYYY-MM-DD>
/// 版权所有:SenGe
/// </summary>
[Kingdee.BOS.Util.HotUpdate]
public class Upper
{
/// <summary>
/// 实现:在下推的时候,保存下推的数据,其中之保存分项工程名称不允许多次下推的数据,存储下来用来进行判断下游单据是否下推过
/// </summary>
/// <param name="e"></param>
//上游单据组织
private String f_pion_orgid;
//下推单据的fid
private String fid;
//上游单据单据头编号
private String fbillno;
//单据体需要下推的单据FEntryID
private System.Int64 fentryid;
//是否可以多次下推
private Boolean f_isitretractable;
//分项工程名称的fid
private String feachName;
public Upper()
{
}
public Upper(string f_pion_orgid, string fid, string fbillno, long fentryid, bool f_isitretractable, string feachName)
{
this.f_pion_orgid = f_pion_orgid;
this.fid = fid;
this.fbillno = fbillno;
this.fentryid = fentryid;
this.f_isitretractable = f_isitretractable;
this.feachName = feachName;
}
public string F_pion_orgid
{
get
{
return f_pion_orgid;
}
set
{
f_pion_orgid = value;
}
}
public string Fid
{
get
{
return fid;
}
set
{
fid = value;
}
}
public string Fbillno
{
get
{
return fbillno;
}
set
{
fbillno = value;
}
}
public long Fentryid
{
get
{
return fentryid;
}
set
{
fentryid = value;
}
}
public bool F_isitretractable
{
get
{
return f_isitretractable;
}
set
{
f_isitretractable = value;
}
}
public string FeachName
{
get
{
return feachName;
}
set
{
feachName = value;
}
}
}
}
下推代码
using System;
using System.Collections.Generic;
using Kingdee.BOS.App.Data;
using Kingdee.BOS;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args;
using Kingdee.BOS.Resource;
using System.Data;
namespace SenGe.k3cloud.Util
{
/// <summary>
/// 类名:IsItRetractable
/// 描述:工具类
/// 作者:SenGe
/// 创建时间:<2019-01-09>
/// 最后修改人:无
/// 最后修改时间:<YYYY-MM-DD>
/// 版权所有:SenGe
/// </summary>
[Kingdee.BOS.Util.HotUpdate]
public class IsItRetractable : AbstractConvertPlugIn
{
/// <summary>
/// 实现:下推的时候运行下面两个方法,
/// 第一个方法是记录下推的数据库名和要下推的数据的fid,在判断分项工程名是否允许多次下推
/// 第二个方法时获取下推目标单据的数据库名和进行查询是否有当前要下推的单据是否下推过,判断分项工程是否下推过,如果只允许下推一次,下推过,这里禁止下推
/// </summary>
/// <param name="e"></param>
// 上游单据-单据头-数据库表名
private String upperBill;
//上有单据-单据体-数据库表名
private String upperBody;
//上游单据-单据体需要下推的数据的FEntryID
private List<System.Int64> lsUpperBodyFEntryID;
//上游单据进行下推的所有数据集合
private List<Upper> lsUpper;
/// <summary>
/// 实现:查询到上游单据的数据库名字
/// 获取当前下推的数据FEntryID,进行数据库查询找到当前单据的FID,编号,进行保存到lsUpper集合里面
/// </summary>
/// <param name="e"></param>
public override void OnInSelectedRow(InSelectedRowEventArgs e)
{
base.OnInSelectedRow(e);
upperBill = e.SourceBusinessInfo.Entrys[0].TableName;
upperBody = e.SourceBusinessInfo.Entrys[1].TableName;
lsUpper = new List<Upper>();
lsUpperBodyFEntryID = new List<System.Int64>();
String FEntity_FEntryID = e.InSelectedRowsSQL;
FEntity_FEntryID = FEntity_FEntryID.Remove(0, FEntity_FEntryID.IndexOf("(") + 1);
while (true)
{
if (FEntity_FEntryID.ToLower().Contains(","))
{
lsUpperBodyFEntryID.Add(Convert.ToInt64(FEntity_FEntryID.Substring(0, FEntity_FEntryID.IndexOf(","))));
FEntity_FEntryID = FEntity_FEntryID.Remove(0, FEntity_FEntryID.IndexOf(",") + 1);
}
else
{
lsUpperBodyFEntryID.Add(Convert.ToInt64(FEntity_FEntryID.Substring(0, FEntity_FEntryID.IndexOf(")"))));
break;
}
}
foreach (Int64 upperBodyFentryID in lsUpperBodyFEntryID)
{
String strSQL = "SELECT f_pion_orgid,fid,fbillno,fentryid,f_isitretractable,feachname FROM(" +
"SELECT t0.FID AS FID, t0.F_PION_ORGID AS F_PION_OrgId, t0.FBILLNO AS FBillNo FROM " + upperBill + " t0 ) e0 INNER JOIN(" +
"SELECT t1.FEntryID AS FEntryID, t0.FID AS FID3, t1.FEACHNAME AS FeachName FROM " + upperBill + " t0 LEFT JOIN " + upperBody + " t1 ON(t0.FID = t1.FID)" +
") e1 ON e0.FID = e1.FID3 INNER JOIN ( SELECT t0.FID AS FID2, t0.F_ISITRETRACTABLE AS F_IsItRetractable FROM T_EachProjectData t0" +
") e2 ON e1.FeachName = e2.FID2 WHERE(e1.FID3 = '" + upperBodyFentryID + "')";
IDataReader dataReader = DBUtils.ExecuteReader(this.Context, strSQL);
while (dataReader.Read())
{
String f_pion_orgid = Convert.ToString(dataReader["f_pion_orgid"]);
String fid = Convert.ToString(dataReader["fid"]);
String fbillno = Convert.ToString(dataReader["fbillno"]);
Int64 fentryid = Convert.ToInt64(dataReader["fentryid"]);
Int64 f_isitretractable = Convert.ToInt64(dataReader["f_isitretractable"]);
String feachname = Convert.ToString(dataReader["feachname"]);
if (f_isitretractable == 1)
{
Upper upper = new Upper(f_pion_orgid, fid, fbillno, fentryid, true, feachname);
lsUpper.Add(upper);
}
}
dataReader.Close();
}
}
/// <summary>
/// 实现:该方法获取下游单据的数据库表名
/// 通过OnInSelectedRow方法获取到的数据在这里进行判断是否下推过,如果分项工程名称不允许多次下推的在这里查询到了,那么禁止下推
/// </summary>
/// <param name="e"></param>
public override void OnCreateTarget(CreateTargetEventArgs e)
{
base.OnCreateTarget(e);
String lowerBill = e.TargetBusinessInfo.Entrys[0].TableName;
String lowerBody = e.TargetBusinessInfo.Entrys[1].TableName;
String strSQL;
foreach (Upper upper in lsUpper)
{
strSQL = "SELECT fid, f_pion_orgid, fsourcebillno, feachname, fname, f_isitretractable FROM(" +
"SELECT t0.FID AS FID, t0.F_PION_ORGID AS F_PION_OrgId, t0.FSOURCEBILLNO AS FsourceBillNo FROM " + lowerBill + " t0) e0 INNER JOIN( SELECT t0.FID AS FID2, t1.FEACHNAME AS FeachName FROM " + lowerBill + " t0 LEFT JOIN " + lowerBody + " t1 ON(t0.FID = t1.FID)" +
") e1 ON e0.FID = e1.FID2 INNER JOIN ( SELECT t0.FID AS FID3, t0_L.FEACHNAME AS FName, t0.F_ISITRETRACTABLE AS F_IsItRetractable FROM T_EachProjectData t0 LEFT JOIN T_EachProjectData_L t0_L ON(t0.FID = t0_L.FID AND t0_L.FLocaleId = 2052) ) e2 ON e1.FeachName = e2.FID3 WHERE(e0.FsourceBillNo = '" + upper.Fbillno + "' AND e0.F_PION_OrgId = '" + upper.F_pion_orgid + "' AND e2.F_IsItRetractable = '1' AND e1.FeachName =" + upper.FeachName + ")";
IDataReader dataReader = DBUtils.ExecuteReader(this.Context, strSQL);
while (dataReader.Read())
{
String fname = Convert.ToString(dataReader["fname"]);
dataReader.Close();
throw new KDExceptionValidate("convert", ResManager.LoadKDString("禁止重复下推,基础资料名为:" + fname + " 禁止重复下推!", "004002030004060", SubSystemType.SCM, new object[0]),
ResManager.LoadKDString("基础资料名为:" + fname + " 禁止重复下推。", "004002030004063", SubSystemType.SCM, new object[0]));
}
dataReader.Close();
}
}
}
}
插件生成dll后,打开单据转换规则,将该dll放到里面即可