login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Werkzaamheden en uren bij elkaar tellen.

Offline Ruultje - 17/09/2009 22:07
Avatar van RuultjeNieuw lid Het ene probleem is nu verholpen maar nu zit ik met het volgende probleem. Ik heb twee tabellen. Eentje met werkzaamheden en de andere met gedraaide diensten (aantal uren en de werkzaamheden). In de tabel diensten staan de uren en de werkzaamheden middels werk1, werk2, werk3 etc.. die laatste wordt gekoppeld aan de tabel werkzaamheden. Maar hoe krijg ik het voor elkaar dat hij die werk-id's samenvoegt.

Hier de twee tabellen (ik heb allen erin gezet welke gekoppeld moeten worden).

Werkzaamheden
werk_id
werknaam

Diensten
werk1
uren1
werk2
uren2
werk3
uren3
werk4
uren4

Die uren horen dus bij hetzelfde cijfer.

Ik stel een voorbeeld. Op eenn dag verricht Piet vier werkzaamheden in totaal werkt hij 8 uur (ik verzin maar iets, erg uitlopend maar gaat om het voorbeeld). Tussenhaakjes wat de ID betekent.
Werk1: id1 (Uitwerken binnengekomen post) 1 uur
Werk2: id2 (Financieële verslagen) 3 uur
Werk3: id3 (Bezoek klanten) 3 uur
Werk4: id4 (Boekhouding) 1 uur

De volgende dag verricht Piet 2 werkzaamheden
Werk1 id4 (Boekhouding) 3 uur
Werk2 id3 (Bezoek klanten) 5 uur

In de tabel moet dus komen te staan:
Uitwerken binnengekomen post 1
Financiële verslagen 3
Bezoek klanten 8
Boekhouding 4

Maar hoe krijg ik dit zo?

De query die ik nu heb
  1. SELECT * FROM werkzaamheden LEFT JOIN diensten
  2. ON werkzaamheden.werkid = diensten.werk1 AND werzaamheden.werkid = diensten.werk2
  3. GROUP BY werknaam


Ik krijg nu geen resultaat. In phpmyadmin werkt het wel. Maar de waarde bij werknaam is NULL. In php krijg ik: Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource. Dit is de code.

  1. $result=mysql_query($sql);
  2. while($row=mysql_fetch_array($result)){
  3.  
  4. echo "<table class='site'>";
  5. echo "<tr>";
  6. echo "<td class='report'>". $row['werknaam']."</td><td class='report'>". $row['uren1']."</td>";
  7. echo "</tr>";
  8. echo "<td class='report'>". $row['werknaam']."</td><td class='report'>". $row['uren2']."</td>";
  9. echo "</tr>";
  10. echo "</table>";
  11. }
  12. ?>


Iemand een idee?

10 antwoorden

Gesponsorde links
Offline avdg - 17/09/2009 23:23 (laatste wijziging 17/09/2009 23:24)
Avatar van avdg PHP gevorderde Ik snap de relatie niet helemaal, voor zover ik snap wil je een lijst van het tabel werknemers linken aan een tabel die hun functies bevat samen met hun uren.

Zou het niet beter zijn een kolom werk_id te plaatsen, daarnaast de functie (numeriek), samen met het aantal uren en de dag?

en dan kolom functie weer verbinden met het tabel functies.

Ik zou voorstellen de structuur van de tabel te veranderen, ik laat je hier echter de keuze om je oude tabel te behouden indien je dit niet ziet zitten.

Dus wat hieronder staat is louter een suggestie!

tabel werknemers:
werk_id
werk_naam

tabel diensten:
werk_id
functie_id
uren
datum

tabel functies:
functie_id
functie_naam

vet: sleutels, onderstreept: index

De tabel diensten hebben meerdere koloms die volgens mij onnutig waren, daarmee zet ik die tabellen onder elkaar en geef ik een extra kolom datum (om meerdere functies op 1 dag te kunnen registreren)

De tabel functies zette ik apart omdat er daar repeterende waarden in voorkomen.

Vb query (niet getest!):
  1. SELECT diensten.functie_naam, diensten.uren FROM werknemers INNER JOIN
  2. (functies INNER JOIN diensten
  3. ON functie.functie_id = diensten.functie_id)
  4. ON werknemers.werk_id = diensten.werk_id
  5. WHERE dienst.werknemer = ??? AND dienst.datum = ???


