[ konstantin @ 04.02.2008. 12:02 ] @
Ljudi zabezeknuo sam se prije par dana. Imao sam zadatak da prihvatim neke podatke u access, iz source tabele prilagoditi podatke u destination tabelu. Napravio kod, sve prošlo kako treba ali shvatim da je broj insertovanih slogova manji nego što sam očekivao,iako nisam dobio nikakvu grešku!? Ganjao problem sa kolegom čitav sat i shvatim da su u source tabeli u kojoj nema primarnog ključa dozvoljeni duplirani slogovi i da ustvari nisu insertovani u destination tabelu naravno upravo oni slogovi koji se ponavljaju jer je u drugoj tabeli definisan primarni ključ.
E sada, sve bi to bilo normalno da sam ja dobio bilo kakvu grešku, međutim nikakvo upozorenje ni od Jet-a ni od VBA iako pokušavam da insertujem slogove koji imaju istu vrijednost PK kao neki drugi slogovi.

Da Vam ne bih komplikovao sa svojim velikim tabelama i svojim kodom, napravio sam sličan kod za 2 tabele:

test1:
f1 txt
f2 txt
f3 num
f4 txt
f5 num

i

test2:
p1 txt PK
p2 txt PK
p3 num PK
p4 txt
p5 num

Ručno ažurirajte tabelu test1 sa 10ak slogova ali da se prva 3 polja ponavljaju za neke slogove, kreirajte dugme cmdBozeSacuvaj i probajte da se uvjerite:

Private Sub cmdBozeSacuvaj_Click()
Dim db As Database
Dim rst1, rst2 As Recordset
Dim str5, strIns5 As String

Set db = CurrentDb
db.Execute "delete * from test2;"
str5 = "SELECT f1,f2,f3,f4,f5 from test1;"
Set rst1 = db.OpenRecordset(str5)
rst1.MoveLast

MsgBox "Tabela test1 ima ukupno slogova-" & rst1.RecordCount

rst1.MoveFirst
While Not rst1.EOF


strIns5 = "insert into test2 (p1,p2,p3,p4,p5) values('" & rst1!f1 & "','" & rst1!f2 & "'," & rst1!f3 & ", '" & rst1!f4 & "', " & rst1!f5 & ");"
db.Execute (strIns5)


rst1.MoveNext
Wend
Set rst2 = db.OpenRecordset("select count(*) as brsl from test2;")


MsgBox "Kraj prenosa u tabelu test2 ukupno samo" & " " & rst2!brsl & " slogova!"

End Sub



Prvo kako je ovako nešto uopšte moguće , a drugo kako se odbraniti od ovako hinjske situacije?

[Ovu poruku je menjao konstantin dana 05.02.2008. u 09:01 GMT+1]

[Ovu poruku je menjao konstantin dana 05.02.2008. u 09:03 GMT+1]
[ Getsbi @ 04.02.2008. 15:18 ] @
Očigledno da nije isto direktno raditi u tabeli i vršiti importovanje. Sećem se od ranije, recimo konverzija:
Informix -> Clipper. Morao sam da uklonim sva ograničenja (Constraint) da bi konverzija bila valjana. Nakon toga postavljao sam indekse i ostalo. U ovom slučaju Primarne ključeve.
[ konstantin @ 05.02.2008. 08:10 ] @
Nije stvar u generalnim problemima oko importa.
Mene interesuje kako da spriječim NEUPOZORAVANJE sa bilo kog nivoa dok se prilikom importa krše takva pravila kao što je nemogućnost dupliranja primarnog ključa.
Evo napunite tabelu test1 sa 10 probnih slogova i izvršite gore postavljeni testni kod. Stvarno bezveze.

Npr. Test1:

1 2 4 3 3 2
1 2 4 2 3 2
1 1 1 4 1 6
1 1 1 3 3 1
2 2 2 3 5 6
1 2 4 3 3 2
1 2 4 2 3 2
1 1 1 4 1 6
1 4 9 3 3 1
2 2 2 3 5 6

Stvarno bezveze.
Ima li neko odgovor na gore postavljeno pitanje?
[ konstantin @ 06.02.2008. 08:36 ] @
Radio sam i update (takođe sa db.execute) poslije inserta i takođe ne dobijem nikakve greške ni upozorenja sa "bilo koje strane".
Da li je moguće da generalno za metod Execute pri objektu db nema nikakvih upozorenja?
[ Getsbi @ 06.02.2008. 09:09 ] @
Šta ti je čekirano na Tools, Options, Edit/Find, Confirm? Ako nije Action Queries, čekiraj tu opciju.
[ konstantin @ 06.02.2008. 10:48 ] @
Čekirana je opcija. Uostalom probaj da izvršiš gore navedeni kod kod sebe pa se uvjeri.
[ Getsbi @ 06.02.2008. 10:59 ] @
Ako hoćeš da ti neko istestira nešto, trebalo bi da napraviš primer i zakačiš ga. Malo ljudi ima vremena da od početka kreira tabele po tvom uputsvu i implementira code. Deviza je : Pomozi da bi ti pomogli. :-)
[ konstantin @ 06.02.2008. 11:14 ] @
Moja baza podataka je zaista ogromna, upravo zato sam i naveo primjer na gore opisan način.
Ali ok, čim stignem kreiraću taj mdb i uploadovati ga.
[ DarioBH @ 06.02.2008. 11:20 ] @
Napravio sam ja i upravu je covjek, kopira samo one koji nemaju iste vrijednosti PK a one druge ne bez ikakvog upozorenja ili obavjestenja da ih nije kopirao

Al nisam skontao poentu svega ovoga, zasto jednostavno ne uradis copy paste i ako nesto ne valja napravice 'paste error' tabelu.
[ konstantin @ 06.02.2008. 11:26 ] @
Zato što prihvatam veliku količinu podataka za tačno zadani format i pripremam ih za migraciju u buduću bazu podataka. Vrlo je osjetljiv posao a mdb mi je u ovom slučaju samo tranziciona baza.

[Ovu poruku je menjao konstantin dana 06.02.2008. u 12:41 GMT+1]
[ konstantin @ 06.02.2008. 11:29 ] @
Getsbi, suština mog pitanja je saglediva možda i bez ovog uploada ali evo i njega.
(na Form1, komandno dugme)
[ Zidar @ 06.02.2008. 14:04 ] @
Treba ovako:

db.Execute (strIns5), dbFailOnError

db.Execute treba uvek izvrsavati sa opcijom dbFailOnError. Ako se pojavi greska, cela transakciaj se ponistava (rollback). Ako dodas Error handling, videces i koja je greska u pitanju. Ako ne dodas error handling, dobices Error: End, Debug poruku i onda mozes da vidis i koja je linija proizvela gresku.

Ako trazis Help za Execute mozes da vidis ovo:

dbFailOnError Rolls back updates if an error occurs (Microsoft Jet workspaces only).


Zakacio sam fjl sa malim prepravkama koda. Ne prolaze podaci s greskom i dobijes lepu poruku.






[ konstantin @ 07.02.2008. 07:15 ] @
Prosto ne mogu da vjerujem da to nisam pronašao na Microsoftovom sajtu.
Zidar, najljepša hvala na objašnjenju.