TABLE CONTROL, usunięcie wierszy

Jeśli programujesz, administrujesz, integrujesz i masz wątpliwość lub obawę, to właśnie najlepsze miejsce dla Ciebie. Pisz śmiało...
wojtas7
Posty: 1071
Rejestracja: pt mar 14, 2008 12:51 pm
Has thanked: 72 times
Been thanked: 318 times

TABLE CONTROL, usunięcie wierszy

Post autor: wojtas7 »

Mam taką zagwozdkę, modyfikuję standard, gdzie na ekranie jest Table Control, jest wypełniana składnią

Kod: Zaznacz cały

LOOP AT SCROLL_TAB WITH CONTROL TCTRL_0100 CURSOR SCROLL-CURSOR.
(grupa funkcyjna COFU ekran 100).

i potrzebuję doprogramować prosty filtr, tak żeby w PBO dodać w trybie modyfikacji kod i usunąć niektóre wiersze z tej table control.
Na ekranie nie ma tabeli wewnętrznej jako takiej z wierszami, jest tylko struktura AFFD używana do przekazania na ekran.

Czy da się to w ogóle zrobić?
dominik.tylczynski
Posty: 8367
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1939 times
Been thanked: 1479 times

Re: TABLE CONTROL, usunięcie wierszy

Post autor: dominik.tylczynski »

Ciekawe wyzwanie...

Przyznam, że ten ekran jest zaimplementowany mocno niestandardowo. Pętla:

Kod: Zaznacz cały

LOOP AT SCROLL_TAB WITH CONTROL TCTRL_0100 CURSOR SCROLL-CURSOR.
działa na dummy tablicy SCROLL_TAB, która nie zawiera żadnych danych:

Kod: Zaznacz cały

DATA: BEGIN OF scroll_tab OCCURS 100,
        dummy TYPE c,
      END OF scroll_tab.
Same dane o PRT są natomiast pobierane przez moduł PBO LST_ENTRY_SHOW i umieszczane w strukturze AFFHD. Zatem po wykonaniu tego modułu, struktura AFFHD zawiera dane o bieżącym rekordzie PRT. Mógłbyś pewnie próbować jakoś przeskoczyć rekordy, których nie chcesz wyświetlać, ale jest bardzo duża szansa, że biorąc pod uwagę sposób implementacji ekranu przewijanie table control nie będzie poprawne.

Może zamiast tego wstaw na końcu pętli:

Kod: Zaznacz cały

  LOOP AT SCROLL_TAB WITH CONTROL TCTRL_0100 CURSOR SCROLL-CURSOR.
*   Dynamische Bestimmung der Anzahl der Loop-Zeilen
    MODULE LOOP_SCROLLING.
*   FHM-Zeile ausgeben
    MODULE LST_ENTRY_SHOW.
*   Änderungskennzeichen setzen
    module set_icon_ocm.
*   Index auf aktuellen Dialogtabelleneintrag inkrementieren
    MODULE LOOP_INDEX_ACT_INCR.
*   Feldauswahlsteuerung
    MODULE LST_FIELD_MODIFY.
  ENDLOOP.
własny kod, który ukryje pola z rekordu PRT, którego nie chcesz wyświetlać. Ten kod najwygodniej będzie wstawić na końcu modułu PBO LST_FIELD_MODIFY.
wojtas7
Posty: 1071
Rejestracja: pt mar 14, 2008 12:51 pm
Has thanked: 72 times
Been thanked: 318 times

Re: TABLE CONTROL, usunięcie wierszy

Post autor: wojtas7 »

Dzięki!

Zastanawiam się w jaki sposób usunąć w ogóle wiersz z wyświetlania. Teoretycznie mógłbym np. dać jakieś znaki "----------" i dla użytkownika to by było już OK, ale bardziej elegancko by było całkiem usunąć wpis. Ale kod w pętli raczej tego nie uzyska... Merytorycznie - chodzi o usunięcie z widoku wpisów PRT ze statusem "Usunięte".

Usunięcie wpisu pewnie by było też możliwe po prostu przez wykasowanie struktury AFFD ale wtedy będą dziury na liście..
dominik.tylczynski
Posty: 8367
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1939 times
Been thanked: 1479 times

