vbamania.pl
login:
hasło:
 
  *Rejestracja *Zapomniane hasło
 Dziś jest sobota, 18 maja 2024 roku.
Ustaw jako stronę startową Ulubione Napisz
PowrótPowrót do serwisu  RegulaminRegulamin rssRSS

  tytuł wątku:
Wątki dyskusji

problem z filtrowaniem raportu (Access 2003)


otwartyotwarty rozpoczął: Alex postów: 11



napisał: jalamas
postów: 316


umieszczony:
12 lipca 2007
13:43

edytowany:
12 lipca 2007
14:30

  
Może to Ci przybliży bardziej sprawę grupowania:
Cytat:
So, if you have 3 grouping levels, and you only want 1, just assign the
ControlSource of all the grouping levels to the same thing. The syntax is:
Me.GroupLevel(0).ControlSource = "SomeField"

Allen Browne - Microsoft MVP. Perth, Western Australia.

tutaj Allen prezentuje bardziej skomplikowany przykład, może z niego coś sobie "pożyczysz"....
http://www.dbforums.com/archive/index.php/t-788269.html

Option Explicithttp://www.iaii.weia.po.opole.pl/dyplomy/VBasic/asci_t/zmienne/optexplc.htm
napisał: Alex
postów: 10


umieszczony:
12 lipca 2007
12:21

  
Jestem dopiero na początku przygody z VBA i czasami nie wszystko jest dla mnie jasne i a nie każde skróty myślowe od razu czytelne.

No ale nic to, nie będę się zrażac na samym poczatku:) Widać nie zrozumiałam o co Ci chodziło, więc przeczytam jeszcze raz - wnikliwiej :) i przetrawie to na spokojnie :)
napisał: jalamas
postów: 316


umieszczony:
12 lipca 2007
12:09

  
Niezupełnie jak widać wszystko Ci uświadomiłam, bo jak widzę:
Dim r1 As String
     r1 = Ramka1.Value


can only be a number, not test

dobrze jest pilnować typów.... zobacz topic Type Conversion Functions
Cytat:
Option Explict dobrze wiedzieć co to robi, ale i tak tego u mnie nie ma

VBA sam robi wiele, konsekwencje ponosi user i projektant aplikacji.
No cóż wobec tego z literówkami i nie tylko możesz się bawić podczas uruchamiana do upadłego.
A jak już będzie duża aplikacja, szukanie błędów...
To były dobre rady, lecz Twoja aplikacja, Twoja wola...

------------- GroupLevel ----------------

Szkicowo, może popracuj według tego:
1. Przykładowo, mam raport o nazwie rpt_moj stworzony w oparciu o kwerendę
SELECT Orders.OrderID, Orders.ID_Klient, Orders.ID_Produkt, Orders.ID_data, Orders.Wymiana, Orders.Reklamacja
FROM Orders;
Gdzie:
GroupLevel(0).ControlSource -- > ID_Klient
GroupLevel(1).ControlSource -- > ID_Produkt
GroupLevel(2).ControlSource -- > ID_data

mam w module standardowym procedury:

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Module : rpt_moj_mod
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Option Compare Database
Option Explicit

Sub Test2()
    Call testrpt_moj(2)
End Sub
Sub Test1()
    Call testrpt_moj(1)
End Sub
Sub testrpt_moj(ByVal lOpcja As Long)
    DoCmd.OpenReport Reportname:="rpt_moj", view:=acViewPreview, OpenArgs:=CStr(lOpcja)
End Sub

W kodzie klasy tegoż raportu mam procedury

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' VBA Document : Report_rpt_moj
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Option Compare Database
Option Explicit
Dim lOpcja As Long

Private Sub NagłówekGrupy0_Format(Cancel As Integer, FormatCount As Integer)
    Select Case lOpcja
        Case 0
        Case 1
            NagłówekGrupy0.Visible = False
        Case 2
    End Select
End Sub

Private Sub NagłówekGrupy1_Format(Cancel As Integer, FormatCount As Integer)
    Select Case lOpcja
        Case 0
        Case 1
        Case 2
            NagłówekGrupy1.Visible = False
    End Select
End Sub

Private Sub Report_Open(Cancel As Integer)
    If Not IsNull(Me.OpenArgs) Then
        Dim strOpcja
        lOpcja = CLng(Me.OpenArgs)
        Select Case lOpcja
            Case 1
                Me.GroupLevel(0).ControlSource = Me.GroupLevel(1).ControlSource
            Case 2
                Me.GroupLevel(1).ControlSource = Me.GroupLevel(2).ControlSource
        End Select
    End If
