El bucle no escribe los valores correctos.
-
12-12-2019 - |
Pregunta
Tengo una tabla que contiene todos los empleados de una empresa (hr_employees).Además de esta tabla, hay otra tabla que tiene todas sus fechas de inicio y finalización, además del tipo de contrato que tienen (hr_employees_status).
Con los datos que obtengo, escribo un 1 o un 0 (1 permanente, 0 otro) en una hoja de cálculo de Excel, codificado por colores según lo determinado por el tipo de contrato (1 = negro, 0 = azul, verde, gris o rojo). , en cada mes (desde mayo de 2005 hasta la actualidad).Cómo determino qué debe ir en qué celda es mediante una cláusula de caso, observando el estado actual en la tabla hr_employee_status.
Funciona bien y hace el 99% de lo que debería correctamente.El único problema es que, tan pronto como un empleado pasa de un contrato temporal a uno permanente, a veces no escribe el valor correcto en una celda.
Cambié un poco el código para extraer solo el mes y el año de la base de datos (y establecer el día en 01), con la esperanza de que, dado que el mes y el año es todo lo que se necesita para escribir en una celda, escribiría el datos correctos en la celda correcta.Pero fue en vano.
No sé qué código publicar, así que aquí está el bucle que determina el tipo de contrato y lo escribe en la hoja de 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
son los resultados recibidos de la base de datos.$start_at
es la fecha en que el empleado comenzó con un tipo de contrato (y por lo tanto determina qué mes marcar).$count
es la diferencia entre la fecha de inicio y la fecha de finalización (cantidad de meses).
Me gustaría saber POR QUÉ no comienza en la fecha correcta al cambiar de un contrato temporal a uno indefinido.
Si se requiere alguna otra información, hágamelo saber.
EDITAR 1: - Respuesta a los comentarios de DaveRandom y Oleg
@DaveRandom:hr_employees
Se ve como esto:
------------------------------------------
|employee_id|name|surname|otherinfo|state|
|1 |Foo |Bar | ******* | 1 |
|2 |Ben |Smith | ******* | 1 |
------------------------------------------
hr_employees_status
Se ve como esto:
------------------------------------------
|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 |
------------------------------------------
Y luego aparecerá la hoja de 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
$start_at
es como sigue: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
Véase más arriba.
$dates
es un bucle a través de la tabla hr_employee_status.Estoy 100% seguro de que ese estado está ahí.¿Por favor explique el tipo de malabarismo?Todos los valores en status son varchar (y no me pregunten por qué, mirándolo ahora, parece una estupidez...)
Solución
Nos falta una parte crucial de su código, por lo que hasta que proporcione más detalles (¿podría mostrarnos dónde define? $start_at
por ejemplo?) Sólo puedo adivinar...
- Preguntas "¿por qué no comienza en la fecha correcta" pero nunca proporcionas el código donde
$start_at
se define.Podría sernos útil. - Por qué eres
switch
En g$dates['status']
?¿Estás seguro de que está en$dates
? - El
switch
La declaración compara valores después de hacer malabarismos con tipos...
switch ("a") {
case 0:
echo "0";
break;
case "a": // never reached because "a" is already matched with 0
echo "a";
break;
}
Este podría ser su caso donde el estado de contrato permanente 1 nunca se alcanza en su switch statement
debido a un tipo incorrecto de $dates['status']
haciendo que se detenga en case '0':
.
Intenta usar var_dump()
para ver los tipos y valores exactos de las variables con las que está operando en su código.