Warunki walidacji.

Jeśli programujesz, administrujesz, integrujesz i masz wątpliwość lub obawę, to właśnie najlepsze miejsce dla Ciebie. Pisz śmiało...
ODPOWIEDZ
anetajur
Posty: 234
Rejestracja: pn lut 05, 2018 1:36 pm
Has thanked: 65 times
Been thanked: 21 times

Warunki walidacji.

Post autor: anetajur »

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ę.
dominik.tylczynski
Posty: 8326
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1915 times
Been thanked: 1474 times
Kontakt:

Re: Warunki walidacji.

Post autor: dominik.tylczynski »

Nie jestem specjalistą od FI i walidacji. Tym nie mniej mam dwie uwagi do Twojego kodu:
  1. 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.
  2. Jeśli walidacja nie działa i nie wiesz dlaczego, postaw break-point przed

    Kod: Zaznacz cały

    CHECK bkpf-bukrs EQ '0606'.
    Wtedy wykonanie walidacji zatrzyma się w debuggerze i będziesz mogła dokładnie sprawdzić co i jak działa.
anetajur
Posty: 234
Rejestracja: pn lut 05, 2018 1:36 pm
Has thanked: 65 times
Been thanked: 21 times

Re: Warunki walidacji.

Post autor: anetajur »

Dziękuję za pomoc. Zaraz wykorzystam porady 😊😊😊
marek.turczynski
Posty: 213
Rejestracja: czw lip 10, 2014 7:53 pm
Has thanked: 21 times
Been thanked: 258 times

Re: Warunki walidacji.

Post autor: marek.turczynski »

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:

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.
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.
Marek Turczyński
yacol
Posty: 561
Rejestracja: śr kwie 04, 2007 4:32 pm
Lokalizacja: Poznań
Has thanked: 9 times
Been thanked: 165 times
Kontakt:

Re: Warunki walidacji.

Post autor: yacol »

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.
Pozdrawiam,

Jacek Witczak
http://novertio.pl
marek.turczynski
Posty: 213
Rejestracja: czw lip 10, 2014 7:53 pm
Has thanked: 21 times
Been thanked: 258 times

Re: Warunki walidacji.

Post autor: marek.turczynski »

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
Marek Turczyński
anetajur
Posty: 234
Rejestracja: pn lut 05, 2018 1:36 pm
Has thanked: 65 times
Been thanked: 21 times

Re: Warunki walidacji.

Post autor: anetajur »

Przy próbie debagowania mam taki komunikat. Wie ktoś o co chodzi?
Załączniki
Przechwytywanie.PNG
Przechwytywanie.PNG (2.4 KiB) Przejrzano 2299 razy
dominik.tylczynski
Posty: 8326
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1915 times
Been thanked: 1474 times
Kontakt:

Re: Warunki walidacji.

Post autor: dominik.tylczynski »

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ę.
anetajur
Posty: 234
Rejestracja: pn lut 05, 2018 1:36 pm
Has thanked: 65 times
Been thanked: 21 times

Re: Warunki walidacji.

Post autor: anetajur »

Rozumiem. Czyli ustawiam break aktywuje walidacja i przechodzę do księgowania dokumentu. Oki. Dziekuje ;)
ODPOWIEDZ