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

Re: MS Access 2010 - filtrovanie údajov

Poslaťod Milan25 » 03.01.2011, 19:36

Stiahol som si Vaše predošlé riešenie pomocou kódov zapísaných do VB.
Filtrovanie funguje presne podľa mojich predstáv, ale keď si zvolím cez filter "skupina" konkrétnu položku (napr. panel), tak filter "názov" po rozbalení pola so zoznamom obsahuje všetky názvy, teda tie, ktoré patria pre "panel", ale aj všetky ostatné, ktoré pre uvedené filtrovanie nepatria (napr. je vyfiltrovaný "panel", ale pole so zoznamom ponúkne aj všetky typy kovania). Výsledkom takéhoto filtrovania je potom prázdny dátovy list, pretože filter 1 = panel, ale filter 2 = kovanie, teda vzniká nesúlad. Ja tento prípad viem ošetriť, ale jedine použitím 3 dotazov ako som priložil do príspevku. Viete mi poradiť ako to zapísať cez VB, alebo iné rozumné riešenie?

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 » 03.01.2011, 20:53

Milan25 píše:Stiahol som si Vaše predošlé riešenie pomocou kódov zapísaných do VB.
Filtrovanie funguje presne podľa mojich predstáv, ale keď si zvolím cez filter "skupina" konkrétnu položku (napr. panel), tak filter "názov" po rozbalení pola so zoznamom obsahuje všetky názvy, teda tie, ktoré patria pre "panel", ale aj všetky ostatné, ktoré pre uvedené filtrovanie nepatria (napr. je vyfiltrovaný "panel", ale pole so zoznamom ponúkne aj všetky typy kovania). Výsledkom takéhoto filtrovania je potom prázdny dátovy list, pretože filter 1 = panel, ale filter 2 = kovanie, teda vzniká nesúlad. Ja tento prípad viem ošetriť, ale jedine použitím 3 dotazov ako som priložil do príspevku. Viete mi poradiť ako to zapísať cez VB, alebo iné rozumné riešenie?

Milan


Pripájam príklad pre filter_2 po zmene filter_1
Kód: Vybrať všetko

Private Sub Filter_1_AfterUpdate()
Dim xF1 As String

xF1 = "SELECT [D_položky skladu 1].Názov FROM [D_položky skladu 1] "
xF1 = xF1 & "WHERE (1 = 1) GROUP BY [D_položky skladu 1].Názov;"

    If nt(Me.Filter_1.Value) <> "" Then
        Me.Filter_2.RowSource = Replace(xF1, "1 = 1", "Skupina = '" & nt(Me.Filter_1.Value) & "'", 1, -1, 1)
    Else
        Me.Filter_2.RowSource = xF1
    End If
   
    Me.Filter_2.Value = Null
    Me.Filter_2.Requery
   
End Sub


Volanie filtra potom analogicky (cez VBA) ako som dal v prvom príklade
Nedoporučujem volania cez makro, človek je obmedzovaný ak potrebuje niečo zložitejšie.

Funkcia NT z prvého príkladu je tiež užitočná :)
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 » 06.01.2011, 14:48

Ďakujem pekne za riešenie, dneska som to zložil dokopy a funguje super, presne takto som si to predstavoval :-)
Môj zápis VBA pripájam v textovom súbore do prílohy, viete mi prosím poradiť ešte v nasledovnom:

- pri otvorení formulára s dátovým listom všetkých skladových položiek po stlačení "Print" mi vypíše chybu a neotvorí zostavu (zrejme čaká na použitie filtra, potom vytlačí už akékoľvek filtrované alebo nefiltrované údaje)
- aký kód použiť pre export údajov do Excelu (princíp Vášho riešenia ako pri vytlačení zostavy)
- aký kód použiť pre export údajov do pdf (princíp Vášho riešenia ako pri vytlačení zostavy)
- po zafiltrovaní podľa SKUPINA zostane v poli so zoznamom napr. "kovanie", avšak po zafiltrovaní podľa NÁZOV síce filtrovanie prebehne v poriadku, ale predchádzajúcu hodnotu "kovanie" vynuluje, neviete prečo?

