Autor Zpráva
weroro
Profil
Ahoj,

chcem generovať do DB užívateľské id po registrácii v tomto tvare 1310061 kde platí YMDcislo_uzivatela_v_ten_den. Ako vyriešiť prípadnú kolíziu resp. ako zvyšovať posledné číslo toho id? Napadla ma možnosť auto incrementu, len som sa zasekol pri návrhu realizácie.

Jednou z možností by bolo toto id skladať z dvoch hodnôt, ktoré budú uložené v DB. Pri registrácii sa do prvého stĺpca uloží aktuálny dátum v tvare YMD a v druhom stĺpci sa bude zapísané číslo užívateľa pre ten deň zvyšovať vždy o 1 (auto incrementom), to ale v tomto prípade to možné nebude, lebo AI mi nezačne samé od seba pri novom dni počítať od 1. AI som zvolil preto, lebo netuším ako urobiť kontrolu existujúceho id, tak aby som mohol toto id zvýšiť o 1 od posledného existujúceho (výpis všetkých id a ich zoradenie mi príde ako zlé riešenie).

Vopred ďakujem za váš čas a nasmerovanie.
Tori
Profil
weroro:
ako urobiť kontrolu existujúceho id, tak aby som mohol toto id zvýšiť o 1
SELECT COUNT(*) FROM tabulka WHERE id BETWEEN 13100600 AND 13100700 a k výsledku přičíst 1 (pro limit 100 registrací na den). Ale není to atomické, na rozdíl od AI, takže pokud se dva lidi registrují ve stejný čas, může (s malou šancí, ale může) dojít ke kolizi ID.
weroro
Profil
Ďakujem veľmi pekne Tori.
Keby niekto potreboval:
function vytvorNoveID()
{
    $cifry = '0000'; // 10 000 IDčiek za deň
    $dnes = date("ymd", time()) . $cifry; // min dnešné ID
    $zajtra = date("ymd", time() + 86400) . $cifry; // min zajtrajšie ID
    $odpoved = mysql_query("SELECT COUNT(*) FROM `test` WHERE uid BETWEEN $dnes AND $zajtra");
    $pole = mysql_fetch_array($odpoved);
    return $dnes  + ($pole[0] + 1); 
}
Amunak
Profil
weroro:
Proč vlastně potřebuješ ID v takto specielním tvaru? Není to moc chytré.
weroro
Profil
Amunak:
To ID sa bude používať ako variabilný symbol. Napadá ťa niečo sofistikovanejšie? Rád si nechám poradiť, nemám s tým veľa skúseností.
Amunak
Profil
weroro:
Používat jenom auto-incrementem vytvořená ID. To se přeci se zápisem VS nijak nevylučuje.
weroro
Profil
Amunak:
Ďakujem za pripomienku. Upravil som to tak aby bolo id užívateľa prideľované auto-incrementom. Avšak na základe požiadavky, ktorú som dostal, som aj tak musel použiť dané riešenie pri objednávkach konkrétnej položky (vraj aby to bolo prehľadnejšie ak sa na to pozrie - bez strojového spracovania).
aDAm
Profil
Ale pořád to bude jen číslo. Pokud jej budeš generovat tak jak si na začátku uvedl tak bude jen "větší" a v ručním zpracování nebude rozdíl. Spíš asi jen psychologický efekt "velkého" čísla = hodně objednávek.
Amunak
Profil
Jako když už bych neměl použít auto increment a musel si to nějak komplikovat, tak se asi pokusím rovnou do toho čísla zabudovat nějaký kontrolní mechanizmus, který bude zjišťovat, jestli je to číslo správně. Aby šlo z platby rovnou poznat, že to někdo vyplnil špatně.
weroro
Profil
Amunak:
Aj mne to tak trochu príde postavené zle, ale nevidím v tom závažnú chybu, preto som to odobril. Aby som vysvetlil požiadavku (aktuálnu verziu).
1. Užívateľ sa zaregistruje - do DB sa uloží číslo užívateľa ako obyčajné číslo zvyšované auto-incrementom
2. Užívateľ si objedná službu - a tu je potrebné vytvoriť číslo / kedy to objednal a koľká objednávka v ten deň to bola /
3. Následne sa vytvorí PDF faktúra, v ktorej bude ako variabilný symbol použité dané číslo
4. Číslo faktúry (čiže aj názov súboru) bude zložené z variabilného symbolu + aktuálne poradové číslo faktúry.

Tento názov je vyžadovaný predo aby sa súbory pri otvorení priečinku s PDF automaticky radili podľa dátumu (v názve bude dátum - variabilný symbol).
Kajman
Profil
Každou půlnoc můžete přes příkaz alter table měnit autoincrement. Když bude ale moc objednávek, mohou padat do následujích dnů a koncem měsíce i do nexistujích čísel toho měsíce.
Amunak
Profil
weroro:
Za předpokladu, že používáš formát YYMMDDNNNN už jen zbývá doufat, aby nebylo denně víc jak 1000 objednávek :)

Byl by velký problém mít název PDF faktury (který je délkou de facto neomezený) ve tvaru YYMMDD-NNNNNNNNNN.pdf? Kde N je VS. Pak by sis s VS mohl taky dělat co chceš. Nevím, jestli číslo faktury má nějaké omezení délky, ale buď by šel použít jen ten VS (beztak bude unikátní), a jestli to omezené není, tak klidně i s tím datem na začátku. Přijde mi škoda zbytečně se omezovat jen kvůli názvu souboru, když by volné číslice VS šly využít lépe.
weroro
Profil
Amunak:
jen zbývá doufat, aby nebylo denně víc jak 1000 objednávek
Je to štvorciferné, takže 10 000 objednávok, a to sa nikdy nestane.

Variabilný symbol: YYMMDDNNNN
Číslo faktúry a zároveň názov súboru: YMMDDNNNN-P

Názov súboru faktúry je teraz tiež neobmedzene dlhý. Je v tare YYMMDDNNNN-P.pdf, pričom P je číslo od 1 do napr. miliardy a označuje celkový počet vystavených faktúr za daný rok.

Kajman:
Ďakujem, na to sa pozriem lebo to nepoznám. Možno s tým vymyslím niečo lepšie.

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