Utworzenie "kalendarza" w wyjściowym xls

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

Utworzenie "kalendarza" w wyjściowym xls

Post autor: emil »

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?
dominik.tylczynski
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

Post autor: dominik.tylczynski »

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
emil
Posty: 142
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 29 times
Been thanked: 44 times

Re: Utworzenie "kalendarza" w wyjściowym xls

Post autor: emil »

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'.)

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.
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:

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.
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.
dominik.tylczynski
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

Post autor: dominik.tylczynski »

Używasz DATA, Inline Declaration for Variables

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>).
To tak jakbyś ten sam field-symbol zadeklarował dwukrotnie. Jest to błąd składni.


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 >.
yacol
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

Post autor: yacol »

Rzuć też okiem tutaj: https://github.com/SAP/styleguides/blob ... eanABAP.md
zbiór informacji jak pisać czysty kod w nowoczesnym ABAPie :)
Pozdrawiam,

Jacek Witczak
http://novertio.pl