ik ben aan het proberen mijn verschillende MySQL query's
te combineren.
Nu de query zelf is geen probleem, maar hoe steek ik de resultaten
in een $variable in PHP?
De query
<?php
$sql= "SELECT SUM( tijd ) AS tijd, SUM( night ) AS night, SUM( sat ) AS sat, SUM( sun ) AS sun, SUM( lunch ) AS lunch FROM roster2013 WHERE naam = '$foo' AND maand ='$maand'";
$sql2 = mysql_query($sql) or die(mysql_error());
?>
voorheen maakte ik voor elke SUM een aparte query waar ik dan de waarde in een variable stak
<?php
$query = "SELECT SUM(tijd)FROM roster2013 WHERE naam = '$foo' AND maand ='$maand'";
$tijd = mysql_query($query) or die(mysql_error());
$tijd2 = mysql_fetch_assoc($tijd);
$tijd3 = $tijd2['SUM(tijd)'];
?>
en dit dan x aantal keer.
Nu moet dit echter toch veel makkelijker kunnen dacht ik, maar de oplossing ontbreekt
me...
tja, als je per medewerker al 12 regels gebruikt, voor wat mi. gewoon voor elke medewerker in 1 regel (+1 voor een while-lus), dan loopt het als snel op natuurlijk...
Ik denk dat je even afstand moet nemen van je php code, en eerst eens moet kijken hoe je een query (liefst inderdaat één query) maakt die alle data oplepelt uit je database. Zodat je daarna eigenlijk alleen nog een lus nodig hebt om eea weer te geven.
Ik vraag me ook af of je berekening door het hele jaar niet neerkomt op "dezelfde query, maar dan niet per maand, maar per jaar" (ik neem aan dat $jan, $feb etc het aantal nominale uren per maand bevat).
Namen van variabelen met nummers: eigenlijk altijd een aanduiding dat je iets doet om array's te vermijden. (er zijn trouwens op http://php.net/array een hele berg functies te vinden die rechtstreeks met array's kunnen werken)
En $mvh is ook een verkeerde weg: je maakt je code nu afhankelijk van de naam van de medewerkers.
Als over 2 jaar MvH vertrekt en zijn vervanger heet NdK, dan kun je ofwel de hele code door worstelen, ofwel jouw vervanger bedenkt dat hij de gegevens van NdK gewoon in $mvh gaat opslaan.
Dan ben je je link met de naam kwijt "maar het werkt wel" en 3 wijzigingen verder kan niemand nog wijs uit de code.
inderdaad vandaar mijn wens naar vereenvoudiging :-D
Het was ooit makkelijker om te begrijpen met aparte query's maar moet daar inderdaad
van af stappen.
Naar berekening toe heb je een punt of het nu per maand is of per jaar uiteindelijk
kom je in december aan een eindresultaat, nu moet ik echter het wel per maand doen
omdat op basis van de overuren per maand we iemand de volgende maand dagje minder of meer
laten werken zodat we op het einde van het jaar zo dicht mogelijk bij 0 zitten.
Wat de medewerkers betreft snap ik het ook, daar zit ik echter dat er mensen bv maar
4 dagen/week andere 3 dagen dus ik geef het aantal uren aan met een array:
<?php
if ($maand == '1' && in_array($foo,array('MVH', 'YBO', 'FCL', 'MST', 'ISL','BLE','SSL','JOM')))
$tbp = '167.20';
elseif ($maand == '1' && in_array($foo,array('IAD',BOE,AVM))) $tbp = '133.76';
?>
die uren sla je sbest ook op in een tabel van je database
tabel medewerkers:
id
naam
tabel tewerkenuren:
medewerker_id
jaar
maand
uren
Maar hoe dan ook: de query is eigenlijk ook gelijk per maand of jaar:
stel het is vandaag 1 juli 2014
dan heeft de persoon gewerkt: het sum(dag + nacht + zondag) over de periode (1 jan/ 30 juni)
en hij had moeten werken? dat staat in de tabel TewerkenUren. Waarbij jaar = 2014 en maand < 7 (is vandaag juli)
In principe kun je ook sommeren over het hele jaar 2014, aangezien het vrij zeker is dat er nog niets gewerkt is in oktober als het vandaag juli is...
@Ivo P:
naar aanleiding van je suggestie voor 2 extra tabellen te maken
heb ik dit ook gedaan.
Ik merk echter dat ik er nog niet veel meer te weten van gekomen ben
betreffende array's, en zie nog niet echt hoe ik dit kan toepassen
op mijn probleem. Tips zijn altijd welkom...
Naar de MySQL toe inderdaad uiteindelijk kan ik SUM maken voor persoon X
op jaarbasis en die dan per maand af toetsen aan de gewerkte uren...
Dus eigenlijk SUM(dag,zon,nacht) die dan via een loop nakijkt naar
de te presteren werkuren uit de tabel voor persoon X die maand?
Heb even screenshot genomen van 2013 om het iets visueler voor te stellen
wat ik nu eenvoudiger wil bereiken.
thanks again!
UPDATE:
zit al een beetje verder met de SUM query:
SELECT maand, SUM( tijd + night + sun - lunch )
FROM `roster2014`
WHERE naam = 'X'
GROUP BY MONTH(start)
Dit is direct slechts 1 query ipv 12 of kan het nog verder gaan?
Ik zou om te beginnen even sorteren op de maand, aangezien je anders je rijen in een rare volgorde zou kunnen terug krijgen. Ook als dat nu een logische volgorde lijkt: je database zou na een delete-actie of een opschooactie oid best ineens de resultaten in een andere volgorde kunnen uitspugen.
Daarnaast is het niet nodig om per werknemer een query uit te voeren. Die voeg je dus gewoon toe in het SELECT stukje (en de group by natuurlijk). Daarnaast sorteer je op die naam, anders wordt het vast een zooitje
Ik zou ook het jaartal toevoegen. Je zegt nu wel dat je per jaar een tabelmaakt, maar genummerde tabelnamen is zo mogelijk nog onwerkbaarder dan genummerde kolommen.
En op basis van de datum in start weet je toch al welk jaar het om gaat. Als je alleen het jaar 2013 wilt: toevoegen in WHERE
SELECT MONTH(start) maand,
YEAR(start) jaar,
naam,
SUM( tijd + night + sun - lunch )
FROM `roster2014`
WHERE YEAR(start) = 2013
GROUP BY MONTH(start), YEAR(start), naam
ORDER BY naam ASC,
jaar ASC,
maand ASC
[size=xsmall]Toevoeging op 27/12/2013 10:00:05:[/size]
En nu combineren met de tabel met te werken uren
Je moet de uren hebben die overeenkomen met de de medewerker en de juiste periode (jaar + maand)
SELECT MONTH(r.start) maand,
YEAR(r.start) jaar,
r.naam,
SUM( r.tijd + r.night + r.sun - r.lunch ),
tw.uren
FROM `roster2014` r
JOIN tewerkenuren tw ON tw.naam = r.naam AND tw.jaar = YEAR(r.start) AND tw.maand = MONTH(r.start)
WHERE YEAR(start) = 2013
GROUP BY maand, jaar, naam
ORDER BY r.naam ASC,
jaar ASC,
maand ASC
Ik merk echter dat ik er nog niet veel meer te weten van gekomen ben
betreffende array's, en zie nog niet echt hoe ik dit kan toepassen
op mijn probleem. Tips zijn altijd welkom...
<?php
// even wat voorbeeld data in teWerkenUren
$teWerkenUren = array(36,36,36,36,36,36,36,36,36,36,36,36);
// even wat voorbeeld data in mvh
$mvh = array(101,102,103,104,105,106,107,108,109,110,111,112);
// lege array voor mvhOT
$mvhOT = array();
// voorbeeld waarde voor $prevmvh
$prevmvh = 113;
// de eerste is afwijkend ivm $prevmvh. die doen we dus buiten de lus om.
$mvhOT[] = ($mvh[0] - $teWerkenUren[0]) + $prevmvh;
// een lus die elf keer doorlopen wordt ( $i = 1 tm 11 )
for($i = 1 ; $i < 12 ; $i++)
{
// de andere 11 zijn nu telkens het zelfde.
$mvhOT[] = ($mvh[$i] - $teWerkenUren[$i]) + $mvhOT[$i-1];
}
// laat de array op het scherm zien
foreach($mvhOT as $k => $m)
echo 'mvhOT' . $k . ': ' . $m . '<br>';
Je gaat toch niet in PHP met arrays lopen klungelen, als het gewoon in de database afgewerkt kan worden.
En dan ga je ook niet voor iedere werknemer in een aparte tabel opslaan hoeveel uren die moet maken voor iedere maand, want dat is per maand een constante gebaseerd op een volledige werkweek.
Het aantal uren die door een werknemer per week gemaakt moeten worden staan toch al ergens opgeslagen in de database en dan kan je dat in de query uitrekenen:
tbh_uren_maand * (uren_per_week_werknemer / uren_volledige_werkweek)
Ik noem dat persoonlijke voorkeur. En als je met mysql werkt dan werk je met arrays in PHP. Maar je hebt gelijk je kunt het rekenwerk ook in de query laten uitvoeren.
heb nu een query die alles doet:
<?
SELECT MONTH(r.start) maand,
YEAR(r.start) jaar,
r.naam,
SUM( r.tijd + r.night + r.sun - r.lunch ),
SUM((tw.uren) - ( r.tijd + r.night + r.sun - r.lunch )) AS recup,
tw.uren
FROM `roster2014` r
JOIN tewerkenuren tw ON tw.naam = r.naam AND tw.jaar = YEAR(r.start) AND tw.maand = MONTH(r.start)
WHERE YEAR(start) = 2013
GROUP BY maand, jaar, naam
ORDER BY r.naam ASC,
jaar ASC,
maand ASC
?>
zover zijn we dus en de berekening klopt.
Volgende stap is dit natuurlijk allemaal ordentelijk in een tabel proberen gieten.
@Franknietbelangrijk: dat had ik al inderdaad bekeken om zo te doen maar dan is het
idee van Ivo P beetje verloren nu ik alles mooi in tabellen heb gestopt.