Let op: bovenstaande querie is louter een voorbeeld en kan aangepast worden naar wens.
Offline Ruultje - 18/09/2009 00:16 (laatste wijziging 18/09/2009 13:49)
Avatar van Ruultje Nieuw lid Met bovenstaande script is het allemaal goedgekomen. Bedankt hiervoor. Berekeningen gaan nu ook goed via GROUP BY en SUM. Enige waar ik nog naar moet kijken is hoe dit via een form kan gaan verlopen. Dus dat hij meerderen malen iets in dezelfde tabel (diensten) kan zetten. Wel natuurlijk elke keer een nieuwe rij.

Alles is nu grotendeels opgelost. Het enige waar ik nog mee zit. Heeft wel betrekking tot een andere database maar qua namen komen ze wel overeen. Van iets wordt een begintijd en een eindtijd ingezet (niet in tijden) dus bijvoorbeel 8 = begintijd en 12 = eindtijd. Wanneer de volgende dienst plaatsvindt moet 12 automatisch worden toegewezen aan de begintijd van die dienst. De eindtijd van de vorige dienst is dus de begintijd van de volgende dienst. Dat gaat dan per werknemer (is trouwens voor iets heel anders). Nu moet deze telling de hele maand doorlopen. Wanneer de eerste van de maand is moet die teller weer op 0 staan. Dus de eerste dienst op de eerste (of de tweede wanneer de eerste op een zaterdag of zondag valt) van de maand moet de begintijd 0 zijn. Hoe kan ik dat met php regelen?

Ik gebruik deze code om de laatste eindtijd te onthouden.

  1. $sql="SELECT dienst_id, einduur FROM diensten WHERE werknemer = 'Jan' ORDER BY dienst_id DESC LIMIT 1";
Offline avdg - 18/09/2009 19:54
Avatar van avdg PHP gevorderde Ik zou het probleem over de forms oplossen met het toevoegen van het knop 'meer toevoegen'.
Dit is mogelijk met een klein truukje toe te passen in js {kijk hier voor een script}

Dan heb je gewoon een keuzelijst voor de functie en een input box voor het aantal uren
Offline Ruultje - 18/09/2009 20:35
Avatar van Ruultje Nieuw lid Hier kan ik wel iets mee. Dankjewel. Wanneer ik deze dan nu in de database wil toevoegen hoe moet ik dit dan doen? In de php code meer mogelijkheden zetten (dus bij de Values in de query) om het aantal uren in te vullen? Zonder dat ik een foutmelding krijg.
Offline avdg - 18/09/2009 20:58 (laatste wijziging 18/09/2009 21:06)
Avatar van avdg PHP gevorderde Een voorbeeld ter verduidelijk:

Jan (id 15) heeft vandaag 8 uur gewerkt, hieronder zijn de gegevens die toegevoegd zijn aan de database:

tabel diensten:
  1. werk_id functie_id uren datum
  2. 15 3 2 18/09/09
  3. 15 7 3 18/09/09
  4. 15 10 1 18/09/09
  5. 15 11 2 18/09/09

Je plaats dus alle gegevens gewoon onder elkaar (door de structuur van de tabel juist vergemakkelijkt)

Bij js zou ik bij de naamgeving gebruik maken van een verborgen verld (type hidden) met het aantal gegevens, de naam van de velden krijgen op het einde een nummer

Met php kan je via dat nummer weten hoeveel velden er zijn ingevuld, je kunt ook zonder nummer werken en php de velden aflopen tot het veld niet bestaat (een arrayelement met de waarde null).

ps: indien je wilt kun je ook op de chat komen (link 'snel vragen' hierboven)
Offline Ruultje - 19/09/2009 14:05 (laatste wijziging 19/09/2009 14:07)
Avatar van Ruultje Nieuw lid Ik heb nu onderstaande gemaakt. Nu voegt hij ze wel vaker toe. Maar hij voegt altijd vier velden in. Hoe krijg ik het voor elkaar dat hij maar 2 velden invult wanneer er maar 2 ingevuld worden en de rest leeg blijft? Dus die rijen ook niet gevuld worden. Nu worden ze gevuld en staan er alleen nullen (bij degene die niet zijn ingevuld).

  1. <?php
  2. $werk_id = $_POST['werk_id'];
  3. $functie_id = $_POST['functie_id'];
  4. $uren = $_POST['uren'];
  5.  
  6. for ($i = 0; $i < 4; ++$i){
  7. $sql="INSERT INTO diensten (dienst_id, functie_id, uren)
  8. VALUES ('$dienst_id[$i]', '$functie_id[$i]', '$uren[$i]')";
  9.  
  10.  
  11. if (!mysql_query($sql))
  12. {
  13. die('Error: ' . mysql_error());
  14. }
  15. }
  16.  
  17. echo "Werkzaamheden toevoegen is gelukt!";
  18. ?>
  19. </table>