End Sub




2. Inną metodą jest zmiana kwerendy raportu, przy grupowaniu po aliasach pól, przykładowo kwerenda podstawowa raportu:

SELECT Orders.OrderID,
Orders.ID_Klient AS GroupKlientId,
Orders.ID_Produkt AS GroupProduktID,
Orders.ID_data AS GroupDateID, Orders.ID_Klient,
Orders.ID_Produkt,
Orders.ID_data,
Orders.Wymiana,
Orders.Reklamacja
FROM Orders;

Wówczas grupowanie raportu projektujemy dla pól jak niżej:
GroupLevel(0).ControlSource -- > GroupKlientId
GroupLevel(1).ControlSource -- > GroupProduktID
GroupLevel(2).ControlSource -- > GroupDateID

Gdy chcemy usunąć grupowanie po ID_Klient:

SELECT Orders.OrderID,
0 AS GroupKlientId,
Orders.ID_Produkt AS GroupProduktID,
Orders.ID_data AS GroupDateID,
Orders.ID_Klient,
Orders.ID_Produkt,
Orders.ID_data,
Orders.Wymiana,
Orders.Reklamacja
FROM Orders;

Zmieniając źródło raportu w jego zdarzeniu Open , jak w przykładzie podkładając jako źródło raportu SQL jak powyżej, gdzie w miejscu
Orders.ID_Klient AS GroupKlientId
jest
0 AS GroupCustomerId i analogicznie ukrywając nagłówek.

Można również zmienić kolejność sortowania:
Me.GroupLevel(i).SortOrder
napisał: Alex
postów: 10


umieszczony:
10 lipca 2007
10:46

edytowany:
10 lipca 2007
15:04

  
Więc filtr chodzi, teraz, niech mi ktoś powie co dalej, chodźby jakieś wskazówki:

1.Jak wysłać do raportu wartości zmiennych r1, r2, r4.

r1 =6 wyłacza grupę 0 w raporcie
r2 = 2 ma wyłączyć grupę 1 w raporcie
r4 > 0 ukrywa szczegóły raportu, a jesli r4 = 3 dodatkowo wyłącza grupę 3


2.Jak zmieniać pola wykorzystane do budowy raportu? (wszystkie pola znajdują się w 1 kwerendzie)

Znacie może jakiś sposób, żeby podejrzeć, co access ma już wybrane? i zmienić to, ale tak, żeby się cały układ nie rozpadł :(

Cytat:
Raport ma zdarzenia Format Event. i Print Event. dla poszczególnych sekcji.
Można sekcje ukrywać, kontrolki również, zmieniać źródło...


Jalamas, możesz podać jakiś przykład jak w kodzie wygląda "zmiana źródła"?

Uzupełnienie
ogólnie układ raportu wygląda nastepująco
-----------------------------------
Grupa 0 - naglówek: [ID_Klient], [Nazwa_Klient]
Grupa 1 - naglówek: ....[ID_Produkt], [Nazwa_Produkt]
Grupa 2 - naglówek: ........[ID_Miesiac], [SumaOfWlkSprzedaz], =Suma([SumaOfIloscBrakow])
Grupa 3 - naglówek: ............[ID_Reklamacja], [Grupa], = Suma([SumaOfIloscBrakow])
Szczegóły: ..............................[Powod],[SumaOfIloscBrakow]
Grupa 3 - stopka: 'tu są tylko dolne obramowania grupy
Grupa 0 - stopka:...podsumowanie [Nawa_Klient], =Suma([SumaOfWlkSprzedaz]), = Suma([SumaOfIloscBrakow])
------------------------------------

Problem z ukrywaniem konkretnych sekcji polega na tym, że nie zmienia to grupowania sekcje głębszych,
np.
0...Klient1
1........Produkt1
2.....................Miesiac: 1, 1000szt., 10
3....................................Wymiana, 8
sz......................................powod1, 6
sz......................................powod2, 2
3....................................Naprawa, 2
sz......................................powod1, 1
sz......................................powod2, 1
1........Produkt2
2.....................Miesiac: 1, 2000szt., 3
3....................................Wymiana, 1
sz.......................................powod2, 1
3....................................Naprawa, 2
sz.......................................powod1, 2

po ukryciu nagłówka grupy 1 wyglada to tak
0...Klient1
2.....................Miesiac: 1, 1000szt., 10
3....................................Wymiana, 8
sz......................................powod1, 6
sz......................................powod2, 2
3....................................Naprawa, 2
sz......................................powod1, 1
sz......................................powod2, 1
2.....................Miesiac: 1, 2000szt., 3
3....................................Wymiana, 1
sz.......................................powod2, 1
3....................................Naprawa, 2
sz.......................................powod1, 2

A powinno tak:
0...Klient1
2.....................Miesiac: 1, 3000szt., 13
3....................................Wymiana, 9
sz......................................powod1, 6
sz......................................powod2, 3
3....................................Naprawa, 4
sz......................................powod1, 3
sz......................................powod2, 1

Dlatego chyba trzeba zmodyfikować źródło raportu, ale nie wiem jak :( Chyba, że ma ktoś inne pomysły
napisał: Alex
postów: 10


umieszczony:
10 lipca 2007
10:12

edytowany:
11 lipca 2007
09:17

  
Cytat:
Nie wiem czy nam przedstawiłaś cały kod procedury zdarzenia gen_rap_Click, ale
- przy obecności Option Explict, kod się nie kompiluje, brak deklaracji zmiennej f2

1.Tej procedury cały:)
2. Option Explict dobrze wiedzieć co to robi, ale i tak tego u mnie nie ma
3. co do zmiennej f2, to literówka już poprawiona, rozpędziłam się, powinno być f3 (nie ma ciaglości ale jest zgodnośc z numerowaniem ramek)

Nie bardzo wiedziałam, czego chciałaś mnie nauczyć tym mini wykładem o stringach, bo cały czas mi się wydawało, że zmienne wewnętrzne, których nie wyświetlam, nie podlegaja konwersji. Ale jednak coś mi uświadomiłaś :)

