Ik probeer een functie te bouwen die een datum uit mijn database haalt.
Nou dacht ik dat ik dat wel onder de knie had, maar wat ik ook doe, dit apparaat blijft maar unexpected errors geven.
De code is volledig zoals die in zen-cart gebruikt wordt, dus de sql query werkt zoals die daar staat. Kan iemand me zeggen wat hier fout gaat?
function get_boek_datum($oId){
global $db;
//de boekingsdatum bepalen op basis van de order history
//hier zit nog een fout in!
$boekdatum_raw = "select orders_status_id, date_added from " . TABLE_ORDERS_STATUS_HISTORY . " WHERE orders_id = '" . $oID . "';
$db->Execute($boekdatum_raw);
while (!$boekdatum_raw->EOF) {
$this_status_id = $boekdatum_raw->fields['orders_status_id'];
$this_boekdatum = $boekdatum_raw->fields['date_added'];
echo $this_status_id;
echo $this_boekdatum;
//if ($this_status_id == ''){
// continue;
//}
//if ($this_status_id == 2){
// $boek_datum = $this_boekdatum;
// $found = true;
// }
//if (($this_status_id == 3) && (!$found)){
// $boek_datum = $this_boekdatum;
// $found = true;
// }
//if (($this_status_id == 1) && (!$found)){
// $boek_datum = $this_boekdatum;
//}
$boekdatum = 1;
//$boekdatum_raw->MoveNext();
}
return $boekdatum;
}// END function get_boek_datum($oId)
echo "boekdatum= " . get_boek_datum(1112);
Volgens mij moet ik als boek_datum de waarde bij 7 eruit krijgen omdat die als eerste "hit" in de if statement en daar de waarde voor found op true zet.
Echter: als ik in de laatste if (==1) de $found = true niet uitcomment, dan geeft ie de waarde behorende bij status_id is 1 ipv die van 7.
Dat kan toch helemaal niet?
Als de functie in de if (==7) found al op true zet, hoe kan ie dan ooit nog in de laatste if (==1) terecht komen?
dat is niet de bedoeling, als er een status_id 2 is moet ie stoppen.
als er geen status_id 2 is maar wel een status_id 3 moet ie daar stoppen enzovoort.
Ik had de functie ook al geprogrammeerd met de return in de if statements zelf, (dus zonder dat $found ertussen) maar dan gedraagt ie zich hetzelfde....
Kennelijk doe ik iets fundamenteels verkeerd, maar ik weet niet wat dat is.
Kan jij me op weg helpen zodat die functie wel doet wat ik wil?
Ha, de code is er zo in ieder geval al een stuk op vooruit gegaan, dit ziet er wel wat beter uit ja, maar deze werkt helaas ook niet.
Ik krijg uit deze functie nog steeds de waarde die bij 1 hoort en niet de waarde die ik wil, namelijk die van 7.
Heb de code nu exact zoals hierboven maar hij "breakt" niet!
Jaja, dat is een hele goeie, ik moet inderdaad order by gebruiken omdat momenteel de status_id 1 als eerste uit deze query komt, en die wil ik sowieso alleen maar als niks anders matcht.
Maar dan heb ik nog steeds een probleem, want de waarde 2 heeft de grootste voorkeur, als die bestaat wil/moet ik die hebben als datum en maken de andere waardes niet meer uit.
Als waarde 2 er niet is dan moet ik de waarde voor id 3 hebben.
Als die er niet is dan de waarde voor 7 en heb ik dan nog niks dan pas de waarde voor 1.
dat verklaart trouwens ook waarom mijn eerste query niet goed in elkaar zat, die query kwam gewoon als eerste met die status_id 1 langs en dan was ie klaar...
Het wordt weer een leerzame middag merk ik al ;)
Gelieve Niet Bumpen:
Twee of meer keer achter elkaar in een topic posten heet bumpen. Bumpen is pas na 24 uur toegestaan en kan een reden zijn voor de admins en moderators om een topic te sluiten. Gebruik indien nodig de knop om je tekst aan te passen.
De (on) logica zit hem in de acties die de orders mogelijk kunnen krijgen.
1. in behandeling
2. vandaag verzonden
3. afgeleverd
4. bijgewerkt
5. wordt verwerkt
6. geannuleerd
7. afgehaald
Waar ik de functie voor nodig heb is om de best mogelijke datum voor de boekhouding te bepalen, wat weer in een programma buiten de webinterface zit.
De best mogelijke datum om te boeken is 2. vraag me niet waarom, dat zegt het vrouwtje en die logica ga ik helemaal niet over nadenken ;)
maar ja, er zijn ook afhalers, veel minder, maar die krijgen dus nooit 2 maar 7, dan is dat de beste datum.
dan heb je ook nog foutjes (het doorschuiven van bestellingen is handmatige actie) en sowieso wil je alles wel boeken dus als 2 en 7 er niet zijn, wil je de datum van 3 als beste datum. Om dezelfde reden is er ook de datum 1 die in principe nooit getriggered zou moeten worden, maar deze zit erin omdat elke order altijd een waarde heeft op 1 (automatisch) dus als er iemand iets helemaal loopt te ver$%^& dan heeft ie in ieder geval nog een waarde
Ik heb de code nu als volgt gemaakt;
function get_boek_datum($oID)
{
global $db;
//de boekingsdatum bepalen op basis van de order history
$boekdatum_raw = $db->Execute("SELECT orders_status_id, date_added FROM " . TABLE_ORDERS_STATUS_HISTORY . " WHERE orders_id = '" . $oID . "' ORDER BY orders_status_id DESC");
while (!$boekdatum_raw->EOF)
{
$this_status_id = $boekdatum_raw->fields['orders_status_id'];
$this_boekdatum = $boekdatum_raw->fields['date_added'];
if (in_array($this_status_id, array(2, 3, 7, 1)))
{
if (($this_status_id == 7) || ($this_status_id == 3))
{
$boek_datum = $this_boekdatum;
}
if ($this_status_id == 2)
{
$boek_datum = $this_boekdatum;
break;
}
if (($this_status_id == 1) && ($boek_datum == ''))
{
$boek_datum = $this_boekdatum;
break;
}
}
$boekdatum_raw->MoveNext();
}
$boek_datum = date("d-m-Y", mktime(0,0,0, substr($boek_datum, 5, 2), substr($boek_datum, 8, 2), substr($boek_datum, 0, 4)));
return $boek_datum;
}// einde functie get_boek_datum
Bij status 7 & 3 geef ik geen break;
en bij status 1 komt ie alleen nog als de datum nog steeds niks heeft.
Volgens mij moet ie goed zijn zo, wel ietsje minder mooi maar ja...
Bedankt voor je hulp!
ps. geen bewuste bump, maar een refresh knop op een verkeerd moment, zag het gelijk maar je eigen post verwijderen kan niet...
edit: nog even ter aanvulling, in vrijwel alle gevallen heeft een bestelling zowel status 3 als status 2. alleen status 3 is vaak een dag of wat later als status 2. als status 2 niet de voorkeursdatum zou zijn voor de boekingen dan zou het inderdaad mooi op te lossen zijn met de waarde die hij als eerste tegenkomt, maar dat is dus niet het geval :)