Tabela Paradox - zapytania do tabeli

0

Witam....

Mam 2 problemy z uzyskaniem wyników z bazy danych.

  1. Chciałbym zsumować wszystkie cyfry z kolumny i wyswietlić sumę na labelu.

  2. Chciałbym dowiedzieć się ile razy w kolumnie tabeli jest słowo np. moneta.

Chcę sobie ułatwić w pracy pewną czynność, ale nie jestem programistom i nie bardzo wiem jak sie za to zabrać. Tabelkę sobie jakoś stworzyłem z tutoriala i nawet działa. Tyle że cały czas dodaję nowe rekordy a z wynikami jest już kiepsko, trzeba liczyć na piechotę :-D .

Baza typu Paradox, komponent typu TTable.

Pomoże ktoś?

0

zamiast ttable weź tquery. Daj strukturę tabeli i podaj które pola chcesz policzyć to Ci napiszę zapytanie abyś miał jakiś szybki start. A dalej to podstawy SQLa to będziesz sobie mógł policzyć co będziesz chciał

0

Dzięki za odzew Misiekd

Tabelka ma 4 kolumny
ID
Środki trwałe
Rok
Sztuk

W kolumnie Srodki trwałe muszę wiedzieć ile mam np. krzeseł dlatego chciałbym aby programik wyliczył mi ile razy w kolumnie jest nazwa krzesło

Kolumna Sztuk przechowuje ilosci srodków np. 2 Tv, 4 radia, 5 drukarek itd. Oczywiście w tej kolumnie są same cyfry bez nazwy predmiotu, no i potrzebna jest po prostu suma z wszystkich rekordów. Marzeniem byłaby możliwość abym wiedział ile jest krzeseł a ile drukarek.

Podpiołem komponent TQuery tylko pytanie jak wpisać procedurę.

Dasz wiarę że firma zatrudniająca kilkadziesiąt osób nie używa excela :-D , masakra.
Dlatego prubuję coś spłodzić aby było mi łatwiej, mam już dość liczenia na "palcach".

0

Nazywanie kolumn z pl literkami i ze spacją w nazwie to bardzo zły pomysł - jeśli możesz to ją zmień

Wpisz do właściwości SQL TQuery coś takiego

SELECT `środki trwałe`, sum(sztuk) from nazwa_tabeli group by `środki trwałe`

za nazwa_tabeli podstaw nazwę twojej tabeli, nie pamiętam jak podaje się nazwy kolumn ze spacją więc najprawdopodobniej zamiast środki trwałe będzie [środki trwałe] lub coś podobnego - chyba, że to pole nazywa się u Ciebie jakoś inaczej

0

srodki_trwale

0

Witam ponownie...

Dziękuję wszystkim za wszelką pomoc.

Niestety,,,

Wczoraj komponent TQuery podpiąłem i widział mi moją tabelke, niestety próby robiłem na nowej formatce i nie zapisałem sobie. Dzisiaj robię jeszcze raz to samo i wyświetliło mi komunikat że brak dostępnych deklaracji SQL..

"Query1:No SQL statement available.

TQuery podpiołem pod alias w DatabaseName, a DataSource pod DataSet. Przy próbie aktywacji TQuery Active na True, wywala powyższy komunikat. Coś przeoczyłem ale co?

0

Już doszedłem co było przyczyną wyświetlania tego komunikatu, otóż wszystko miałem dobrze podpięte, tylko aby włączyć wartść Active na True komponentu TQuery, należało najpierw we właściwościach SQL tego komponentu wpisać zapytanie.

No to już wiem jak i co podpiąć, teraz jak wyciągnąć informacje z tej tabelki?.

SELECT  IloscZak,  sum (IloscZak)
FROM srodki.db GROUP BY IloscZak

Wynik na komponencie DBGrid to 3 pozycje:

1 pozycja to suma 61 rekordów, w których jest tylko po 1 sztuce
2 pozycja to 1 rekord w którym są wpisane 2 sztuki
3 pozycja to 1 rekord w którym są wpisane 4 sztuki

Ja wolałbym aby wyswietliło mi sumę tych trzech pozycji w jednym rekordzie czyli 67 sztuk.

