*&---------------------------------------------------------------------*
*& Include          ZADA_PROG_UNIT_03_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form variable_declaration_simple
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM variable_declaration_simple .
  "Crée moi une variable nommée lv_prenom (lv=local variable) et qui est du type string.
  DATA lv_prenom TYPE string.
  DATA lv_nom TYPE char40.

  lv_prenom = 'adrien'.
  lv_nom = 'dacunto'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form variable_declaration_succes
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM variable_declaration_succes .

  DATA: lv_age    TYPE i,
        lv_code_p TYPE i.

  lv_age = 10.
  " CTRL + D
  " Duplique la ligne sélectionnée

  " CTRL + Clique Gauche
  " Selectionne le mot entier

ENDFORM.
*&---------------------------------------------------------------------*
*& Form variable_convention_nommage
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM variable_convention_nommage .
  DATA: lv_PRIX TYPE i,
        prix    TYPE i.

  " la variable appelé 'lv_prix'
  " lv correspond à sa scope => local variable
ENDFORM.
*&---------------------------------------------------------------------*
*& Form variable_type_vs_like
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM variable_type_vs_like .
  DATA: lv_variable4 TYPE string,
        lv_variable5 LIKE lv_variable4,
        lv_variable6 LIKE lv_variable5.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form constant_declaration_simple
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM constant_declaration_simple .

  " lc= local constant avec une valeur de 0000
  " obligation de definir la valeur à la déclaration de la constante
  CONSTANTS lc_an_0 TYPE i VALUE 0000.

  DATA lv_an_sup LIKE lc_an_0.

  lv_an_sup = lc_an_0 + 0001.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form constant_declaration_succes
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM constant_declaration_succes .

  CONSTANTS: lc_birthdate    TYPE string VALUE 'Seoul',
             lc_birthcountry TYPE string VALUE 'South Korea'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form exercice_carte_identite
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM exercice_carte_identite .

  " Déclarations de constantes
  CONSTANTS: lc_birthdate    TYPE d VALUE '20000829',
             lc_birthcountry TYPE string VALUE 'FRA',
             lc_birthplace   TYPE string VALUE 'Saint-Jean'.

  " Déclarations de variables
  DATA: lv_lastname        TYPE string,
        lv_firstname       TYPE string,
        lv_num_doc         TYPE string,
        lv_expiration_date TYPE d,
        lv_sex             TYPE c LENGTH 1,
        lv_height          TYPE float,
        lv_date_delivery   TYPE d,
        lv_address         TYPE string.

  " Affectation de valeurs
  lv_lastname = 'D''acunto'.
  lv_firstname = 'Adrien'.
  lv_num_doc = 'BJZJXV8X9'.
  lv_expiration_date = '20350818'.
  lv_sex = 'M'.
  lv_height = '1.67'.
  lv_date_delivery = '20250819'.
  lv_address = '1 RUE DES MARGUERITES 31140 AUCAMVILLE FRANCE'.

  " Write ou Debug
  WRITE:/ 'LASTNAME : ', lv_lastname,
        / 'FIRSTNAME : ', lv_firstname,
        / 'BIRTHDATE : ', lc_birthdate,
        / 'BIRTHCOUNTRY : ', lc_birthcountry,
        / 'BIRTHPLACE : ', lc_birthplace,
        / 'DOCUMENT NUMBER : ', lv_num_doc ,
        / 'EXPIRATION DATE : ', lv_expiration_date,
        / 'SEX : ', lv_sex,
        / 'HEIGHT : ', lv_height,
        / 'DELIVERY DATE : ', lv_date_delivery,
        / 'ADDRESS : ', lv_address.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form type_c
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM type_c .

  " Deux manieres différentes de déclarer un TYPE char
  " A utiliser lorsque l'on souhaite limiter la taille de la chaîne de
  " caracteres.
  DATA lv_char1     TYPE char10.
  DATA lv_char2(10) TYPE c. " Recommander

ENDFORM.
*&---------------------------------------------------------------------*
*& Form type_numeric
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM type_numeric .

  DATA lv_integer TYPE i.

  lv_integer = 1.
  lv_integer = 10.
  lv_integer = 100.
  lv_integer = 1000.

  DATA lv_n TYPE n.

  lv_n = 10.
  lv_n = 10.
  lv_n = 100.
  lv_n = 1000.

  " Pour le type NUMC, impératif de spécifier le nombre de caractère
  DATA lv_numc TYPE numc5.

  lv_numc = 31000. " Toulouse
  lv_numc = 45000. " Loiret
  lv_numc = 13000. " Marseille

