SUSR_USER_ADDRESS_READ.abap


FUNCTION susr_user_address_read.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     VALUE(USER_NAME) LIKE  USR01-BNAME
*"     VALUE(READ_DB_DIRECTLY) LIKE  SZAD_FIELD-FLAG DEFAULT SPACE
*"  EXPORTING
*"     VALUE(USER_ADDRESS) LIKE  ADDR3_VAL STRUCTURE  ADDR3_VAL
*"     VALUE(USER_USR03) LIKE  USR03 STRUCTURE  USR03
*"  EXCEPTIONS
*"      USER_ADDRESS_NOT_FOUND
*"----------------------------------------------------------------------
* TABLES: USR03, USR21, TSAD3T, ADCP."USR0340A                   "*367d
*--- "*509d+
*  DATA: nametext(75).
*  DATA: status_table LIKE adrstatus OCCURS 0 WITH HEADER LINE.
*  DATA: read_cam LIKE szad_field-flag.
*--- "*509d-
  DATA: addr_sel LIKE addr3_sel.
  DATA: addr_val LIKE addr3_val.
*  DATA: RC LIKE SZAD_FIELD-RETURNCODE.                          "*367d
*------- "*367i+
  DATA: v_addr_usr_wa LIKE v_addr_usr.
  DATA: save_subrc LIKE sy-subrc.
  DATA: save_tabix LIKE sy-tabix.
*------- "*367i-

  CLEAR usr21.
  CLEAR usr03.                         "USR0340A
*----------- "*467d+
*  CLEAR tsad3t.
*  CLEAR adcp.                          "*227i
*----------- "*467d-

  IF user_name = space.                "*263i
    MESSAGE e824 RAISING user_address_not_found.                 "*263i
  ENDIF.                               "*263i

*------- "*509d+
*  read_cam = space.
*  REFRESH status_table.
*  CALL FUNCTION 'ADDR_GET_STATUS_INFO'
*       TABLES
*            status_table = status_table
*       EXCEPTIONS
*            OTHERS       = 0.
*  LOOP AT status_table.
*    IF status_table-constant = 'BC01' AND status_table-value = 'X'.
*      read_cam = 'X'.
*      EXIT.
*    ENDIF.
*  ENDLOOP.
*  IF read_cam = 'X'.
*------- "*509d-
    IF user_name <> g_last_user_name.  "*227i
      SELECT SINGLE * FROM usr21 WHERE bname = user_name.
      IF sy-subrc <> 0.
        CLEAR g_last_usr21.            "*227i
        g_last_user_name = user_name.  "*227i
        MESSAGE e289 WITH user_name RAISING user_address_not_found.
      ENDIF.
      g_last_usr21 = usr21.            "*227i
    ELSE.                              "*227i
      IF NOT g_last_usr21 IS INITIAL.  "*227i
        usr21 = g_last_usr21.          "*227i
      ELSE.                            "*227i
        MESSAGE e289 WITH user_name    "*227i
                     RAISING user_address_not_found.             "*227i
      ENDIF.                           "*227i
    ENDIF.                             "*227i

    IF usr21-persnumber <> space
       AND usr21-addrnumber <> space.
      addr_sel-persnumber = usr21-persnumber.
      addr_sel-addrnumber = usr21-addrnumber.
      addr_sel-date       = '00010101'.
    ELSE.
      MESSAGE e289 WITH user_name RAISING user_address_not_found.
    ENDIF.
*----------- "*367i+
*   check in buffer if update is active
    IF g_update_active IS INITIAL.
*----------- "*367i-
      DATA: ev_upginfo LIKE uvers.
      CALL FUNCTION 'UPG_GET_ACTIVE_COMP_UPGRADE'
          EXPORTING
*             IV_COMPONENT           = 'SAP_BASIS'
               iv_upgtype             = 'A'
               iv_buffered            = 'X'
           IMPORTING
                ev_upginfo             = ev_upginfo
           EXCEPTIONS
                no_upgrade_active      = 1
                ambigious_entries      = 2
                invalid_component_name = 3
                OTHERS                 = 4.
      IF sy-subrc = 1
         OR ( sy-subrc = 0 AND ev_upginfo-putstatus <> 'B'
              AND ev_upginfo-putstatus <> 'S' ).
*-------------------------------------------------------------- "*367i+
        g_update_active = c_n.
      ELSE.
        g_update_active = c_y.
      ENDIF.
    ENDIF.
    IF g_update_active = c_n.
*-------------------------------------------------------------- "*367i-
      IF read_db_directly = 'X'.
