Przechwycenie w PAI wartości listboxa na ekranie 0100

Jeśli programujesz, administrujesz, integrujesz i masz wątpliwość lub obawę, to właśnie najlepsze miejsce dla Ciebie. Pisz śmiało...
ODPOWIEDZ
emil
Posty: 133
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 29 times
Been thanked: 42 times

Przechwycenie w PAI wartości listboxa na ekranie 0100

Post autor: emil »

Sprawa ma się następująco:

Utworzyłem sobie ekran (0100) na którym mam m.in. listboxa zasilanego zawartością jednej z tabel. Generowany był przez "okno słownika/pól programu", a dodatkowo w PBO zapełniam listę wartościami:

Kod: Zaznacz cały

   TYPE-POOLS : VRM.
  DATA: ld_field    TYPE VRM_ID ,
        it_listbox  TYPE VRM_VALUES,
        wa_listbox  LIKE LINE OF it_listbox.
  DATA: it_ZKC26_T_WN_STAN type STANDARD TABLE OF ZKC26_T_WN_STAN,
        wa_ZKC26_T_WN_STAN type ZKC26_T_WN_STAN.

  SELECT * from ZKC26_T_WN_STAN
    into table it_ZKC26_T_WN_STAN.

  loop at it_ZKC26_T_WN_STAN into wa_ZKC26_T_WN_STAN.
    wa_listbox-key = wa_ZKC26_T_WN_STAN-STATUS_ID.
    wa_listbox-text = wa_ZKC26_T_WN_STAN-STATUS_NAME.
    append wa_listbox to it_listbox.
  endloop.

  ld_field = 'ZKC26_T_WN_STAN-STATUS_NAME'.

  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id     = ld_field
      values = it_listbox.

Do tego miejsca wszystko działa dobrze.
Na ekranie jest także przycisk, który w PAI uruchamia działanie performa USTAW:

Kod: Zaznacz cały

MODULE user_command_0100 INPUT.
  DATA:
    lv_ok_code LIKE sy-ucomm.

  MOVE ok_code TO lv_ok_code.

  CLEAR ok_code.

  CASE lv_ok_code.
    WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
      LEAVE PROGRAM.
    WHEN 'CONT' OR 'GET'.
      PERFORM get_data.
    WHEN 'USTAW'.
      perform ustaw_status.
    WHEN 'HISTORIA_WNIOSKU'.
      PERFORM historia_wniosku.
  ENDCASE.
ENDMODULE.  
Perform siedzi sobie w includzie z performami i... nie potrafię w nim wyłapać wartości, którą zwraca mi ekran z pola wyboru.

Wg wszelkich porad w necie, teoretycznie powinienem dostać się do wybranej wartości przez odwołanie się w ld_field, ale niestety ten zwraca mi nazwę elementu który został przypisany, czyli ld_field = 'ZKC26_T_WN_STAN-STATUS_NAME'.

Najwyrwaźniej gdzieś w założeniach musiałem zrobić błąd, co jest dla mnie o tyle dziwne, że przy tej samej konstrukcji nie mam problemów z dobraniem się do wartości z innych pól wypełnianych na ekranie 0100, np z całkiem innego programu form wywoływany performem w PAI (patrz-> im_id):

Kod: Zaznacz cały

*    "dorzucamy notatkę do do logu, wykorzystując FM
*    CALL FUNCTION 'ZY_KC26_NOTE_ADD'
*      EXPORTING
*        im_id        = zkc26_t_wn_head-nr_wn_id
*        im_zdarzenie = 'AKCEPTACJA WNIOSKU'
*        im_notatka   = lv_uzasadnienie
*        im_wew_it    = '0'.
Mogę prosić o jakieś sugestie/rady jak dobrać się do danych?
wojtas7
Posty: 1058
Rejestracja: pt mar 14, 2008 12:51 pm
Has thanked: 71 times
Been thanked: 313 times

Re: Przechwycenie w PAI wartości listboxa na ekranie 0100

Post autor: wojtas7 »

A jak nazywa się Twoje pole które dałeś na screenie? Do tego pola musisz się odwołać a nie do tej zmiennej która po prostu ma w sobie nazwę pola z ekranu i się nie będzie zmieniać.

Zrób zmienną globalną w top include programu czy grupy funkcyjnej (nie wiem gdzie robisz ten ekran), nazwij ZKC26_T_WN_STAN-STATUS_NAME czy jak tam chcesz, i w niej będziesz mieć wartość wyboru.

Tak mi się wydaje 💚
emil
Posty: 133
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 29 times
Been thanked: 42 times

