Loop non scrivere i valori corretti
-
12-12-2019 - |
Domanda
Ho una tabella che contiene tutti i dipendenti di un'azienda (hr_employees).In aggiunta a questo tavolo, è un'altra tabella con tutte le loro date di inizio e di fine, più che il tipo di contratto che hanno (hr_employees_status).
Con i dati che ho, scrivo un 1 o uno 0 (1 permanente basato, 0 altri) di un foglio di calcolo di excel, di colore codificato come determinato dal tipo di contratto (1 = nero, 0 = blu, verde, grigio o rosso), in ogni mese (da Maggio 2005 fino al presente).Come determinare che cosa dovrebbe andare in quale cella è da una clausola di caso, guardando lo stato attuale nel hr_employee_status tabella.
Si loop bene, e fa il 99% di quello che dovrebbe correttamente.L'unico problema è che, non appena un dipendente si sposta da un contratto di lavoro temporaneo a permanente, che a volte non scrive il corretto valore di una cella.
Ho cambiato il codice un po ' solo a tirare il mese e l'anno dal database (il giorno 01), di speranze che, dal mese e anno è tutto quello che serve per scrivere in una cella, di scrivere i dati in modo corretto in cella corretta.Ma senza alcun risultato.
Non so quale codice postale, così qui è il ciclo che determina il tipo di contratto e scrive per il foglio di 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
è il risultato di quanto ricevuto dal DB.$start_at
è la data in cui il dipendente è iniziato con un tipo di contratto (e, quindi, determina il mese di mark).$count
è la differenza tra la data di inizio e la data di fine (numero di mesi).
Vorrei sapere PERCHÉ non iniziare a correggere la data di quando si passa da un contratto a tempo determinato, di una permanente.
Se qualsiasi altra informazione è necessaria, per favore fatemelo sapere.
EDIT 1: - Risposta al feedback da DaveRandom e Oleg
@DaveRandom:hr_employees
assomiglia a questo:
------------------------------------------
|employee_id|name|surname|otherinfo|state|
|1 |Foo |Bar | ******* | 1 |
|2 |Ben |Smith | ******* | 1 |
------------------------------------------
hr_employees_status
assomiglia a questo:
------------------------------------------
|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 |
------------------------------------------
E poi il foglio di excel in uscita
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
è come segue: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
Vedi sopra.
$dates
è un ciclo attraverso il hr_employee_status tabella.Io sono sicuro al 100% che lo stato c'è.Si prega di spiegare il tipo di giocoleria?Tutti i valori di stato è di tipo varchar (e non mi chiedete il perchè, guardando ora, mi sembra una cosa stupida da fare...)
Soluzione
Ci manca qualche parte cruciale del vostro codice, così fino a quando non fornire più dettagli (potrebbe mostrarci dove si definiscono $start_at
per esempio?) Posso solo immaginare...
- Si chiede "perché non iniziare a data corretta", ma non ti forniscono il codice di cui
$start_at
è definito.Potrebbe essere utile anche a noi. - Perché
switch
ing$dates['status']
?Siete sicuri che sia in$dates
? - Il
switch
dichiarazione confronta i valori di una volta tipo di giocoleria...
switch ("a") {
case 0:
echo "0";
break;
case "a": // never reached because "a" is already matched with 0
echo "a";
break;
}
Questo potrebbe essere il caso in cui il contratto a tempo indeterminato di stato 1 non viene mai raggiunto nella tua switch statement
a causa del non corretto tipo di $dates['status']
rendendo arrestarsi case '0':
.
Provare a utilizzare var_dump()
per vedere l'esatta valori e tipi di variabili in uso nel tuo codice.