2012-05-21 5 views
3

У меня есть таблица, которая содержит всех сотрудников в компании (hr_employees). В дополнение к этой таблице есть другая таблица со всеми датами начала и окончания, плюс какой тип контракта у них есть (hr_employees_status).Loop не записывает правильные значения

С данными, которые я получаю, я пишу 1 или 0 (1 постоянный, 0 другой) в таблицу Excel, с цветовой кодировкой, определяемой типом контракта (1 = черный, 0 = синий, зеленый, серый или красный), каждый месяц (с мая 2005 года по настоящее время). Как я определяю, что должно произойти в том, какая ячейка является аргументом case, глядя на текущий статус в таблице hr_employee_status.

Он отлично работает и делает 99% того, что он должен правильно. Единственная проблема заключается в том, что, как только сотрудник переходит из временного контракта на постоянную основу, он иногда не записывает правильное значение в ячейку.

Я немного изменил код, чтобы вытащить только месяц и год из базы данных (и установить день до 01), из надежды, что, поскольку месяц и год - это все, что необходимо для записи в ячейку, он будет записывать правильные данные в правильную ячейку. Но безрезультатно.

Я не знаю, что код для размещения, так вот цикл, который определяет тип контракта и записывает его на лист первенствовать:

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 являются результаты, как полученные из БД. $start_at - это дата начала работника с типом контракта (и, таким образом, определяет, какой месяц указывать). $count - разница между датой начала и датой окончания (количество месяцев).

Я хотел бы знать, ПОЧЕМУ он не начинается в правильную дату при переключении временного контракта на постоянный.

Если какая-либо другая информация требуется, пожалуйста, дайте мне знать.

EDIT 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

Можете ли вы показать пример данных из БД и текущий/желаемый результат работы электронной таблицы? – DaveRandom

+0

* «иногда не записывает правильное значение в ячейку» * Что он пишет вместо этого? Кроме того, какие-либо ошибки/предупреждения в ваших журналах? – Oleg

+0

Тип жонглирования - это в основном автоматическое преобразование типа переменной. Например, при сравнении String с Integer - строка автоматически преобразуется в Integer. Таким образом, в 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(), чтобы увидеть точные типы и значения переменных, которые вы используете в своем коде.

Смежные вопросы