Re: Przechwycenie w PAI wartości listboxa na ekranie 0100

Post autor: emil »

wojtas7 pisze: pt lut 21, 2020 7:58 am A jak nazywa się Twoje pole które dałeś na screenie? Do tego pola musisz się odwołać a nie do tej zmiennej która po prostu ma w sobie nazwę pola z ekranu i się nie będzie zmieniać.

Zrób zmienną globalną w top include programu czy grupy funkcyjnej (nie wiem gdzie robisz ten ekran), nazwij ZKC26_T_WN_STAN-STATUS_NAME czy jak tam chcesz, i w niej będziesz mieć wartość wyboru.
To też nie tędy droga.
Zrobiłem tak, jak sugerowałeś, zmienną w topie. SAP przestał krzyczeć o niedostępności elementu, ale nie przyjmuje pod zmienną żadnej wartości.
Tym oto sposobem powróciłem, by marudzić.

Kolejno, od początku, jak wygląda sytuacja:
1.png
1.png (69.8 KiB) Przejrzano 2283 razy
1 to moje problematyczne pole. Zasilam sobie je wartościami z tabeli bazodanowej.
2 i 3 to pola z których jestem w stanie bez problemu odczytać wartości.
2 też jest słownikowa - dane ssane z tabeli bazodanowej.

Oczywiście 1 jest na liście elementów ekranu:
2.png
2.png (24.74 KiB) Przejrzano 2283 razy
W PAI bez żadnych wodotrysków obsługuję sobie zdarzenie ustaw...

Kod: Zaznacz cały

MODULE user_command_0100 INPUT.
  DATA:
    lv_ok_code LIKE sy-ucomm.

  MOVE ok_code TO lv_ok_code.
  CLEAR ok_code.

  CASE lv_ok_code.
    WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
      LEAVE PROGRAM.
    WHEN 'CONT' OR 'GET'.
      PERFORM get_data.
    WHEN 'USTAW'.
      PERFORM ustaw_status.
    WHEN 'HISTORIA_WNIOSKU'.
      PERFORM historia_wniosku.
  ENDCASE.
ENDMODULE.                 " USER_COMMAND_0100  INPUT
który uruchamia FORMa:

FORM ustaw_status.
MESSAGE zkc26_t_wn_stan-status_name type 'I' display like 'E'.
MESSAGE 'ustawianie statusu' TYPE 'I'.


IF zkc26_t_wn_head-nr_wn_biz IS INITIAL.
MESSAGE 'Nie podano numeru wniosku.' TYPE 'I' DISPLAY LIKE 'E'.

ELSEIF lv_uzasadnienie IS INITIAL.
MESSAGE 'Nie podano numeru uzasadnienia.' TYPE 'I' DISPLAY LIKE 'E'.


ELSEIF zkc26_t_wn_stan-status_name IS INITIAL.
MESSAGE 'Nie podano nowego statusu.' TYPE 'I' DISPLAY LIKE 'E'.


ELSE.
"ustawienie nowego stanu - jakieś tam zapytania ble ble ble
ENDIF.
ENDFORM.

I teraz w tym oto formie (ustaw_status) dzieje się największa magia:
pogubione linie, dotyczące zkc26_t_wn_stan-status_name powodują błąd.
3.png
3.png (11.97 KiB) Przejrzano 2283 razy
Co ciekawe, podkreślone (zkc26_t_wn_head-nr_wn_biz, lv_uzasadnienie ), które korzystają z innych elementów ekranu, działają poprawnie.

Nie potrafię namierzyć, skąd problem z zkc26_t_wn_stan-status_name? o.0
wojtas7
Posty: 1058
Rejestracja: pt mar 14, 2008 12:51 pm
Has thanked: 71 times
Been thanked: 313 times

Re: Przechwycenie w PAI wartości listboxa na ekranie 0100

Post autor: wojtas7 »

No to już nie ma błędu na ekranie ale jest problem z widocznością tej zmiennej, którą zrobiłeś w TOP. Pytanie czy ekran masz w programie, grupie funkcyjnej? Możesz też przekazać tą zmienną do Forma jako parametr.
emil
Posty: 133
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 29 times
Been thanked: 42 times

Re: Przechwycenie w PAI wartości listboxa na ekranie 0100

Post autor: emil »