*     nur Feld department mit direktem SELECT auf ADCP bestimmen
*     (Sonderlocke  - nur für RDDIMPDP außerhalb des Upgrades)
        IF user_name <> g_last_user_name.                        "*227i
          SELECT * FROM adcp WHERE addrnumber =  usr21-addrnumber
                             AND persnumber =  usr21-persnumber
                             AND nation     =  space.
          ENDSELECT.
          IF sy-subrc = 0.
            g_last_adcp = adcp.        "*227i
          ELSE.
            CLEAR g_last_adcp.         "*227i
            g_last_user_name = user_name.                        "*227i
            MESSAGE e289 WITH user_name RAISING user_address_not_found.
          ENDIF.
        ELSE.                          "*227i
          IF NOT g_last_adcp IS INITIAL.                         "*227i
            adcp = g_last_adcp.        "*227i
          ELSE.                        "*227i
            MESSAGE e289 WITH user_name"*227i
                         RAISING user_address_not_found.         "*227i
          ENDIF.                       "*227i
        ENDIF.                         "*227i
        user_address-department = adcp-department.
        user_usr03-abtlg        = adcp-department.
      ELSE.
*     Normales Nachlesen, falls nicht im Austausch-Upgrade (Downtime
*     oder Phase PCON)
*------------------------------ "*367d+
*        CALL FUNCTION 'ADDR_PERS_COMP_GET'
*             EXPORTING
*                  ADDRESS_PERS_IN_COMP_SELECTION = ADDR_SEL
*             IMPORTING
*                  ADDRESS_PERS_IN_COMP_VALUE     = ADDR_VAL
*                  RETURNCODE                     = RC
*             EXCEPTIONS
*                  OTHERS                         = 1.
*        IF SY-SUBRC <> 0 OR RC = 'E'.
*------------------------------ "*367d-
*------------------------------------- "*367i+
*       first read in buffer (if nothing is found at least save
*       index for insert)
        READ TABLE g_user_data WITH KEY user = user_name
          BINARY SEARCH.
        save_subrc = sy-subrc.
        save_tabix = sy-tabix.
        IF save_subrc <> 0.
*         read in database if data not found in buffer
          SELECT SINGLE * FROM v_addr_usr INTO v_addr_usr_wa
            WHERE addrnumber = addr_sel-addrnumber
              AND persnumber = addr_sel-persnumber
              AND date_from  = addr_sel-date
              AND nation     = addr_sel-nation.
*             and DATE_FR_C  = ADDR_SEL-DATE
*             and NATION_C   = ADDR_SEL-NATION
*             and DATE_FR_P  = ADDR_SEL-DATE.
          IF sy-subrc <> 0.
*------------------------------------- "*367i-
            MESSAGE e289 WITH user_name RAISING user_address_not_found.
          ENDIF.                       "*367i
        ELSE.
*-------------------------"*367i+
          v_addr_usr_wa = g_user_data-data.
        ENDIF.
        MOVE-CORRESPONDING v_addr_usr_wa TO addr_val.
        g_user_data-user = user_name.
        g_user_data-data = v_addr_usr_wa.
*       insert buffer
        CASE save_subrc.
          WHEN 0.
*           MODIFY g_user_data INDEX save_tabix. "not necessary
          WHEN OTHERS.
            INSERT g_user_data INDEX save_tabix.
        ENDCASE.
        addr_val-date = addr_sel-date.
*-------------------------"*367i-
        user_address = addr_val.
        IF user_usr03 IS REQUESTED.    "*369i
*         Felder auf USR03 mappen
          user_usr03-mandt = sy-mandt. "USR0340A
          user_usr03-bname = user_name."USR0340A
          IF addr_val-converted = 'X'.
            user_usr03-name1 = addr_val-name_text."USR0340A
          ELSE.
            user_usr03-name1 = addr_val-name_first."USR0340A
            user_usr03-name2 = addr_val-name_last."USR0340A
          ENDIF.
          user_usr03-name3 = addr_val-name1."USR0340A
          user_usr03-name4 = addr_val-name2."USR0340A
          SELECT SINGLE * FROM tsad3t WHERE langu = sy-langu
                                        AND title = addr_val-title_p.
          IF sy-subrc = 0.
            user_usr03-salut = tsad3t-title_medi."USR0340A
          ELSE.
*            CLEAR tsad3t.     "*467d
            CLEAR user_usr03-salut.    "*467i
          ENDIF.
          user_usr03-abtlg = addr_val-department."USR0340A
          user_usr03-kostl = usr21-kostl."USR0340A
          user_usr03-buinr = addr_val-building_c."USR0340A
          user_usr03-roonr = addr_val-roomnum_c."USR0340A
*------------ "*369i+
          IF NOT addr_val-house_num1 IS INITIAL OR
             NOT addr_val-house_num2 IS INITIAL.
            CALL FUNCTION 'ADDR_COMPOSE_STREET_LINE'
                 EXPORTING
                      street             = addr_val-street
                      house_number       = addr_val-house_num1
                      house_number2      = addr_val-house_num2
                      length             = 30
*                   RULE               =
*                   ADDRESS_LAYOUT_KEY =
                      country            = addr_val-country
                      language           = addr_val-langu
                 IMPORTING
                      street_line        = user_usr03-stras
                      .
          ELSE.