And też powinno być Stringiem :) więc teraz gra :) Wystarczyło dokleić AND jako text do procedury SQL & "AND" &, a nie oczekiwać, że VBA sam to zrobi :]. W każdym razie wygląda to tak.

...
    Dim stDocName As String
    Dim stLinkCriteria As String
    
    'zmienne do zczytywania formularza
    Dim r1 As String
    ...
    Dim r3 As String
    ...
    'zmienne do budowy filtra
    Dim f1 As String
    Dim f3 As String
    
    'zczytywanie danych z formularza
    r1 = Ramka1.Value
    If Ramka3a.Enabled = True Then
        r3 = Ramka3a.Value
        Else: r3 = Ramka3.Value
    End If
    ...
    If r1 > 0 And r1 < 6 Then
       f1 = "[ID_Klient]=" & r1
       Else: f1 = ""
    End If
    
    If r3 > 0 Then
        f3 = "[ID_Miesiac]=" & r3
        Else: f3 = ""
    End If
    'Filtrowanie
    stDocName = "RaportBrakow"
    If f1 = "" Then
        stLinkCriteria = f3
        Else
        If f3 = "" Then
            stLinkCriteria = f1
            Else
            stLinkCriteria = f1 & " AND " & f3
        End If
    End If
    DoCmd.OpenReport stDocName, , , stLinkCriteria
    ...


Dla nie zorientowanych <bo przecież każdy czasami taki jest >:
gdyby f1 i f3 zawsze miały wartość inną niż "", czyli po prostu miały to można by pominąć cały blok
if... filtrowania
i wpisać tylko jedną linijkę
stLinkCriteria = f1 & " AND " & f3
jednak jeśli f1 jest puste a f3 pełne a zostawimy w kodzie & "AND" & to się program wysypie <sprawdzone>
to samo gdy f1 pełne a f3 puste, stąd blok if...
napisał: jalamas
postów: 316


umieszczony:
10 lipca 2007
09:05

  
Alex
Wrócę do Twojego przedostatniego postu.
Nie wiem czy nam przedstawiłaś cały kod procedury zdarzenia gen_rap_Click, ale
- przy obecności Option Explict, kod się nie kompiluje, brak deklaracji zmiennej f2

-
Cytat:
Each control in an option group has a numeric value that you can set with the OptionValue property. Read/write Long.
Note The OptionValue property is set to a number because the value of an option group can only be a number, not text

Ty deklarujesz, na przykład:
Dim r1 As String
....
r1 = Ramka1.Value


wprawdzie dokonywana jest konwersja, lecz po co skoro potem ?
If r1 > 0 And r1 < 6 Then


See Cstr...
-
stLinkCriteria = f1 And f2

skoro f1 i f2 są stringami to proszę sobie zrobić coś takiego w module standardowym i wykonać:
Sub Test()
    MsgBox "aaaa" And "cccc"
End Sub


I co widzimy?
Konkatenacja stringów to operator &, jeśli AND miało się znaleźć w stLinkCriteria to także powinien być włączony jako zwykły string.
Nie wiem zatem co mam myśleć o Twojej procedurze...
napisał: Alex
postów: 10


