MS Access 2010 - filtrovanie údajov

"Rady nielen z Porady" - Tipy a triky, "how-to ...", nápady a riešenia k aplikáciam MS Office
pre všetky verzie až po MS Office 2010

MS Access 2010 - filtrovanie údajov

Poslaťod Milan25 » 13.12.2010, 19:35

Dobrý deň prajem,

chcel by som sa s Vami poradiť s nasledovným problémom:

Databáza obsahuje tabuľky (obchodné aktivity, zákazník, dodávateľ) poprepájané navzájom prostredníctvom relácií. Zdrojom výsledného formulára (zobrazený ako rozdelený formulár s dátovým listom) je dotaz, ktorý spája uvedené tabuľky so všetkými poliami. Formulár obsahuje vo svojej hlavičke 3 samostatné polia so zoznamom (zákazník, dodávateľ, položka) a dátový list tohto formulára by som chcel filtrovať podľa hodnôť, ktoré si vyberám v týchto výberovníkoch (svoj obsah budú čerpať zo zdrojového dotazu). Momentálne som pre tieto účely vytvoril zvlášť výberové dotazy, ktoré obsahujú kritériá pre filtrovanie (ich zdrojom sú výberovníky vo formulári), avšak problém je, keď chcem filtrovať údaje prostredníctvom všetkých troch filtrov samostatne, súčasne alebo ich navzájom aj kombinovať (poradie filtrovania rôzne). Následne mám vytvorenú zostavu, ktorej zdrojom je uvedený dotaz a potrebujem mať na tlačovom výstupe len vyfiltrované údaje podľa zvolenej kombinácie (niektoré filtre môžu aj nemusia byť použité).

Ako cieľovú si predstavujem nasledovnú štruktúru databázy : 3 tabuľky, 1 dotaz, 1 formulár a 1 zostava.

Viete mi v tomto poradiť? vopred ďakujem

Milan
Milan25
 
Príspevky: 54
Registrovaný: 30.07.2010, 10:28
Udelené poďakovania: 2 krát
Prijaté poďakovania: 0 krát

Re: MS Access 2010 - filtrovanie údajov

Poslaťod Palo-admin » 15.12.2010, 22:55

Už tu raz bolo niečo podobné riešené - "Výběr položek v sestavách".
Týkalo sa to síce reportov, ale logika je rovnaká.
Najjednoduchšie je z jednotlivých výberov vygenerovať podmienku, ktorá sa "podhodí" filtru.

Kód: Vybrať všetko
Private Sub btn_Filter_Click()

Dim xTXT As String
    filter_text = ""
   
    xTXT = nt(Me.fltDU.Value)
    If xTXT <> "" Then
        If InStr(1, xTXT, "*") > 0 Then
            filter_text = "(DÚ Like '" & xTXT & "')"
        Else
            filter_text = "(DÚ = '" & xTXT & "')"
        End If
    End If

    xTXT = nt(Me.fltAdresa.Value)
    If xTXT <> "" Then
            filter_text = filter_text & IIf(filter_text <> "", " and ", "") & "(Adresa Like '*" & xTXT & "*')"
    End If
   
    If filter_text <> "" Then
        Me.Filter = filter_text
        Me.FilterOn = (Me.btn_Filter.Value)
    End If
       
    Me.btn_Filter.Caption = IIf(Me.btn_Filter.Value, "Filter zapnutý", "Filter vypnutý")

End Sub


Viď priložený príklad (form Dan_URADY).

Iná možnosť je poskladať SQL dotaz, ktorý bude zdrojom údajov pre formulár (viď vlastnosť RecordSource).
Osobne som to robil tak, že v dotaze som už zakomponoval podmienku, napr "WHERE (1=1)",
kde som potom 1=1 vymenil za konkrétnu podmienku a následne urobil Requery,
aby sa údaje formulára updatovali.

Palo
Nemáte oprávnenie prezerať súbory priložené v tomto príspevku.
Palo-admin
Administrátor stránky
 
Príspevky: 473
Registrovaný: 18.07.2008, 16:43
Udelené poďakovania: 6 krát
Prijaté poďakovania: 63 krát

Re: MS Access 2010 - filtrovanie údajov

Poslaťod Milan25 » 16.12.2010, 22:49

Ďakujem za odpoveď a postup, mne sa viacej páči riešenie cez dotaz a skúsil som vytvoriť nasledovné:

SELECT [Položky skladu].*, [Položky skladu].Skupina, [Položky skladu].Názov, [Forms]![Položky skladu]![Filter 2] AS Názov, [Položky skladu].Dodávateľ, [Forms]![Položky skladu]![Filter 3] AS Dodávateľ
FROM [Položky skladu]
WHERE ((([Položky skladu].Skupina)=[Forms]![Položky skladu]![Filter]) AND (([Forms]![Položky skladu]![Filter 2]) Is Null)) OR ((([Položky skladu].Názov)=[Forms]![Položky skladu]![Filter 2]) AND (([Forms]![Položky skladu]![Filter 3]) Is Null)) OR ((([Položky skladu].Dodávateľ)=[Forms]![Položky skladu]![Filter 3]));

Filtrovanie mi funguje až na dodávateľa, zrejme neviem správne zložiť postupnosť funkcie... viete mi poradiť, aby všetky tri filtre fungovali súčasne aj samostatne?
Vopred ďakujem

Milan
Milan25
 
Príspevky: 54
Registrovaný: 30.07.2010, 10:28
Udelené poďakovania: 2 krát
Prijaté poďakovania: 0 krát

Re: MS Access 2010 - filtrovanie údajov

Poslaťod Palo-admin » 18.12.2010, 13:34

Najskôr k názvom polí. Nedoporučujem pre názvy poľa použiť názvy, ktoré majú v kóde inú preddefinovanú funkciu, t.j. [Filter] by som zmenil na [Filter_1],
medzery zase podtržítkom, ľahšie sa potom píše kód.

Potom by funkcia pre report (analogicky i pre form - tam potom ešte pridať Me.Requery) mohla vyzerať nasledovne:
Pre form sa volanie podobnej funkcie môže zavesiť na udalosť "AfterUpdate" konkrétneho prvku-filtra.
Kód: Vybrať všetko
Private Sub Report_Open(Cancel As Integer)

    Dim MyForm As Form, xx As String
    Dim xSql As String, xWhr As String
   
    Set MyForm = [Forms]![Položky skladu]
   
    On Error GoTo errdsc
    xSql = "SELECT [Položky skladu].* FROM [Položky skladu] WHERE (1=1);"
   
    'TEST VYPLNENOSTI FILTER POLI
    xx = nt(MyForm.Filter_1.Value)
    If xx <> "" Then
        xWhr = xWhr & IIf(xWhr <> "", " and ", "") & "([Položky skladu].Skupina)= '" & xx & "')"
    End If
   
    xx = nt(MyForm.Filter_2.Value)
    If xx <> "" Then
        xWhr = xWhr & IIf(xWhr <> "", " and ", "") & "([Položky skladu].Názov)= '" & xx & "')"
    End If
   
    xx = nt(MyForm.Filter_3.Value)
    If xx <> "" Then
        xWhr = xWhr & IIf(xWhr <> "", " and ", "") & "([Položky skladu].Dodávateľ)= '" & xx & "')"
    End If
   
    'UPDATE ZDROJA UDAJOV
    If xWhr <> "" Then
        xSql = Replace(xSql, "(1=1)", xWhr, 1, -1, 1)
    End If
    Me.RecordSource = xSql

errdsc:

End Sub


V príklade, ktorý som tu už prikladal, je použitá funkcia NT, ktorá kontroluje, či je hodnota NULL

Kód: Vybrať všetko
Function nt(hodnota As Variant) As String
' Vstupy: ľubovolná hodnota
' Funkce: prevádza hodnotu Null na ""
    If IsNull(hodnota) Then
        nt = ""
    ElseIf IsEmpty(hodnota) Then
        nt = ""
    Else
        nt = hodnota
    End If
End Function
Palo-admin
Administrátor stránky
 
Príspevky: 473
Registrovaný: 18.07.2008, 16:43
Udelené poďakovania: 6 krát
Prijaté poďakovania: 63 krát

Re: MS Access 2010 - filtrovanie údajov

Poslaťod Milan25 » 18.12.2010, 18:28

Ďakujem za návod, ale stále to neviem zložiť dokopy, možno si v niečom nerozumieme, preto prikladám do prílohy ukážku.
Pokúste sa uplatniť Váš kód priamo na tomto príklade tak, aby filtre boli kombinovateľné a ich výstup sa dal vytlačiť pomocou danej zostavy.
Dokážete na základe toho jedného dotazu dostať aj do daných polí so zoznamom vždy len aktuálny výber hodnôt? (napr. Filter_2 bude mať vyfiltrovaný názov položky a Filter_3 ponúkne len príslušných dodávateľov, nie všetkých)
Veľmi mi to pomôže, vopred vďaka.

Milan
Nemáte oprávnenie prezerať súbory priložené v tomto príspevku.
Milan25
 
Príspevky: 54
Registrovaný: 30.07.2010, 10:28
Udelené poďakovania: 2 krát
Prijaté poďakovania: 0 krát

Re: MS Access 2010 - filtrovanie údajov

Poslaťod Palo-admin » 18.12.2010, 19:43