Vaše riešenie cez VBA je úplne super, mám všetko čo potrebujem a postačuje mi k tomu len 1 tabuľka, 1 dotaz a 1 zostava :)

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 » 06.01.2011, 16:32

Dávkované jak cyankáli, po troškách, aby hneď nezabilo 8-)
Tuším to začnem spisovať a faktúrovať, pomaly vzniká komplexná aplikácia :mrgreen:

Ad: export do XLS - viď prílohu.
Chce to trochu rozsiahlejší kód, ale podstata je využitie funkcie "DoCmd.OutputTo ..."
xlsExport.zip

Jeho volanie môže byť napr. takéto:
Kód: Vybrať všetko

Private Sub btn_Excel_Click()
    Dim xSql As String
    Dim xExcelAjSpusti As Boolean
   
    xExcelAjSpusti = True
    xSql = Me.RecordSource
   
    If xSql <> "" Then
        Call ExportVycucDoXls("Poloz_skladu_Vyber", xSql, xExcelAjSpusti)
    End If
   
End Sub


Ad: Print error
do kódu treba pridať ešte jeden riadok:
Kód: Vybrať všetko
    xSql = Replace(xSql, ";", "", 1, -1, 1)


Ad: PDF
Z Office 2007 a vyššie sa dá exportovať i priamo :
You can save as a PDF or XPS file from a 2007 Microsoft Office system program only after you install an add-in. For more information, search for "Enable support for other file formats, such as PDF and XPS" on Office Online.


... ale ja uprednostňujem "virtuálnu tlač" do PDF, napr. PDFCreator
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 » 06.01.2011, 18:05

Oh, to je ozaj zložitý kód :)

Uvedenú funkciu "DoCmd.OutputTo ..." som skúšal. V podstate mi ide len o nahradenie makra, ktoré som používal doteraz.
Prostredníctvom makier som spustil všeobecný výstup a tam si vždy zvolil typ výstupu a príslušnú verziu (MS excel 2003, 207, pdf, atď.).
Avšak len na základe existencie viacerých dotazov a viacerých zostáv (každá mala svoj zdroj a ten bol zároveň aj filtrom) - je to veľmi nepraktické a databáza má x zbytočných objektov :)
Preto som Vám veľmi vďačný za riešenie cez VB a samozrejme priznávam, že moje ďalšie otázky sa vždy naskytnú po vyriešení konkrétneho problému :)

Vyskúšal som aj export do pdf a xls, ale Access to exportuje z dátového listu a ja potrebujem export vo forme zostavy, tak sa s tým ešte pohrám.

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 Milan25 » 10.01.2011, 21:00

Vyskúšal som Vaše riešenie, ale najviac by sa mi hodilo priamo použitie funkcie "DoCmd.OutputTo".
Pokúsil som sa ju vytvoriť súčasne pre export do Excelu aj pdf, ale nefunguje mi.
Použil som nasledovný kód:

Private Sub Export_XLS_Click()

Dim MyDB As Database
Dim qdfTemp As QueryDef
Dim xSql As String

xSql = Me.RecordSource

Set MyDB = CurrentDb

With MyDB

Set qdfTemp = .CreateQueryDef("", xSql)
DoCmd.OutputTo acOutputQuery, qdfTemp, "(*.xls)", "", , "", 0

End With

End Sub


Pokúšam sa o zloženie funkcie podľa Vášho návrhu, ale neviem tomu výstupnému kódu posunúť správny zdroj (filtrovaný alebo nefiltrovaný).
Je uvedený kód úplne chybný?
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 » 10.01.2011, 21:43

Problémov je tam viac:
1) xSql = Me.RecordSource - musí byť "SELECT ..." syntax

2) samotný export - treba definovať mená:
Kód: Vybrať všetko
Private Sub Export_XLS_Click()

    Dim MyDB As Database
    Dim qdfTemp As QueryDef
    Dim xSql As String, xPortFileName As String
   
    xSql = Me.RecordSource
   
    Set MyDB = CurrentDb
   
    With MyDB
       
        xPortFileName = "Vysledok_TempName"
        'Set qdfTemp = .CreateQueryDef("", xSql)
        Set qdfTemp = .CreateQueryDef(xPortFileName, xSql) 'potrebuje meno
       
        'DoCmd.OutputTo acOutputQuery, qdfTemp, "(*.xls)", "", , "", 0
        DoCmd.OutputTo acOutputQuery, qdfTemp.Name, "MicrosoftExcelBiff8(*.xls)", "", False, "", 0
       
        .QueryDefs.Delete xPortFileName 'qdfNew.Name - treba po sebe upratať :)
    End With