umieszczony:
9 lipca 2007
15:09

  
Oj teraz zauwazyłam male rozbieznosci <kajam sie>
zmieniłam troche uklad raportu i z pierwotny 3 grup zrobily się 4:

Grupa 0 klient
Grupa 1 produkt
Grupa 2 sprzedaz miesieczna
Grupa 3 reklamacje (tu podzial czy do naprawy, czy do wymiany)
Szczegoly (to ilosc zareklamowanych sztuk i powody reklamacji)

ta mała zmiana pozwolila mi na utworzenie wszystkich sum jakich potrzebowalam.
napisał: Alex
postów: 10


umieszczony:
9 lipca 2007
14:47

edytowany:
10 lipca 2007
10:50

  
1. Napotkałam mały problem przy filtrowaniu.
Mam problem z OpenReport z WhereCondition "Where .... And...." wiem, że where się nie pisze, ale AND mi potrzebne, bo filtr ma być skladany :( jakieś pomysły? Filtr jako pojedyńczy śmiga ładnie ;)

Poniżej kod przycisku drukującego raport
Private Sub gen_rap_Click()
On Error GoTo Err_gen_rap_Click

    Dim stDocName As String
    Dim stLinkCriteria As String
    
    'zmienne do zczytywania formularza
    Dim r1 As String
    Dim r2 As String
    Dim r3 As String
    Dim r4 As String
        
    'zmienne do budowy filtra
    Dim f1 As String
    Dim f3 As String
    
    'zczytywanie danych z formularza
    r1 = Ramka1.Value   'r1 = 6 ma wyłączyć grupę 0 w raporcie
    r2 = Ramka2.Value   'r2 = 2 ma wyłączyć grupę 1 w raporcie
    If Ramka3a.Enabled = True Then
        r3 = Ramka3a.Value
        Else: r3 = Ramka3.Value
    End If
    If Ramka4a.Enabled = True Then  'r4 > 0 ukrywa szczegóły raportu, r4 = 2 ma wyłączać grupę 3
        r4 = Ramka4a.Value
        Else: r4 = Ramka4.Value
    End If
   
'filtowanie raportu, opiera się tylko na r1 i r3! reszta parametrów do raportu, że filtrować źródło rekordów!
    If r1 > 0 And r1 < 6 Then
        f1 = "[ID_Klient]=" & r1
        Else: f1 = ""
    End If
    
    If r3 > 0 Then
        f3 = "[ID_Miesiac]=" & r3
        Else: f3 = ""
    End If
    
    stDocName = "RaportReklamacje"
    stLinkCriteria = f1 And f2
    DoCmd.OpenReport stDocName, , , stLinkCriteria

    

Exit_gen_rap_Click:
    Exit Sub

Err_gen_rap_Click:
    MsgBox Err.Description
    Resume Exit_gen_rap_Click
    
End Sub




2. Pytanie zasadnicze - w raporcie :)

Cytat:
Raport ma zdarzenia Format Event. i Print Event. dla poszczególnych sekcji.
Można sekcje ukrywać, kontrolki również, zmieniać źródło...


Ok, jeśli dobrze rozumiem, to zdarzenia te muszę urochomić w raporcie?
więc niech mi ktos jeszcze powie jak mam do raportu wysłać dane :]
Głównie będzie chodzić o zmienianie źródła (chodź nie do końca, raport jest oparty na kwerendzie RapReklamacje, zmiana źródła powinna polegać, na "niebraniu" do raportu poszczególnych pól kwerendy)

Dane z formularza, ktore zawarza o pola do raportu to:

r1, gdy =6 wyłacza grupę 0 w raporcie (pozostale wartości to filtr)
r2 = 2 ma wyłączyć grupę 1 w raporcie
r4 > 0 ukrywa szczegóły raportu, a jesli r4 = 2 dodatkowo wyłącza grupę 3

grupa 0 to pola [ID_Klient], [Nazwa_Klient],
grupa 1 to pola [ID_Produkt], [Nazwa_Produkt]
grupa 2 to pola [ID_Miesiac], [SumaOfWlkSprzedaz], [Suma([IloscBrakow])]
grupa 3 to pola [ID_Reklamacja], [Grupa]
szczegóły to pola [ID_Powod],[IloscBrakow]

Mam jeszcze kilka pytan ale to raczej kosmetyka (nie mówie, że proste tylko, że nie jest mi to do szcześcia bardzo potrzebne, ale lepiej by wyglądało :D ) więc zostawie na później
napisał: Alex
postów: 10


