login  Naam:   Wachtwoord: 
Registreer je!
 Forum

rekenen met previous row values

Offline phanegem - 10/12/2014 12:04
Avatar van phanegemNieuw lid Beste,

Ik wil het volgende bereiken:

Ik heb een table met de volgende gegevens:

id - event - duur (in minuten) - plaats

Ik wil een query en dus een tabel waarbij de begin en eindtijd van het event wordt berekend.

ID| event |Duur | begin | Einde | plaats
-------------------------------------------------
1 | U2 | 30 min | 13:00 | 13:30 | stage 1
2 | Coldplay | 40 min | 13:30 | 14:10 | stage 2

De eerste begintijd staat vast 13:00 uur, de rest kan berekend worden door de begintijd te pakken + de duur = eindtijd = gelijk de begintijd van het volgende event.

De bedoeling is dat als je bij een van de events (stuk of 20) de duur verandert het gehele tijdsschema wordt aan gepast.

Ik weet niet hoe ik dus kan opzetten

bij voorbaat dank

8 antwoorden

Gesponsorde links
Offline finduilas - 10/12/2014 13:23 (laatste wijziging 10/12/2014 13:33)
Avatar van finduilas PHP gevorderde  Volgens mij zo:

a) plaats geen begintijd of eindtijd in de database, maar enkel duur

b) foreach van de events
  1. $eindtijd = date("h:i",$vastestarttijd); // of tijd uit de DB,...
  2.  
  3. //Je resultaten overlopen in een foreach
  4. foreach ($arr as &$value) {
  5.  
  6. // je gegevens tonen op je website
  7.  
  8. //Berekenen van de eindtijd/begintijd
  9. $nieuwebegintijd = $eindtijd;
  10.  
  11. $duur = 30; //vervangen door je duur uit je DB
  12. $nieuweindtijd = date("H:i", strtotime($begintijd)+($duur*60)); //*60 om om te zetten naar minuten
  13.  
  14. //eindtijd opslaan buiten de for-lus om straks opnieuw te gebruiken
  15. $eindtijd = $nieuweeindtijd;
  16. }


Als je het toch wilt opslaan in de database, dan doe je net hetzelfde, maar met een update die alle ids overloopt en de begin- en eindtijd opnieuw overloopt..

EDIT: Het is het idee, is nu uit de losse pols hier neergetypt.
Offline Thomas - 11/12/2014 20:08
Avatar van Thomas Moderator Begin en einde overlappen dus nooit, ondank het feit dat de (fictieve?) concerten op verschillende stages (podia?) plaatsvinden? Ben je een timetable aan het maken voor een soort van festival of iets dergelijks? Is dit je huiswerk? Wat probeer je te bereiken?

Het begin en einde staan niet echt vast denk ik, maar hangen af van (worden berekend met behulp van) een starttijd en een duur. De berekende gegevens (begintijd, eindtijd) zijn dus min of meer redundant (dubbel). Ze zijn af te leiden uit starttijd, duur en ... volgorde. Dit veld ontbreekt nog? Of worden de gegevens altijd direct in de goede volgorde ingevoerd? 

Meestal is het handig om een aparte kolom (naast je primary key) aan te maken als een volgorde relevant is. Dit lijkt mij in jouw geval van toepassing. Immers, als de duur van een optreden verandert, verschuiven alle begin- en eindtijden van optredens die hierna komen. Je hoeft niet alles opnieuw te berekenen... En hoe/waar je dat precies opslaat... tja, dat kan op tig verschillende manieren en hangt een beetje af van wat je probeert te bereiken.

En als je dus verschillende podia hebt, heb je waarschijnlijk ook meerdere "tijdlijnen"? Op muziekfestivals staat band B in tent 2 ook niet te wachten op band A die in tent 1 optreedt hoor, verschillende optredens vinden doorgaans tegelijkertijd plaats en moet je dus kiezen welke je wilt zien .
Offline phanegem - 12/12/2014 11:06 (laatste wijziging 12/12/2014 11:12)
Avatar van phanegem Nieuw lid Begin en einde overlappen nooit.

Het is geen huiswerk maar een soort tool om het plannen van ons festival makkelijker te maken.
Het staat vast dat het om 13:00 uur begint.

De volgorde is ook relevant maar kan gewoon als ID worden genoteerd omdat eigenlijk alleen de duur , de band en het podium de enige variabele zijn.

Het doel is, om te spelen met de volgorde van de verschillende bands, en de duur van een optreden.

Wat er dus aangepast kan worden, duur , welk podium, welke band.

