Microsoft Office Access
uređuje Branislav Mihaljev, MVP

 Office Praktikum | Mapa sajta 

 
Bookmark and Share
Matična strana sajta
Novo na sajtu
Mapa sajta
Beleške
Knjiga posetilaca
Kontakt

Prethodna stranica
Pretraga sajta
Pretraga MSKB

Blog Praktikuma
RSS feed 
 
Office Praktikum

Još o Accessu
 


Skoro svakodnevno slušamo
  Radio Paradise:
  eklektični muzički online radio bez reklama!
 

   

Sponzori sajta

  Connectivity by SBB
 
Connectivity by SBB

 

Informacije

NOVOSTI
Novi prilog o Wordu
Tri nova autorska članka
Četiri priloga o Accessu
Opis i uputstvo za alatku YuCirLat '08 (Word)

SADRŽAJ ZA PREUZIMANJE
YuCirLat '08 unapređena alatka za konverziju kodnih rasporeda u Wordu

SKREĆEMO PAŽNJU
Beleške: B(l)oga li ti tvoga!- prilog koji će nekog možda čak i da naljuti
Kako pretraživati MSKB
* a pronaći ćete i još mnogo novih sadržaja...

USKORO SERIJA ČLANAKA O OFFICEU 2010

POZIVAMO VAS
* i prenesite svoja iskustva. Najbolji prilozi će biti objavljeni.



  (C) 2000-2009 Praktikum na Webu
 

Duplirani zapisi

Nivo:  NIVO 2 - klinite za objašnjenje


Referencijalni integritet bi trebalo da obezbedi korisnika od dupliranja podataka. Ipak, u praksi se dešava da se razni zapisi ponavljaju jednom ili više puta. Na primer, kada omogućite korisniku transfer podataka iz drugih baza podataka, pri čemu niste definisali jedinstveni ključ ili u slučaju kada se jedinstveni ključ može načiniti od dva ili više polja zapisa. Takve podatke možete sačuvati u tabeli sa privremenim sadržajem, ukloniti duplikate - posebno u slučaju kada je korisnik više puta učitao podatke iz iste datoteke - a zatim distribuirati podatke u tabele sa trajnim sadržajem.

Pronaći duplirane zapise je zapravo lako: postojeći čarobnjak pod nazivom Find Duplicates Query Wizard će na osnovu vaših odgovora na postavljena pitanja kreirati upit u kome možete videti koji su zapisi duplirani i koliki je njihov broj. Primer ovakvog upita možete videti na slici. Upit prebrojava ponavljanje istih zapisa i prikazuje rezultate gde je ovaj broj veći od 2 (za broj 1 zapis je jedinstven), grupišući pritom neko od ID polja na jedinstvenu vrednost.

Dobro, pronašli ste zapise koji se dupliraju i videli broj ponavljanja. I šta dalje? Verovatno ste poželeli da na osnovu prethodnog napravite nekakav upit koji bi pobrisao duplirane zapise. Ovde obično nastaju problemi, jer se od ovog momenta zahteva dobro poznavanje SQL jezika. Za početak, zaboravite upit koji je čarobnjak kreirao, nego krenite sa novim upitom. Pređite u SQL prikaz i prenesite sledeću SQL strukturu:

SELECT tblTabela.fldPolje, tblTabela.ID
  FROM tblTabela
  WHERE (((tblTabela.fldPolje) In
   (SELECT [fldPolje] FROM [tblTabela] AS Tmp
  GROUP BY [fldPolje] HAVING Count(*)>1)))
  ORDER BY tblTabela.fldPolje;

Primetite dvostruku SELECT klauzulu: o ugnežđenim upitima smo pisali detaljnije u prethodnim prilozima. Sačuvajte ovaj upit pod nekim nazivom, npr. qryOD1, a zatim kreirajte novi upit i pređite u SQL prikaz. Prilagodite sledeću SQL strukturu vašoj tabeli i prethodnom upitu, pa je prenesite u novi upit:

SELECT DISTINCTROW Q1.ID, Max(Q2.ID) AS MaxOfID
  FROM qryOD1 AS Q1 INNER JOIN qryOD1 AS Q2
  ON Q1.fldPolje = Q2.fldPolje
  GROUP BY Q1.ID
  HAVING (((Max(Q2.ID))>[Q1]![ID]));

