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

  1. $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
    
  2. 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í.

  3. ¿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...)

¿Fue útil?

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...

  1. Preguntas "¿por qué no comienza en la fecha correcta" pero nunca proporcionas el código donde $start_at se define.Podría sernos útil.
  2. Por qué eres switchEn g $dates['status']?¿Estás seguro de que está en $dates?
  3. El switch La declaración compara valores después de hacer malabarismos con tipos...

Ejemplo de php.net:

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top