Zapewne to musi być odpowiednio zadane pytanie, szukam po necie pomocy i na razie nic nie znalazłem, ale próbuję :-D

0

Najprawdopodobniej, nie wpisałeś zapytania do właściwości SQL TQuery.

[Edit]

Eh, spóźniłem się :)

0

Napisałem takie zapytanie:

SELECT 'Nazwa', count (Krzesło) from "monety.db" where Group By 'Nazwa'

Oczekiwałem, że z kolumny "Nazwa" wylistuje mi wszystkie rekordy z nazwą "Krzesło"
Wywaliło mi komunikat o błędzie w Group. Coś jest źle ale co?

0

Już wiem :-) błędem było wpisanie warunek (where). Jednak kopiowanie pomocnych źródełek z netu to błąd. Trzeba przepisywać. Nazwę bazy też miałem złą :-| .

SELECT 'Nazwa', count (Krzesło) from "srodki.db"  Group By 'Nazwa'

Mimo to błąd,,, zamiast wylistować mi rekordy ze słowem Krzesło pisze mi, że

Invalid field name Krzesło.
Ale przecież w kolumnie "Nazwa" są rekordy z wpisem Krzesło :-O

0

No wreszcie doszedłem :-)

SELECT *from "srodki.db" where nazwa in ('Krzesło')

Wylistował mi wszystkie rekordy z wpisem (krzesło).
Ale teraz jak to uzupełnić aby podał mi ile jest rekordów z wpisem (krzesło), a nie wylistował je. Pewnie trzeba skorzystać z operatora "sum", panowie szlachta pomocy, to już mnie przerasta.

0
SELECT * from "srodki.db" where nazwa = 'Krzesło'

jak już coś

SELECT Count(*) from "srodki.db" where nazwa = 'Krzesło'

i przeczytaj sobie jakieś podstawy SQLa

0

Zapytania trenuję w SQL Explorer i tak skonstruowane

SELECT *from "srodki.db" where nazwa in ('Krzesło')

zwraca mi poprawne wyniki, ale Twoja wersja przyda mi się już do programiku.
Czytam wszystko co znajdę w necie na temat SQL-a, ale dużo tego jest, a ja nie chcę programować tylko ułatwić sobie zadania w pracy, a że jestem uparciuch to próbuję :-). Najczęściej metodą prób i błędów.

Ale muszę powiedzieć, że zaczyna mi się to podobać :-D .

0
Nieprogramista napisał(a)

Zapytania trenuję w SQL Explorer i tak skonstruowane
to akurat nie ma nic do rzeczy - wystarczy, że program wyświetli wynik :p

SELECT *from "srodki.db" where nazwa in ('Krzesło')

zwraca mi poprawne wyniki, ale Twoja wersja przyda mi się już do programiku.

jak się później przekonasz jest wiele dróg do wyświetlenia tego, co chcesz. Sztuka polega na tym aby na te wyniki czekać jak najkrócej. Operator IN służy do wyszukiwania wartości, które są w zbiorze, np

SELECT *from "srodki.db" where nazwa in ('Krzesło', 'Stół', 'Ławka')

to samo zapytanie można napisać też tak

SELECT *from "srodki.db" where nazwa = 'Krzesło' or nazwa =  'Stół' or nazwa =  'Ławka'

Czytam wszystko co znajdę w necie na temat SQL-a, ale dużo tego jest,
i to jest Twój największy błąd - nie czytaj wszystkiego, bardziej zaawansowane rzeczy na tym poziomie tylko Ci namieszają.
przeczytaj najpierw np. to http://www.php.rk.edu.pl/w/p/pobieranie-rekordw/ Nie wiem jak u Ciebie z angielskim - tutaj jest dość dobry opis http://www.w3schools.com/sql/sql_select.asp

0

Dziękuję Misiekd za pomoc, angielski u mnie jest ok dam radę, poczytam sobie to co mi podlinkowałeś. Z zapytaniami SQL sobie już poradzę, tak myślę :-) . Gorzej będzie z podpięciem tego pod jakieś buttony. O ile się nie mylę to trzeba to jakoś podpiąć w OnClick buttona. No będę próbował :-)

0