Ovaj upit morate napisati u SQL prikazu; tek nakon što završite pisanje, možete ga pogledati u režimu prikaza dizajna. Primer takvog upita vidite na sledećoj slici. Sačuvajte ga pod nekim nazivom, npr "qryOD2" jer ćete ga iskoristiti za treći i konačni upit.

Treći upit je jednostavan: povežite vašu tabelu sa drugim upitom (qryOD2) u relaciji jedan-ka-jedan, promenite tip upita na Delete Query i prenesite polje "*" u upit; zvezdica označava sva polja tabele, ali možete koristiti i bilo koje drugo, jer ćete zapise brisati bez filtriranja. Prenesite u SQL prikaz upita sledeću SQL strukturu:

DELETE DISTINCTROW tblTabela.*
  FROM tblTabela
  INNER JOIN qryOD2
  ON tblTabela.ID = qryOD2.ID;

Stvari se "malčice" komplikuju kada tražite jedinstvene zapise po više zapisa. Pretpostavimo da želite da ustanovite jedinstvene zapise uključujući pet polja zapisa. Tada će upiti imati sledeću SQL strukturu (nazivi polja su skraćeni zbog preloma):

SELECT
    T1.F1, T1.F2, T1.F3,
    T1.F4, T1.F5, T1.tblTabela_ID
  FROM tblTabela AS T1
  WHERE (((T1.F1) In
   (SELECT [F1]
     FROM [tblTabela] As Tmp
     GROUP BY [F1],[F2],[F3],[F4],[F5]
     HAVING Count(*)>1  And [F2] = [T1].[F2]
       And [F3] = [T1].[F3] And [F4] = [T1].[F4]
       And [F5] = [T1].[F5])))
  ORDER BY T1.F1, T1.F2, T1.F3, T1.F4, T1.F5;

SELECT DISTINCTROW Q1.tblTabela_ID
  FROM qryOD1 AS Q1
  INNER JOIN qryOD1 AS Q2
   ON (Q1.F5 = Q2.F5)
   AND (Q1.F4 = Q2.F4)
   AND (Q1.F3 = Q2.F3)
   AND (Q1.F2 = Q2.F2)
   AND (Q1.F1 = Q2.F1)
  GROUP BY Q1.Table1_ID
  HAVING (((Max(Q2.tblTabela_ID))>[Q1]![tblTabela_ID]));

Postoje slučajevi kada će upit koji briše podatke prijaviti grešku; u ovom slučaju, to je treći upit. Prvo proverite da li je tabela obeležana sa oznakom "samo za čitanje" (Read Only), zatim proverite vaša prava u radu sa objektima baze. Ukoliko ovo ne pomogne, proverite da li je tabela povezana sa tabelom koja je obeležena oznakom "samo za čitanje". Pokušajte da napravite kopiju tabele, pa nad njom pokrenite upit za brisanje. U svakom slučaju, mogućnost brisanja zapisa možete jednostavno proveriti: otvorite tabelu u režimu uređivanja podataka, obeležite zapis i pokušajte da ga izbrišete pritiskom na taster DEL. Ako u tome ne uspete, uzrok tome je isti onaj koji je sprečio izvršavanje upita.

"Luksuznije" rešenje ovog problema zahteva rad sa sirovim podacima i znatno uvećan utrošak resursa i prostora. Jednostavno, kreirajte upit prema vašoj tabeli i postavite sva polja u upit. Uključite prikaz grupisanja i ostavite vrednosti Total kolone na Group By. Pokrenite upit i iskopirajte sve podatke u tabelu sa privremenim sadržajem. Zatim izbrišite podatke iz prvobitne tabele - pod uslovom da neko od polja tabele nije u referencijalnim integritetu sa poljem druge tabele - i iskopirajte podatke iz prvobitne tabele. Naravno, obavezno načinite kopiju baze podataka pre nego što pokrenete akcioni upit.

 

  (C) 2000-2009 Praktikum na Webu

PC 124


 
 

Vrh stranice  Prethodna stranica  Naslovna strana  Mapa sajta  Pretraga

AFORIZAM ZA DANAS OVIH DANA SLUŠAMO...

Copyright © Praktikum na Webu, 2000-2009; Valinor Design; sva prava pridržana.