Jak przetestować update przed jego wykonaniem?

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

Jak przetestować update przed jego wykonaniem?

Post autor: emil »

Mam konstrukcję w stylu:

Kod: Zaznacz cały

loop at it_alv into wa_alv

          UPDATE db_table SET
          endda = wa_alv-endda
          aedtm = sy-datum
          uname = sy-uname
          seqnr = wa_alv-seqnr
          WHERE
          zid = wa_alv-zid AND
          pernr = wa_alv-pernr AND
          zakres = wa_alv-zakres.

          IF sy-subrc NE 0.
            CLEAR lv_alert.
            CONCATENATE 'Wystąpił błąd w zapisie danych' wa_alv-pernr wa_alv-zakres ' w id upr ' wa_alv-zid  INTO lv_alert SEPARATED BY space.
            MESSAGE : lv_alert TYPE 'E'.
          ENDIF.
          
endloop.
...czyli lecę loopem po itabie i na podstawie danych z itaba aktualizuję sobie rekord w bazie.
Przy każdym przebiegu sprawdzam, czy zaktualizował mi się rekord, jeśli nie - zatrzymuję się wyświetlając error.

Jakiego rozwiązania użyć, bądź jaką konstrukcję zbudować, by przed wykonaniem docelowego update, wykonać... "testowy przebieg" i sprawdzić, czy da się zaktualizować db_table na podstawie wszystkich rekordów z it_alv?
ZETKA
Posty: 61
Rejestracja: czw lis 04, 2010 10:49 pm
Has thanked: 1 time
Been thanked: 53 times

Re: Jak przetestować update przed jego wykonaniem?

Post autor: ZETKA »

Jeżeli dobrze pamiętam, to MESSAGE wykonuje niejawny COMMIT więc tak jak w przykładzie być nie może.
Należałoby zliczyć sy-subrc = 0, wykonać ROLLBACK i dopiero wtedy wyświetlić komunikat.

Zalecaną konstrukcją jest oczywiście UPDATE... FROM TABLE..., wtedy można się posłużyć zmienną sy-dbcnt
Pozdrawiam,
Krzysiek
emil
Posty: 66
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 13 times
Been thanked: 22 times

Re: Jak przetestować update przed jego wykonaniem?

Post autor: emil »

ZETKA pisze: śr cze 15, 2022 11:16 am Zalecaną konstrukcją jest oczywiście UPDATE... FROM TABLE..., wtedy można się posłużyć zmienną sy-dbcnt
Coś na tej zasadzie (patrz->pogrubione)?

REPORT: z_test_001.

DATA: it_tab TYPE TABLE OF ztest.
DATA: wa_tab TYPE ztest.
DATA: it_new TYPE TABLE OF ztest.
DATA: wa_new TYPE ztest.

DATA: lv_count TYPE i.
DATA: lv_dbcnt TYPE sy-dbcnt.

SELECT * FROM ztest INTO CORRESPONDING FIELDS OF wa_tab.
WRITE: wa_tab-id, wa_tab-value, /.
ENDSELECT.

"dobry rekord
wa_new-mandt = 100.
wa_new-id = 1.
wa_new-value = 'zm'.
APPEND wa_new TO it_new.
"dobry lub zły rekord
wa_new-mandt = 100.
wa_new-id = 2.
wa_new-value = 'RR'.
APPEND wa_new TO it_new.
lv_count = lines( it_new ).

UPDATE ztest FROM TABLE it_new.
lv_dbcnt = sy-dbcnt.

WRITE: / ,'rekordów w itab: ', lv_count , /.
WRITE: / ,'zmieniono rekordów (sy-dbcnt): ', lv_dbcnt , /.

IF lv_count EQ lv_dbcnt .
COMMIT WORK.
WRITE: 'zmienilem',/.
ELSE.
ROLLBACK WORK.
WRITE: 'nie zmieniłem / alert',/.
ENDIF.


SELECT * FROM ztest INTO CORRESPONDING FIELDS OF wa_tab.
WRITE: wa_tab-id, wa_tab-value, /.
ENDSELECT.
Tabela jak na screenie.
tbtst.png
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
wojtas7
Posty: 914
Rejestracja: pt mar 14, 2008 12:51 pm
Has thanked: 58 times
Been thanked: 231 times

Re: Jak przetestować update przed jego wykonaniem?

Post autor: wojtas7 »

A może bezpieczniej używać MODIFY ?