Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Upit za unos podataka, ali bez podataka

[es] :: MS SQL :: Upit za unos podataka, ali bez podataka

[ Pregleda: 2352 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

batasson
Nikola Pasic
Beograd

Član broj: 96246
Poruke: 148
93.87.244.*



Profil

icon Upit za unos podataka, ali bez podataka16.04.2010. u 13:05 - pre 170 meseci
Pozdrav,

Mozda smesno zvuci naslov, ali problem je sledeci.
Napravio sam bazu i potrebno ja da kada kliknem na dugme "Novi" da se kreira novi zapis, ali samo da se upise podatak u prvo polje ('idnalog', koji je tipa 'autonumber'). Tu sam mislio da koristim INSERT INTO upit (ali ne znam kako da ga napisem samo za jednu kolonu i koja je autonumber).

Nakon klika, kreirao bi se novi nalog sa odgovarajucim rednim brojem i kada se popune polja u aplikaciji sa upitom UPDATE bi 'update-ovao' taj zapis (nalog).

Nadam se da ste razumeli moju zamisao. Bolja resenja su svakako dobrodosla.

Hvala
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Upit za unos podataka, ali bez podataka16.04.2010. u 13:15 - pre 170 meseci
To ti je generalno loša ideja.

Šta ako tabela ima neko polje koje je NOT NULL, a ti želiš samo da napraviš prazan slog da bi dobio id.
Ideja autonumber polja je da to polje u tabeli dobije neki broj u rastućoj sekvenci u momentu upisa novog sloga u bazu.
 
Odgovor na temu

batasson
Nikola Pasic
Beograd

Član broj: 96246
Poruke: 148
93.87.244.*



Profil

icon Re: Upit za unos podataka, ali bez podataka16.04.2010. u 13:31 - pre 170 meseci
Sta bi mi ti preporucio? Kako da resim problem?

Klikom na dugme se da kreira novi nalog i odmah da dobije broj (pozeljno je sledeci redni). Nakon dobijanja broja naloga, popunjavaju se polja u formi i na dugme 'Save', snimaju se promene u bazi.

Citat:

Šta ako tabela ima neko polje koje je NOT NULL, a ti želiš samo da napraviš prazan slog da bi dobio id.


Ostavio sam samo primarni kljuc da bude NOT NULL :)
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Upit za unos podataka, ali bez podataka16.04.2010. u 13:39 - pre 170 meseci
Loš ti je dizajn ako nešto što treba da bude broj naloga bude autoincrement polje. Takva polja se po pravilu ni ne prikazuju na ekranu. Ako je potrebno da nešto bude jedinstveni podatak, tada ga generiši na način koji garantuje jedinsvenost takvog podataka i to pokaži korisniku kao broj naloga. Na primer, pritiskom na taster novi pokreni proceduru koja će da uradi update nad tabelom u kojoj držiš podatak o sledećem raspoloživom broju u okviru sekvence, pa to ponudi kao broj naloga.

Ako budeš insistirao na dizajnu kakv sada imaš, pogađam koje će ti biti sledeće pitanje: U bazi imam autoincrement polje, ali su neki brojevi preskočeni - šta da radim?

Ne znam šta pokušavaš da postigneš, samo znam da si na pogrešnom putu...

Uzgred u transact sql-u imaš u insert komandi output klauzulu kojom možeš da vratiš vrednost nekog polja. Tako bi u insert stavio da insertuješ null u neko polje i output klauzulom dobio koji ti je ID ALI MOLIM TE NEMOJ TO DA RADIŠ!!!

[Ovu poruku je menjao djoka_l dana 16.04.2010. u 14:52 GMT+1]
 
Odgovor na temu

batasson
Nikola Pasic
Beograd

Član broj: 96246
Poruke: 148
93.87.244.*



Profil

icon Re: Upit za unos podataka, ali bez podataka16.04.2010. u 13:54 - pre 170 meseci
Citat:

