2012-05-21 146 views
3

我有一個表包含公司中所有員工(hr_employees)。除此表之外,另一個表格包含所有開始日期和結束日期,以及它們具有的合同類型(hr_employees_status)。使用我得到的數據,我寫了一個1或0(1永久基礎,0其他)到excel電子表格,根據契約類型確定顏色編碼(1 =黑色,0 =藍色,綠色,灰色或紅色),每月(從2005年5月至現在)。我如何通過case子句來確定哪些單元格應該到哪裏,查看hr_employee_status表中的當前狀態。循環不寫入正確的值

它循環良好,並且它應該正確地執行99%的操作。唯一的問題是,只要員工從臨時合同移到永久基礎上,它有時不會將正確的值寫入單元格。

我已經將代碼稍微改爲只從數據庫中提取月份和年份(並將日期設置爲01),出於希望,因爲月和年是寫入單元格所需的全部內容,它會在正確的單元格中寫入正確的數據。但無濟於事。

我不知道作什麼崗位代碼,所以這裏是確定合同的類型,並將其寫入到Excel工作表的循環:

switch ($dates['status']) { 
case '0': 
    $color = 'blue'; 
    $cellcontent="0"; 
    break; 
case '1': 
    $color = 23; 
    $cellcontent="0"; 
    break; 
case '2': 
    $color = 'black'; 
    $cellcontent="1"; 
    break; 
case '3': 
    $color = 'green'; 
    $cellcontent="0"; 
    break; 
case '4': 
    $color = 'red'; 
    if(mysql_num_rows($query) > 2) 
     $cellcontent = "0"; 
    else { 
     $cellcontent="1"; 
    } 
    break; 
} 
if($s['state'] == '4') 
    $color = 'red'; 
$format_content =& $workbook->addFormat(array('align' => 'center', 'size' => 11, 'numformat' => '@', 'fontfamily' => 'Calibri', 'left' => 1, 'bottom' => 1, 'right' => 1, 'color' => $color)); 
for($f = $start_at; $f <= $start_at+$count; $f++) { 
    $totalmonths = $totalmonths + $cellcontent; 
    $worksheet->write($k,15+$f,$cellcontent,$format_content); 
} 

$date是結果從DB好評。 $start_at是員工以合同類型開始的日期(從而確定要標記哪個月)。 $count是開始日期和結束日期(月數)之間的差額。

我想知道爲什麼它不是從正式的日期開始,從臨時合同轉換爲永久合同。

如果需要其他信息,請告訴我。

編輯1: - 響應從DaveRandom和奧列格反饋

@DaveRandom: hr_employees看起來是這樣的:

------------------------------------------ 
|employee_id|name|surname|otherinfo|state| 
|1   |Foo |Bar | ******* | 1 | 
|2   |Ben |Smith | ******* | 1 | 
------------------------------------------ 

hr_employees_status看起來是這樣的:

------------------------------------------ 
|employee_id|from_date |to_date |status| 
|1   |2006-07-12|2009-08-11| 0 | 
|1   |2009-08-12|0000-00-00| 1 | 
|2   |2009-07-01|0000-00-00| 1 | 
------------------------------------------ 

而且那麼Excel表格將輸出

Name  Surname  Start Date  *dates* June-06 July06 ->- July09 Aug09 Sep09 
Foo  Bar   2006-07-12    *empty*  0 ->- 0  1  1 
Ben  Smith  2009-07-01    *empty* *empty* ->- 1  1  1 

@Oleg

  1. $start_at如下:

    round(((substr($dates['from_date'],0,4) * 12) + substr($dates['from_date'],5,2)) - ((substr($start_date,0,4) * 12) + substr($start_date,5,2))) + 1; 
    // $dates is a loop through the hr_employee_status table 
    
  2. 見上文。 $dates是通過hr_employee_status表的循環。我100%確定那個狀態在那裏。

  3. 請解釋類型雜耍?所有的狀態值都是varchar(並且不要問我爲什麼,現在看它,這似乎是一件愚蠢的事情......)

+0

可以顯示來自DB的示例數據和當前/想要的電子表格輸出嗎? – DaveRandom

+0

*「有時不會將正確的值寫入單元格」*它代之以什麼?此外,您的日誌中的任何錯誤/警告? – Oleg

+0

類型雜耍基本上是自動變量類型轉換。例如,將一個字符串與一個整數進行比較 - 該字符串會自動轉換爲整數。因此,在PHP中:'var_dump(0 ==「a」); // true'。 – Oleg

回答

0

我們缺少你的代碼的某些關鍵部分,所以直到你提供更多的細節(你能不能告訴我們,你比如定義$start_at?)我只能猜測...

  1. 你問「爲什麼它不能在正確的日期開始」,但你永遠不會提供代碼$start_at的定義。這對我們可能有用。
  2. 你爲什麼要switch ing $dates['status']?你確定它在$dates
  3. switch聲明式的雜耍後比較值...

Example from php.net

switch ("a") { 
case 0: 
    echo "0"; 
    break; 
case "a": // never reached because "a" is already matched with 0 
    echo "a"; 
    break; 
} 

這可能是你的情況下永久合同狀態1永遠不會在你的switch statement達到,因爲類型不正確$dates['status']使其停止在case '0':

嘗試使用var_dump()查看代碼中操作變量的確切類型和值。