Properties SourceCde
txt
1
*---------------------------------------------------------------------*
2
*       FORM ADDRESS_MAINTAIN                                         *
3
*---------------------------------------------------------------------*
4
*       ........                                                      *
5
*---------------------------------------------------------------------*
6
FORM address_maintain.
7
  DATA: mode, return TYPE i, kz, answer, am_save(1) TYPE c,
8
        am_pos LIKE sy-fdpos, am_length LIKE sy-fdpos,
9
        func_name TYPE rs38l_fnam.
10
  DATA: am_handletab LIKE addr1_dia OCCURS 1 WITH HEADER LINE,
11
        am_sel LIKE addr1_sel, am_address LIKE addr1_val,
12
        am_ucomm LIKE sy-ucomm, am_title LIKE sy-title.
13
  DATA: keytab TYPE TABLE OF vimty_textfield,
14
        keytab_wa TYPE vimty_textfield,
15
        am_key TYPE vimty_max_textline.
16
 
17
  FIELD-SYMBOLS: <am_title> TYPE c, <am_key> TYPE c,
18
                 <am_handle_x> TYPE x,
19
                 <namtab> TYPE vimnamtab, <keyfld> TYPE ANY.
20
  IF x_header-adrnbrflag EQ space.
21
    MESSAGE e001(sv).
22
    EXIT.
23
  ENDIF.
24
  IF status-action NE anzeigen AND status-action NE transportieren AND
25
     adrnbr_roflag EQ space.
26
    MOVE svim_text_012 TO am_title.    "Adresse bearbeiten
27
  ELSE.
28
    MOVE svim_text_017 TO am_title.    "Adresse anzeigen
29
  ENDIF.
30
  am_pos = strlen( am_title ).
31
  am_length = 70 - am_pos.
32
  ASSIGN am_title+am_pos(am_length) TO <am_title>.
33
  MOVE ':' TO <am_title>.
34
  ADD 2 TO am_pos.
35
  SUBTRACT 2 FROM am_length.
36
  ASSIGN am_title+am_pos(am_length) TO <am_title>.
37
  CLEAR am_pos.
38
  PERFORM vim_external_repr_for_key TABLES keytab
39
                                    USING <f1_x>.
40
  LOOP AT keytab INTO keytab_wa.
41
    CONCATENATE am_key keytab_wa-text INTO am_key SEPARATED BY space.
42
    am_pos = am_pos + keytab_wa-outplen + 1.
43
    IF am_pos > am_length. EXIT. ENDIF.
44
  ENDLOOP.
45
  IF sy-subrc = 0.
46
    ASSIGN am_key(am_pos) TO <am_key>.
47
*  IF x_header-clidep NE space.
48
*    am_length = x_header-keylen - client_length.
49
*    ASSIGN <f1>+client_length(am_length) TO <am_key>.
50
*  ELSE.
51
*    ASSIGN <f1> TO <am_key>.
52
*  ENDIF.
53
    MOVE <am_key> TO <am_title>.
54
  ENDIF.
55
  ASSIGN am_handletab-handle TO <am_handle_x> CASTING.
56
  IF x_header-adrnbrflag EQ 'O'.       "use old technique
57
* Übergangslösung Adressumstellung 3.0F Anfang
58
    IF <address_number> NE space.
59
      SELECT adrnr FROM sadr INTO sadr-adrnr
60
                             WHERE adrnr EQ <address_number>.
61
        EXIT.
62
      ENDSELECT.
63
      IF sy-subrc NE 0.
64
        CALL FUNCTION 'ADDR_CONVERT_ADRC_TO_SADR'
65
          CHANGING
66
            address_number = <address_number>.
67
*     IF <ADDRESS_NUMBER> NE SPACE AND "new address number -> update
68
*        STATUS-ACTION NE ANZEIGEN AND STATUS-ACTION NE TRANSPORTIEREN.
69
*       <STATUS>-UPD_FLAG = 'X'.
70
*     ENDIF.  "not necessary, adrnbr will never be changed
71
      ENDIF.
72
    ENDIF.
73
* Übergangslösung Adressumstellung 3.0F Ende
74
    MOVE <address_number> TO sadr-adrnr.
75
    kz = space.
76
   IF status-action NE anzeigen AND status-action NE transportieren AND
77
             adrnbr_roflag EQ space.
78
      IF <address_number> EQ space.
79
        mode = 'A'.
80
      ELSE.
81
        mode = 'M'.
82
      ENDIF.
83
      IF status-action EQ kopieren.
84
        IF <address_number> NE space.
85
          SELECT * FROM sadr WHERE adrnr EQ <address_number>.
86
            kz = 'X'.
87
            EXIT.
88
          ENDSELECT.