Ako budeš insistirao na dizajnu kakv sada imaš, pogađam koje će ti biti sledeće pitanje: U bazi imam autoincrement polje, ali su neki brojevi preskočeni - šta da radim?


Hehehe... Potpuno si pravu, cak sam se setio da kad sam i pre par godina za vezbu radio nesto slicno, da su mi neki brojevi bili preskoceni u tabeli. :\

Ali, kako onda da resim problem? Moze li neki kratki primer?



p.s. mozak je definitivno misic koji se mora redovno trenirati inace i ono sto znas zaboravis
 
Odgovor na temu

mkaras
Marko Karas
Beograd

Član broj: 66087
Poruke: 427



+19 Profil

icon Re: Upit za unos podataka, ali bez podataka16.04.2010. u 16:07 - pre 170 meseci
Po meni, bolje rešenje je da se "redni broj" dobija u momentu upisa sloga u tabelu. Koristi neku pomoćnu tabelu iz koje ćeš izvlačiti sledeći "redni broj". To suštinski i ne mora da bude redni broj već bilo kakav alfanumerik koji se menja po nekoj određenoj zavisnosti. Ako radiš u mrežnom okruženju, a ko sada ne radi u mreži, onda je dobra praksa da u momentu uzimanja podatka iz pomoćne tabele zaklljučaš tu tabelu i siguran si da si dobio jedinstven podatak.
 
Odgovor na temu

batasson
Nikola Pasic
Beograd

Član broj: 96246
Poruke: 148
95.180.71.*



Profil

icon Re: Upit za unos podataka, ali bez podataka18.04.2010. u 10:08 - pre 170 meseci
Sad sam malo zbunjen.

Ako sam dobro skapirao, trebalo bi da da u toj pomocnoj tabeli bude kolona ID i kolona za broj naloga. Svaki put pri kreiranju novog naloga, treba da se proveri koji je poslednji i da novi bude uvecan za 1. Je li tako?

 
Odgovor na temu

M E N E
borislav
Temerin

Član broj: 30434
Poruke: 231
212.200.231.*



+1 Profil

icon Re: Upit za unos podataka, ali bez podataka19.04.2010. u 06:26 - pre 170 meseci
Prvo sto je receno, jeste da razdvojis bilo sta sto mozes nazvati BROJ DOKUMENTA (kakav god dokument bio) i IDENTITY property samog PK. Naime, doci ces mozda u priliku da menjas dizajn baze, ili ce ti se pojaviti (ovo je vrlo tipicno!) dve vrste dokumenata koji idu u istu tabelu i svaki od njih bi trebao imati nezavisan broj dokumenta (npr fakture i ponude ... jako je lose, ako imas fakturu 1,2, 3 pa ponudu 4, pa fakturu 5, 6 ....; umesto toga treba da imas fakturu 1,2,3, pa ponudu 1, pa fakturu 4,5...)
Da bi ovo postigao, treba u posebnoj tabeli, tabeli brojaca (VRRRRLO osetljivoj - konkurentni pristup njoj moras obezbediti adekvatnim zakljucavanjem - to je isto gore receno) da odrzavas brojace - prilikom dizajniranja, treba da vidis od cega moze zavisiti jedan takav broj dokumenta (u ovom gore, jednostavnom slucaju, zavisi samo od tipa dokumenta), pa ces odrzavati vise brojaca i uvek upitom zahvatati onaj koji ti treba prilikom pravljenja dokumenta. Kad uzmes odgovarajuci broj, naredni (u tabeli brojaca) moras inkrementirati. Jednostavna tabela brojaca za gornji primer sada izgleda ovako

create table TestBrojac (
TipDokumenta char(10),
Broj int
)

sa sadrzajem:

TipDokumenta Broj
-----------------------
faktura 6
ponuda 2


