Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ACCESS] [Formularze][Raporty] Tworzenie podformularzy lub podraportów z zapytania SQL
Forum PHP.pl > Forum > Bazy danych > Access
vokiel
Witam

Mam problem z przygotowaniem raportu/formularza zbiorczego.

Strukura bazy:
ID | DATA | RODZAJ | NR | KWOTA

Co chce osiągnąć?
Raport sumujący poszczególne rodzaje, + szczegóły dla wybranych dla konkretnej daty

Czyli:
1. Rodzaj 1
SUMA: suma dla rodzaj 1

2. Rodzaj 2
NR1 KWOTA 1
NR2 KWOTA 2
SUMA: suma dla rodzaj 2

itd...

Jak to najlepiej rozwiązać?


Przy okazji jak przekazać zmienną z formularza do kwerendy?

Będę wdzięczny za pomoc, nakierowanie, linki do dobrych tutoriali
Pozdrawiam
Beatus
Witaj,

masz tabelę i chcesz na jej podstawie dowiedzieć się:
a) ile jest rekordów, które mają wpisany rodzaj 1, 2 itd i jednocześnie na jaką kwotę opiewają te wszystkie rekordy gdzie wskazany jest określony rodzaj. Dobrze zrozumiałam? Jeżeli tak, najprościej jest zrobić kwerendę która będzie grupowała wg rodzajów, liczyła ID i sumowała kwoty.

SELECT Tabela1.RODZAJ, Count(Tabela1.ID) AS PoliczOfID, Sum(Tabela1.KWOTA) AS SumaOfKWOTA
FROM Tabela1
GROUP BY Tabela1.RODZAJ;

cool.gif chcesz na podstawie dat móc obejrzeć rekordy mieszczące się w określonych przedziałach czasowych? Jeżeli tak, najprościej jest zrobić kwerendę, która po uruchomieniu poprosi o podanie daty od i daty do, a następnie wyświetli te rekordy, które mieszczą się w podanym przedziale.

SELECT Tabela1.DATA, Tabela1.RODZAJ, Tabela1.NR, Tabela1.KWOTA
FROM Tabela1
WHERE (((Tabela1.DATA) Between [podaj datę od w formacie RRRR-MM-DD] And [podaj datę do w formacie RRRR-MM-DD]));

Czy taki zapis w SQL wyjaśnia ci jak to zrobić?

Pytasz też jak przekazać zmienną z formularza do kwerendy.
Nie wiem jak i podejrzewam, że się nie da. Formularz to tylko nakładka, która ułatwia wprowadzanie danych lub ich przeglądanie.
Może napisz czego konkretnie potrzebujesz.

Pozdrawiam
vokiel
Hej
Dzięki za odp.
Niezbyt dobrze opisałem problem, prawdopodobnie z powodu, że zbyt długo się z tym męczyłem.

Wynikiem działania miało być generowanie raportów dziennych. Moim problemem było chyba to, że chciałem zawrzeć jak najwięcej w jak najmniejszej liczbie zapytań/kwerend.