89
        ELSE.
90
          CLEAR sadr.
91
        ENDIF.
92
        CLEAR <address_number>.
93
        mode = 'A'.
94
      ENDIF.
95
    ELSE.
96
      mode = 'D'.
97
    ENDIF.
98
    func_name = 'ADDRESS_MAINTAIN'. "struggling against extended check
99
    DO.
100
      CALL FUNCTION func_name
101
        EXPORTING
102
          adrswa_in         = sadr
103
          processing_status = mode
104
          kennzeichen       = kz
105
          save_intern       = 'X'
106
          title             = am_title
107
        IMPORTING
108
          adrswa_out        = sadr
109
          returncode        = return
110
          update_flag       = am_save
111
        EXCEPTIONS
112
          not_found         = 4.
113
      IF sy-subrc NE 0.
114
        IF status-action NE anzeigen AND
115
           status-action NE transportieren AND
116
           adrnbr_roflag EQ space.
117
          CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_MESSAGE'
118
            EXPORTING
119
              diagnosetext1 = svim_text_013   "Die Adresse für das
120
              diagnosetext2 = <am_key>
121
              diagnosetext3 = svim_text_014 "wurde nicht gefunden.
122
              textline1     = svim_text_015"Möchten Sie eine neue er
123
              titel         = svim_text_016"Adresse nicht vorhanden
124
            IMPORTING
125
              answer        = answer.
126
          IF answer EQ 'J'.
127
            mode = 'A'.
128
          ELSE.
129
            return = 4.
130
            EXIT.
131
          ENDIF.
132
        ELSE.
133
          MESSAGE i055(sv) WITH <am_key>.
134
          return = 4.
135
          EXIT.
136
        ENDIF.
137
      ELSE.
138
        EXIT.
139
      ENDIF.
140
    ENDDO.
141
   IF status-action NE anzeigen AND status-action NE transportieren AND
142
             adrnbr_roflag EQ space.
143
      IF return NE 4 AND sadr-adrnr NE <address_number> OR
144
         am_save NE space. "transport for address changes is requested
145
        MOVE: 'X' TO <status>-upd_flag,
146
               sadr-adrnr TO <address_number>.
147
      ENDIF.
148
    ENDIF.
149
    CLEAR am_ucomm.
150
  ELSE. "4.0: use new version of address maintenance
151
   IF status-action NE anzeigen AND status-action NE transportieren AND
152
             adrnbr_roflag EQ space.
153
      IF status-action EQ kopieren.
154
        IF <address_number> NE space.
155
          IF <address_number> NP '@NEW*'.
156
            am_sel-addrnumber = <address_number>.
157
          ELSE.
158
            am_sel-addrhandle = <f1_x>.
159
          ENDIF.
160
          CALL FUNCTION 'ADDR_GET'
161
            EXPORTING
162
              address_selection = am_sel
163
            IMPORTING
164
              address_value     = am_address
165
            EXCEPTIONS
166
              parameter_error   = 1
167
              address_not_exist = 2
168
              version_not_exist = 3
169
              internal_error    = 4.
170
          IF sy-subrc EQ 0.
171
            MOVE-CORRESPONDING am_address TO am_handletab. "#EC *
172
          ENDIF.
173
        ENDIF.
174
        CLEAR <address_number>.
175
        am_handletab-maint_mode = 'CREATE'.
176
      ELSE.
177
        IF <address_number> EQ space.
178
          am_handletab-maint_mode = 'CREATE'.
179
        ELSE.
180
          am_handletab-maint_mode = 'CHANGE'.
181
        ENDIF.
182
      ENDIF.                           "status-action eq kopieren.
183
    ELSE.
184
      IF <address_number> IS INITIAL.  "no address assigned
185
        MESSAGE i055(sv) WITH <am_key>.
186
        EXIT.
187
      ENDIF.
188
      am_handletab-maint_mode = 'DISPLAY'.
189
    ENDIF.
190
    IF am_handletab-maint_mode EQ 'CREATE' OR
191
       <address_number> CP '@NEW*'.
192
      <am_handle_x>(x_header-keylen) = <f1_x>.
193
*      am_handletab-handle = <f1>.
194
    ELSE.
195
      CLEAR am_handletab-handle.
196
    ENDIF.
197
    IF <address_number> NP '@NEW*'.
198
      am_handletab-addrnumber = <address_number>.
199
    ELSE.
200
      CLEAR am_handletab-addrnumber.
201
    ENDIF.
202
    am_handletab-addr_group = vim_addr_group.
203
    APPEND am_handletab.
204
* individual preparation of address dialog requested?.....
205
    CLEAR: vim_addr_field_selection,
206
           vim_addr_keywords,
207
           vim_addr_chng_deflt_comm_types,