Milan25 píše:Ďakujem za návod, ale stále to neviem zložiť dokopy, možno si v niečom nerozumieme, preto prikladám do prílohy ukážku.
Pokúste sa uplatniť Váš kód priamo na tomto príklade tak, aby filtre boli kombinovateľné a ich výstup sa dal vytlačiť pomocou danej zostavy.
Dokážete na základe toho jedného dotazu dostať aj do daných polí so zoznamom vždy len aktuálny výber hodnôt? (napr. Filter_2 bude mať vyfiltrovaný názov položky a Filter_3 ponúkne len príslušných dodávateľov, nie všetkých)
Veľmi mi to pomôže, vopred vďaka.

Milan

Páči sa, riešenie v prílohe, dúfam že som to dobre pochopil :)

Palo
Nemáte oprávnenie prezerať súbory priložené v tomto príspevku.
Palo-admin
Administrátor stránky
 
Príspevky: 473
Registrovaný: 18.07.2008, 16:43
Udelené poďakovania: 6 krát
Prijaté poďakovania: 63 krát

Re: MS Access 2010 - filtrovanie údajov

Poslaťod Milan25 » 18.12.2010, 20:48

Vynikajúúco, to je ono :) presne takéto riešenie som si predstavoval, jediná moja úprava - daný kód som priradil ako "udalosť po aktualizácií" každého z filtrov.

Druhá vec, ktorú som písal do príspevku, dokáže Access do tohto filtra (pola so zoznamom) vybrať vždy len dostupné hodnoty podľa filtrovania? (Zoznam vlastností prvku/datové/zdroj ovládacieho prvku).
Pôvodne som to skúšal tak, že zdrojom môjho formulára boli 3 dotazy s kritériami (odkaz na pole filter vo formulári) a postupne podľa vyplnenia filtrov sa zmenšoval rozsah údajov (podľa zapnutého filtru skupiny pole filter_2 zobrazilo už len hodnoty, ktoré patria do danej skupiny a následne filter_3 zobrazil len hodnoty patriace do danej filtrovanej skupiny + filtrovaného názvu).
V inom prípade mi dané tri filtre vždy ponúkajú všetky možnosti, teda aj tie, ktoré pre daný vyfiltrovaný rozsah už nepatria.
Výsledkom je prázdny formulár, pretože takú kombináciu nemožno vyfiltrovať a zobraziť.
To je posledný detail mojich starostí :)

Milan
Milan25
 
Príspevky: 54
Registrovaný: 30.07.2010, 10:28
Udelené poďakovania: 2 krát
Prijaté poďakovania: 0 krát

Re: MS Access 2010 - filtrovanie údajov

Poslaťod Palo-admin » 18.12.2010, 22:23

Milan25 píše:... dokáže Access do tohto filtra (pola so zoznamom) vybrať vždy len dostupné hodnoty podľa filtrovania? ...


Hej, to sme riešili v tomto príspevku: Provázáni položek ve formuláři Access (aj s kódom aj s príkladom)

P.
Palo-admin
Administrátor stránky
 
Príspevky: 473
Registrovaný: 18.07.2008, 16:43
Udelené poďakovania: 6 krát
Prijaté poďakovania: 63 krát

Re: MS Access 2010 - filtrovanie údajov

Poslaťod Milan25 » 19.12.2010, 11:04

Pozrel som si príspevok, ale to nie je celkom ono :)
Ja potrebujem od filtrovania získať viac a prikladám moju názornú ukážku a riešenie (pomocou 3 dotazov, ale tento spôsob sa mi nepáči - musím vytvárať veľa nových objektov).

Milan
Nemáte oprávnenie prezerať súbory priložené v tomto príspevku.
Milan25
 
Príspevky: 54
Registrovaný: 30.07.2010, 10:28
Udelené poďakovania: 2 krát
Prijaté poďakovania: 0 krát

Re: MS Access 2010 - filtrovanie údajov

Poslaťod Palo-admin » 02.01.2011, 22:35

Milan25 píše:Pozrel som si príspevok, ale to nie je celkom ono :)
Ja potrebujem od filtrovania získať viac a prikladám moju názornú ukážku a riešenie (pomocou 3 dotazov, ale tento spôsob sa mi nepáči - musím vytvárať veľa nových objektov).

Milan

Stiahol som si tu ukážku, ale nechápem čo by tie filtre okrem toho čo už robia, mali robiť.
P.
Palo-admin
Administrátor stránky
 
Príspevky: 473
Registrovaný: 18.07.2008, 16:43
Udelené poďakovania: 6 krát
Prijaté poďakovania: 63 krát

Ďalší

Späť na Word, Excel, PowerPoint, Outlook, Access

Kto je on-line

Užívatelia prezerajúci fórum: Google [Bot] a 4 hostia

cron