Grupowanie danych w tablicy

0

Witam, mam problem z pogrupowaniem danych w tabeli oraz ich sumowaniem.

struktura tablicy:

przykładowe dane:

procedure Sumuj;
var
Tab: record
LiPoz: Integer;
Poz: array of record
Nazwa: string;
Ilosc: Integer;
end;
end;
begin

Tab.LiPoz:=0;
SetLength(Tab.Poz, Tab.LiPoz);

FormMain.ADODataset.Close;
FormMain.ADODataset.CommandText:='zapytanie';
FormMain.ADODataset.Open;

while not FormMain.ADODataset.Eof do
begin
przykładowe dane
tab[0]:=('Pokarm','60');
tab[1]:=('Butelka','40');
tab[2]:=('Pokarm','20');
tab[3]:=('Butelka','10');
end;
tworzę pętlę:

for Li:=0 to Tab.LiPoz-1 do
for Li2:=Li+1 to Tab.LiPoz do
if Tab.Poz[Li].Nazwa=Tab.Poz[Li2].Nazwa then
Tab.Poz[Li].Ilosc:=Tab.Poz[Li].Ilosc+Tab.Poz[Li2].Ilosc

i tutaj stoję !

end;

Potrzebuję otrzymać wynik:

Pokarm 60
Butelka 50

Proszę o pomoc. Z góry dziękuję.

0

Powiem szczerze kombinowałem, ale z pozornym banałem jak mi się wydaje jak wylistowanie na ekranie elementów
o unikalnych nazwach mi nie wychodzi. Jeżeli to nie będzie gra czy tam aplikacja konsolowa to polecam skorzystać z
takich obiektow jak TList czy nawet TStringList i trzymać w tej StringList dodawane obiekty zamiast tablicy, dodajesz
przez AddObject('nazwa', Obiekt); lub do TList przez Add(WskaznikNaObiekt). I wtedy będziesz miał do dyspozuycji,
bardzo przydatną funkcję IndexOf, nie wspominając już o wygodniejszym sortowaniu i tak dalej. Tylko, że w Twoim
postcie piszesz, ze chcesz osiągnąc Pokarm 60, a nie przypadkiem 80? Czy po prostu pierwszej pozycji nie chcesz w
ogóle sumować z pozostalymi? Bo jeżeli tak to ma działać, to nieco trzeba pokombinować z tym. A poza tym widzę
w jednym miejscu podajesz wartości jako string, a później chcesz je sumowac jako liczby - potrzebna tu konwersja.
Myślę, że ktoś inny tutaj i bardziej doświadczony coś Tobie więcej pomoże, bo ja po nieprzespanej nocy nie umiem.

0
olesio napisał(a)

Powiem szczerze kombinowałem, ale z pozornym banałem jak mi się wydaje jak wylistowanie na ekranie elementów
o unikalnych nazwach mi nie wychodzi. Jeżeli to nie będzie gra czy tam aplikacja konsolowa to polecam skorzystać z
takich obiektow jak TList czy nawet TStringList i trzymać w tej StringList dodawane obiekty zamiast tablicy, dodajesz
przez AddObject('nazwa', Obiekt); lub do TList przez Add(WskaznikNaObiekt). I wtedy będziesz miał do dyspozuycji,
bardzo przydatną funkcję IndexOf, nie wspominając już o wygodniejszym sortowaniu i tak dalej. Tylko, że w Twoim
postcie piszesz, ze chcesz osiągnąc Pokarm 60, a nie przypadkiem 80? Czy po prostu pierwszej pozycji nie chcesz w
ogóle sumować z pozostalymi? Bo jeżeli tak to ma działać, to nieco trzeba pokombinować z tym. A poza tym widzę
w jednym miejscu podajesz wartości jako string, a później chcesz je sumowac jako liczby - potrzebna tu konwersja.
Myślę, że ktoś inny tutaj i bardziej doświadczony coś Tobie więcej pomoże, bo ja po nieprzespanej nocy nie umiem.

Niestety ale muszę to zrobić na tablicy. W wyniku zapytania jest drugie zapytanie z innej instancji, które daje wynik. Tak naprawdę dane mam, ale muszę je pogrupować. Co to Twojego pytania to pomyliłem się i ma być

POKARM 80 (przepraszam za błąd).

Może jeszcze ktoś doświadczony tutaj zaglądnie i podpowie gdzie jest błąd lub co trzeba jeszcze zrobić.

0

Posortuj najpierw dane wejściowe po kolumnie która ma wyznaczać grupy - Widzę że masz rekordset to posortuj rekordset (nie rozumiem jego znacznia w twim progrmie ale zakładam że tam są dane do pogrupowania). Potem w jeden pętli zacznij dodawać wartości i sprawdzaj czy nazwa z poprzedniego wiersza z kolumny grupy jest taka sama. Jeżeli jest różna to znczy że skończyłeś liczenie sumy dla danej grupy.

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