Цикл не записывает правильные значения

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

Получив полученные данные, я записываю 1 или 0 (1 постоянный на основе, 0 другой) в таблицу Excel, кодируемую цветом в соответствии с типом контракта (1 = черный, 0 = синий, зеленый, серый или красный) в каждом месяце (с мая 2005 года по настоящее время). Как определить, в какой ячейке должна находиться ячейка, с помощью выражения 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 это результаты, полученные из БД.$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 (и не спрашивайте меня, почему, глядя на это сейчас, это кажется глупостью...)

1 ответ

Решение

Нам не хватает важной части вашего кода, поэтому пока вы не предоставите более подробную информацию (не могли бы вы показать нам, где вы определяете $start_at например?) я могу только догадываться...

  1. Вы спрашиваете "почему он не начинается с правильной даты", но вы никогда не предоставляете код, где $start_at определено. Это может быть полезно для нас.
  2. Почему ты switchИНГ $dates['status']? Вы уверены, что это в $dates?
  3. switch оператор сравнивает значения после жонглирования типа...

Пример с 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() чтобы увидеть точные типы и значения переменных, с которыми вы работаете, в вашем коде.

Другие вопросы по тегам