Re: TABLE CONTROL, usunięcie wierszy

Post autor: dominik.tylczynski »

Rozumiem mniej więcej co chcesz zrobić, ale nie uzyskasz tego przez zmianę logiki ekranu. Tak jak napisałeś - wykasowanie danych ze struktury AFFD sprawi tylko, że na liście będziesz mieć puste rekordy.

Dane o PRT są wstawiane na ekran, do bieżącego rekordu table control modułem PBO LST_ENTRY_SHOW, najpewniej procedurą read_affhd_with_index:

Kod: Zaznacz cały

      WHEN const-aktyp_ver.
*       Step-Loop verlassen ?
        IF rc27x-entries   = 0               OR
           rc27x-index_act > rc27x-index_end.
          EXIT FROM STEP-LOOP.
        ENDIF.
*       Satz aus Belegtabelle lesen
        PERFORM read_affhd_with_index
                USING rc27x-index_act
                      rclst
                      affhd.
Z kolei ta procedura wywołuje funkcję CF_BT_CO_FHM_READ_WITH_INDEX:

Kod: Zaznacz cały

* FHM AFFHD-Struktur füllen
  CALL FUNCTION 'CF_BT_CO_FHM_READ_WITH_INDEX'
       EXPORTING
            tabix_imp = rclst_out-index_plfh
       IMPORTING
            affhd_exp = affhd_out
       EXCEPTIONS
            fhm_master_not_found = 01.
a w funkcji odczytanie tablicy wewnętrznej AUFTFH:

Kod: Zaznacz cały

* Belegtabelleneintrag zum Index lesen
  READ TABLE AUFTFH INDEX TABIX_IMP.
Musiałbyś się wciąć w miejsce gdzie ta tablica jest napełniana i wywalić z niej niepotrzebne PRT. To jest do zrobienia i zapewne zadziała, ale wymaga nieco zabawy. Może to mieć też niespodziewane skutki uboczne.

Pytanie czy jest sens robić taką zmianę, która jak rozumiem jest raczej kosmetyczna - chodzi o wygodę użytkowników. Może zamiast tego warto pomyśleć dlaczego w zleceniach produkcyjnych są PRT ze statusem "usunięte" i rozwiązać problem u źródła?
wojtas7
Posty: 1071
Rejestracja: pt mar 14, 2008 12:51 pm
Has thanked: 72 times
Been thanked: 318 times

Re: TABLE CONTROL, usunięcie wierszy

Post autor: wojtas7 »

Dzięki za pomoc jeszcze raz. Potwierdzasz zagmatwanie tego kodu :-) Najtrudniejsze tu jest że ilość wierszy jest obliczana osobno i potem select jest robiony wiersz po wierszu więc uzyskanie ładnej listy będzie nietrywialne.

A biznesowo - w systemie zewnętrznym sterują sobie środkami pomocniczymi produkcji i idocami będą przysyłać usunięcie PRT lub dodanie nowych do konkretnych zleceń produkcyjnych. Zmiana standardu w moim wykonaniu polega na dodaniu kolumny z opisem statusu danego PRT (to akurat już jest nawet napełniane w AFFD) więc wystarczyło dodać kolumnę i widać status np LÖKZ czyli znacznik usuwania. To rozumiem że jest jak najbardziej OK że PRT nie jest usuwany, ale ma nadawany status usunięcia.
dominik.tylczynski
Posty: 8367
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1939 times
Been thanked: 1479 times

Re: TABLE CONTROL, usunięcie wierszy

Post autor: dominik.tylczynski »

Szukałem jeszcze miejsca, gdzie PRT są odczytywane dla zlecenia produkcyjnego. Chciałem znaleźć funkcję czy procedurę, gdzie można by dodać odfiltrowanie PRT oznaczonych do usunięcia. Ten kod jest mocno złożony i jestem przekonany, że jeśli nawet znajdzie się miejsce gdzie ten odczyt jest robiony to będzie trudno ograniczyć tę zmianę wyłącznie do wyświetlania zlecenia produkcyjnego, najpewniej będzie ona miała skutki uboczne w innych miejscach w systemie.
Odradzam implementację tej zmiany, no chyba, że to naprawdę krytyczna.