Unlock an user

Z_CHANGE_USER_UFLAG.abap
REPORT Z_CHANGE_USER_UFLAG.
 
TABLES: USR02.
 
PARAMETERS: p_user   LIKE usr02-bname OBLIGATORY,
            p_client LIKE usr02-mandt DEFAULT sy-mandt,
            p_uflag  TYPE usr02-uflag DEFAULT 0,
            p_modify TYPE boolean DEFAULT space AS CHECKBOX.
 
" Variables pour audit et contrôle
DATA: lv_old_uflag TYPE usr02-uflag,
      lv_message   TYPE string,
      lv_timestamp TYPE timestamp.
 
AT SELECTION-SCREEN ON p_uflag.
 
  " Validation des valeurs UFLAG autorisées [[1]](https://community.sap.com/t5/technology-q-a/password-reset-based-on-uflag/qaq-p/12585274)
  CASE p_uflag.
    WHEN 0.   " Utilisateur déverrouillé
      lv_message = 'Déverrouillage utilisateur'.
    WHEN 32.  " Verrouillé par administrateur
      lv_message = 'Verrouillage administrateur'.
    WHEN 64.  " Verrouillé par tentatives de connexion
      lv_message = 'Verrouillage tentatives connexion'.
    WHEN 128. " Verrouillé par tentatives mot de passe [[1]](https://community.sap.com/t5/technology-q-a/password-reset-based-on-uflag/qaq-p/12585274)
      lv_message = 'Verrouillage tentatives mot de passe'.
    WHEN 192. " Combinaison 64+128
      lv_message = 'Verrouillage combiné'.
    WHEN OTHERS.
      MESSAGE 'Valeur UFLAG non autorisée. Utilisez: 0,32,64,128,192' TYPE 'E'.
  ENDCASE.
 
AT SELECTION-SCREEN.
 
  " Vérifier si l'utilisateur existe
  SELECT SINGLE bname FROM usr02
    CLIENT SPECIFIED
    INTO @DATA(lv_user_check)
    WHERE mandt = @p_client
      AND bname = @p_user.
 
  IF sy-subrc NE 0.
    MESSAGE 'Utilisateur non trouvé dans le mandant spécifié' TYPE 'E'.
  ENDIF.
 
START-OF-SELECTION.
 
  " Vérification des autorisations [[2]](https://help.sap.com/saphelp_scm70/helpdata/ru/9f/dbaccb35c111d1829f0000e829fbfe/content.htm),
  AUTHORITY-CHECK OBJECT 'S_USER_GRP'
    ID 'CLASS' FIELD '*'
    ID 'ACTVT' FIELD '02'.
 
  IF sy-subrc NE 0.
    MESSAGE 'Autorisation insuffisante pour modifier les utilisateurs' TYPE 'E'.
    EXIT.
  ENDIF.
 
  " Lecture des données actuelles pour audit
  SELECT SINGLE uflag FROM usr02
    CLIENT SPECIFIED
    INTO lv_old_uflag
    WHERE mandt = p_client
      AND bname = p_user.
 
  IF sy-subrc = 0.
    " Affichage des informations avant modification
    WRITE: / 'Utilisateur:', p_user,
           / 'Client:', p_client,
           / 'Ancienne valeur UFLAG:', lv_old_uflag,
           / 'Nouvelle valeur UFLAG:', p_uflag,
           / 'Action:', lv_message.
 
    " Vérification si modification nécessaire
    IF lv_old_uflag = p_uflag.
      WRITE: / 'Aucune modification nécessaire - valeurs identiques'.
      EXIT.
    ENDIF.
 
    " Modification du champ UFLAG
    IF p_modify = 'X'.
 
      UPDATE usr02 CLIENT SPECIFIED
        SET uflag = p_uflag
        WHERE mandt = p_client
          AND bname = p_user.
 
      IF sy-subrc = 0.
        COMMIT WORK.
        WRITE: / '*** MODIFICATION RÉUSSIE ***',
               / 'UFLAG modifié de', lv_old_uflag, 'vers', p_uflag,
               / 'Modifié par:', sy-uname.
      ELSE.
        ROLLBACK WORK.
        MESSAGE 'Erreur lors de la modification UFLAG' TYPE 'E'.
      ENDIF.
    ELSE.
      WRITE: / 'Mode simulation - aucune modification effectuée'.
    ENDIF.
  ELSE.
    MESSAGE 'Erreur lors de la lecture des données utilisateur' TYPE 'E'.
  ENDIF.