umieszczony:
9 lipca 2007
09:06

  
hehehe, czyli dobrze się stało, że tu trafiłam
bo... zapomniałam, a może raczej, jeszcze o tym nie pomyślałam, ale pomyśle :)
narazie jestem na etapie projektowania, wszystkiego co jest mi potrzebne i przewidywania, co jeszcze może być o czym jeszcze nie pomyślałam :)

co rozumiesz przez podzielenie bazy?

co do opcji użytkownika, jeszcze się z nimi nie bawiłam, bo na obecnym etapie nie jest mi to potrzebne (ale mam pytanko, czy moge się tym zająć na końcu, jesli pojawi się jednak potrzeba uruchomienia użytkowników??)

Docelowy zamysł jest taki:
w przyszłości (bo jeszcze do tego nei doszłam ;) ale myśle że jest to kwesja kilku dni, jak już uporządkuje sprawę z raportami) ta baza ma pobierać dane z excela, gdzie będą wysyłane z innego systemu.

A tak przy okazji, jak w praktyce wygląda pobieranie danych z excela do istniejącej tablicy? (bo do nowej to banał)

Czy można automatem ustalić, które kolumny z których arkuszy mają być pobierane (i żeby program sam sprawdzał ile wierszy jest wypełnionych) i do których pól istniejącej tabeli dopisane??
Hmmm, w zasadzie to mam jeszcze jedno pytanie. Czy jest jakaś funkcja lub gotowy dodatek do bazy-taki wizard, w którym można wybrać plik, z którego chce się pobrać dane??
napisał: jalamas
postów: 316


umieszczony:
7 lipca 2007
09:09

  
O CreateReport w aplikacji docelowej nawet nie myśl, to wymaga dostępu do projektu bazy danych, co w aplikacji docelowej jest niedopuszczalne, nie wspomnę o mde, czy runtime.
Raport ma zdarzenia Format Event. i Print Event. dla poszczególnych sekcji.
Można sekcje ukrywać, kontrolki również, zmieniać źródło...
Wykorzystywać funkcje użytkownika.
Jeżeli chodzi o wielkość bazy, nie wiem jak ja oceniasz, czy kompaktujesz, kompilujesz, czy nie zapominasz o podzieleniu bazy.
O wyłączeniu autokorekty przy zakończeniu aplikacji.
napisał: Alex
postów: 10


umieszczony:
6 lipca 2007
11:00

  
Witam wszystkich!

Mój problem polega na tym, że mam raport, a w nim 3 grupy KLIENT, PRODUKT i SPRZEDAŻ MIESIĘCZNA
a w szczegółach REKLAMACJE.

chce móc go filtrować w zależności od potrzeb uzytkownika i dopóki wszystkie dane są tylko filtrowane nie ma problemu, ale....

można (trzeba mieć możliwość) generowania raportu bez podziału na Klientów, czyli grupa KLIENT powinna wogóle zniknąć, to samo dotyczy grupy PRODUKT (nie wiem czy można taką grupę w filtrze usunąć, albo wyłaczyć, żeby się nie drukowała i nie filtrowała danych w głębi raportu)

problem mam też z sekcją szczegóły, gdyż musze miec możliwość wyświetlania reklamacji jako sumy miesięcznej (jeden wynik), albo w podziale na powody reklamacji (w tym momencie będzie kilka sum) i znowu gdybym miała wyselecjonować konkretny 1 powód to nei ma problemu, ale jak mam podać sumę wszystkich reklamacji bez podziału, to nie wiem jak to zrobić.

1.Nie wiem czy da się to rozwiązać na gotowym raporcie? Jeśli tak to jak
2.Jeśli nie to jak automatem wygenerować nowy raport, kóry sam będzie wyciągał dane z kwerendy i tworzył tyle grup ile trzeba? Od razu pisze, że VBA to dla mnei ciągle rozsypane puzzle i dopiero kilka kawalków udało mi się poskładać w całość (jak np. otwieranie formularzy i raportów z użyciem kryteriów filtrowanai), ale CreateReport() to nadal "czarna magia" nie wiem, jakie parametry wstawić i jak to oprogramować, żeby robił to co robić ma

Wiem, że moge zrobić 9 różnych raportów (+ wersje z wykresami) i nie będzie problemu tylko że baza wtedy będzie Wielka, tego nie chcę

W każdym razie będę wdzięczna za wszelkie wskazówki

Alex


<-wstecz  1  dalej->
wszystkich stron: 1


Sortuj posty: z