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?
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