De bands haal ik uit een andere database maar dat lukt allemaal wel.


De vraag was, hoe programeer ik de query en vervolgens de rekensom om elke keer de begintijd uit te rekenen.

Als er een optreden klaar is op bv podium 1, gaan we gelijk verder met podium 2, er speelt niets tegelijkertijd. (nog niet, wellicht over een jaar of 5)

Ik kan dit wel in excel maken maar dan is het niet voor de hele groep toegankelijk en via deze weg wel.

Iemand die mij een min of meer complete code aanlevert kan rekenen op twee vrijkaarten  
Offline Thomas - 12/12/2014 13:28 (laatste wijziging 12/12/2014 13:30)
Avatar van Thomas Moderator Maar wat is "podium" in dat geval dan? Is dit echt een fysieke locatie waar artiesten op staan? Zijn "podium 1" en "podium 2" echt twee verschillende geografische locaties? Als dit het geval is, en toeschouwers vervolgens moeten verhuizen, dan wil je toch ook een soort van pauze tussendoor inlassen? EDIT: en wat dacht je van het klaarzetten van instrumenten, belichting etc? Zit dit in jouw definitie van "optreden" ingebakken?

Waar je ook voor kunt kiezen is een soort van tijdsblokkenstructuur. Elk blok duurt bijvoorbeeld een half uur. Voor een optreden van 40 minuten zou je dan twee blokken kunnen reserveren. Ook kun je op die manier rekening houden met vertraging/uitloop (encores?). Het probleem is een beetje: als dingen precies passen, zijn ze meestal te krap .

Zoals met een heleboel zaken: jouw probleem is niet uniek. Je zou eens kunnen kijken hoe andere festivals dit aanpakken?

Verder zeg je:
Citaat:
Het staat vast dat het om 13:00 uur begint.
Als je nog zoekende bent naar een vorm is het misschien beter om dingen zo flexibel mogelijk te houden en (nog) niet vast te pinnen. Wat misschien een idee is, is een instelbare starttijd?

Citaat:
Het doel is, om te spelen met de volgorde van de verschillende bands, en de duur van een optreden.
Dit lijkt mij reden te meer om optredens te voorzien van een volgorde? Daarmee kun je dan via een interface optredens verwisselen / verschuiven?

Citaat:
Als er een optreden klaar is op bv podium 1, gaan we gelijk verder met podium 2, er speelt niets tegelijkertijd. (nog niet, wellicht over een jaar of 5)
Misschien wil je daar dan nu al rekening mee houden in je ontwerp, anders mag je straks weer een hoop zaken opnieuw doen. En als dit dan vervangen gaat worden door een groter systeem, dan is je bestaande systeem al een (betere) specificatie hiervoor (dan de variant die hier geen rekening mee hield).

Bij wijze van gedachtenexperiment: verplaats je eens in een bezoeker, deze heeft waarschijnlijk zijn/haar favoriete artiesten die hij/zij wil zien. Waar loopt deze bezoeker tegenaan bij jouw programmering?
Offline phanegem - 12/12/2014 14:25
Avatar van phanegem Nieuw lid Ben erg blij dat je meedenkt.

Er zijn drie locaties

1 is hoofdpodium
2 is pauze
3 is 2e podium

De podiums staan overigs naast elkaar dus je hoeft helemaal niets te missen.

"Dit lijkt mij reden te meer om optredens te voorzien van een volgorde? Daarmee kun je dan via een interface optredens verwisselen / verschuiven?"


Het gaat er meer om dat we een blokkenschema creeren met een vaste volgorde

optreden 1 op hoofdpodium (1) van ** band dat xx minuten duurt
pauze op (2) dat xx minuten duurt
optreden 2 op kleine podium (3) ** band dat xx minuten duurt
pauze op (2) dat xx minuten duurt
optreden 3 op hoofdpodium(1) ** band dat xx minuten duurt

etc etc

Een variabele begintijd zou kunnen maar in de vergunning staat al vast dat we om 13:00 uur beginnen.


Op dit moment zijn we bezig met prijs en beschikbaarheid van bands. Als we deze weten en we hebben ze geboekt kunnen we een bepaalde band aan een blok toewijzen.

Om dus te kunnen zien hoe we zitten met onze timeline en waar we moeten of kunnen besparen in tijd.

Het schuiven met bands kan ik makkelijker doen door in een "blok" een andere band in te vullen dan dat ik de volgorde verander.

Over het organiseren hoef je me niet wijzer te maken dat lukt allemaal wel. Dit is mijn zevende editie. :-)