End Sub

Za tento príspevok autor Palo-admin dostal poďakovanie :
Milan25
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 » 11.01.2011, 21:05

Vynikajúco, to je presne ono a teraz sa pokúšam upraviť kód pre prípad, že zvolený export bude zrušený uživateľom.
Avšak problém robí ten názov, Access vypíše chybu "Run-time error 3265 - Položka nebyla v kolekcii nalezena"
Do exportovaného súboru zámerne nedávam verziu excelu, pretože chcem, aby mi Access ponúkol verziu pre uloženie (používam office 2007).
Váš upravený zápis je nasledujúci:

Kód: Vybrať všetko
Private Sub Export_XLS_Click()
   
    Dim MyDB As Database
    Dim qdfTemp As QueryDef
    Dim xSql As String, xPortFileName As String
   
    xSql = Me.RecordSource
   
    Set MyDB = CurrentDb

On Error GoTo xErr
   
    With MyDB
       
        xPortFileName = "Položky skladu - excel"
        Set qdfTemp = .CreateQueryDef(xPortFileName, xSql)
       
        DoCmd.OutputTo acOutputQuery, qdfTemp.Name, , "", False, "", 0
       
        .QueryDefs.Delete xPortFileName
       
xErr:
   
    .QueryDefs.Delete xPortFileName
   
    If Err.Number = 2501 Then
        MsgBox "Export do *.xls zrušený používateľom", vbInformation, "INFO"
    Else
        MsgBox Error$
    End If
   
    End With

End Sub
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 Milan25 » 20.01.2011, 21:10

Výsledné a plne funkčné riešenie podľa mojich predstáv :-)

Kód: Vybrať všetko
Private Sub Export_XLS_Click()
 
Dim MyDB As Database
Dim qdfTemp As QueryDef
Dim xSql As String, xPortFileName As String
 
xSql = Me.RecordSource
 
Set MyDB = CurrentDb
 
On Error GoTo xErr
 
With MyDB
 
xPortFileName = "Položky skladu - excel"
Set qdfTemp = .CreateQueryDef(xPortFileName, xSql)
 
DoCmd.OutputTo acOutputQuery, qdfTemp.Name, , , -1, , , acExportQualityPrint

.QueryDefs.Delete xPortFileName
 
Exit_Export_XLS:
   Exit Sub
xErr:
 
If Err.Number = 2501 Then
    MsgBox "Export do *.xls zrušený používateľom", vbInformation, "INFO"
Else
    MsgBox Error$
    .QueryDefs.Delete xPortFileName
End If
 
End With
 
Resume Exit_Export_XLS
 
End Sub
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 Milan25 » 31.01.2011, 21:01

Moje finálne riešenie pre export rovnakého zdroja priamo do PDF cez formát zostavy:

Kód: Vybrať všetko
Private Sub Export_PDF_Click()
       
    Dim xSql As String
   
    xSql = Me.RecordSource
    xSql = Mid(xSql, InStr(1, xSql, "WHERE") + 6, Len(xSql))
    xSql = Mid(xSql, 1, Len(xSql) - 1)
    xSql = Replace(xSql, ";", "", 1, -1, 1)
   
    DoCmd.OpenReport "Položky skladu", acViewPreview, , xSql, acHidden
    DoCmd.OutputTo acOutputReport, "Položky skladu", , , -1, , , acExportQualityPrint
    DoCmd.Close acReport, "Položky skladu", acSaveNo

On Error GoTo xErr
   
xErr:
    If Err.Number = 2501 Then
        MsgBox "Export do *.pdf zrušený používateľom", vbInformation, "INFO"
    End If

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

Predchádzajúci

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

Kto je on-line

Užívatelia prezerajúci fórum: Žiadny registrovaný užívateľ nie je prítomný a 1 hosť

cron