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

 

posted @ 2017-02-20 16:44  安之&若素  阅读(213)  评论(0)    收藏  举报