Udało mi się utworzyć raport z podraportami, tyle, że każdy podraport oparty na kwerendzie, a nie tak jak planowałem na powiązaniu z głównym raportem.
Do każdej listy szczegółów musiałem stworzyć mini-podraport oparty na kwerendzie. Sumy ogólne wyciągam jednym zapytaniem:
  1. SELECT
  2. IIf(KASY_FISKALNE.KASA_1 IS NULL,0,KASY_FISKALNE.KASA_1) AS KASA_1,
  3. IIf(KASY_FISKALNE.KASA_2 IS NULL,0,KASY_FISKALNE.KASA_1) AS KASA_2,
  4. (SELECT IIF(SUM(KWOTA) IS NULL , 0 , SUM(KWOTA)) FROM KASA WHERE RODZAJ=12 AND DateValue(DATA)=DateValue(Forms!ROZLICZENIE_DNIA_PARAMETRY!data_wybrana)) AS ZALICZKI_WPLACONE,
  5. (SELECT IIF(SUM(KWOTA) IS NULL , 0 , SUM(KWOTA)) FROM KASA WHERE RODZAJ=11 AND DateValue(DATA)=DateValue(Forms!ROZLICZENIE_DNIA_PARAMETRY!data_wybrana)) AS WPLATY_GOTOWKOWE,
  6. (SELECT IIF(SUM(KWOTA) IS NULL , 0 , SUM(KWOTA)) FROM KASA WHERE RODZAJ=2 AND DateValue(DATA)=DateValue(Forms!ROZLICZENIE_DNIA_PARAMETRY!data_wybrana)) AS ZWROTY_VAT,
  7. (SELECT IIF(SUM(KWOTA) IS NULL , 0 , SUM(KWOTA)) FROM KASA WHERE RODZAJ=4 AND DateValue(DATA)=DateValue(Forms!ROZLICZENIE_DNIA_PARAMETRY!data_wybrana)) AS DO_BANKU,
  8. (SELECT IIF(SUM(KWOTA) IS NULL , 0 , SUM(KWOTA)) FROM KASA WHERE RODZAJ=6 AND DateValue(DATA)=DateValue(Forms!ROZLICZENIE_DNIA_PARAMETRY!data_wybrana)) AS ZAICZKI_WYDANE,
  9. (SELECT IIF(SUM(KWOTA) IS NULL , 0 , SUM(KWOTA)) FROM KASA WHERE RODZAJ=7 AND DateValue(DATA)=DateValue(Forms!ROZLICZENIE_DNIA_PARAMETRY!data_wybrana)) AS ZWROTY_DO_PARAGONU,
  10. (SELECT IIF(SUM(KWOTA) IS NULL , 0 , SUM(KWOTA)) FROM KASA WHERE RODZAJ=5 AND DateValue(DATA)=DateValue(Forms!ROZLICZENIE_DNIA_PARAMETRY!data_wybrana)) AS KW,
  11. (SELECT IIF(SUM(KWOTA) IS NULL , 0 , SUM(KWOTA)) FROM KASA WHERE RODZAJ IN (3,8,9,10) AND DateValue(DATA)=DateValue(Forms!ROZLICZENIE_DNIA_PARAMETRY!data_wybrana)) AS FAKTURY
  12. FROM KASY_FISKALNE WHERE (((DateValue([DATA]))=DateValue(Forms!ROZLICZENIE_DNIA_PARAMETRY!data_wybrana)));


Przy okazji znalazłem jak pobrać wartość z pola formularza do kwerendy:)

Ale Twoje
  1. SELECT Tabela1.RODZAJ, Count(Tabela1.ID) AS PoliczOfID, Sum(Tabela1.KWOTA) AS SumaOfKWOTA
  2. FROM Tabela1 GROUP BY Tabela1.RODZAJ;
jest lepsze, po małym dostosowaniu:
  1. SELECT RODZAJE_OPERACJI.NAZWA AS NAZWA, Sum(KASA.KWOTA) AS SumaOfKWOTA
  2. FROM KASA LEFT JOIN RODZAJE_OPERACJI ON RODZAJE_OPERACJI.ID=KASA.RODZAJ
  3. GROUP BY RODZAJE_OPERACJI.NAZWA;

Jeszcze tylko nie rozumiem filozofii tworzenia wielokrotnych joinów. Jest jakoś inaczej, ale może dzisiaj mi się uda winksmiley.jpg
Beatus
Cóż, ja bym nie zastosowała takiego rozwiązania ponieważ jest ono "sztywne". Wszystkie bazy, które robię wymagają nieustannych modyfikacji. Pojawiają się jakieś nowe wytyczne, nowe potrzeby i muszę wprowadzać dodatkowe funkcjonalności. Zawsze więc staram się szukać czegoś dynamicznego, co będzie działało również wtedy gdy użytkownik wprowadzi RODZAJ625 chociaż niby miało być tylko 12. Listy też tworzę dynamiczne w oparciu o kwerendy z możliwością uzupełniania nawet wtedy gdy teoretycznie takich uzupełnień nie powinno być. W połowie przypadków jednak są. Jednak twoje realia pracy z bazą mogą być zupełnie inne.
Jeśli zaś chodzi o JOIN nie miałam potrzeby korzystania. To jest operator, który łączy dane z różnych tabel pod warunkiem, ze kolumny mają takie same parametry. I tylko tyle wiem. Czasem używam UNION aby pozbierać rozpierzchnięte w kilku exl rekordy do jednej bazy access. Takie porządki smile.gif
Pozdrawiam i powodzenia
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.