Microsoft Office Access
uređuje Branislav Mihaljev, MVP

Bookmark and Share
Matična strana sajta
  Novo na sajtu
  Mapa sajta
  Beleške
  Kontakt
  Pretraga MSKB

 Blog Praktikuma
  RSS feed
  P@W @Tw

  Izvezi stranicu u PDF
 
Office Praktikum

Još o Accessu
 


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

 
       

Sponzori sajta

SBB CS 1.6 game server: 82.117.200.1
 
Connectivity by SBB

 
Suština pasijansa
Suština pasijansa
 


 

Informacije

NOVOSTI

I još dva nova priloga o Excelu
Novi prilozi o Wordu
Novi i prilozi u temi "razno o Officeu"
Novi članci o novostima u Officeu 2010!

SADRŽAJI ZA PREUZIMANJE

Lokalizacija Total Commandera 7.51Obe jezičke školjke za popularni program na srpskom sad funkcionišu u bilo kojoj varijanti Windowsa!
RNDalica.ExcelDodatak za Excel 2007/2010 za generisanje slučajnih podataka!
YuConv.ExcelDodatak za Excel 2007/2010 za konverziju pisama!
YuConvNetDodatak za Word 2007/2010 za konverziju pisama i kodnih rasporeda!

SKREĆEMO PAŽNJU

Kako pretraživati MSKB
a pronaći ćete i još mnogo novih sadržaja...

KONTAKT

Da li znate za pravila koja važe pri kontaktu sa nama? Molimo vas da se obavestite o tome!
 
POZIVAMO VAS

i prenesite svoja iskustva. Najbolji prilozi će biti objavljeni.

  (C) 2000-2010 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-2011 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-2011; Valinor Design; sva prava pridržana.