2016-05-04 9 views
0

我正在使用python 2.7,龍捲風web服務,peewee for database。離開時需要的指導在python中報告邏輯和函數

方案要獲得假報告每月26日至下月25

所以我這樣做下面的示例場景(但在邏輯上我堅持出來)

我得到FROM_DATETO_DATE從UI(選擇報告26-04-2016至25-05-2016)

Leavetable是表名(它有員工ID,從日離開,離開至今,working_days)

working_days只不過每個假(29-04-2016 - 2016年2月5日)的計數= 2(星期六和星期日排除的話)

對於特定月份 單個僱員的總假樣品葉

  • 24-04-16 - 26-04-16,

  • 28-04-16 - 29-04-16,

  • 15-05-2016至29-05-2016

我的代碼(幫我改)

 value=0 
     for report in Leavetable.select().where(Leavetable.Employee_ID==employees_id): 
      db_from_date = report.From_Date 
      if (from_date<=db_from_date and to_date>=db_from_date): 
       workingday=float(report.Working_Days)+value 
       value= workingday 
       print value 

它獲得的價值= 3的相同休假以上的

  • 24-04-16 - 26-04-16(這是必須採取1天但不是 此代碼工作了)

  • 28-04-16 - 29-04-16(這是採取(2天)

  • 15-05-2016至29-05-2016(26,27,28,29必須排除這4天)

指導我什麼是最簡單的解決方案,讓這個邏輯工作出來,請做必要的。

根據solarflare指導,我添加了下面的代碼。

但即使在邏輯上它不適合。上述情況假期15-05-2016至29-05-2016此離開還包括當我正在採取15-04-2016至15-05-2016的報告

 value=0 
     for report in Leavetable.select().where(Leavetable.Employee_ID==employees_id): 
      for dt in rrule(DAILY, dtstart=report.From_Date,until=report.To_Date): 
       if (dt.weekday() < 5): 
        if (report.To_Date>=from_date and report.From_Date<=to_date): 
         value += 1 
        print value 
+0

我花了一段時間瞭解你在問什麼。請始終寫下你所期待的結果以及你所得到的結果(並使用正確的表格欄)。對於你的問題:你有兩個錯誤:1.你不能使用'Working_days'這個字段,因爲它總是在整個期間,你必須計算你的期間中的每一天,如果它是工作日,並且在from_date和至今。 2.在你的'if ...'中,你只能排除在from_date之前結束並在to_date之後開始的句點;現在,你會錯過下個月的第三期4天。 – Solarflare

+1

請提供'SHOW CREATE TABLE'。 –

+0

@Solarflare是的,你是R8這是沒有工作日的問題,它會花費很長的過程,所以我用了,如果你有任何解決方案或想法? –

回答

1

我改變的基本上面的代碼,如果邏輯和上面的場景中得到了滿足,下面我列出可能有些變量名可能很難理解的代碼,如果這裏有什麼評論:

    if (db_from_date>= prev_month and db_to_date<=this_month): 
         counting = float(working_day) 
         leave_availed=value+counting 
         value=leave_availed 

        elif(db_from_date >= prev_month and db_from_date <= this_month and db_to_date > this_month): 
         counting = float(working_day) 
         check_point =counting + 0.5 
         extra_days = workdays.networkdays(this_month_date,db_to_date,holidays) 
         if int(check_point)==check_point: 
          extra_days=extra_days - 0.5 
         count=counting-extra_days 
         leave_availed=value+count 
         value=leave_availed 

        elif(db_from_date < prev_month and db_to_date>=prev_month and db_to_date <= this_month): 
         counting = float(working_day) 
         extra_days = workdays.networkdays(db_from_date,prev_month_date,holidays) 
         count = counting - extra_days 
         leave_availed=value+count 
         value=leave_availed 

        elif(db_from_date < prev_month and db_to_date > this_month): 
         count = workdays.networkdays(prev_month,this_month,holidays) 
         leave_availed=value+count 
         value=leave_availed 

        else: 
         leave_availed=0