Nie mam pomysłu, w jaki sposób optymalnie odpytać tabelę wewnętrzną o dane, dodatkowo ją nieco sprzątając.
W wewnętrznej tabeli, jak widać na screenach, mam sytuację, w której część rekordów (żółta) ma wspólne wartości w kolumnach a-f. Wiem, że wspólne wartości ZAWSZE występują (o ile występują) dokładnie w a-f. Muszę skonstruować logikę, która pozwoli mi:
- znaleźć wpisy ze wspólnym zakresem danych a-f,
- stworzyć dodatkowy wpis z wartościami a-f tak jak było, ale: chcę zmodyfikować kol7 oraz w kol8 i kol9 podać sumy znalezionych rekordów ze wspólnym mianownikiem,
- po dodaniu nowego wiersza, muszę usunąć „źródłowe” wiersze, czyli te, które pierwotnie były oznaczone na żółto.
Stworzenie samego algorytmu nie jest problemem, natomiast od której strony bym nie zaczynał, to nie podoba mi się konstrukcja rozwiązania. Pętle w pętlach pętlę poganiają.
Warto wspomnieć, że tabela wewnętrzna będzie zawierała 60 000 – 100 000 pozycji. Nie do końca uśmiecha mi się budowa rozwiązania, w którym każdy element z każdym będzie porównywany w celu sprawdzenia, czy gdzieś występuje jego „częściowy” dubel.
Czy ktoś z Was mierzył się z tego typu problemem?
Będę wdzięczny za sugestie, jak w miarę optymalnie podejść do rozwiązania problemu.
Jak w tym przypadku optymalnie wyszukać dane?
-
- Posty: 69
- Rejestracja: czw lis 04, 2010 10:49 pm
- Has thanked: 1 time
- Been thanked: 71 times
- Kontakt:
Re: Jak w tym przypadku optymalnie wyszukać dane?
Pomijając kolumnę G problem rozwiązuje prosty COLLECT.
Kolumną G, w zależności o tego jak ma być obsłużona można manipulować w oparciu o sy-tabix.
Kolumną G, w zależności o tego jak ma być obsłużona można manipulować w oparciu o sy-tabix.
Pozdrawiam,
Krzysiek
Krzysiek
-
- Posty: 561
- Rejestracja: śr kwie 04, 2007 4:32 pm
- Lokalizacja: Poznań
- Has thanked: 9 times
- Been thanked: 165 times
- Kontakt:
Re: Jak w tym przypadku optymalnie wyszukać dane?
Czy liczba rekordów z taką samą wartością kolumn A-F będzie zawsze większa od 1? Przykładowo na Twoim zrzucie ekranowym (na żółto) zaznaczone są 4 rekordy. Rozumiem, że może być ich 2, 5, 12, 666, ... itd ale zawsze więcej niż 1, tak? Oczywiście poza przypadkiem gdy jest 0 ale to oznacza, że nie ma rekordów z powtórzonymi wartościami w kolumnach A-F.
Pozdrawiam,
Jacek Witczak
http://novertio.pl
Jacek Witczak
http://novertio.pl
-
- Posty: 561
- Rejestracja: śr kwie 04, 2007 4:32 pm
- Lokalizacja: Poznań
- Has thanked: 9 times
- Been thanked: 165 times
- Kontakt:
Re: Jak w tym przypadku optymalnie wyszukać dane?
To tak na szybko:
tabela z danymi gdzie występują "rekordy na żółto " to tabela_źródłowa
tabela z danymi przygotowanymi tak jak opisałeś w swoim poście to tabela_wynikowa
wykorzystałbym konstrukcję pętli po grupach rekordów: https://help.sap.com/doc/abapdocu_752_i ... oup_by.htm
loop at tabela_źródłowa ... group by kol1 kol2 kol3 kol4 kol5 ... X = group size ...
loop at group ....
ta pętla wykona się tyle razy ile jest rekordów w grupie:
1 raz dla każdego rekordu z niepowtarzalną zawartością kolumn A-F
X razy dla każdej grupy rekordów z taką samą zawartością kolumn A-F
endloop.
jeśli X = 1 to znaczy, że mamy do czynienia z rekordem z niepowtarzalną zawartością kolumn A-F i go po prostu dodajesz
do tabela_wynikowa
w przeciwnym wypadku do tabela_wynikowa dodajesz rekord z posumowanymi wartościami z kolumn A-F obliczonymi w loop at group ...
endloop.
tabela z danymi gdzie występują "rekordy na żółto " to tabela_źródłowa
tabela z danymi przygotowanymi tak jak opisałeś w swoim poście to tabela_wynikowa
wykorzystałbym konstrukcję pętli po grupach rekordów: https://help.sap.com/doc/abapdocu_752_i ... oup_by.htm
loop at tabela_źródłowa ... group by kol1 kol2 kol3 kol4 kol5 ... X = group size ...
loop at group ....
ta pętla wykona się tyle razy ile jest rekordów w grupie:
1 raz dla każdego rekordu z niepowtarzalną zawartością kolumn A-F
X razy dla każdej grupy rekordów z taką samą zawartością kolumn A-F
endloop.
jeśli X = 1 to znaczy, że mamy do czynienia z rekordem z niepowtarzalną zawartością kolumn A-F i go po prostu dodajesz
do tabela_wynikowa
w przeciwnym wypadku do tabela_wynikowa dodajesz rekord z posumowanymi wartościami z kolumn A-F obliczonymi w loop at group ...
endloop.
Pozdrawiam,
Jacek Witczak
http://novertio.pl
Jacek Witczak
http://novertio.pl
Re: Jak w tym przypadku optymalnie wyszukać dane?
Finalnie użyłem jeszcze innego rozwiązania, wykorzystując dodatkową wewnętrzną tabelę. W skrócie:
- biorę wszystkie rekordy do IT_temp
- usuwam duble
(mam teraz listę unikalnych rekordów)
- loopem na it_temp sprawdzam, czy w bazie jest więcej niż jeden rekord dla każdego z wpisu z it_temp
- jeśli tak - oznaczam sobie taki rekord by na podstawie postawionej flagi dalej obrabiać dane (nie tylko sumować któreś wartości, jak się okazało).
Na szczęście przy mojej skali danych, nie czuć jakichś problemów z wydajnością.
- biorę wszystkie rekordy do IT_temp
- usuwam duble
(mam teraz listę unikalnych rekordów)
- loopem na it_temp sprawdzam, czy w bazie jest więcej niż jeden rekord dla każdego z wpisu z it_temp
- jeśli tak - oznaczam sobie taki rekord by na podstawie postawionej flagi dalej obrabiać dane (nie tylko sumować któreś wartości, jak się okazało).
Na szczęście przy mojej skali danych, nie czuć jakichś problemów z wydajnością.