Mam w tabeli tb_dni, listę w postaci:
pernr | rok | data
12300 | 2025 | 20250108
12300 | 2025 | 20250111
12300 | 2025 | 20250122
45600 | 2025 | 20250123
45600 | 2025 | 20250130
Chciałbym nieco ułatwić Użytkownikom życie i dać im możliwość wyrzucenia tego do xls`a, ale w nieco bardziej czytelnej formie.
Wymyśliłem sobie, by kolejne daty (dni wybranego roku) były kolejnymi kolumnami xls`a.
Trzy pierwsze kolumny itab_kalendarz to pernr vorna nachn, później 0101 0102 0103 0104 itd, czyli
pernr | vorna | nachn | 0101 | 0102 | 0103 | 0104 itd
Nie mogę wpaść na pomysł, jak to zrealizować, by nie pytać 366 razy, czy dla każdego pernr istnieje jakaś data w tb_dni by postawić "x" w odpowiedniej kolumnie określającej jakiś dzień.
Zastanawiałem się nad wykorzystaniem sprawdzenia, który mamy dzień roku, ale lata przestępne zdemolowały mój pomysł.
Czy mogę prosić o jakieś sugestie?
Utworzenie "kalendarza" w wyjściowym xls
-
- Posty: 8597
- Rejestracja: wt kwie 03, 2007 4:05 pm
- Has thanked: 2042 times
- Been thanked: 1537 times
Re: Utworzenie "kalendarza" w wyjściowym xls
Zakładam, że kolumny 0101 0102 0103 0104 należy interpretować jako pierwszy stycznia, drugi stycznia itd.
Wytnij ostatnie 4 znaki z tb_dni-data i dostaniesz miesiąc oraz dzień. tb_dni-data ma format YYYYMMDD. Zatem tb_dni-data+4(4) da MMDD. Stąd już łatwo wstawisz X do odpowiedniej kolumny 0101 0102 0103 0104
Wytnij ostatnie 4 znaki z tb_dni-data i dostaniesz miesiąc oraz dzień. tb_dni-data ma format YYYYMMDD. Zatem tb_dni-data+4(4) da MMDD. Stąd już łatwo wstawisz X do odpowiedniej kolumny 0101 0102 0103 0104
Re: Utworzenie "kalendarza" w wyjściowym xls
Teoretycznie tak, ale trafiłem na kolejny potykacz:
pod lv_dzien biorę kolejne dni (na ten moment ręcznie dwa pierwsze dni stycznia).
jak widać, przypisuję sobie '0101' pod fs`a żeby odnieść się do odpowiedniego pola poprzez zmienną ( <fs_field> = 'X'.)
Do tego momentu wszystko śmiga, mógłbym wyrzucić na zewnątrz zapytanie i aktualizację zawartości kolejnych pól, ale gdy próbuję przypisać nową wartość pod fs`a, robi się problem:
dostaję błąd: <fs_field> jest już zadeklarowane, plus wskazanie linii z assignem dla drugiego dnia stycznia.
Próbowałem zwolnić przypisanie, testując :
clear <fs_field>.
unassign <fs_field>.
...ale nie zwolniło to przypisania fs`a - błąd nadal występuje.
pod lv_dzien biorę kolejne dni (na ten moment ręcznie dwa pierwsze dni stycznia).
jak widać, przypisuję sobie '0101' pod fs`a żeby odnieść się do odpowiedniego pola poprzez zmienną ( <fs_field> = 'X'.)
Kod: Zaznacz cały
lv_dzien = '0101'.
ASSIGN COMPONENT lv_dzien OF STRUCTURE wa_plany TO FIELD-SYMBOL(<fs_field>).
CONCATENATE lv_rok lv_dzien INTO lv_data_spr.
SELECT COUNT( * ) INTO lv_ile FROM zhcm_lp_leave WHERE
begda = lv_data_spr AND
pernr = wa_plany-pernr AND
yearplan = lv_rok AND
version = lv_version.
IF lv_ile = 1.
<fs_field> = 'X'.
ENDIF.
CLEAR lv_data_spr.
CLEAR lv_ile.
Kod: Zaznacz cały
lv_dzien = '0102'.
ASSIGN COMPONENT lv_dzien OF STRUCTURE wa_plany TO FIELD-SYMBOL(<fs_field>).
CONCATENATE lv_rok lv_dzien INTO lv_data_spr.
SELECT COUNT( * ) INTO lv_ile FROM zhcm_lp_leave WHERE
begda = lv_data_spr AND
pernr = wa_plany-pernr AND
yearplan = lv_rok AND
version = lv_version.
IF lv_ile = 1.
<fs_field> = 'X'.
ENDIF.
CLEAR lv_data_spr.
CLEAR lv_ile.
Próbowałem zwolnić przypisanie, testując :
clear <fs_field>.
unassign <fs_field>.
...ale nie zwolniło to przypisania fs`a - błąd nadal występuje.
-
- Posty: 8597
- Rejestracja: wt kwie 03, 2007 4:05 pm
- Has thanked: 2042 times
- Been thanked: 1537 times
Re: Utworzenie "kalendarza" w wyjściowym xls
Używasz DATA, Inline Declaration for Variables
To jest odpowiednik deklaracji:
Zatem nie możesz mieć dwa razy w kodzie To tak jakbyś ten sam field-symbol zadeklarował dwukrotnie. Jest to błąd składni.
Możesz zrobić tak:
albo tak:
albo tak:
Moim zdaniem opcja pierwsza jest najbardziej elegancka.
Ponadto notacja węgierska jest passe. Usuń prefix fs_, bo nic on nie wnosi, skoro field-symbol jest zawsze między < i >.
Kod: Zaznacz cały
ASSIGN COMPONENT lv_dzien OF STRUCTURE wa_plany TO FIELD-SYMBOL(<fs_field>).
To jest odpowiednik deklaracji:
Kod: Zaznacz cały
FIELD-SYMBOLS: <fs_field>.
Zatem nie możesz mieć dwa razy w kodzie
Kod: Zaznacz cały
ASSIGN COMPONENT lv_dzien OF STRUCTURE wa_plany TO FIELD-SYMBOL(<fs_field>).
Możesz zrobić tak:
Kod: Zaznacz cały
FIELD-SYMBOLS: <fs_field>.
lv_dzien = '0101'.
ASSIGN COMPONENT lv_dzien OF STRUCTURE wa_plany TO <fs_field>.
...
lv_dzien = '0102'.
ASSIGN COMPONENT lv_dzien OF STRUCTURE wa_plany TO <fs_field>.
albo tak:
Kod: Zaznacz cały
lv_dzien = '0101'.
ASSIGN COMPONENT lv_dzien OF STRUCTURE wa_plany TO FIELD-SYMBOL(<fs_field>).
...
lv_dzien = '0102'.
ASSIGN COMPONENT lv_dzien OF STRUCTURE wa_plany TO <fs_field>.
albo tak:
Kod: Zaznacz cały
lv_dzien = '0101'.
ASSIGN COMPONENT lv_dzien OF STRUCTURE wa_plany TO FIELD-SYMBOL(<fs_field1>).
...
lv_dzien = '0102'.
ASSIGN COMPONENT lv_dzien OF STRUCTURE wa_plany TO FIELD-SYMBOL(<fs_field2>).
Moim zdaniem opcja pierwsza jest najbardziej elegancka.
Ponadto notacja węgierska jest passe. Usuń prefix fs_, bo nic on nie wnosi, skoro field-symbol jest zawsze między < i >.
-
- Posty: 568
- Rejestracja: śr kwie 04, 2007 4:32 pm
- Lokalizacja: Poznań
- Has thanked: 10 times
- Been thanked: 174 times
Re: Utworzenie "kalendarza" w wyjściowym xls
Rzuć też okiem tutaj: https://github.com/SAP/styleguides/blob ... eanABAP.md
zbiór informacji jak pisać czysty kod w nowoczesnym ABAPie
zbiór informacji jak pisać czysty kod w nowoczesnym ABAPie

Pozdrawiam,
Jacek Witczak
http://novertio.pl
Jacek Witczak
http://novertio.pl