2017-04-02 92 views
2

希望有人能提供一些帮助,我目前工作的一段代码,这似乎是有问题。不幸的是我不能发布底层数据,但会尝试解释。虽然循环问题

的代码目前通过选择KPI的周期,如果有什么需要运行或不基于当前时间和是否个人的KPI需要运行计算。目前,如果我硬编码一些kpi的代码工作正常,但如果我让它遍历所有kpi的,那些不应该运行的代码被告知运行,也在选择,定义的东西像@Period,当我让它贯穿所有KPI的设置@Period当它不应该运行,但它的意图运行它设置罚款。

总的来说,我有2个问题,我认为这是相关KPI的运行时,他们并不意味着,当他们正在运行时,他们并不意味着他们拿起错期不管怎样这是奇怪的。我想现在发生的事情是,当我让它一直贯穿KPI的时候,它们混在一起,但我不知道这是怎么发生的,在我发疯之前,任何帮助都会很大。

正如你可以从我的代码看到有2 @current_timestamps,当它设置为23.45.18.873它不应该运行一些kpi的,但它无论如何运行它们,21.45.18.873意味着它们可以运行。

declare @job_current_time_minute float, 
     @job_current_date_time_minute as datetime, 
     @current_timestamp as datetime 



SET @job_current_time_minute = 52--cast(datepart(minute, getdate()) as float) 
SET @job_current_date_time_minute = getdate() 
--SET @current_timestamp = cast('2017-04-02 23:45:18.873' as datetime) 
SET @current_timestamp = cast('2017-04-02 21:45:18.873' as datetime) 
--Run: 88 6 0 52 5 5 5 
--Run: 88 1 10 52 5 5 5 

declare 
    @kpi_id int, 
    @kpi_parent_id int, 
    @sql nvarchar(max), 
    @kpi_last_result nvarchar(100), 
    @kpi_last_runtime datetime, 
    @kpi_params nvarchar(max), 
    @kpi_current_time_minute float, 
    @schedulue_minute float, 
    @reoccurrence float, 
    @result float, 
    @kpi2 int, 

    -- Email Variables 
    @kpi_name nvarchar(150), 
    @kpi_desc nvarchar(150), 
    @kpi_report_link nvarchar(150), 
    @kpi_email_subject nvarchar(150), 
    @kpi_email_body nvarchar(300), 
    @kpi_email_query nvarchar(max), 
    @kpi_sms_msg nvarchar(300); 


SET @kpi_params = N'@retvalOUT varchar(max) OUTPUT'; 

select @kpi_id = min(kpi_id) from KPI where KPI_Active = 1; --and kpi_id in (86, 88) 

    while @kpi_id is not null 

     begin 

      select 
      @kpi_parent_id = kpi_parent_id, 
      @sql = kpi_Script, 
      @schedulue_minute = datepart(minute,s.Schedule_Start), 
      @reoccurrence = s.Reoccurrence, 
      @result = cast((@job_current_time_minute - datepart(minute,s.Schedule_Start))/s.Reoccurrence as decimal(18,2)), 
      @kpi_name = kpi_name, 
      @kpi_desc = kpi_desc, 
      @kpi_report_link = kpi_report_link, 
      @kpi_email_subject = kpi_email_subject, 
      @kpi_email_body = kpi_email_body, 
      @kpi_email_query = kpi_email_query, 
      @kpi_sms_msg = kpi_sms_msg, 
      @kpi_current_time_minute = 60*DATEPART(HOUR, GETDATE())+DATEPART(MINUTE,GETDATE()), 
      @kpi2 = KPI_ID 
      from EWI..KPI 
      inner join EWI..Schedule s on KPI.Schedule_ID = s.Schedule_ID where kpi_id = @kpi_id--order by kpi_id asc 

      --set @sql = 'select @retvalOUT= (' + @sql + ')' 

if floor(@result) <> ceiling(@result) 

     begin 

      PRINT 'Not Time to Run: ' + ' ' + cast(@kpi_id as varchar(11)) + ' ' + cast(@result as varchar(11)) 

     end 

else 

     begin 

        declare 
        @ThresholdID int, 
        @PeriodID int, 
        @Threshold_value int, 
        @Threshold_PosNeg nvarchar(5) 

      select @ThresholdID = Threshold_ID, @PeriodID = Period_ID, @Threshold_value = Threshold_value, @Threshold_PosNeg = Threshold_PosNeg from (
      -- select * from (
       select * from (
         select KPI_ID, t.Threshold_ID, p.Period_ID, t.Threshold_Value, t.Threshold_PosNeg, p.DayStartTime, p.DayEndTime, Period_desc, [Day] 
         from EWI..Threshold t join 
            EWI..Period p on t.Period_ID = p.Period_ID where KPI_ID = @kpi_id 
       ) x where (case when [Day] = datename(dw,getdate()) then Period_id 
        when [Day] = choose(datepart(dw, getdate()), 'WEEKEND','Weekday','Weekday','Weekday','Weekday','Weekday','WEEKEND') then Period_ID 
        when [Day] = 'All' then Period_ID end) is not null 
      ) y where case when datediff(second,DayStartTime,DayEndTime) > 0 then 
      case when convert(time(0), @current_timestamp) >= DayStartTime and convert(time(0), @current_timestamp) < DayEndTime then 1 else 0 end 
      else case when convert(time(0), @current_timestamp) >= DayStartTime or convert(time(0), @current_timestamp) < DayEndTime then 1 else 0 end 
      end = 1 


select 'Run: ' + cast(@kpi_id as varchar(11)) + ' ' + cast(@PeriodID as varchar(11)) + ' ' + 
cast(@Threshold_value as varchar(11)) + ' ' + cast(@job_current_time_minute as varchar(11)) + ' ' + 
cast(@result as varchar(11)) + ' ' + 
cast(ceiling(@result) as varchar(11))+ ' ' +cast(floor(@result) as varchar(11)) 

    end 


    select @kpi_id = min(kpi_id) from KPI where KPI_Active = 1 and kpi_id > @kpi_id; 


end 
+0

我不想演这个角色,但是......想象你读的问题,你想帮助;你会明白什么吗?你说你不能发布数据;甚至不是其中的一部分,这足以重现问题? –

+0

嗨乔尔戈斯,我完全同意,但试图把这些数据的子集放在一起几乎是不可能的,但我会尝试。我希望这个问题与我的代码的逻辑或我正在做的事情有关。正如我所说,如果我硬编码kpi的,它的工作正常,但是当我让while循环遍历我有问题时。 – PJD

+0

我不认为这与KPI有关,我正在设置一个试图“重现”问题的演示 –

回答

1

看看这个rextester demo。你是否同意这个模型重现了这个问题?似乎比较ceiling(@result)floor(@result)确实会给予处处true

经过我们的讨论,在我看来,测试应该是: if (@result - datepart(minute, Schedule_Start)) % @reoccurrence = 0 或类似的东西。但是这假定@ recurence是一个整数