Offline Thomas - 12/12/2014 16:05
Avatar van Thomas Moderator Hm, ik zie het als volgt:

Op dit moment heb je één tijdslijn waarin evenementen zitten.
Een evenement heeft een duur (in een tijdseenheid, bijvoorbeeld minuten), een type (optreden, pauze) en een locatie (podium X, podium Y, etc.). Indien het een optreden betreft, zou je hier nog extra informatie aan kunnen hangen (band, eventueel op te voeren acts etc.).

Maar als je gaat schuiven met deze blokken (wat me nog steeds een stuk eenvoudiger lijkt dan zaken opnieuw invullen) dan kan het dus gebeuren dat je ineens twee opeenvolgende pauzes hebt ofzo . Of een pauze aan het einde.

Mocht het festival groter worden krijg je waarschijnlijk per locatie een eigen tijdslijn waarbij meerdere evenementen tegelijkertijd (parallel) plaatsvinden, maar nu dus nog niet. Deze tijdslijn is niets meer dan de volgorde (per locatie) van evenementen (op die locatie). In jouw geval kun je het (voor nu, in ieder geval) beter omdraaien: je begint met het creëren van een (één) tijdslijn waar je evenementen aan toevoegt.

Het berekenen van begin- en eindtijd is wat mij betreft "secundair", dit wordt bepaald naar aanleiding van de volgorde. Ik weet ook niet of het echt meerwaarde heeft om dit expliciet op te slaan. Je kunt dit immers makkelijk berekenen als je deze informatie weergeeft. Daarnaast veranderen deze tijden continu zolang je schuift met de volgorde. Als je de begin- en eindtijden expliciet wilt opslaan zul je hier code+queries voor moeten schrijven. Dit maakt je applicatie mogelijk complexer dan strict noodzakelijk. Wat is er op tegen om enkel met begin- en eindtijden te werken in de weergave? Je hoeft dan alleen wat extra code (niets eens extra queries) te schrijven voor het uitrekenen van tijdstippen.

Ik denk dat het helpt als je een soort van plaatje maakt (een visuele voorstelling) van wat je wilt doen. Je interface (beheerpagina) zal dus een soort van balk met blokjes zijn die je kunt toevoegen, verschuiven en verwijderen. (Of meerdere balken, als je meerdere tijdslijnen hebt). Dit maakt het indelen veel intuïtiever denk ik. Deze weergave is dan ook direct je festival-programma. Heb je bijvoorbeeld al eens gekeken naar de sortable plugin van jQuery (bekijk ook vooral de verschillende voorbeelden in de rechterkolom)? Daarmee kun je elementen in een of meerdere lijsten draggen en droppen.
Bedankt door: phanegem
Offline phanegem - 12/12/2014 18:47 (laatste wijziging 12/12/2014 18:51)
Avatar van phanegem Nieuw lid

Plaatje

Dit is het idee.