Moet wel nog iets aan de veiligheid doen.
Offline avdg - 19/09/2009 20:53
Avatar van avdg PHP gevorderde
  1. for ($i = 0; $i < 4; ++$i){


vervang die 4 door het aantal elementen
Offline Ruultje - 20/09/2009 17:19 (laatste wijziging 20/09/2009 17:23)
Avatar van Ruultje Nieuw lid Op de één of andere manier krijg ik maar niets werkend. Sterker: ik kom er niet uit met de arrays. Dus als ik bijvoorbeeld 4 uren toevoeg dat ook de ID juist toegewezen wordt. Hij voegt namelijk wel toe wat ik invul. Maar alleen bij de eerste rij vult hij de juist ID in. Daarna is het standaard nul. Ik zit dus behoorlijk vast met de arrays.

Ik heb dit maar dat werkt niet.

  1. $uur = array('dienst_id', 'functie_id', 'uren');
  2.  
  3. $sql_uren = array();
  4.  
  5. foreach($uur as $uren)
  6. {
  7. $sql_uren[] = "('" . mysql_real_escape_string($dienst_id) . "')";
  8. $sql_uren[] = "('" . mysql_real_escape_string($functie_id) . "')";
  9. $sql_uren[] = "('" . mysql_real_escape_string($uren) . "')";
  10. }


Nu voegt die niets toe.
Offline avdg - 20/09/2009 20:07 (laatste wijziging 20/09/2009 20:10)
Avatar van avdg PHP gevorderde Geef eens een teller en een key aan $sql_uren
Offline Ruultje - 20/09/2009 23:43 (laatste wijziging 20/09/2009 23:49)
Avatar van Ruultje Nieuw lid Ik heb iets geprobeerd maar dan krijg ik een foutmelding. Tenminste heb er een count aan toegevoegd.. Key lukt niet echt. Ik heb nu dit maar dan krijg ik een foutmelding. Hij voegt dan wel iets toe. Maar dan maar één resultaat.

  1. $dienst_id = mysql_insert_id();
  2. if (isset($_POST['uren'])) {
  3.  
  4.  
  5. $uur = array('dienst_id', 'functie_id', 'uren');
  6.  
  7. $sql_uren=count($uur);
  8.  
  9. for ($i=0;$i<$sql_uren;$i++){
  10.  
  11. foreach($uur as $uren)
  12. {
  13. $sql_uren[] = "('" . mysql_real_escape_string($dienst_id) . "')";
  14. $sql_uren[] = "('" . mysql_real_escape_string($functie_id) . "')";
  15. $uren[] = "('" . mysql_real_escape_string($uren) . "')";
  16. }
  17.  
  18. $dienst_id = mysql_escape_string($_POST['dienst_id'][$i]);
  19. $functie_id = mysql_escape_string($_POST['functie_id'][$i]);
  20. $uren = mysql_escape_string($_POST['uren'][$i]);
  21.  
  22.  
  23.  
  24.  
  25.  
  26. $sql_uren="INSERT INTO uren (dienst_id, functie_id, uren)
  27. VALUES ('$dienst_id', '$functie_id', '$uren')";
  28.  
  29.  
  30.  
  31. if (!mysql_query($sql_uren))
  32. {
  33. die('Error: ' . mysql_error());
  34. }
  35. }
  36. }
  37.  
  38. echo "Werkzaamheden toegevoegd";
  39. echo "<br><br>";


De foutmelding
Warning: Cannot use a scalar value as an array in C:\wamp\www\test\index1.php on line 52

Warning: Cannot use a scalar value as an array in C:\wamp\www\test\index1.php on line 53

Warning: Cannot use a scalar value as an array in C:\wamp\www\test\index1.php on line 54

Dit zijn de velden tussen de foreach in.


Wanneer ik deze gebruik voegt hij nu wel overal de juiste ID in. In principe wordt dus nu alles goed berekend. Enige nadeel is dat hij altijd vier velden vult. Waar iets ingevuld is staat alles juist. Maar lege velden bevatten alleen nullen. Hebben wel de juiste ID meegekregen.

  1. for ($i = 0; $i < 4; ++$i){
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.265s