ENDFORM.
*&---------------------------------------------------------------------*
*& Form type_date
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM type_date .

  " Les types dates sont toujours au format AAAAMMJJ
  DATA lv_date TYPE d.

  " sy-datum = variable système
  lv_date = sy-datum.
  lv_date = '198011044'.

  DATA lv_datum TYPE datum.

  lv_datum = sy-datum.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form type_heure
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM type_heure .

  DATA lv_heure  TYPE uzeit.
  DATA lv_heure2 TYPE t.

  lv_heure = sy-uzeit.
  lv_heure2 = sy-uzeit.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form type_float
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM type_float .

  DATA: lv_f     TYPE f,
        lv_float TYPE float.

  lv_f = '123455.12'.
  lv_float = '123455.12'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form type_decfloat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM type_decfloat .

  " Précision jusqu'à 34 chiffres significatifs
  " utilisé pour les calculs financiers.
  DATA lv_decfloat TYPE decfloat34.

  lv_decfloat = '12345.67890123456789012345678901234'.
  lv_decfloat = '67890123456789012345678901234.12345'.
  lv_decfloat = '6789012345678901234567890123412345'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form type_packed_decimal
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM type_packed_decimal .

  " Type numérique compact, idéal pour montants financiers.
  DATA lv_pack TYPE p DECIMALS 2.

  lv_pack = '1234.56'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form type_boolean
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM type_boolean .
  DATA: lv_check  TYPE boolean,
        lv_check2 TYPE abap_bool.

  lv_check = abap_true.
  lv_check2 = abap_false.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form type_xfeld
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM type_xfeld .

  DATA: lv_xfeld1 TYPE xfeld,
        lv_xfeld2 TYPE xfeld.

  lv_xfeld1 = 'X'.
  lv_xfeld2 = ''.

  " IMPORTANT !
  "
  " Avec le xfeld, le 'X' doit être en majuscule !

ENDFORM.
*&---------------------------------------------------------------------*
*& Form type_fieldsymbols
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM type_fieldsymbols .

  "1. DECLARATION
  "   Un FIELD-SYMBOL est une variable spéciale qui agit comme un pointeur
  "   c’est comme une flèche sur une carte : la flèche ne contient pas
  "   l’objet, elle indique juste où il se trouve.

  DATA lv_text TYPE string VALUE 'Bonjour, je suis la valeur pointée'.
  FIELD-SYMBOLS <lfs_string> TYPE string.

  "2. ASSIGNATION
  "   un FIELD-SYMBOL ne contient pas de valeur avant d’être assigné.
  "   Toute tentative d’écriture directe sans assignation provoque
  "   une erreur CX_SY_REF_IS_INITIAL.

  ASSIGN lv_text TO <lfs_string>.

  "3. AFFECTATION DE VALEUR ET VISUALISATION DU RESULTAT

  WRITE:/ <lfs_string>.
  <lfs_string> = 'Salut'.
  WRITE:/ <lfs_string>.

  "4. EXEMPLE DE MODIFICATION

  DATA lv_number TYPE i.
  FIELD-SYMBOLS <lfs_num> TYPE i.

  ASSIGN lv_number TO <lfs_num>.
  <lfs_num> = 10.  " Ici, on modifie directement lv_number
  " via le FIELD-SYMBOL

ENDFORM.
*&---------------------------------------------------------------------*
*& Form fieldsymbols_succes
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM fieldsymbols_succes .

  FIELD-SYMBOLS: <lfs_field1> TYPE any,
                 <lfs_field2> TYPE any,
                 <lfs_field3> TYPE any.

  " Cela nécessitera d'ASSIGN chacun des FIELD-SYMBOLS avant de les
  " utiliser.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form exercice_fieldsymbols
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM exercice_fieldsymbols .
  "------------------------------------------------------------
  " Exemple : Déclaration, assignation et affichage de plusieurs field-symbols
  "------------------------------------------------------------

  "--- Déclaration de variables de base
  DATA: lv_nom    TYPE string VALUE 'Dupont',
        lv_prenom TYPE string VALUE 'Claire',
        lv_age    TYPE i      VALUE 32.

  " CONSIGNES
  " 1. Déclarer 3 field-symbols
  " 2. Assigner chaque field-symbol à une des variables ci-dessus
  " 3. Modifier la valeur du Field-symbol
  " 4. WRITE les variables

  " 1.
  FIELD-SYMBOLS: <lfs_nom>    TYPE string,
                 <lfs_prenom> TYPE string,
                 <lfs_age>    TYPE i.

  " 2.
  ASSIGN lv_nom TO <lfs_nom>.
  ASSIGN lv_prenom TO <lfs_prenom>.
  ASSIGN lv_age TO <lfs_age>.

  " 3.
  IF <lfs_prenom> IS ASSIGNED.
        <lfs_prenom> = 'Adrien'.
  ENDIF.

  IF <lfs_nom> IS ASSIGNED.
        <lfs_nom> = 'D''acunto'.
  ENDIF.

  IF <lfs_age> IS ASSIGNED.
        <lfs_age> = 25.
  ENDIF.

  " 4.
  WRITE:/ 'LASTNAME : ', lv_nom,
      / 'FIRSTNAME : ', lv_prenom,
      / 'AGE : ', lv_age.

  " TIPS
  " Pour être sûr qu'un Field-Symbol est assigné, vous pouvez
  " controller l'assignation comme dans l'exemple ci-dessous

*  DATA: lv_prenom TYPE string VALUE 'FRED'.
*    FIELD-SYMBOLS: <lfs_prenom> TYPE string.
*
*    ASSIGN lv_prenom TO <lfs_prenom>.
*
*    IF <lfs_prenom> IS ASSIGNED.
*      <lfs_prenom> = 'PIERRE'.
*      WRITE:/ <lfs_prenom>,
*            / lv_prenom.
*    ENDIF.

ENDFORM.