No to już nie ma błędu na ekranie ale jest problem z widocznością tej zmiennej, którą zrobiłeś w TOP. Pytanie czy ekran masz w programie, grupie funkcyjnej? Możesz też przekazać tą zmienną do Forma jako parametr.
Przedstawiona wyżej sytuacja ma miejsce bez "dodatkowej" zmiennej w topie (tej, którą sugerowałeś). Skupiłem się na pokazaniu sytuacji, w której dane z zkc26_t_wn_head-nr_wn_biz i lv_uzasadnienie bez problemu są widoczne w FORMie, natomiast nawet nie tyle nie ma informacji z zkc26_t_wn_stan-status_name, to takie pole wg SAP nie istnieje.

By była jasność, "działające" pola nie są nigdzie dodatkowo deklarowane, po zadeklarowaniu i ustawieniu ich na ekranie, od razu wartości z nich są dostępne w ramach całego programu.
dominik.tylczynski
Posty: 8326
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1915 times
Been thanked: 1474 times
Kontakt:

Re: Przechwycenie w PAI wartości listboxa na ekranie 0100

Post autor: dominik.tylczynski »

emil pisze: śr lut 26, 2020 7:54 am By była jasność, "działające" pola nie są nigdzie dodatkowo deklarowane, po zadeklarowaniu i ustawieniu ich na ekranie, od razu wartości z nich są dostępne w ramach całego programu.
Ekran komunikuje się z programem poprzez zmienne globalne. Zatem każde pole wej/wyj, które zdefiniowałeś na ekranie musi referować do zmiennej globalnej w programie.
emil
Posty: 133
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 29 times
Been thanked: 42 times

Re: Przechwycenie w PAI wartości listboxa na ekranie 0100

Post autor: emil »

To była bardzo długa i bardzo trudna lekcja.
Problem wynikał z tego, że popierdzilił mi się typ danych z nazwą pola i nazwą elementu tworzoną automatycznie przez malarza ekranów.
Tworząc element na ekranie (zasilany tabelą z bazy), zostawiałem jego "domyślną" nazwę, która tak naprawdę była postrzegana przez SAP jako odwołanie się do jakiegoś pola tabeli(?). Ogólnie jak teraz patrzę, to całkiem bezsensownie to wyglądało po stronie mojego kodu. Chwilami wydawało mi się, że deklarowałem zmienne globalne odnoszące się do pól ekranu, ale robiłem to w taki głupi sposób, że idę zaraz spłukać oczy w sedesie by pozbyć się z pamięci obrazu tego, co uwaliłem.

Ot, błędy młodości.
Dziękuję wszystkim za pomoc.
wojtas7
Posty: 1058
Rejestracja: pt mar 14, 2008 12:51 pm
Has thanked: 71 times
Been thanked: 313 times

Re: Przechwycenie w PAI wartości listboxa na ekranie 0100

Post autor: wojtas7 »

Jednak szybciej idzie nauka jak masz obok chociaż na chwilę kogoś z doświadczeniem ;-) No ale nie każdy ma ten luksus.
RKISIEL
Posty: 583
Rejestracja: pn lut 14, 2011 9:10 pm
Has thanked: 421 times
Been thanked: 263 times

Re: Przechwycenie w PAI wartości listboxa na ekranie 0100

Post autor: RKISIEL »

Panowie,
Przy pierwszym spotkaniu stawiam Emilowi kolejkę i Was też oczywiście zapraszam :D
Rafał
Rafał Kisiel
emil
Posty: 133
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 29 times
Been thanked: 42 times

Re: Przechwycenie w PAI wartości listboxa na ekranie 0100

Post autor: emil »

RKISIEL pisze: śr kwie 01, 2020 11:01 pm Panowie,
Przy pierwszym spotkaniu stawiam Emilowi kolejkę i Was też oczywiście zapraszam :D
Rafał
...ale za co? :D
RKISIEL
Posty: 583
Rejestracja: pn lut 14, 2011 9:10 pm
Has thanked: 421 times
Been thanked: 263 times

Re: Przechwycenie w PAI wartości listboxa na ekranie 0100

Post autor: RKISIEL »

emil pisze: czw kwie 02, 2020 5:57 am
RKISIEL pisze: śr kwie 01, 2020 11:01 pm Panowie,
Przy pierwszym spotkaniu stawiam Emilowi kolejkę i Was też oczywiście zapraszam :D
Rafał
...ale za co? :D
Za samokształcenie/szukanie/rozwiązywanie...
Tego próbowałem nauczać a teraz mogę postawić rozumnym kolejkę :D
Mój nauczyciel chwalił mnie za umiejętność użycia wędki a nie za zjedzenie ryb...
Rafał
Rafał Kisiel
ODPOWIEDZ