Question

J'ai une table qui contient tous les employés d'une entreprise (hr_employees).En plus de ce tableau, se trouve un autre tableau contenant toutes leurs dates de début et de fin, ainsi que le type de contrat dont ils disposent (hr_employees_status).

Avec les données que j'obtiens, j'écris un 1 ou un 0 (1 permanent, 0 autre) sur une feuille de calcul Excel, codé par couleur selon le type de contrat (1 = noir, 0 = bleu, vert, gris ou rouge) , chaque mois (de mai 2005 à aujourd'hui).Comment je détermine ce qui doit aller dans quelle cellule se trouve par une clause case, en regardant l'état actuel dans la table hr_employee_status.

Il boucle bien et fait correctement 99% de ce qu'il devrait.Le seul problème est que, dès qu'un employé passe d'un contrat temporaire à un contrat permanent, il arrive parfois qu'il n'écrive pas la bonne valeur dans une cellule.

J'ai légèrement modifié le code pour extraire uniquement le mois et l'année de la base de données (et définir le jour sur 01), dans l'espoir que, puisque le mois et l'année suffisent pour écrire dans une cellule, il écrirait le corriger les données dans la bonne cellule.Mais en vain.

Je ne sais pas quel code poster, voici donc la boucle qui détermine le type de contrat et l'écrit sur la feuille 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 sont les résultats reçus de la base de données.$start_at est la date à laquelle l'employé a commencé avec un type de contrat (et détermine ainsi le mois à marquer).$count est la différence entre la date de début et la date de fin (nombre de mois).

Je voudrais savoir POURQUOI cela ne commence pas à la bonne date lors du passage d'un contrat temporaire à un contrat permanent.

Si d'autres informations sont nécessaires, veuillez me le faire savoir.

MODIFICATION 1 : - Réponse aux commentaires de DaveRandom et Oleg

@DaveRandom :hr_employees ressemble à ça:

------------------------------------------
|employee_id|name|surname|otherinfo|state|
|1          |Foo |Bar    | ******* |  1  |
|2          |Ben |Smith  | ******* |  1  |
------------------------------------------

hr_employees_status ressemble à ça:

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

Et puis la feuille Excel affichera

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 est comme suit:

    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. Voir au dessus. $dates est une boucle à travers la table hr_employee_status.Je suis sûr à 100% que ce statut est là.

  3. Veuillez expliquer la jonglerie de types ?Toutes les valeurs de status sont varchar (et ne me demandez pas pourquoi, en y regardant maintenant, cela semble être une chose stupide à faire...)

Était-ce utile?

La solution

Il nous manque une partie cruciale de votre code, donc jusqu'à ce que vous fournissiez plus de détails (pourriez-vous nous montrer où vous définissez $start_at par exemple ?) Je ne peux que deviner...

  1. Vous demandez "pourquoi ça ne commence pas à la bonne date" mais vous ne fournissez jamais le code où $start_at est défini.Cela pourrait nous être utile.
  2. Pourquoi es-tu switching $dates['status']?Êtes-vous sûr que c'est dans $dates?
  3. Le switch l'instruction compare les valeurs après avoir jonglé avec les types...

Exemple de php.net:

switch ("a") {
case 0:
    echo "0";
    break;
case "a": // never reached because "a" is already matched with 0
    echo "a";
    break;
}

Cela peut être votre cas où le statut de CDI 1 n'est jamais atteint dans votre switch statement en raison d'un type incorrect de $dates['status'] le faisant s'arrêter à case '0':.

Essayez d'utiliser var_dump() pour voir les types et les valeurs exacts des variables sur lesquelles vous opérez dans votre code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top