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

  1. $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
    
  2. Siehe oben. $dates ist eine Schleife durch die Tabelle hr_employee_status.Ich bin zu 100 % sicher, dass dort der Status steht.

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

War es hilfreich?

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

  1. 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.
  2. Warum bist du switching $dates['status']?Sind Sie sicher, dass es drin ist? $dates?
  3. Der switch Anweisung vergleicht Werte nach Typ-Jonglage...

Beispiel von php.net:

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top