(necu sad da ulazim da mozes (moras!) imati sifarnik tipova dokumenata, pa nece u tabeli pisati "faktura" ili "ponuda", vec neki broj...;polje TipDokumenta stavis da bude PK)
Ovde sam naveo slucaj gde je u TestBrojac smesten NAREDNI BROJ, sto znaci da ces ovaj broj usvojiti za naredni dokument, a zatim inkrementiranjem spremiti brojac za naredni dokument.

Na ovaj nacin imas vecu kontrolu nad brojacima, u slucaju neke brlje mozes ih lakse modifikovati/ispraviti gresku, a pritom ne diras identity polje, koje pustis da slobodno "puca" i koje ce ti biti PK.
Nad dvojkom tipdokumenta/brojdokumenta stavis unique index i to je to (ne u ovoj tabeli, vec u tabeli samih dokumenata).

U slucaju naknadnog dodavanja nove vrste, tj, tipa dokumenta dovoljno je samo da u tabelu brojaca stavis novi brojac, koji moze da krene od 1 (ili nekog opsega, kako zelis/volis/moras) a program nastavlja da radi.

Tipicno je da imas vise tabela u kojima odrzavas brojace koji nemaju veze jedni sa drugima. Naime, neki brojaci zavise od tipa dokumenta (kao ovaj gore), a neki od fizicke lokacije, organizacione strukture, coveka (zaposlenog) i slicno. Ne treba to da izbegavas, samo napravi dobru politiku pristupa i ispostuj je svuda.
Uhvatili ste me nespremnog
 
Odgovor na temu

batasson
Nikola Pasic
Beograd

Član broj: 96246
Poruke: 148
93.87.244.*



Profil

icon Re: Upit za unos podataka, ali bez podataka28.04.2010. u 12:30 - pre 170 meseci
Evo posle malo vremena isprobavanja nisam uspeo :(

Kako da napisem upit koji ce proveriti koliko ima redova u tabeli i na to koloni nalog dodati 1 (da bude sledeci redni broj)?

Tabela je brojac<$id,nalog>
 
Odgovor na temu

Boris B.
Ljubljana

Član broj: 213615
Poruke: 286
*.dial-up.dsl.siol.net.



+14 Profil

icon Re: Upit za unos podataka, ali bez podataka04.05.2010. u 22:02 - pre 170 meseci
Postoje razni nacini, npr SELECT COUNT(*) FROM XXX ce ti vratiti broj zapisa u tabeli XXX, SELECT MAX(Rbr) ce ti vratiti zadnju (maksimalnu) vrednost polja Rbr, SELECT MAX(Rbr) FROM XXX WHERE Godina=2006 ce ti vratiti RBr zadnjega zapisa gde je godina 2006... zavisi sta ti treba.

Za "rupe" u brojanju ne moras da brines jer u principu kod takve vrste aplikacija nema brisanja nego samo storniranje-deaktivacija zapisa.

Mnogo veci problem je concurrency iliti kada vise korisnika radi "SELECT MAX" svi ce dobiti istu vrednost i posledicno uraditi INSERT te vrednosti. Zato je najbolje da ni ne radis SELECT nego koristis MAX direktno u INSERT SELECT-u. Korisnik ne moze "unapred" da zna dodeljeni broj naloga jer je to relativno na vreme unosa.

Moj savet je da odvojis Id_Nalog od Rbr-a, koristis INSERT SELECT sa MAX-om (obavezno i index na MAX polje), a posle insert-a dobijes bas taj record sa upitom "SELECT * FROM Nalozi WHERE Id_Nalog=SCOPE_IDENTITY()".

Ako je tabela velika MAX moze biti neefikasan jer trazi maksimum pri svakom unosu. U takvim situacijama se u MSSQL-u obicno pravi simulator sekvence, znaci funkcija koja prvo uzme lock i poveca neki counter u nekom polju i zatim vrati novu vrednost polja, ali pretpostavljam da ti to nece trebati
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
 
Odgovor na temu

[es] :: MS SQL :: Upit za unos podataka, ali bez podataka

[ Pregleda: 2352 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.