208
           vim_addr_frame_text,
209
           vim_addr_excluded_functions.
210
    REFRESH vim_addr_excluded_functions.
211
    vim_addr_titlebar = am_title.
212
    CLEAR vim_skip_adr_maint.                               "UF120400
213
    IF x_header-frm_bf_adr NE space.   "...yes
214
      PERFORM (x_header-frm_bf_adr) IN PROGRAM.
215
    ENDIF.
216
    CHECK vim_skip_adr_maint IS INITIAL.                    "UF120400
217
    CALL FUNCTION 'ADDR_DIALOG_PREPARE'
218
         EXPORTING
219
              field_selection           = vim_addr_field_selection
220
              keywords                  = vim_addr_keywords
221
*             TITLEBAR                  = AM_TITLE
222
              titlebar                  = vim_addr_titlebar
223
              change_default_comm_types = vim_addr_chng_deflt_comm_types
224
              frame_text                = vim_addr_frame_text
225
         TABLES
226
              excluded_functions        = vim_addr_excluded_functions
227
*             ERROR_TABLE               =
228
         EXCEPTIONS
229
              internal_error            = 1
230
              OTHERS                    = 2.
231
    IF am_handletab-maint_mode EQ 'CHANGE' AND
232
       am_handletab-addrnumber NE space.
233
      READ TABLE vim_locked_addresses FROM am_handletab-addrnumber
234
                                      TRANSPORTING NO FIELDS.
235
      IF sy-subrc NE 0.                "not yet locked
236
        CALL FUNCTION 'ADDR_ENQUEUE'
237
             EXPORTING
238
                  address_number    = am_handletab-addrnumber
239
*               MODE_ADRC         = 'E'
240
*               _SCOPE            = '2'
241
*               _WAIT             = ' '
242
*               _COLLECT          = ' '
243
             EXCEPTIONS
244
                  address_not_exist = 1
245
                  foreign_lock      = 2
246
                  system_failure    = 3
247
                  internal_error    = 4.
248
        CASE sy-subrc.
249
          WHEN 0.
250
            INSERT am_handletab-addrnumber INTO TABLE
251
                                           vim_locked_addresses.
252
          WHEN 1.
253
            IF status-action NE anzeigen AND
254
               status-action NE transportieren AND
255
               adrnbr_roflag EQ space.
256
              CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_MESSAGE'
257
                EXPORTING
258
                  diagnosetext1 = svim_text_013"Die Adresse für das Obj:
259
                  diagnosetext2 = <am_key>
260
                  diagnosetext3 = svim_text_014"wurde nicht gefunden.
261
                  textline1     = svim_text_015"Möchten Sie eine neue er
262
                  titel         = svim_text_016"Adresse nicht vorhanden
263
                IMPORTING
264
                  answer        = answer.
265
              IF answer EQ 'J'.
266
                am_handletab-maint_mode = 'CREATE'.
267
                IF <address_number> NP '@NEW*'.
268
                  <am_handle_x>(x_header-keylen) = <f1_x>.
269
*                  am_handletab-handle = <f1>.
270
                  CLEAR am_handletab-addrnumber.
271
                ENDIF.
272
                MODIFY am_handletab INDEX 1.
273
              ELSE.
274
                EXIT.
275
              ENDIF.
276
            ELSE.
277
              MESSAGE i055(sv) WITH <am_key>.
278
              EXIT.
279
            ENDIF.
280
          WHEN 2.
281
            MESSAGE i049(sv) WITH sy-msgv1.
282
            am_handletab-maint_mode = 'DISPLAY'.
283
          WHEN OTHERS.
284
            MESSAGE i050(sv) WITH <am_key>.
285
            am_handletab-maint_mode = 'DISPLAY'.
286
        ENDCASE.
287
      ENDIF.                           "not yet locked
288
    ENDIF. "am_handletab-maint_mode eq 'CHANGE' and no new address
289
    DO.
290
      CALL FUNCTION 'ADDR_DIALOG'
291
           IMPORTING
292
                ok_code           = am_ucomm
293
           TABLES
294
                number_handle_tab = am_handletab
295
*             VALUES            =
296
           EXCEPTIONS
297
                address_not_exist = 1
298
                group_not_valid   = 2
299
                parameter_error   = 3
300
                internal_error    = 4.
301
      CASE sy-subrc.
302
        WHEN 0.
303
          READ TABLE am_handletab INDEX 1.
304
          EXIT.
305
        WHEN 1.
306
          IF status-action NE anzeigen AND
307
             status-action NE transportieren AND
308
             adrnbr_roflag EQ space.
309
            CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_MESSAGE'
310
              EXPORTING
311
                diagnosetext1 = svim_text_013 "Die Adresse für das
