Autor Zpráva
franta87
Profil *
Ahoj,
snazim se tu udelat takovej ukolovnik a zasekl jsem se na jedne veci a to rozplanovani do vice mesicu.
skousim 2 varianty.
tahle varianta mi z promene perioda rozepise 6mesicu od aktualniho data na mesice..
Musel jsem osetrit prechod roku, coz funguje. druhej if resi dalsi rok. ale pokud je to delsi perioda kde by se bral az rok 2014 od 2012 tak uz dostanu zpatky 2012 z ktere vychazim. mozna by slo nejak primo resit pres date ale nevim jak. Ja defakto pricitam matematicky mesice.
Jeste teda napisu co presne potrebuju. V mysql mam nasledujici tabulku
id | uzivatel | rok | mesic1 | mesic2 | ..... | mesic12
data vypadaji nasledovne
1 | franta | 2012 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | - zaznam s id 1 a jmenem franta ma v roce 2012 ukol s id 2 v mesici 12/2012.

a ja potrebuju udelat ze v pripade vkladani ukolu a zvoleni periody, tak aby se id ukolu updatlo i do dalsich mesicu.

resp. budeme brat ze je 1/2012 a budu chtit vlozit ukol na 14mesicu, tabulka by mela vypadat nasledovne
1 | franta | 2012 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
2 | franta | 2013 | 2 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 |


poradite nekdo jak by to slo ne moc slozite vytvorit ?

Diky

Franta

zde jsem si skousel vytvorit rozpis mesicu ale asi to nebude uplne idealni.
  $perioda = 6;
  $a_perioda=$aktualni_mesic[1]+$perioda;
  $a_mesic=$aktualni_mesic[1];
    while ( $a_mesic < $a_perioda )
    {
        if($a_mesic > 12 ) { $mesic = $a_mesic-12; $rok=$aktualni_mesic[2]+1; } else { $mesic=$a_mesic; $rok=$aktualni_mesic[2]; };
        if($mesic > 12 ) { $amesic = $mesic-12; $arok=$rok+1; } else { $amesic=$mesic; $arok=$rok; };
        print $amesic."/$arok<br>";
        ++$a_mesic;

    }
Tori
Profil
1. Návrh databáze není dobrý, jednak číslování sloupců mesic1mesic12, a taky jeden úkol má mít jedno ID. Pro ukládání datumů má MySQL typ DATE. Použila bych něco takového:
* tabulka uzivatele: ID (int), jméno (varchar), ...
* tabulka ukoly: ID_ukol (int), ID_uzivatel (int, tady bude ID z tabulky uživatelů), od (date), do (date), popis_ukolu (varchar), ...

Data v tabulce úkolů pro Frantovo čtrnáctiměsíční úkol by vypadala třeba takto:
| 1 (id úkolu) | 1 (id uživatele) | 2012-12-01 | 2014-02-28 | rýžovat zlato na Aljašce |
Ukládám první den prvního měsíce a poslední den posledního měsíce, aby se dalo snadno vyhledávat, které úkoly probíhají právě dnes (např. SELECT * FROM ukoly WHERE CURRENT_DATE() BETWEEN od AND do).

2. Co dělá ten rozpis měsíců - tím jste vkládal data do DB pro jednotlivé úkoly, nebo to je výpis úkolů z DB na následující půlrok? Jestli vkládání dat, tak správná data pro DB můžete (pro čtrnáctiměsíční úkol začínající tento měsíc) vytvořit třeba takhle:
$start = date('Y-m-d', strtotime('first day of this month'));
$stop = date('Y-m-d', strtotime('last day of +14 month'));
echo "od: $start, do: $stop";
Zkoušela jsem to v PHP 5.3.5. Nejsem si jistá, jestli to bude fungovat v 5.2, zkuste. Jde to i jinak, ale tohle se mi líbilo. :)
franta87
Profil *
Tori:

