0

默认情况下,我的日期后面的 Aspx 代码来自1/1/0001 00:00:00. 问题是代码在我们的网络上运行良好,但是当以补丁的形式部署到客户端时,我得到了异常。In cs code, i had a check for the same, but I dont know why its not working on client.

所以我想从SP本身限制这个。参数在 Codebehind as 中接受值,DateTime在 SP 中参数也是Datetime。当我尝试将其更改为它时Varchar(),无论在哪里使用它都会给我例外。

请注意,我不能再更改 CS 中的代码了。我需要 SP 本身的 SQl 最终解决方案。

下面是我的SP。我试过了。

CREATE PROC UP_REM_CRUD_SALESPERSON_TARGET   
(  
 @P_OPMODE INT =NULL,  
 @P_PERSONCD INT,  
 @P_TARGETRATE INT = NULL,  
 @P_FROMDATE VARCHAR(20)=NULL,  // problem here with this param, &
 @P_TODATE VARCHAR(20)=NULL,    // with this, originally both are datetime
 @P_BROKER_BOOKING_PERCENTAGE DECIMAL(18,0) = 0,  
 @P_LMBY VARCHAR(50)=NULL,  
 @P_EXECSTATUS INT OUTPUT  
)  
 AS  
 BEGIN  

  DECLARE @V_SALARY AS DECIMAL(18,0)  
  DECLARE @V_TARGET AS DECIMAL(18,0)  
  DECLARE @V_ENDDATE AS DATE =( GETDATE()+ 36500) ;  
  //Tried with this check also but its not working too
  IF @P_FROMDATE='1/1/0001 00:00:00' 
        BEGIN
            SET @P_FROMDATE = '1/1/1753 00:00:00'
        END

    IF @P_FROMDATE ='1/1/0001 00:00:00' 
        BEGIN
            SET @P_FROMDATE = '12/12/9999 23:59:59'
        END

  -- STEP 1: FETCH GROSS SALARY OF THE SALES PERSON*/  

  SET @V_SALARY  = ( SELECT TOP(1)  BD.GROSSSALARY   
       FROM REM_M_SALEPERSON SP   
        INNER JOIN  HR_EMPPAYSLIPMAS BD    
         ON SP.PERSONCD = BD.EMPCODE   INNER JOIN HR_EMPMAS EM   
         ON SP.PERSONCD = EM.EMPCODE  
       WHERE EM.EMPCODE=@P_PERSONCD  
       ORDER BY BD.MONTHPERIODCODE  DESC  )  

  -- STEP 2: CALCULATE THE TARGET OF THAT SALES PERSON USING  
  -- TARGET = RATE* SALARY   

  SET @V_TARGET = (@P_TARGETRATE * @V_SALARY);  

  -- STEP 3: CREATE A TARGET RECORD FOR THAT SALES PERSON IN TABLE REM_T_SALESPERSON_TARGET   

  IF @P_OPMODE =1  
   BEGIN  
    INSERT INTO REM_T_SALESPERSON_TARGET(SALESPERSONID,TARGETINFIGURES,TARGETACHIEVEDINFIGURES,TARGETSTARTDATE,TARGETENDDATE,LMBY,SALESTARGETRATE, BROKER_BOOKING_PERCENTAGE )  
    VALUES (@P_PERSONCD,@V_TARGET,0,GETDATE(),@V_ENDDATE,@P_LMBY,@P_TARGETRATE, @P_BROKER_BOOKING_PERCENTAGE)  
   END  

  -- STEP 4: FETCH THE RECORDS BASED ON BOOKING     
  IF @P_OPMODE = 4  
   BEGIN  
     DECLARE @TARGET_ACHIEVED AS DECIMAL(18,2)  
     DECLARE  @DIRECT_SALES AS DECIMAL(18,0)   
     DECLARE @V_SALE_TYPE AS VARCHAR(1)   
     DECLARE @MIXED_SALES AS DECIMAL(18,0)  
     DECLARE @TOTAL_DIRECT AS DECIMAL(18,0)  
     DECLARE @TOTAL_MIXED AS DECIMAL(18,0)  

     SET @TARGET_ACHIEVED =0         
     SET @DIRECT_SALES =0         
     SET @MIXED_SALES =0   
     SET @TOTAL_DIRECT =0        
     SET @TOTAL_MIXED =0        

     /*  
     IF THE FROM DATE AND TO DATES ARE PROVIDED THEN FIND THE SALES MADE INDIVIDUALLY BY THE SALES PERSON  
     AND ALSO THE SALES IN WHICH BROKERS WERE INVOLVED, IN BETWEEN THE DATE SUPPLIED.  
     */  
     IF @P_FROMDATE IS NOT NULL AND @P_TODATE  IS NOT NULL  
      BEGIN  

       -- TOTAL SALES MADE BY SALES PERSON INDIVIDUALLY  

       SET @DIRECT_SALES = (SELECT SUM(A.NETBASICPRICE)   
             FROM REM_T_APPLICANTHDR  A INNER JOIN REM_T_SALESPERSON_TARGET B   
                      ON A.SPERSONCD = B.SALESPERSONID   
             WHERE A.SPERSONCD=@P_PERSONCD AND (A.APPDT BETWEEN @P_FROMDATE  AND @P_TODATE) AND (RTRIM(LTRIM(A.AGENTCD))='' ) )  


       -- TOTAL SALES MADE BY SALES PERSON ALONGWITH AGENTS  

       SET @MIXED_SALES = (SELECT SUM(A.NETBASICPRICE)   
            FROM REM_T_APPLICANTHDR  A INNER JOIN REM_T_SALESPERSON_TARGET B   
               ON A.SPERSONCD = B.SALESPERSONID   
            WHERE A.SPERSONCD=@P_PERSONCD AND   (A.APPDT BETWEEN @P_FROMDATE  AND @P_TODATE) AND (RTRIM(LTRIM(A.AGENTCD))<>'') )  


       -- IF THE SALE TYPE IS DIRECT THEN PICK ALL AMOUNT  

       IF @DIRECT_SALES > 0  
        BEGIN  
         SET @V_SALE_TYPE = 'D'  
         SET @TOTAL_DIRECT = @DIRECT_SALES  
        END  

       -- IF SALE IS MADE WITH AGENT INVOLVED PICK 20% OF THAT SALE  

       IF @MIXED_SALES > 0  

        BEGIN  

         SET @V_SALE_TYPE ='M'  
         SET @TOTAL_MIXED = (20*@MIXED_SALES)/100;   

        END  

       /*  
       CALCULATE TOTAL TARGET ACHIEVED AS A SUM OF INDIVIDUAL SALE AND AGENT BASED SALE  
       */  
       SET @TARGET_ACHIEVED =   (ISNULL(@TOTAL_DIRECT,0)+ISNULL(@TOTAL_MIXED,0));  


       /*CREATE A TABLE OF TARGET ACHIEVEMENT REPORT WITH ALL RELEVANT DETAILS*/  

       SELECT A.EMPNAME AS SALES_PERSON_NAME,@TARGET_ACHIEVED AS TARGET_ACHIEVED,@TOTAL_DIRECT AS DIRECTSALE,@TOTAL_MIXED AS MIXEDSALE,B.TARGETINFIGURES,B.SALESTARGETRATE,  
         CASE   
          WHEN ISNULL((@TARGET_ACHIEVED - TARGETINFIGURES),0) < 0 THEN 'BELOW TARGET'  
          ELSE CONVERT(VARCHAR, ISNULL((@TARGET_ACHIEVED - TARGETINFIGURES),0))   
         END AS TARGET_DIFFERENCE  
       FROM HR_EMPMAS A   
         INNER JOIN  REM_T_SALESPERSON_TARGET B   
       ON A.EMPCODE = B.SALESPERSONID  
       WHERE A.EMPCODE = @P_PERSONCD  


           /*TARGET ACHIEVEMENT*/  
       SELECT A.APPNO,CONVERT(DATE,A.APPDT,103)AS APPDT,C.PRJNAME,A.APPLICANT,A.BROKERAGEAMT,A.BROKARAGE,A.BROKASSAMT,A.BROKON, A.NETBASICPRICE,    
        CASE WHEN A.AGENTCD <>'' THEN 'BROKER SALE' ELSE 'DIRECT SALE' END AS SALE_TYPE  
       FROM REM_T_APPLICANTHDR A INNER JOIN REM_T_SALESPERSON_TARGET B   
           ON A.SPERSONCD = B.SALESPERSONID   
           INNER JOIN REM_M_PRJHDR C ON C.PRJCD =A.PRJCD  
       WHERE A.SPERSONCD = @P_PERSONCD AND  (A.APPDT BETWEEN @P_FROMDATE AND @P_TODATE)  



       /* INCENTIVE CALCULATION  */    

       DECLARE @INCENTIVE AS DECIMAL(18,0), @COUNTER AS INT  
       --SET @COUNTER  = (SELECT COUNT(*) FROM REM_T_APPLICANTHDR  A INNER JOIN REM_T_SALESPERSON_TARGET B  
       --     ON A.SPERSONCD = B.SALESPERSONID   
       --      WHERE A.SPERSONCD = @P_PERSONCD AND  ((CONVERT(DATE,@P_FROMDATE,102) >= CONVERT(DATE,TARGETSTARTDATE,102)) AND (CONVERT(DATE,@P_TODATE,102) <= CONVERT(DATE,TARGETENDDATE,102))))  
       --IF @COUNTER > 0  
       -- BEGIN  
       --    SET @INCENTIVE = ISNULL(@COUNTER,0) * 2500;  
       -- END  

       SET @INCENTIVE = (SELECT  SUM(CASE WHEN DISCOUNT  = 0.00 THEN 0.01 * NETBASICPRICE  
                        WHEN DISCOUNT <= 0.01 THEN 0.0075 * NETBASICPRICE  
                  WHEN DISCOUNT <= 0.02 THEN 0.0050 * NETBASICPRICE  
                  ELSE 0.0025 * NETBASICPRICE   
                 END  
                +  
                CASE WHEN AGENTCD <> 0       THEN 2500.0  
                 ELSE    0.0       END)  AS INCENTIVE  
               FROM  REM_T_APPLICANTHDR  A   
                INNER JOIN REM_T_SALESPERSON_TARGET B  
                                      ON A.SPERSONCD = B.SALESPERSONID   
               WHERE A.SPERSONCD = @P_PERSONCD AND (A.APPDT BETWEEN @P_FROMDATE AND @P_TODATE)  
               GROUP BY SPERSONCD             
           )  


          SELECT ISNULL(@INCENTIVE,0) AS TOTALINCENTIVE, ISNULL(@DIRECT_SALES,0) AS TOTALDS, ISNULL(@MIXED_SALES,0) AS TOTALMS, B.TARGETINFIGURES, ISNULL(@TARGET_ACHIEVED,0) AS TOTALTA  
          FROM REM_T_APPLICANTHDR  A   
             INNER JOIN REM_T_SALESPERSON_TARGET B  
              ON A.SPERSONCD = B.SALESPERSONID    
             INNER JOIN HR_EMPMAS C   
              ON A.SPERSONCD = C.EMPCODE  
             WHERE A.SPERSONCD = @P_PERSONCD AND (A.APPDT BETWEEN @P_FROMDATE AND @P_TODATE)  


      END  
     ELSE  
      BEGIN  
       SELECT A.APPNO,A.APPDT,C.PRJNAME,A.APPLICANT,A.BROKERAGEAMT,A.BROKARAGE,A.BROKASSAMT,A.BROKON, A.NETBASICPRICE,    
        CASE WHEN A.AGENTCD <>'' THEN 'BROKER SALE' ELSE 'DIRECT SALE' END AS SALE_TYPE  
       FROM REM_T_APPLICANTHDR A   
           INNER JOIN REM_T_SALESPERSON_TARGET B   
            ON A.SPERSONCD = B.SALESPERSONID   
           INNER JOIN REM_M_PRJHDR C   
            ON C.PRJCD =A.PRJCD  
       WHERE 1=0  
      END  
   END  
 END  
4

1 回答 1

1

您重复此块两次:

IF @P_FROMDATE ='1/1/0001 00:00:00' 
BEGIN
    SET @P_FROMDATE = '12/12/9999 23:59:59'
END

应该是@P_TODATE第二次

其次,我会说使用VARCHAR日期是可怕的。

第三个 ASP.NET 端您应该使用DateTime?而不是DateTime,因此默认值为null.

另一种选择是使用datetime2作为查询的参数。它们支持全部范围的 .NET DateTime。但这是一个快速解决方案,它并没有解决你不应该绕过的真正问题1/1/0001

于 2013-09-04T09:48:34.360 回答