Autor Zpráva
mjaus
Profil
Chcel by som sa spytat ci sa uz niekto stretol s pripadom ked potrebujem riesit objednavkovy formular do ktoreho potrebujem zapracovat generovanie cisla objednavky. Pasujem sa s tym a nic ma nenapada. Idealne by bolo ak by po nejakom kliku na NOVA OBJEDNAVKA, vygenerovalo cislo tvaru YYMMDDXXXX (kde Y je rok 13, M je mesiac 03, D je den 12, a X je cislo od 0001 do 9999) takze 1303120001. Samozrejme ze sa nesmie opakovat. Nasledne na to by sa otvoril formular....


Dakujem.
Tori
Profil
mjaus:
Jednodušší by bylo generovat číslo objednávky až při ukládání. Vezmete aktuální datum a čas, naformátujete, přidáte ID vloženého záznamu (typ SMALLINT(4) UNSIGNED ZEROFILL AUTO_INCREMENT), a případně updatujete záznam v DB.
Pokud byste chtěl vygenerovat ID ještě před uložením objednávky, tak vám může v DB vznikat nespojitá řada ID objednávek v případě, že uživatel zruší formulář a někdo jiný vytvoří jinou objednávku dřív, než bude to nepoužité ID uvolněno.
had
Profil *
[#2] Tori: pokud by chtěl zobrazovat číslo objednávky už přímo na objednávkovém formuláři, bylo by lepší, aby nejprve zapsal (prázdný) záznam do databáze (tím si zajistí, že mu číslo nikdo nesebere), zobrazil formulář a po jeho odeslání provedl UPDATE v databázi.
mjaus
Profil
Tori:
Ako dosiahnem k zformatovanemu datumu pridat ID v tvare napr: 0005? Je to tym ZEROFILL? To by bola aka pecka... :) Dik.

had:
ano tak nejako by to bolo asi OK.
had
Profil *
je trochu problém, pokud chceš mít ten konec číslovaný každý den od 0001, že nejprve se musíš doptat na aktuální počet záznamů z daného dne, připočíst 1 a ihned vložit nový řádek. Jak říká Tori - tady by mohly vzniknout dvě stejná ID objednávek (to by řešilo UNIQUE u sloupce), ale je to nepraktické řešení.

Přimlouval bych se za jednodušší variantu: vytvoř si v databázi sloupec ID, kterému přiřadíš AUTO_INCREMENT, PRIMARY_KEY a UNSIGNED_ZEROFILL, čímž zajistíš unikátnost záznamu a automaticky se s vložením řádku vytvoří nový záznam s nejvyšším číslem (a to by bylo nejvyšší, ikdyž bys smazal poslední vložený záznam - tedy naprostá unikátnost). Další sloupec bych vytvořil ten s číslem objednávky a tam budeš volat zapisovat date() YYMMDD a přidáš na konec ID záznamu, který editováváš...
Tori
Profil
Jo takhle, já asi předpokládala jiné zadání. Pokud dnes vytvořím obj. s číslem 1303120001, tak zítřejší budou začínat zas od 0001, nebo pokračovat 0002 atd. až do konce roku?


had:
bylo by lepší, aby nejprve zapsal (prázdný) záznam do databáze (tím si zajistí, že mu číslo nikdo nesebere)
Jenže právě při zrušení objednávky pak může vzniknout buď nespojitá řada (dnešní objednávky dostanou čísla 0001, 0002, 0004,..). Anebo by mohl recyklovat ID, ale pak zase dnešní objednávka může padnout do volného místa mezi včerejšími, takže nebude sedět posloupnost datumů a IDček (1303110003, 1303110005, 1303120004).


had:
je trochu problém, pokud chceš mít ten konec číslovaný každý den od 0001, že nejprve se musíš doptat na aktuální počet záznamů z daného dne, připočíst 1 a ihned vložit nový řádek
Tohle se jinak dá udělat i poddotazem v insertu - jeden sloupec pro číselnou řadu v rámci období (0001, 0002), druhý pro identifikátor období (130312, 130313 nebo 2013, 2014).
mjaus
Profil
Tak dakujem. Uz si to nejako zacinam predstavovat. Asi to bude ze formatovany datum YYMMDD plus ID (typ SMALLINT(4) UNSIGNED, PRIMARY_KEY, ZEROFILL AUTO_INCREMENT). Cislovanie bude pokracovat. Cize nie kazdy den od 0001, 0002, 0003... ale pokracovat v poslednom.

Pri zmazani zaznamu bude vlastne objednavka zrusena ale existovat bude takze cislo ostava akurat objednavka sa nebude vybavovat - dalsi stlpec asi nejaky STATUS (objednane, dodane, zrusene...)

Vsetkym velka vdaka... Ak by tak uz sa ozvem s konkretnym kodom :))))
aDAm
Profil
mjaus:
dá se to také řešit pomocí číselníku. Já to řešil tak že sem si založil tabulku co reprezentuje číselník kde jsou počítadla pro objednávky, faktury, service účty atd. Každý záznam pak má u sebe uvedeno jaký má mít tvar, tj. tebou zmíněné YYMMDDXXXX. Datum se nahradí automaticky replacerem co YY nahradí za např. 13 či YYYY za 2013 atd...a pak samotné číslo to se vytáhne z onoho číselníku, pomocí sprintf se naformátuje aby se doplnily nuly a po uložení objednávky se provede inkrementace číselníku. V podstatě seš schopen zobrazit číslo objednávky ješte před samotným uložením ale pouze jako informativní hodnotu, protože v jednom okamžiku může pracovat více lidí najednou že.

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:

0