Вопрос

У меня есть таблица, содержащая всех сотрудников компании (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

@Олег

  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 (и не спрашивайте меня, почему, глядя на это сейчас, это кажется глупостью...)

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top