dekuji za reakci.
Ja jsem databazi navrhoval takto z duvodu, ze pak mohu jednoduse rozepsat mesice do kalendare pro danej ukol i pro vice lidi. Prijde mi to lepsi nez pres select datumu v db. nazvy sloupcu nejsou samozrejme mesic1, to sem rozepsal jen do prikladu pro lepsi pochopeni.
Vicemene bojuju s tim cyklem, kterej mi doplni prave hodnotu do daneho mesice a samozrejme pokud bude prechod na dalsi rok tak i udela insert s rokem +1 a doplni hodnotu do mesicu kterych se to tyka.

ps: na php 5.3.x jedu :)
Tori
Profil
franta87:
nazvy sloupcu nejsou samozrejme mesic1
Nejde o to, jestli se jmenují leden - prosinec nebo měsíc1 - měsíc12, ale o to, že se s takto uloženými daty dost špatně pracuje. Zkuste třeba pro vaši strukturu DB vymyslet dotaz, který najde všechny uživatele a seřadí je sestupně podle nejdelšího úkolu, který je u toho kterého uživatele uložený.

Způsob zobrazení by imho neměl ovlivňovat způsob uložení dat. Můžu si z databáze načíst do pole úkoly probíhající v následujích n měsících. Pak cyklem for projdu všechny časy od teď do (teď + n-1 měsíců) v jednoměsíčních intervalech. V každé iteraci projdu pole úkolů a vypíšu všechny, kde $ukol->od <= $mesic && $ukol->do >= $mesic. asi by to šlo i rychleji, to je jen pro příklad, že není nutno kvůli tomu používat nestandardní návrh DB
franta87
Profil *
Tori:

moc diky za nakopnuti :) nakonec to je mnohem jednodussi :)
nakonec jsem to udelal dle rady

id klientid ukolid zacatek konec
1 1 100 2012-12-06 2013-08-09
2 1 101 2013-08-10 2014-01-08

textove jsem si s tim pohral a vypada nasledovne

$qry = "select id, zacatek, konec, klientid, period_diff(date_format(konec, '%Y%m'), date_format(zacatek, '%Y%m')) as mesicu from `ukoly` WHERE `klientid`='1'  ";
  $res=mysql_query($qry);
  while ($r=mysql_fetch_assoc($res)) {

print "<tr><td>Ukol s id $r[id] zacina v ".date("d/m/Y", strtotime($r[zacatek]))." a konci v ".date("d/m/Y", strtotime($r[konec]))." a trva ".$r[mesicu]." mesicu. Dalsi ukol muze zacit ".date("d m Y", strtotime("+1 days", strtotime($r[konec])))."</td></tr>";

};

vysledek je

Ukol s id 1 zacina v 06/12/2012 a konci v 09/08/2013 a trva 8 mesicu. Dalsi ukol muze vlozit 10 08 2013
Ukol s id 2 zacina v 10/08/2013 a konci v 08/01/2014 a trva 5 mesicu. Dalsi ukol muze vlozit 09 01 2014

ted to jeste musim nejak dostat do te graficke/tabulkove verze ktera by mela byt rozepsana prave podle mesicu vytizeni daneho klienta

kde pri vyberu roku 2012 se mi vykrizkuje prosinec
.. kde pri vyberu roku 2013 se mi vykrizkujou vsechny mesice atd dle hodnot od - do..

| leden | unor | ... | prosinec |
-------------------------------------
| | | ... | X |

Tori: poradis prosim jeste s timto ? Vypada to ze v tom umis chodit mnohem lepe nez ja :)
Tori
Profil
Můžete třeba porovnávat datumy ve formátu unix timestamp, příslušné funkce MySQL i PHP jak vidím znáte. Jedno políčko tabulky začíná v [první den daného měsíce, 00:00:00] a končí v [začátek políčka + 1 měsíc - 1 sec]. Ke konci políčka přičtete 1 sec a máte začátek dalšího políčka.
Jestli chcete rozlišovat tři stavy políčka (tj. navíc hodnota "obsazeno jen zčásti"), tak první měsíc v obsazeném intervalu začíná dřív než začátek úkolu, podobně poslední měsíc úkolu (jen tam se asi musí zkontrolovat i to, jestli následující úkol nenavazuje hned druhý den). ve 4 ráno lepší nakopnutí nevymyslím, pardon

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: