Excel导入数据
--*************************************************************************** --描述:插入excel导入生成的xml数据源添加到营运备案申请表和明细表 --创建人: --创建日期:2017-01-12 --描述:导入营运端线下审核的医院提交的备案数据, -- 导入的数据相应字段需要更新到表中 --***************************************************************************** ALTER PROCEDURE [dbo].[TRD_Management_BakApplyMgr_InsertImportTradeBakApply] @XmlStr [xml], ---导入采购单商品数据xml @OperaterName [nvarchar](128), --操作人 @OperaterID [nvarchar](128), --操作人ID @ERRORINFO [varchar](3000) = NULL OUTPUT --返回错误信息 WITH EXECUTE AS CALLER AS BEGIN --拆分xml SET @ERRORINFO='' SET @XmlStr=CONVERT(XML,REPLACE(REPLACE(REPLACE(CAST(@XmlStr AS NVARCHAR(max)),'/','/'),'>','>'),'<','<')) --声明表变量 DECLARE @_T table( ID int, BAK_ID int, PLAT_ID int, BUYER_ID int, [STATE] int, APPROVE_CONTENT nvarchar(128), PRODUCT_NAME nvarchar(256), DC_PRODUCT_ID int, REG_PRODUCT_NAME nvarchar(256), REG_NO nvarchar(256), MANU_NAME nvarchar(256), SALER_NAME nvarchar(256), SPEC nvarchar(4000), MODLE nvarchar(4000), BUYER_NAME nvarchar(256), BAK_REASON nvarchar(4000), SPECIAL_CONTENT nvarchar(256), SALER_USER nvarchar(128), SALER_USER_PHONE nvarchar(128), CREATEDATE nvarchar(128), BASE_MEASURE nvarchar(128), BRAND nvarchar(128), BASE_MEASURE_EX int ) DECLARE @_TRD_RowCount int --从xml数据插入表变量 INSERT into @_T SELECT doc.col.value('数据ID[1]', 'int') 数据ID, doc.col.value('申请主ID[1]', 'int') 数据ID, doc.col.value('平台ID[1]', 'int') 数据ID, doc.col.value('医院ID[1]', 'int') 数据ID, doc.col.value('审核状态[1]', 'int') 审核状态, doc.col.value('审核备注[1]', 'nvarchar(4000)') 审核备注, doc.col.value('产品名称[1]', 'nvarchar(256)') 产品名称, doc.col.value('产品编号[1]', 'nvarchar(256)') 产品编号, doc.col.value('注册证产品名称[1]', 'nvarchar(256)') 注册证产品名称, doc.col.value('注册证号[1]', 'nvarchar(256)') 注册证号, doc.col.value('生产企业名称[1]', 'nvarchar(256)') 生产企业名称, doc.col.value('经销企业名称[1]', 'nvarchar(256)') 经销企业名称, doc.col.value('规格[1]', 'nvarchar(256)') 规格, doc.col.value('型号[1]', 'nvarchar(256)') 型号, doc.col.value('医院名称[1]', 'nvarchar(256)') 医院名称, doc.col.value('申请备注[1]', 'nvarchar(4000)') 申请备注, doc.col.value('专机专用配套机型[1]', 'nvarchar(256)') 专机专用配套机型, doc.col.value('企业联系人[1]', 'nvarchar(128)') 企业联系人, doc.col.value('企业联系人电话[1]', 'nvarchar(128)') 企业联系人电话, doc.col.value('医院申请日期[1]', 'nvarchar(128)') 医院申请日期, doc.col.value('计量单位[1]', 'nvarchar(256)') 计量单位, doc.col.value('商标[1]', 'nvarchar(256)') 商标, doc.col.value('换算比[1]', 'int') 换算比 FROM @XmlStr.nodes('/NewDataSet/MyDataSet') doc(col) --验证表变量数据是否为零 select @_TRD_RowCount=count(*) from @_T if(@_TRD_RowCount=0) BEGIN SET @ERRORINFO='生成可导入数据为空!' RETURN END if(@_TRD_RowCount>500) begin set @ERRORINFO='导入申请的数量不能超过500条!' RETURN end
--循环验证导入的生产企业,数据是否符合规则(游标) --DECLARE @ManuName NVARCHAR(256) --DECLARE @TRDPCount INT --DECLARE ManuName_cur cursor for select ManuName from @_T --open ManuName_cur --FETCH NEXT FROM ManuName_cur into @ManuName --while (@@fetch_status=0) -- begin -- --表是否存在数据 -- select @TRDPCount=count(*) from trd_plat_org where NAME=@ManuName -- if(@TRDPCount<=0) -- begin -- SET @ERRORINFO='有生产企业名称不存在,导入失败!'+cast(@ManuName as varchar(128))+',' -- RETURN -- end -- FETCH NEXT FROM ManuName_cur into @ManuName -- end --close ManuName_cur --deallocate ManuName_cur
--循环验证导入的数据来源,数据是否符合规则(游标) DECLARE @myState INT DECLARE State_cur cursor for select [STATE] from @_T open State_cur FETCH NEXT FROM State_cur into @myState while (@@fetch_status=0) begin --审核状态导入时只能是11和12,其中11为审批通过,12为审批不通过! IF @myState!=11 and @myState!=12 begin SET @ERRORINFO='审核状态不符合规则,导入失败!'+cast(@myState as varchar(128))+',' RETURN end FETCH NEXT FROM State_cur into @myState end close State_cur deallocate State_cur --添加事务 BEGIN TRANSACTION--开始事务 DECLARE @errorSun INT --定义错误计数器 SET @errorSun=0 --没错为0 /**********将营运端线下审核的备案数据状态更新到明细表中***********/ --UPDATE TRD_MANAGE_BAKITEM --SET TRD_MANAGE_BAKITEM.[STATE]=B.[STATE] --FROM @_T AS B --WHERE TRD_MANAGE_BAKITEM.ID=B.ID UPDATE TRD_MANAGE_BAKITEM SET TRD_MANAGE_BAKITEM.[STATE]=B.[STATE], TRD_MANAGE_BAKITEM.PRODUCT_NAME=B.PRODUCT_NAME, TRD_MANAGE_BAKITEM.DC_PRODUCT_ID=B.DC_PRODUCT_ID, TRD_MANAGE_BAKITEM.REG_PRODUCT_NAME=B.REG_PRODUCT_NAME, TRD_MANAGE_BAKITEM.REG_NO=B.REG_NO, TRD_MANAGE_BAKITEM.MANU_NAME=B.MANU_NAME, TRD_MANAGE_BAKITEM.SALER_NAME=B.SALER_NAME, TRD_MANAGE_BAKITEM.SPEC=B.SPEC, TRD_MANAGE_BAKITEM.MODLE=B.MODLE, TRD_MANAGE_BAKITEM.BUYER_NAME=B.BUYER_NAME, TRD_MANAGE_BAKITEM.BAK_REASON=B.BAK_REASON, TRD_MANAGE_BAKITEM.SPECIAL_CONTENT=B.SPECIAL_CONTENT, TRD_MANAGE_BAKITEM.SALER_USER=B.SALER_USER, TRD_MANAGE_BAKITEM.SALER_USER_PHONE=B.SALER_USER_PHONE, TRD_MANAGE_BAKITEM.CREATEDATE=B.CREATEDATE, TRD_MANAGE_BAKITEM.BASE_MEASURE=B.BASE_MEASURE, TRD_MANAGE_BAKITEM.BRAND=B.BRAND, TRD_MANAGE_BAKITEM.BASE_MEASURE_EX=B.BASE_MEASURE_EX FROM @_T AS B WHERE TRD_MANAGE_BAKITEM.ID=B.ID SET @errorSun=@errorSun+@@ERROR --累计是否有错 /**********将营运端线下审核的备案数据备注更新到备案审核内容表***********/ INSERT INTO TRD_BAK_APPROVE(BAK_ID,PLAT_ID,BAK_ITEM_ID,APPROVE_USER,APPROVE_DATE,APPROVE_USER_ID, APPROVE_CONTENT,APPROVE_ORG_ID,APPROVE_STATE) SELECT distinct A.BAK_ID, A.PLAT_ID, A.ID, @OperaterName, GetDate(), @OperaterID, '营运审批备注:'+A.APPROVE_CONTENT, A.BUYER_ID, A.STATE FROM @_T A SET @errorSun=@errorSun+@@ERROR --累计是否有错 --提交事物 IF @errorSun<>0 BEGIN SET @ERRORINFO= '不完整的操作,或意外中断!' ROLLBACK TRANSACTION--事务回滚语句 END ELSE BEGIN COMMIT TRANSACTION--事务提交语句 END; --根据备案产品导入的状态修改备案申请表状态 WITH T AS ( SELECT BAK_ID , STATE , COUNT(1) Qty FROM TRD_MANAGE_BAKITEM T WHERE T.STATE IN(10,11,12) GROUP BY BAK_ID , STATE ) UPDATE TRD_MANAGE_BAK SET STATE = CASE WHEN ( SELECT COUNT(1) FROM T WHERE T.BAK_ID = TRD.ID AND T.STATE IN (10,11) ) = 2 THEN 20 --审批中 WHEN ( SELECT COUNT(1) FROM T WHERE T.BAK_ID = TRD.ID AND T.STATE IN (10,12) ) = 2 THEN 20 --审批中 WHEN ( SELECT COUNT(1) FROM T WHERE T.BAK_ID = TRD.ID AND T.STATE IN (11,12) ) = 2 THEN 30 --审批完成 WHEN 10=ALL ( SELECT STATE FROM T WHERE T.BAK_ID = TRD.ID ) THEN 10 --待审批 WHEN 11=ALL ( SELECT STATE FROM T WHERE T.BAK_ID = TRD.ID ) THEN 30--审批完成【全部提交】 WHEN 12=ALL ( SELECT STATE FROM T WHERE T.BAK_ID = TRD.ID ) THEN 30--审批完成【全部提交】 END FROM TRD_MANAGE_BAK TRD JOIN T ON T.BAK_ID = TRD.ID END
下面是调用存储的代码
#region 营运端导入Excel文件数据 /// <summary> ///导入营运端线下审核过的数据到系统 /// </summary> /// <returns></returns> public static string ImportTradeBakApplyFromExcel(FileUpload exfile, string userID, string userName) { string result = string.Empty; string filePath = @"~/UploadTemplateExcelFiles/"; string fileName = ""; try { //调用文件上传 result = UploadFile.CommonUploadFile(exfile, filePath, ref fileName); if (string.IsNullOrEmpty(result)) { //从上传文件获取处理xml格式数据 string xmlresult = GetXmlDataFromExcel.GetExcelDataToXml("~/UploadTemplateExcelFiles/" + fileName); result = InsertImportTradeBakApply(xmlresult, userID, userName); } } catch (Exception ex) { return "导入发生意外错误,请联系技术人员!"; } return result; } #endregion #region 营运端导入生成的xml数据源根据ID更新备案审核状态及备注 /// <summary> /// 导入生成的xml数据源根据ID更新备案审核状态及备注 /// </summary> /// <param name="xmlresult">导入xml格式数据</param> /// <param name="projectID">项目ID</param> /// <param name="platID">平台ID</param> /// <param name="BuyerID">买方机构ID</param> /// <param name="userID">当前管理员ID</param> /// <param name="userName">当前管理员名称</param> /// <param name="BakTitle">申请名称</param> /// <returns></returns> protected static string InsertImportTradeBakApply(string xmlresult, string userID, string userName) { string errorMsg = string.Empty; try { SqlParameter[] Parameters = new SqlParameter[4]; Parameters[0] = new SqlParameter("@XmlStr", xmlresult);//导入xml格式数据 Parameters[1] = new SqlParameter("@OperaterID", userID);//当前管理员ID Parameters[2] = new SqlParameter("@OperaterName", userName);//当前管理员名称 Parameters[3] = new SqlParameter("@ERRORINFO", SqlDbType.VarChar);//导入返回的错误信息 Parameters[3].Size = 256; Parameters[3].Direction = ParameterDirection.Output; int i = SqlHelper.ExecuteNonQuery("TRD_Management_BakApplyMgr_InsertImportTradeBakApply", Parameters); errorMsg = Parameters[3].Value.ToString(); return errorMsg; } catch (Exception ex) { throw ex; } } #endregion

浙公网安备 33010602011771号