La boucle n'écrit pas les valeurs correctes
-
12-12-2019 - |
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
$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
Voir au dessus.
$dates
est une boucle à travers la table hr_employee_status.Je suis sûr à 100% que ce statut est là.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...)
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...
- 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. - Pourquoi es-tu
switch
ing$dates['status']
?Êtes-vous sûr que c'est dans$dates
? - Le
switch
l'instruction compare les valeurs après avoir jonglé avec les types...
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.