Witam, może byłby ktoś chętny mi pomóc w poprawce walidacji. Tworzę ją w GGB0. Pierwszy raz piszę exitem warunki dla kontroli i od wczoraj nad tym siedzę i nie działa. Może ktoś mnie na coś naprowadzi. Najpierw wyjaśnię co walidacja ma sprawdzać.
Jest tabelka z-towa ZZokres gdzie użytkownik definiuje otwarte okresy VAT. Kolumny JG, miesiąc i rok.
Walidacja ma sprawdzać przy ZMIANIE dokumentu księgowego (np. FB02) pole BKPF-VATDATE czy nie należy do okresu zamkniętego. Jeżeli należy, to użytkownik nie może zmienić tej daty na inną.
Więc w GGB0 programuję WARUNKI, a kontrola zawsze będzie false.
Mój kod to:
FORM u200 USING b_result.
TABLES ZZokres.
CHECK bkpf-bukrs EQ '0606'.
"KONTROLA
SELECT SINGLE *
FROM ZZokres
WHERE bukrs EQ bkpf-bukrs
AND gjahr EQ bkpf-vatdate+0(4)
AND monat EQ bkpf-vatdate+4(2).
"Otwarty okres VAT
IF sy-subrc NE 0.
B_RESULT = B_TRUE.
ELSE.
B_RESULT = B_FALSE.
ENDIF.
ENDFORM.
Proszę o wyrozumiałość i ewentualną pomoc, wskazówki dziękuję.
Warunki walidacji.
-
- Posty: 8356
- Rejestracja: wt kwie 03, 2007 4:05 pm
- Has thanked: 1924 times
- Been thanked: 1478 times
- Kontakt:
Re: Warunki walidacji.
Nie jestem specjalistą od FI i walidacji. Tym nie mniej mam dwie uwagi do Twojego kodu:
- Wewnątrz definicji procedury nie wolno używać TABLES - szczegółowy opis dlaczego zamieściłem w artykule: Niebezpieczna deklaracja TABLES.
Bez wnikania w samo działanie walidacji napisałbym selekcję następująco:Kod: Zaznacz cały
FORM u200 USING b_result. CHECK bkpf-bukrs EQ '0606'. "KONTROLA SELECT SINGLE bukrs into bkpf-bukrs FROM ZZokres WHERE bukrs EQ bkpf-bukrs AND gjahr EQ bkpf-vatdate+0(4) AND monat EQ bkpf-vatdate+4(2). "Otwarty okres VAT IF sy-subrc NE 0. B_RESULT = B_TRUE. ELSE. B_RESULT = B_FALSE. ENDIF. ENDFORM.
- Jeśli walidacja nie działa i nie wiesz dlaczego, postaw break-point przedWtedy wykonanie walidacji zatrzyma się w debuggerze i będziesz mogła dokładnie sprawdzić co i jak działa.
Kod: Zaznacz cały
CHECK bkpf-bukrs EQ '0606'.
-
- Posty: 213
- Rejestracja: czw lip 10, 2014 7:53 pm
- Has thanked: 21 times
- Been thanked: 258 times
Re: Warunki walidacji.
Kilka uwag z mojej uwaga dotyczących dobrej praktyki w substytucjach i walidacjach w F:
Nie hardkoduj jednostek gospodarczych w exitach - do tego lepiej stworzyć set i ustawić warunek początkowy w walidacji, że firma musi być w secie (do utworzenia w transakcji GS01 jako 'basic set' na podstawie tabeli T001).
Do tego w kodzie od Dominika zmieniłbym jedną rzecz:
Nie robiłbym selekcji do dostarczonych danych z BKPF, czyli do BKPF-BUKRS bo tam już jest dostarczona wartość i nie powinno się jej zmieniać.
W Twoim przypadku nie robiłbym w ogóle tego poprzez walidację tylko poprzez implict enhancement w metodzie VATDATE_CHECK w BADI VATDATE_VALUES_DEFAULT_SAP. Tam na końcu metody możesz dodać check, który będzie widoczny wtedy w każdym module i, co ważniejsze, będzie w jednym miejscu, które jest z góry przeznaczone na kontrolę daty VAT a nie ukryte w walidacjach.
Nie hardkoduj jednostek gospodarczych w exitach - do tego lepiej stworzyć set i ustawić warunek początkowy w walidacji, że firma musi być w secie (do utworzenia w transakcji GS01 jako 'basic set' na podstawie tabeli T001).
Do tego w kodzie od Dominika zmieniłbym jedną rzecz:
Kod: Zaznacz cały
FORM u200 USING b_result.
"KONTROLA
SELECT SINGLE bukrs into @Data(lv_bukrs)
FROM ZZokres
WHERE bukrs EQ @bkpf-bukrs
AND gjahr EQ @bkpf-vatdate+0(4)
AND monat EQ @bkpf-vatdate+4(2).
"Otwarty okres VAT
IF sy-subrc NE 0.
B_RESULT = B_TRUE.
ELSE.
B_RESULT = B_FALSE.
ENDIF.
ENDFORM.
W Twoim przypadku nie robiłbym w ogóle tego poprzez walidację tylko poprzez implict enhancement w metodzie VATDATE_CHECK w BADI VATDATE_VALUES_DEFAULT_SAP. Tam na końcu metody możesz dodać check, który będzie widoczny wtedy w każdym module i, co ważniejsze, będzie w jednym miejscu, które jest z góry przeznaczone na kontrolę daty VAT a nie ukryte w walidacjach.
Marek Turczyński
-
- Posty: 561
- Rejestracja: śr kwie 04, 2007 4:32 pm
- Lokalizacja: Poznań
- Has thanked: 9 times
- Been thanked: 165 times
- Kontakt:
Re: Warunki walidacji.
Jeżeli już stosujemy nową składnię ABAPa to tego selecta można napisać jeszcze tak:
select single @abap_true
into @data(lv_exists)
from zzokres
where ...
if lv_exists = abap_true.
...
else.
...
endif.
w ten sposób w ogóle unikamy transferu danych z serwera BD do serwera aplikacyjnego - przecież chodzi nam tylko o sprawdzenie czy dana krotka istnieje w tabeli.
select single @abap_true
into @data(lv_exists)
from zzokres
where ...
if lv_exists = abap_true.
...
else.
...
endif.
w ten sposób w ogóle unikamy transferu danych z serwera BD do serwera aplikacyjnego - przecież chodzi nam tylko o sprawdzenie czy dana krotka istnieje w tabeli.
Pozdrawiam,
Jacek Witczak
http://novertio.pl
Jacek Witczak
http://novertio.pl
-
- Posty: 213
- Rejestracja: czw lip 10, 2014 7:53 pm
- Has thanked: 21 times
- Been thanked: 258 times
Re: Warunki walidacji.
Tego sposobu nie znałem, że można @abap_true używać. Zapisany - dzięki, mogę uprościć mój kod o kolejne niepotrzebne dane.
Pozdrawiam,
Marek
Pozdrawiam,
Marek
Marek Turczyński
-
- Posty: 8356
- Rejestracja: wt kwie 03, 2007 4:05 pm
- Has thanked: 1924 times
- Been thanked: 1478 times
- Kontakt:
Re: Warunki walidacji.
Samej procedury-rozszerzenia walidacji nie możesz wprost debugować.
Musisz normalnie księgować dokument i zatrzymać przy pomoc break-point przebieg wykonania w Twojej procedurze walidację.
Musisz normalnie księgować dokument i zatrzymać przy pomoc break-point przebieg wykonania w Twojej procedurze walidację.