Цикл не записывает правильные значения
-
12-12-2019 - |
Вопрос
У меня есть таблица, содержащая всех сотрудников компании (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
@Олег
$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
См. выше.
$dates
— это цикл по таблице hr_employee_status.Я на 100% уверен, что статус там есть.Пожалуйста, объясните жонглирование типами?Все значения в статусе — varchar (и не спрашивайте меня, почему, глядя на это сейчас, это кажется глупостью...)
Решение
Нам не хватает некоторой важной части вашего кода, поэтому, пока вы не предоставите более подробную информацию (не могли бы вы показать нам, где вы определяете $start_at
например?) Я могу только догадываться...
- Вы спрашиваете: «Почему оно не начинается в правильную дату», но никогда не предоставляете код, в котором
$start_at
определено.Нам это может быть полезно. - Почему ты
switch
инг$dates['status']
?Ты уверен, что это внутри?$dates
? - А
switch
оператор сравнивает значения после жонглирования типами...
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()
чтобы увидеть точные типы и значения переменных, с которыми вы работаете в своем коде.