na formę daj TDatabase, TQuery, TDataSource, TDBGrid zapnij razem (wiesz już jak :) ). W Query->SQL wpisz swoje zapytanie. Teraz daj przycisk, kliknij go dwa razy i w kodzie wpisz

Query1.Active := not Query1.Active;

Uruchom sobie aplikację i poklikaj w przycisk.

Teraz dodaj jeszcze TEdit na formę, w SQL wpisz

SELECT Count(*) FROM "srodki.db" WHERE Lower(nazwa) = Lower(:nazwa)

i w OnClick przycisku daj

Query1.Close;
Query1.ParamByName('nazwa').AsString := Edit1.Text;
Query1.Open;

Teraz uruchom sobie program i wpisz np. krzesło w edicie i wciśnij przycisk. Właśnie stworzyłeś swoje pierwsze sparametryzowane zapytanie :p

0

Nie,,, no rewelacja :-) Misiekd masz u mnie duże [browar] . To jest to czego tak naprawdę oczekiwałem, teraz dopasuję to do swoich potrzeb. Ale zamiast edita postaram się tak zrobić, żeby odpowiednie hasła wybierać z komponentu listbox. Wpszę sobie wszystkie nazwy do listboxa i poprzez kliknięcie w odpowiednią nazwę wynik wyświetli mi się na DBGridzie. Mam nadzieję że dam radę. Ale to już jutro. Muszę powiedzieć, że sporo się dzisiaj nauczyłem, ale też i nauczyciel jest dobry, DZIĘKUJĘ !

0
Nieprogramista napisał(a)

Wpszę sobie wszystkie nazwy do listboxa...

A co będzie jak firma nabędzie nowy rodzaj środka trwałego? Np. taboret. Albo jak ktoś w tabeli zamiast "Krzesło" wpisze "Krzeslo"? Będziesz zawsze dopisywał nową pozycję i kompilował projekt?
Możesz dynamicznie dodawać nazwy środków trwałych do ListBox (osobiście użyłbym TComboBox a nawet TDBComboBox).
select distinct('nazwa') from srodki.db order by 'nazwa' zwróci Ci nazwy wszystkich środków trwałych.
Oczywiście powyższe rozwiązanie to typowa "zapchaj dziura" ponieważ struktura bazy którą tworzysz to najlepszy spasób na wpuszczenie się w kanał.
Ale próbuj, próbuj... inaczej się nie naumiesz :d

0

No nie wiem, lista nazw środków trwałych jest skończona, i nie ma ich wcale tak dużo. A nawet jakby trzeba byłoby dopisać kolejną nazwę do listy, to może udałoby się zrobić to programowo, bez potrzeby kompilowania programiku.

ListBox1.Items.Add(Edit1.text);

Natomiast problemem może być jakaś literówka w tabeli "krzeslo" zamiast "krzesło". To faktycznie może być problem :-/

0

No tak wszystko pięknie działa na TDBGridzie, problem zaczyna się przy próbie wyświetlenia wyniku zapytania na labelu. Chciałbym uzyskać coś w stylu raportu, odpowiedź na kilku labelach. Przyklad:

Krzesło................10
Taboret................5
Telefon.................25
itd.

Wynik w postaci liczb to labele.
Jak to ugryźć? :-/

0

No tak wszystko pięknie działa na TDBGridzie, problem zaczyna się przy próbie wyświetlenia wyniku zapytania na labelu. Chciałbym uzyskać coś w stylu raportu, odpowiedź na kilku labelach. Przyklad:

Krzesło................10
Taboret................5
Telefon.................25
itd.

Czekaj do rana. Odpowiem i napiszę co i jak, bo to są pierdoły jakieś.

0

przejście po wszystkich rekordach

Query1.Open; //otwarcie zapytania
Query1.First; //ustawienie się na pierwszym rekordzie
while not Query1.EoF do //dopóki nie dojdzie do końca zbioru to
begin
  Label1.Caption := Query1.FieldByName('nazwa_pola').AsString; //przypisanie do właściwości Caption komponentu Label1 tego co jest w danym rekordzie w polu 'nazwa_pola'
  Query1.Next; //przejdź do następnego rekordu. Jeśli to opuścisz to pętla nigdy się nie skończy!!
  Sleep(1000); //zatrzyma wykonywanie programu na 1s.
