Schleife schreibt nicht die richtigen Werte
-
12-12-2019 - |
Frage
Ich habe eine Tabelle, die alle Mitarbeiter eines Unternehmens enthält (hr_employees).Zusätzlich zu dieser Tabelle gibt es eine weitere Tabelle, die alle Start- und Enddaten sowie die Art des Vertrags enthält (hr_employees_status).
Mit den Daten, die ich bekomme, schreibe ich eine 1 oder eine 0 (1 dauerhaft, 0 andere) in eine Excel-Tabelle, farbcodiert je nach Vertragstyp (1 = Schwarz, 0 = Blau, Grün, Grau oder Rot). , in jedem Monat (von Mai 2005 bis heute).Wie ich bestimme, was in welche Zelle passen soll, erfolgt über eine Case-Klausel, indem ich mir den aktuellen Status in der Tabelle hr_employee_status ansehe.
Es schleift einwandfrei und macht 99 % seiner Aufgaben korrekt.Das einzige Problem besteht darin, dass, sobald ein Mitarbeiter von einem befristeten zu einem unbefristeten Vertrag wechselt, manchmal nicht der richtige Wert in eine Zelle geschrieben wird.
Ich habe den Code ein wenig geändert, um nur Monat und Jahr aus der Datenbank abzurufen (und den Tag auf 01 zu setzen), in der Hoffnung, dass, da der Monat und das Jahr alles sind, was zum Schreiben in eine Zelle erforderlich ist, dies auch der Fall sein würde Richtige Daten in der richtigen Zelle.Aber ohne Erfolg.
Ich weiß nicht, welchen Code ich posten soll, daher ist hier die Schleife, die den Vertragstyp bestimmt und ihn in die Excel-Tabelle schreibt:
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
sind die Ergebnisse, wie sie von der DB empfangen werden.$start_at
ist das Datum, an dem der Mitarbeiter mit einer Vertragsart begonnen hat (und bestimmt somit, welcher Monat markiert werden soll).$count
ist die Differenz zwischen dem Startdatum und dem Enddatum (Anzahl der Monate).
Ich würde gerne wissen, WARUM der Wechsel von einem befristeten zu einem unbefristeten Vertrag nicht zum richtigen Zeitpunkt beginnt.
Wenn weitere Informationen erforderlich sind, lassen Sie es mich bitte wissen.
EDIT 1: - Antwort auf das Feedback von DaveRandom und Oleg
@DaveRandom:hr_employees
sieht aus wie das:
------------------------------------------
|employee_id|name|surname|otherinfo|state|
|1 |Foo |Bar | ******* | 1 |
|2 |Ben |Smith | ******* | 1 |
------------------------------------------
hr_employees_status
sieht aus wie das:
------------------------------------------
|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 |
------------------------------------------
Und dann wird die Excel-Tabelle ausgegeben
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
ist wie folgt: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
Siehe oben.
$dates
ist eine Schleife durch die Tabelle hr_employee_status.Ich bin zu 100 % sicher, dass dort der Status steht.Bitte erklären Sie Typ-Jonglage?Alle Werte im Status sind varchar (und fragen Sie mich nicht, warum das, wenn ich es jetzt betrachte, wie eine dumme Sache erscheint ...)
Lösung
Uns fehlt ein entscheidender Teil Ihres Codes. Bis Sie uns weitere Details mitteilen (können Sie uns bitte zeigen, wo Sie definieren?) $start_at
zum Beispiel?) Ich kann nur raten...
- Sie fragen: „Warum startet es nicht zum richtigen Datum?“, aber Sie geben den Code nie an
$start_at
ist definiert.Es könnte für uns nützlich sein. - Warum bist du
switch
ing$dates['status']
?Sind Sie sicher, dass es drin ist?$dates
? - Der
switch
Anweisung vergleicht Werte nach Typ-Jonglage...
switch ("a") {
case 0:
echo "0";
break;
case "a": // never reached because "a" is already matched with 0
echo "a";
break;
}
Dies kann bei Ihnen der Fall sein, wenn der unbefristete Vertragsstatus 1 in Ihrem Unternehmen nie erreicht wird switch statement
wegen falscher Art von $dates['status']
damit es aufhört case '0':
.
Versuchen Sie es mit var_dump()
um die genauen Typen und Werte der Variablen anzuzeigen, die Sie in Ihrem Code bearbeiten.