*------------ "*369i-
            user_usr03-stras = addr_val-street."USR0340A
          ENDIF.                       "*369i
          user_usr03-pfach = addr_val-po_box."USR0340A
          user_usr03-pstlz = addr_val-post_code1."USR0340A
          user_usr03-ort01 = addr_val-city1."USR0340A
          user_usr03-regio = addr_val-region."USR0340A
          user_usr03-land1 = addr_val-country."USR0340A
          IF addr_val-langu_p IS INITIAL. "*509i
            user_usr03-spras = addr_val-langu."USR0340A
*-------- "*509i+
          ELSE.
            user_usr03-spras = addr_val-langu_p."USR0340A
          ENDIF.
*-------- "*509i-
*         USER_USR03-TELPR = ADDR_VAL-???
          CONCATENATE addr_val-tel_number addr_val-tel_extens
                   INTO user_usr03-telnr."USR0340A
*         USER_USR03-TEL01 = ADDR_VAL-???
*         USER_USR03-TEL02 = ADDR_VAL-???
*         USER_USR03-TELX1 = ADDR_VAL-???
          CONCATENATE addr_val-fax_number addr_val-fax_extens
                   INTO user_usr03-telfx."USR0340A
*         USER_USR03-TELTX = ADDR_VAL-???
          user_usr03-ort02 = addr_val-city2."USR0340A
          user_usr03-pstl2 = addr_val-post_code2."USR0340A
          user_usr03-tzone = addr_val-time_zone."USR0340A
        ENDIF.                         "*369i
      ENDIF.
*      ENDIF.                                                    "*367d
    ELSE.
*     Sonderbehandlung für den Austausch-Upgrade
      user_address-name_last  = user_name.
      user_address-name_text  = user_name.
      user_address-addrnumber = usr21-addrnumber.
      user_address-persnumber = usr21-persnumber.
      user_usr03-mandt = sy-mandt.     "USR0340A
      user_usr03-bname = user_name.    "USR0340A
      user_usr03-name2 = user_name.

    ENDIF.   " if sy-subrc <> 1 (vom FB upg_get_active_comp_upgrade)
*---- "*509d+
*  ELSE.
*    SELECT SINGLE * FROM usr03 WHERE bname = user_name."USR0340A
*    IF sy-subrc <> 0.
*      MESSAGE e289 WITH user_name RAISING user_address_not_found.
*    ENDIF.
*    MOVE usr03 TO user_usr03.          "USR0340A
*
** Folgende Felder aus der USR03 werden in Zukunft nicht mehr
** unterstützt (Information in Mail an Anwender aufnehmen):
** KOSTL  Kostenstelle   (doch -> steht in USR21)
*
** Folgende Felder sind in Zukunft über andere Adreß-FBs zu besorgen:
** TEL01  Telefonnummer
** TEL02  Telefonnummer
** TELX1  Telexnnummer
** TELTX  Teletexnummer
** TZONE  Zeitzone   (ggf. als abweichende Zeitzone)
*
** Folgende Felder aus der USR03 sind in Zukunft Bestandteil der
** Firmenadresse:
** STRAS
** PFACH
** PSTLZ
** PSTL2
** ORT01
** ORT02
** REGIO
** LAND1
** NAME3
** NAME4
** TZONE
*
** Folgende Felder aus USR03 konnten auch bisher nicht gepflegt werden:
** TELPR  Telefonnummer (privat)
*
** Anrede  -> wird möglichst gut umgesetzt, ist dann als Schlüssel oder
**            ggf. als Teil von NAMETEXT vorhanden.
*    user_address-name_first = usr03-name1."USR0340A
*    user_address-name_last  = usr03-name2."USR0340A
*    user_address-department = usr03-abtlg."USR0340A
*    user_address-building_c = usr03-buinr."USR0340A
*    user_address-roomnum_c  = usr03-roonr."USR0340A
*    user_address-name1      = usr03-name3."USR0340A
*    user_address-name2      = usr03-name4."USR0340A
*    user_address-street     = usr03-stras."USR0340A
*    user_address-po_box     = usr03-pfach."USR0340A
*    user_address-post_code1 = usr03-pstlz."USR0340A
*    user_address-post_code2 = usr03-pstl2."USR0340A
*    user_address-city1      = usr03-ort01."USR0340A
*    user_address-city2      = usr03-ort02."USR0340A
*    user_address-region     = usr03-regio."USR0340A
*    user_address-country    = usr03-land1."USR0340A
*    user_address-langu_p    = usr03-spras."USR0340A
*    user_address-tel_number = usr03-telnr."USR0340A
*    user_address-fax_number = usr03-telfx."USR0340A
*    user_address-time_zone  = usr03-tzone."USR0340A
*
*    nametext(15)    = usr03-salut.     "USR0340A
*    nametext+15(30) = usr03-name1.     "USR0340A
*    nametext+45(30) = usr03-name2.     "USR0340A
*    CONDENSE nametext.
*    user_address-name_text  = nametext.
*  ENDIF.
*---- "*509d-
  g_last_user_name = user_name.        "*227i
ENDFUNCTION.