end;
Query1.Close;

Ten kod nie stworzy Ci x labeli tylko w jednym będzie wyświetlał po kolei rekordy. Powinieneś załapać jak to się robi.

To co chcesz zrobić jest niepraktykowane ponieważ TLabel nie jest tabelką, a próbujesz tabelkę do niego wcisnąć. Liczba zwróconych rekordów jest zmienna więc nie jesteś w stanie stwierdzić ile Labeli będzie Ci potrzebne w czasie projektowania aplikacji. Musiał byś je tworzyć dynamicznie (z poziomu kodu) na podstawie liczby rekordów, ustawiać im położenie i zabezpieczyć się przed sytuacją, kiedy jakieś 'wychodziły by' poza formę bo by się nie mieściły

0

Witam ponownie

Posunąłem się troszkę dalej, mianowicie chcąc uzyskać więcej informacji z tabelki podmieniam zapytania we właściwościach
SQL. Za pomocą takiej procedury:

procedure TForm1.Button1Click(Sender: TObject);
begin
With Query1 Do

Begin
     Close; //Zamknięcie aktywnego zapytani
     SQL.LoadFromFile('C:\zapytanie.txt'); // Wczytanie zapytania z pliku

         Open; //Aktywowanie zapytania
end;
end;

Zapytania tworzę sobie w plikach tekstowych. Jednak jest to takie,, hmm prostackie, ponieważ każde stworzone zapytanie podpinam pod nowego buttona. Im więcej pytań tym więcej buttonów, co prawda klikam i pięknie mi wyświetla na DBGridzie wynik zapytania, ale nie to chciałem osiągnąć. Z Labelami jednak sobie nie poradziłem jestem jeszcze za cienki :-/ . A raport powinien być gotowy po jednym kliknięciu w jakiś przycisk. A może dałoby się wyświetlić wynik kilku zapytań na 1 DBGridzie?.

0

Zapytania do bazy możesz trzymać w... bazie :-P
Utwórz sobie tabelę o jakiejś takiej strukturze:
ID_zapytania
Opis_zapytania
Tresc_zapytania
Z tej tabeli, w DBComboBox wyświetl sobie pole 'Opis_zapytania' a pod przyciskiem daj procedurę która załaduje do Query zawartość pola 'Tresc_zapytania'.
Zamiast labeli możesz użyć zwykłego Memo, chociaż nie bardzo widzę sens pałowania się z czymś co wyswietla się w DBGridzie, ale to Twój problem.
No i na koniec zdanie które jeszcze nie padło a paść musi - Paradox jest be a BDE nie jest od lat rozwijane, bawisz się archaiczną technologią.

0

A co mi tam, opiszę to łopatologicznie.
Tworzysz tabelę 'Zapytania' z polami: 'ID_zapytania', 'Opis_zapytania', 'Tresc_zapytania'.
Wrzucasz na formę Query, nazwijmy je qZapytanie, we właściwość SQL wpisujesz zapytanie (może być na sztywno)

select Opis_zapytania, Tresc_zapytania from Zapytania order by Opis_zapytania

Wrzucasz na formę DataSource, nazwijmy je dsZapytanie i spinasz z qZapytanie (powinieneś już wiedzeć jak).
Wrzucasz na formę DBComboBox, własciwość DataSource ustawiasz na dsZapytanie, właściwość DataField ustawiasz na pole 'Opis_zapytania'. To co zaznaczysz w DBComboBox będzie również 'zaznaczone' w qZapytanie.
I na koniec pod przyciskiem dajesz kod

  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Text := qZapytanie.FieldByName('Tresc_zapytania').AsString;
  Query1.Open;
0

Właśnie uświadomiłem sobie że powyżej opisałem bzdurę :-/
Zamiast DBComBox użyj DBLookupComboBox, właściwości DataSource i DataField pozostaw puste, właściwość ListSource ustaw na dsZapytanie, właściwość ListField ustaw na 'Opis_zapytania' a właściwość KeyField na cokolwiek (tu akurat nie będzie potrzebna).

1 użytkowników online, w tym zalogowanych: 0, gości: 1