Jquery sortable is wel een goed idee om het zo te doen maar hier ken ik helemaal niks van
Offline Thomas - 20/12/2014 20:05
Avatar van Thomas Moderator Dit geeft je misschien wat inspiratie:

  1. <?php
  2. // http://stackoverflow.com/questions/3774755/jquery-sortable-select-and-drag-multiple-list-items
  3. // http://stackoverflow.com/questions/2150002/jquery-ui-sortable-how-can-i-change-the-appearance-of-the-placeholder-object
  4. // http://stackoverflow.com/questions/14821033/call-custom-function-after-jquery-sortable
  5.  
  6. // http://stackoverflow.com/questions/19718937/jquery-ui-sortable-items-not-working
  7. // http://stackoverflow.com/questions/1796206/problem-updating-sortables-in-jquery
  8.  
  9. // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
  10.  
  11. header('Content-Type: text/html; charset=UTF-8');
  12. ?>
  13. <!DOCTYPE html>
  14. <html>
  15. <head>
  16. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  17. <title>sortable test</title>
  18. <link type="text/css" rel="stylesheet" href="//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css">
  19. <link type="text/css" rel="stylesheet" href="style.css">
  20. <script type="text/javascript" src="//code.jquery.com/jquery-1.10.2.js"></script>
  21. <script type="text/javascript" src="//code.jquery.com/ui/1.11.2/jquery-ui.js"></script>
  22. </head>
  23.  
  24. <body>
  25. <div class="sortable">
  26. <ul id="col1">
  27. <li data-time="30">
  28. <span class="start"></span>
  29. <span class="end"></span>
  30. item 1a
  31. </li>
  32. <li data-time="120">
  33. <span class="start"></span>
  34. <span class="end"></span>
  35. item 1b
  36. </li>
  37. <li data-time="15">
  38. <span class="start"></span>
  39. <span class="end"></span>
  40. item 1c
  41. </li>
  42. </ul>
  43. <ul id="col2">
  44. <li data-time="45">
  45. <span class="start"></span>
  46. <span class="end"></span>item 2a</li>
  47. <li data-time="45">
  48. <span class="start"></span>
  49. <span class="end"></span>item 2b</li>
  50. <li data-time="45">
  51. <span class="start"></span>
  52. <span class="end"></span>item 2c</li>
  53. </ul>
  54. <ul id="col3">
  55. <li data-time="90">
  56. <span class="start"></span>
  57. <span class="end"></span>item 3a</li>
  58. <li data-time="45">
  59. <span class="start"></span>
  60. <span class="end"></span>item 3b</li>
  61. <li data-time="15">
  62. <span class="start"></span>
  63. <span class="end"></span>item 3c</li>
  64. </ul>
  65. <ul id="delete">
  66. </ul>
  67. <div class="clear"><!-- clear --></div>
  68. </div>
  69. label <input type="text" id="label" /><br />
  70. time <input type="text" id="time" /><button type="button" id="click">add</button>
  71.  
  72. <script type="text/javascript">
  73. //<![CDATA[
  74. function addLeadingZero(number) {
  75. return (number < 10 ? '0' + number : number);
  76. }
  77. function formatDate(date) {
  78. return addLeadingZero(date.getHours())+':'+addLeadingZero(date.getMinutes());
  79. }
  80.  
  81. $().ready(function() {
  82. // give elements the proper height
  83. $('div.sortable ul li').each(function(e) {
  84. $(this).css('height', $(this).attr('data-time')+'px');
  85. });
  86.  
  87. var updateTimetable = function() {
  88. $('div.sortable ul').each(function() {
  89. var start = new Date('2013-12-20T13:00:00+01:00');
  90. $(this).children().each(function() {
  91. var current = parseInt($(this).attr('data-time'));
  92. $(this).find('span.start').html(formatDate(start));
  93. start = new Date(start.getTime() + current * 60 * 1000); // ms
  94. $(this).find('span.end').html(formatDate(start));
  95. });
  96. });
  97. }
  98. updateTimetable();
  99.  
  100. $('div.sortable ul').sortable({
  101. 'connectWith': 'div.sortable ul',
  102. 'update': function(e, ui) {
  103. // update times
  104. updateTimetable();
  105. // delete everything in the delete div
  106. $('ul#delete').html('');
  107. }
  108. });
  109.  
  110. // add element
  111. $('#click').click(function() {
  112. var time = $('input#time').val(); // might want to check if this is actually numeric
  113. var label = $('input#label').val(); // might want to escape HTML
  114. var $li = $('<li data-time="'+time+'"><span class="start"></span><span class="end"></span>'+label+'</li>');
  115. $li.css('height', time+'px');
  116. $('ul#col1').prepend($li).sortable('refresh'); // to recognize new element as a sortable element
  117. updateTimetable();
  118. });
  119. });
  120. //]]>
  121. </script>
  122. </body>
  123. </html>


En de eigen stylesheet:
  1. @CHARSET "UTF-8";
  2.  
  3. div.sortable ul { float: left; list-style-type: none; margin: 0 10px 0 0; padding: 5px; background-color: #eeeeee; width: 200px; }
  4. div.sortable ul li { width: 180px; padding: 5px; margin: 5px; background-color: #cccccc; text-align: center; }
  5. div.sortable ul li span.start { background-color: #ffcccc; }
  6. div.sortable ul li span.end { background-color: #ccffcc; }
  7. div.sortable ul#delete { background-color: #ffcccc; height: 250px; }
  8. .clear { clear: both; }


(rest van de jQuery en opmaak komt van het internet)

Je kunt blokken verslepen tussen de grijze kolommen.
Je kunt blokken toevoegen via de invoervelden (time = tijd in minuten = hoogte blok in pixels).
Je kunt blokken verwijderen door deze in de rode kolom te droppen.

Dit voorbeeld slaat verder geen data op, maar illustreert (mogelijk) goed wat er allemaal kan met jQuery en hoe handig een visuele interface (mogelijk) is.

Het bleek nogal lastig om kolommen te "synchroniseren" en "mutual exclusive" te maken (je moet dan allemaal dummy-items invoegen in de overige kolommen). Dat mag je zelf uitzoeken .
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2020 Sitemasters.be - Regels - Laadtijd: 0.276s