312
                diagnosetext2 = <am_key>
313
                diagnosetext3 = svim_text_014"wurde nicht gefunden.
314
                textline1     = svim_text_015"Möchten Sie eine neue er
315
                titel         = svim_text_016"Adresse nicht vorhanden
316
              IMPORTING
317
                answer        = answer.
318
            IF answer EQ 'J'.
319
              READ TABLE am_handletab INDEX 1.
320
              am_handletab-maint_mode = 'CREATE'.
321
              IF <address_number> NP '@NEW*'.
322
                <am_handle_x>(x_header-keylen) = <f1_x>.
323
*                am_handletab-handle = <f1>.
324
                CLEAR am_handletab-addrnumber.
325
              ENDIF.
326
              MODIFY am_handletab INDEX 1.
327
            ELSE.
328
              am_ucomm = 'CANC'.
329
              EXIT.
330
            ENDIF.
331
          ELSE.
332
            MESSAGE i055(sv) WITH <am_key>.
333
            am_ucomm = 'CANC'.
334
            EXIT.
335
          ENDIF.
336
        WHEN OTHERS.
337
          MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno WITH
338
                  sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
339
          am_ucomm = 'CANC'. EXIT.
340
      ENDCASE.
341
    ENDDO.
342
    IF am_handletab-maint_mode EQ 'CHANGE' AND
343
       am_handletab-addrnumber NE space    AND
344
       ( am_ucomm EQ 'CANC' OR am_handletab-updateflag EQ space ).
345
      READ TABLE vim_locked_addresses FROM am_handletab-addrnumber
346
                                      TRANSPORTING NO FIELDS.
347
      IF sy-subrc EQ 0.                "dequeue
348
        CALL FUNCTION 'ADDR_DEQUEUE'
349
               EXPORTING
350
                 address_number    = am_handletab-addrnumber
351
*                MODE_ADRC         = 'E'
352
*                _SCOPE            = '3'
353
*                _SYNCHRON         = ' '
354
*                _COLLECT          = ' '
355
               EXCEPTIONS
356
                 address_not_exist = 1
357
                 internal_error    = 2.
358
      ENDIF.
359
    ENDIF.
360
   IF status-action NE anzeigen AND status-action NE transportieren AND
361
             adrnbr_roflag EQ space.
362
      IF am_ucomm NE 'CANC'.
363
        IF am_handletab-maint_mode EQ 'CREATE'.
364
          <address_number> = '@NEW'.
365
          <address_number>+4(6) = <status>-newadrcnt.
366
          ADD 1 TO <status>-newadrcnt.
367
          <status>-upd_flag = 'X'.
368
        ENDIF.
369
        IF am_handletab-updateflag NE space. "addr. itself is to be save
370
          READ TABLE vim_addresses_to_save
371
                              WITH KEY viewname = x_header-viewname
372
                                       addrnumber = <address_number>
373
                              BINARY SEARCH TRANSPORTING NO FIELDS.
374
          IF sy-subrc NE 0.
375
            vim_addresses_to_save-addrnumber = <address_number>.
376
            CLEAR vim_addresses_to_save-handle.
377
            <vim_addr_handle_x>(x_header-keylen) = <f1_x>.
378
*            vim_addresses_to_save-handle = <f1>.
379
            INSERT vim_addresses_to_save INDEX sy-tabix.
380
          ENDIF.
381
          IF vim_client_state EQ vim_log AND
382
             x_header-flag NE vim_transport_denied.
383
            <status>-upd_flag = 'X'. "nec. for transport of master entry
384
          ENDIF.
385
        ENDIF.
386
      ENDIF.
387
    ENDIF.
388
    CLEAR return.
389
  ENDIF.                               "am_statetab-value eq space.
390
* IF STATUS-ACTION NE KOPIEREN AND STATUS-ACTION NE HINZUFUEGEN.
391
  IF status-action NE kopieren AND status-action NE hinzufuegen AND
392
     vim_single_entry_function NE 'INS'.
393
    IF return NE 4 AND am_ucomm NE 'CANC'.
394
      IF <xmark> EQ markiert.
395
        <xmark> = nicht_markiert.
396
        IF <status>-upd_flag EQ space.
397
          MODIFY extract INDEX exind.
398
          READ TABLE total WITH KEY <vim_xextract_key> BINARY SEARCH.
399
          <mark> = nicht_markiert.
400
          MODIFY total INDEX sy-tabix.
401
        ENDIF.
402
        SUBTRACT: 1 FROM mark_extract,
403
                  1 FROM mark_total.
404
      ENDIF.
405
    ENDIF.
406
    CLEAR function.
407
  ENDIF.
408
ENDFORM.                    "address_maintain