[ Borkke @ 23.02.2011. 08:35 ] @
Pozdrav svima!

Pravim neku malu Wpf aplikaciju...
Muci me pitanje kako se formira sql upit ako imam dve tabele(adresa i radnik): jedna ima primarni kljuc idAdresa a druga ima primarni kljuc idRadnik
i strani kljuc idAdresa.

tabela adresa ima: pk.idAdresa, ulica, broj, grad, zip
radnik ima : pk.idRadnika, sk.idAdresa, ime, prezime, mail, telefon...

primarni kljucevi su int(autoinkrement) a spoljni kljuc je int i nije auto inkrement.

Kako sad da formiram sql za unos podataka kad iz forme uzmem sve potrebne podatke vezane za radnika???
Jel dostoji neki lepsi nacin da se popune obe tabele odjednom ili prvo adresu pa da se izcita poslednji primarni kljuc tabele adresa
pa da se taj primarni kljuc doda u Sql upit, kao strani kljuc, za dodavanje radnika....
[ Dusan Kondic @ 23.02.2011. 09:25 ] @
Po strukturi tabela, rekao bih da želiš da radnik može da ima više adresa. Da li je tako?

1) Ako radnik može da ima samo jednu adresu, ja bih iz tabele radnika izbacio polje idAdresa
a iz tabele adresa umesto polja idAdresa stavio idRadnik. Prilikom upisa bih prvo upisao radnika,
zatim uzeo njegov id
DECLARE @RadnikId INT
SET @RadnikId = IDENT_CURRENT('TabelaRadnik')
i upisao adresu. Ovim bi tabela adresa predstavljala vertikalni nastavak
tabele radnika.

2) Ako radnik može da ima više adresa, onda problem može da se reši na više načina.
Npr: unutar transakcije upišeš radnika sa idAdresa = 0, pa posle upisa adrese update-uješ
polje idAdresa u tabeli radnika

Code:

DECLARE @intErrorCode INT -- flag koji hvata greške

BEGIN TRANSACTION

INSERT INTO TabelaRadnika(... idAdresa ...) VALUES(... 0 ...)

SELECT @intErrorCode = @@ERROR
IF (@intErrorCode <> 0) GOTO PROBLEM

DECLARE @RadnikId INT
SET @RadnikId = IDENT_CURRENT('TabelaRadnik')

INSERT INTO TabelaAdresa(...) VALUES( ...)

SELECT @intErrorCode = @@ERROR
IF (@intErrorCode <> 0) GOTO PROBLEM

DECLARE @IdAdresa INT
SET @IdAdresa = IDENT_CURRENT('TabelaAdresa')

UPDATE TabelaRadnika SET idAdresa = @IdAdresa WHERE RadnikId = @RadnikId

SELECT @intErrorCode = @@ERROR
IF (@intErrorCode <> 0) GOTO PROBLEM

COMMIT TRANSACTION

PROBLEM:
IF (@intErrorCode <> 0) 
BEGIN
ROLLBACK TRAN
END


[ Zidar @ 23.02.2011. 22:29 ] @
Citat:
tabela adresa ima: pk.idAdresa, ulica, broj, grad, zip
radnik ima : pk.idRadnika, sk.idAdresa, ime, prezime, mail, telefon...

primarni kljucevi su int(autoinkrement) a spoljni kljuc je int i nije auto inkrement.

Kako sad da formiram sql za unos podataka kad iz forme uzmem sve potrebne podatke vezane za radnika???
Jel dostoji neki lepsi nacin da se popune obe tabele odjednom ili prvo adresu pa da se izcita poslednji primarni kljuc tabele adresa
pa da se taj primarni kljuc doda u Sql upit, kao strani kljuc, za dodavanje radnika....

Ovde se radi o jednoj adresi i vise radnika. Prvo mora da se unese red u adresu, pa onda da se doda radnik (ili vise njih). Problem je sad sto ne znas spoljni kljuc - to je vrednost inkrementa koji je SQL napravio kad si insertovao adresu. No, iam i za to funkcija - ScopeIdentity(). kad to znas, sve je lako, teorijski

Ovako nekako moze da ide

Code:
 -- ovo je naravno pseudo code
DECLARE @idAdresa
INSERT INTO Adresa (Ulica, Broj, Grad, ZIP)
SET @IDadresa = ScopeIdentity()  -- ovo cita autoinkrement koji si dobio kad si izvrsio INSERT

-- onda unsese sve radnike koji pripadaju toj adresi:
INSERT INTO Radnik (@IDadresa, ime1, prezime1, mail1, telefon1...)   
INSERT INTO Radnik (@IDadresa, ime2, prezime2, mail2, telefon2...)   
INSERT INTO Radnik (@IDadresa, ime3, prezime3, mail3, telefon3...)   
INSERT INTO Radnik (@IDadresa, ime4, prezime4, mail4, telefon14..)   


Problem je naravno sto ne znas uvek koliko ce radnika da se unese, ako unosis vise od jednog, pa ovako u stvari nece moci. Na kraju ces verovatno zavrsiti tako sto ces nekoj stored proceduri poslati comma delimited string koji moze da izgleda ovako:

@string = 'ime1, prezime1, mail1, telefon1;ime2, prezime2, mail2, telefon2;ime3, prezime3, mail3, telefon3;ime4, prezime4, mail4, telefon14)

Primeti da string sadrzi podatke o vise radnika, svaka kolona odvojena zarezom, pa izmedju dva radnika dodje ;. Onda tvoja procedura ovaj string prvo rastavi na nekoliko redova(po jedan za svakog radinka, pa onda svaki red na kolone i na kraju dobijes tabelu koju insertujes u tabelu Radnik, posto si joj dodao @IDadresa = ScopeIdentity().

Nije prosto kad ima vise radnika...




[ Borkke @ 23.02.2011. 23:51 ] @
Hvala na odgovoru...

Malo sam ishitreno postavio temu. Moram malo bolje da uradim relacije izmedju tabela ali
svakako ste mi pomogli posto nisam znao za ScopeIdentity() :)