BOS批量插入数据然后关联表实战原创
金蝶云社区-云社区用户26064194
云社区用户26064194
3人赞赏了该文章 667次浏览 未经作者许可,禁止转载编辑于2022年01月13日 08:50:29
引用的dll:
Kingdee.K3.FIN.App.Core.dll
Kingdee.BOS.App.dll
Kingdee.BOS.ServiceHelper.dll

方法:SaveFPJSZZGLRW

    [Description("发票反写应收"), HotUpdate]
    public class INVOPRT : AbstractOperationServicePlugIn
    {
        public override void OnPreparePropertys(PreparePropertysEventArgs e)
        {
            //e.FieldKeys.Add("");将需要应用的字段Key加入
            e.FieldKeys.Add("FBillNo");
            //结算组织
            e.FieldKeys.Add("FSETTLEORGID");
        }
  public override void AfterExecuteOperationTransaction(AfterExecuteOperationTransaction e)
        {
 if (strOP.EqualsIgnoreCase("Save"))
            {
                //销售普通发票,销售增值税专票 等 要更新(开票人、收款人、复核人)字段;
                List<Dto> dtos = e.DataEntitys.Select(P => new Dto()
                {
                    FId = Convert.ToInt64(P["Id"])
                   ,FSettle_ParentOrg_Id = Convert.ToInt64((P["SETTLEORGID"] as DynamicObject)["ParentOrg_Id"])
                }).Distinct().ToList();
                this.SaveFPJSZZGLRW(this.Context, dtos);
            }
        }

#region 销售普通发票,销售增值税专票 等 要更新(开票人、收款人、复核人)字段

        private class Dto
        {
            public Int64 FId { get; set; }
            public Int64 FSettle_ParentOrg_Id { get; set; }
        }

        private void SaveFPJSZZGLRW(Context context, List<Dto> list)
        {
            if (context == null || list.IsEmpty()) return;

            //创建表结构
            string tmpTableName = CommonFunction.GetTempTableName(context);
            StringBuilder sbSQL = new StringBuilder();
            sbSQL.AppendFormat(" Create table {0}  ( ", tmpTableName);
            sbSQL.Append("FId int not null ");
            sbSQL.Append(",FSettle_ParentOrg_Id int not null");
            sbSQL.Append(" ) ");
            DBUtils.Execute(context, sbSQL.ToString());

            //插入数据
            Dictionary<string, DbType> columnInfos = new Dictionary<string, DbType>();
            columnInfos.Add("FId", DbType.Int64);
            columnInfos.Add("FSettle_ParentOrg_Id", DbType.Int64);
            BulkInsertAdapter bulkInsertAdapter = new BulkInsertAdapter(context, columnInfos, tmpTableName, list.Count);
            foreach (Dto dto in list)
            {
                DataRow newRow = bulkInsertAdapter.NewRow;
                newRow["FId"] = dto.FId;
                newRow["FSettle_ParentOrg_Id"] = dto.FSettle_ParentOrg_Id;
                bulkInsertAdapter.Insert(newRow);
            }
            bulkInsertAdapter.Finish();

            //创建索引
            string indexPrefix12 = tmpTableName.Substring(6, 12);
            List<SqlObject> listSqlObject = new List<SqlObject>();
            string text = string.Format(" IF NOT EXISTS (SELECT 1 FROM KSQL_INDEXES WHERE KSQL_INDNAME = 'idx_{0}_1') CREATE INDEX idx_{0}_1 ON {1} (FId)", indexPrefix12, tmpTableName);
            listSqlObject.Add(new SqlObject(text, new List<SqlParam>()));
            text = string.Format(" IF NOT EXISTS (SELECT 1 FROM KSQL_INDEXES WHERE KSQL_INDNAME = 'idx_{0}_2') CREATE INDEX idx_{0}_2 ON {1} (FSettle_ParentOrg_Id)", indexPrefix12, tmpTableName);
            listSqlObject.Add(new SqlObject(text, new List<SqlParam>()));
            DBUtils.ExecuteBatchWithTime(context, listSqlObject, 300);
            listSqlObject.Clear();

            //更新(开票人、收款人、复核人)字段
            string updateSql = string.Format(@"/*dialect*/Merge into T_IV_SALESIC_O a Using 
                                            (
                                                select 
                                                x.FID 
                                                ,z.F_HANS_DRAWER as FDRAWER
                                                ,z.F_HANS_PAYEE as FPAYEE
                                                ,z.F_HANS_REVIEWER as FREVIEWER
                                                from T_IV_SALESIC x 
                                                inner join {0} y on x.FID=y.FID
                                                inner join HANS_t_FPJSZZGLRW z on z.FSETTLEORGID=y.FSettle_ParentOrg_Id AND z.FDocumentStatus='C'
                                             ) b ON (a.FID = b.FID)    
                                             When Matched Then Update Set a.FDRAWER = b.FDRAWER,a.FPAYEE=b.FPAYEE,a.FREVIEWER=b.FREVIEWER
                                            ", tmpTableName);
            DBServiceHelper.Execute(context, updateSql);

            //删除临时表
            if (DBServiceHelper.IsExistTable(context, tmpTableName))
                DBServiceHelper.Execute(context, string.Format(@"/*dialect*/DROP TABLE {0}", tmpTableName));
        }
        #endregion
    }
}


INVOPRT.rar(2.81KB)

图标赞 3
3人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!