2007 Jul 31 12:56 PM
Hi all, i am using FM to save address, but in FM we have
READ TABLE addr_appl_to_int WITH KEY l_key_h BINARY SEARCH.
addr_appl_to_int i m getting this as blank due to which always getting error .
Any pointers to this will be helpful .
Regards
Taranam
Hi all, i am using FM to save address, but in FM we have
READ TABLE addr_appl_to_int WITH KEY l_key_h BINARY SEARCH.
addr_appl_to_int i m getting this as blank due to which always getting error .
Any pointers to this will be helpful .
Regards
Taranam
2008 May 20 8:55 AM
2008 May 20 9:11 AM
Dear friend
i am seanding you the complete description your
problem pls go through this if help full pls
rewards.
vivek
FUNCTION addr_number_get.
*"----
-
""Lokale Schnittstelle:
*" IMPORTING
*" VALUE(ADDRESS_HANDLE) LIKE SZAD_FIELD-HANDLE
*" VALUE(ADDRESS_REFERENCE) LIKE ADDR_REF STRUCTURE ADDR_REF
*" VALUE(PERSONAL_ADDRESS) LIKE ADRC-PERS_ADDR DEFAULT SPACE
*" VALUE(NUMBERRANGE_NUMBER) LIKE INRI-NRRANGENR DEFAULT '01'
*" VALUE(E071K_WA) LIKE E071K STRUCTURE E071K OPTIONAL
*" VALUE(GENERATE_TRANSPORT_ENTRIES) LIKE SZAD_FIELD-FLAG OPTIONAL
*" VALUE(OWNER) LIKE SZAD_FIELD-FLAG DEFAULT 'X'
*" VALUE(TABLE_NAME) LIKE TSADRV-DDIC_TABLE OPTIONAL
*" VALUE(FIELD_NAME) LIKE TSADRV-DDIC_FIELD OPTIONAL
*" VALUE(OBJKEY) LIKE ADRCS2-OBJKEY OPTIONAL
*" EXPORTING
*" VALUE(ADDRESS_NUMBER) LIKE ADRC-ADDRNUMBER
*" VALUE(RETURNCODE_NUMBERRANGE) LIKE INRI-RETURNCODE
*" TABLES
*" E071K_TAB STRUCTURE E071K OPTIONAL
*" EXCEPTIONS
*" ADDRESS_HANDLE_NOT_EXIST
*" INTERNAL_ERROR
*" PARAMETER_ERROR
*"----
-
DATA: read_index LIKE sy-tabix,
insert_index LIKE sy-tabix,
max_lines LIKE sy-tabix,
default_address_index LIKE sy-tabix,
ref_index LIKE sy-tabix.
DATA: person_number LIKE adrp-persnumber. "*918d
DATA: lv_pnr LIKE ixadcp-pnr. "*918i
DATA: default_found TYPE t_boole.
MOVE c_no TO default_found.
DATA: early_date LIKE adrc-date_from.
Initialisierung der FG sicherstellen
PERFORM check_for_initialization.
Gültigkeit des ADDRESS_HANDLE prüfen
MOVE address_handle TO l_key_h-handle.
READ TABLE addr_appl_to_int WITH KEY l_key_h BINARY SEARCH.
IF sy-subrc = 0.
read_index = sy-tabix.
early_date = addr_appl_to_int-date_from.
DESCRIBE TABLE addr_appl_to_int LINES max_lines.
ELSE.
MESSAGE e030 WITH address_handle RAISING address_handle_not_exist.
ENDIF.
Gültigkeit von ADDRESS_REFERENCE prüfen
IF ADDRESS_HANDLE(20) <> C_PERSONAL_ADDRESS_HANDLE. "*114d
IF PERSONAL_ADDRESS = C_NO. "114i"400d
IF address_reference = space.
MESSAGE e056 RAISING parameter_error.
ENDIF.
IF address_reference-appl_key = space
AND address_reference(20) <> c_address_reference_root.
MESSAGE e281 RAISING parameter_error.
ENDIF.
ENDIF. "*400d
Prüfen, ob Tabelle/Feld gültig sind
IF NOT address_reference IS INITIAL.
PERFORM check_reference USING address_reference-appl_table
address_reference-appl_field.
ENDIF.
Adreßgruppe muß gültig sein
PERFORM check_address_group_valid
USING address_reference-addr_group.
Prüfen, ob Gruppe gleich ADRC-ADDRGROUP
Prüfen der Nummernkreisnummer
IF numberrange_number <> '01' AND numberrange_number <> '10'.
MESSAGE e278 WITH numberrange_number RAISING parameter_error.
ENDIF.
Ziehen der Nummer
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
nr_range_nr = numberrange_number
object = 'ADRNR'
IMPORTING
number = address_number
returncode = returncode_numberrange
EXCEPTIONS
interval_not_found = 01
number_range_not_intern = 02
object_not_found = 03
quantity_is_0 = 04
OTHERS = 99.
IF sy-subrc <> 0.
MESSAGE a885 WITH 'NUMBER_GET_NEXT' RAISING internal_error.
ENDIF.
734i+
If the number is still initial then it must not be happened,
dump must occur, otherwise database inconsistent.
IF address_number IS INITIAL.
MESSAGE x885 WITH 'NUMBER_GET_NEXT' .
ENDIF.
734i-
Keine Message zum Nummernkreis-Returncode; dies bleibt dem
rufenden Programm vorbehalten, das einen evtl. Dialog steuert.
Austauschen des Handles durch die Nummer:
Lesen der ADDR_APPL_TO_INT-Einträge zum ADDRESS_HANDLE
(dabei Default_address_index ermitteln!)
PERFORM read_table_index_i
TABLES addr_appl_to_int
USING 'ADDR_APPL_TO_INT'
read_index.
WHILE addr_appl_to_int-addr_handle = address_handle.
IF default_found = c_no
AND addr_appl_to_int-date_from <> early_date.
MESSAGE a893 RAISING internal_error.
ENDIF.
IF addr_appl_to_int-date_from = early_date
AND addr_appl_to_int-nation = space.
default_address_index = addr_appl_to_int-anr.
default_found = c_yes.
ENDIF.
Erzeugen des ADDR_EXT_TO_INT-Eintrages:
MOVE address_number TO l_key_ndn-number.
MOVE addr_appl_to_int-date_from TO l_key_ndn-date_from.
MOVE addr_appl_to_int-nation TO l_key_ndn-nation.
PERFORM get_table_index_for_insert
TABLES addr_ext_to_int
USING 'ADDR_EXT_TO_INT'
l_key_ndn
CHANGING insert_index.
MOVE space TO addr_ext_to_int.
MOVE address_number TO addr_ext_to_int-addrnumber.
MOVE addr_appl_to_int-date_from TO addr_ext_to_int-date_from.
MOVE addr_appl_to_int-nation TO addr_ext_to_int-nation.
MOVE addr_appl_to_int-anr TO addr_ext_to_int-anr.
PERFORM insert_tab_index_i
TABLES addr_ext_to_int
USING 'ADDR_EXT_TO_INT'
insert_index.
Eintragen der Nummer in IADRC und Löschen
des Handle in IADRC:
Also check that Parameter PERSONAL_ADDRESS
is set correctly
PERFORM read_table_index_i
TABLES iadrc
USING 'IADRC'
addr_appl_to_int-anr.
IF personal_address <> iadrc-pers_addr. "*114i
IF personal_address = c_yes. "*114i
MESSAGE e015 RAISING parameter_error. "*114i
ELSE. "*114i
MESSAGE e011 RAISING parameter_error. "*114i
ENDIF. "*114i
ENDIF. "*114i
MOVE address_number TO iadrc-addrnumber.
MOVE space TO iadrc-address_handle.
PERFORM modify_tab_index_i
TABLES iadrc
USING 'IADRC'
addr_appl_to_int-anr.
Löschen des ADDR_APPL_TO_INT-Eintrages:
DELETE addr_appl_to_int INDEX read_index.
nächsten ADDR_APPL_TO_INT-Satz für
Schleifenverarbeitung lesen:
IF read_index >= max_lines.
EXIT.
ELSE.
max_lines = max_lines - 1.
ENDIF.
PERFORM read_table_index_i
TABLES addr_appl_to_int
USING 'ADDR_APPL_TO_INT'
read_index.
ENDWHILE.
CALL FUNCTION 'ADDR_CONTAINER_REPLACE_HANDLE' "*412i
EXPORTING "*412i
address_handle = address_handle "*412i
address_number = address_number. "*412i
Verteilung der Adreßnummer
In allen Datentabellen Ixxxx die Adreßnummer eintragen:
IADRC wurde oben bereits behandelt, dabei IADRC-ADDRESS_HANDLE
jeweils gelöscht.
distribute_address_number adrct.
distribute_address_number adcp.
distribute_address_number adr2.
distribute_address_number adr3.
distribute_address_number adr4.
distribute_address_number adr5.
distribute_address_number adr6.
distribute_address_number adr7.
distribute_address_number adr8.
distribute_address_number adr9.
distribute_address_number adr10. "*178i
distribute_address_number adr11. "*178i
distribute_address_number adr12. "*178i
distribute_address_number adr13. "*178i
distribute_address_number adrt.
distribute_address_number adru. "*981i
distribute_address_number adrcomc.
distribute_address_number adrg.
**----
"209i+"918d+
LOOP AT iadrc WHERE op_code NE c_ignore
AND op_code NE c_skip
AND pers_addr EQ space.
PERFORM collect_cd_1_tab USING iadrc-addrnumber
address_handle.
ENDLOOP.
LOOP AT iadcp WHERE op_code NE c_ignore
AND op_code NE c_skip
AND addrnumber = address_number
AND persnumber NE space.
IF iadcp-comp_pers = 'P'.
PERFORM collect_cd_2_tab USING iadcp-addrnumber
iadcp-persnumber
address_handle
space.
ELSE.
PERFORM collect_cd_3_tab USING iadcp-addrnumber
iadcp-persnumber
address_handle
space.
ENDIF.
ENDLOOP.
**----
"209i-"918d-
Die Tabellen CD__TAB müssen gefüllt werden. "918i
"*918i
Da zu der fraglichen Adresse gerade erst die "*918i
Adressnummer gezogen wurde, muß sie noch mit existenten "*918i
Sätzen im lokalen Gedächtnis stehen, also reicht der "*918i
Zugriff über ADDR_EXT_TO_INT. "*918i
"*918i
Für die gezogene Adressnummer darf nur dann ein "*918i
CD_1_TAB-Eintrag erstellt werden, wenn die "*918i
zugehörige Adresse eine Oragnisationsadresse ist. "*918i
"*918i
READ TABLE addr_ext_to_int "*918i
WITH KEY addrnumber = address_number "*918i
date_from = c_default_date_from "*918i
nation = space "*918i
BINARY SEARCH. "*918i
IF sy-subrc <> 0. "*918i
MESSAGE a892 WITH 'ADDR_EXT_TO_INT' "*918i
RAISING internal_error. "*918i
ENDIF. "*918i
PERFORM read_table_index_i "*918i
TABLES iadrc "*918i
USING 'IADRC' "*918i
addr_ext_to_int-anr. "*918i
IF iadrc-pers_addr IS INITIAL. "*918i
PERFORM collect_cd_1_tab "*918i
USING iadrc-addrnumber "*918i
address_handle. "*918i
ENDIF. "*918i
Wenn zu die Adresse eine Personenadresse ist, muß ein "*918i
CD_2_TAB-Eintrag erstelt werden, wenn es eine "*918i
Organisationsadresse mit Ansprechpartnern ist benötigen "*918i
wir einen CD_3_TAB-Eintrag. "*918i
"*918i
READ TABLE ixadcp "*918i
WITH KEY anr = addr_ext_to_int-anr "*918i
BINARY SEARCH. "*918i
read_index = sy-tabix. "*918i
IF sy-subrc = 0. "*918i
Es gibt Typ2 oder Typ3-Adressen zu der Adressnummer "*918i
DESCRIBE TABLE ixadcp LINES max_lines. "*918i
CLEAR lv_pnr. "*918i
WHILE ixadcp-anr = addr_ext_to_int-anr. "*918i
IF ixadcp-pnr <> lv_pnr. "*918i
lv_pnr = ixadcp-pnr. "*918i
PERFORM read_table_index_i "*918i
TABLES iadcp "*918i
USING 'IADCP' "*918i
ixadcp-index. "*918i
IF NOT iadcp-persnumber IS INITIAL. "*918i
CASE iadcp-comp_pers. "*918i
WHEN c_personal_relation. "*918i
PERFORM collect_cd_2_tab "*918i
USING iadcp-addrnumber "*918i
iadcp-persnumber "*918i
address_handle "*918i
space. "*918i
WHEN c_company_relation. "*918i
PERFORM collect_cd_3_tab "*918i
USING iadcp-addrnumber "*918i
iadcp-persnumber "*918i
address_handle "*918i
space. "*918i
WHEN OTHERS. "*918i
MESSAGE a890 WITH 'IADCP-COMP_PERS' "*918i
RAISING internal_error. "*918i
ENDCASE. "*918i
ELSE. "*918i
Zu der Person wurde noch keine Nummer gezogen. "*918i
Die CD_2/3_TAB-Einträge werden erst im "*918i
ADDR_PERSON_NUMBER_GET geschrieben. "*918i
ENDIF. "*918i
ENDIF. "*918i
read_index = read_index + 1. "*918i
exitif read_index > max_lines. "*918i
READ TABLE ixadcp INDEX read_index. "*918i
ENDWHILE. "*918i
ENDIF. "*918i
--------------------------- COMM_A_IN_MEMORY pflegen (s.u.)
(nicht für persönliche Adressen)"*078i
IF ADDRESS_HANDLE(20) = 'ADRC ADRP ADDRNUMBER'. "*078i
ELSE. "*078i
*114i+
IF PERSONAL_ADDRESS = C_YES. "*123d
COMM_A_P_IN_MEMORY pflegen bei pers. Adr.
... und bei Firmenadressen, die"*123i+
nachträglich angelegt und existierenden
Personen zugeordnet wurden (z.B. bei
SAP-Benutzern) "*123i-
CLEAR person_number. "*918d+
LOOP AT iadcp WHERE addrnumber = address_number.
AND COMP_PERS = 'P'. "*123d
IF iadcp-persnumber = person_number
OR iadcp-persnumber = space.
ELSE. "*918d-
Es müssen Einträge für COMM_A_P_IN_MEMORY erzeugt werden, "*918i
falls für die zugehörigen Personen schon Nummern "*918i
gezogen wurden. "*918i
"*918i
READ TABLE addr_ext_to_int "*918i
WITH KEY addrnumber = address_number "*918i
date_from = c_default_date_from "*918i
nation = space "*918i
BINARY SEARCH. "*918i
IF sy-subrc <> 0. "*918i
MESSAGE a892 WITH 'ADDR_EXT_TO_INT' "*918i
RAISING internal_error. "*918i
ENDIF. "*918i
READ TABLE ixadcp "*918i
WITH KEY anr = addr_ext_to_int-anr "*918i
BINARY SEARCH. "*918i
read_index = sy-tabix. "*918i
IF sy-subrc = 0. "*918i
Es gibt Typ2 oder Typ3-Adressen zu der Adressnummer "*918i
DESCRIBE TABLE ixadcp LINES max_lines. "*918i
CLEAR lv_pnr. "*918i
WHILE ixadcp-anr = addr_ext_to_int-anr. "*918i
IF ixadcp-pnr <> lv_pnr. "*918i
lv_pnr = ixadcp-pnr. "*918i
PERFORM read_table_index_i "*918i
TABLES iadcp "*918i
USING 'IADCP' "*918i
ixadcp-index. "*918i
IF NOT iadcp-persnumber IS INITIAL. "*918i
MOVE address_number TO l_key_nn-addrnumber.
MOVE iadcp-persnumber TO l_key_nn-persnumber.
PERFORM get_table_index_for_insert
TABLES comm_a_p_in_memory
USING 'COMM_A_P_IN_MEMORY'
l_key_nn
CHANGING insert_index.
MOVE address_number TO comm_a_p_in_memory-addrnumber.
MOVE iadcp-persnumber TO comm_a_p_in_memory-persnumber.
MOVE c_on TO comm_a_p_in_memory-tel_flag.
MOVE c_on TO comm_a_p_in_memory-fax_flag.
MOVE c_on TO comm_a_p_in_memory-ttx_flag.
MOVE c_on TO comm_a_p_in_memory-tlx_flag.
MOVE c_on TO comm_a_p_in_memory-smtp_flag.
MOVE c_on TO comm_a_p_in_memory-rml_flag.
MOVE c_on TO comm_a_p_in_memory-x400_flag.
MOVE c_on TO comm_a_p_in_memory-rfc_flag.
MOVE c_on TO comm_a_p_in_memory-prt_flag."*178i
MOVE c_on TO comm_a_p_in_memory-ssf_flag."*178i
MOVE c_on TO comm_a_p_in_memory-uri_flag."*178i
MOVE c_on TO comm_a_p_in_memory-pag_flag."*178i
PERFORM insert_tab_index_i
TABLES comm_a_p_in_memory
USING 'COMM_A_P_IN_MEMORY'
insert_index.
ELSE. "*918i
Zu der Person wurde noch keine Nummer gezogen. "*918i
Die CD_2/3_TAB-Einträge werden erst im "*918i
ADDR_PERSON_NUMBER_GET geschrieben. "*918i
ENDIF. "*918i
ENDIF. "*918i
read_index = read_index + 1. "*918i
exitif read_index > max_lines. "*918i
READ TABLE ixadcp INDEX read_index. "*918i
ENDWHILE. "*918i
ENDIF. "*918i
ENDIF. "*918d
person_number = iadcp-persnumber. "*918d
ENDLOOP. "*918d
*114i-
ELSE. "114i"123d
IF personal_address = c_no. "*123i
MOVE address_number TO l_key_n-number.
PERFORM get_table_index_for_insert
TABLES comm_a_in_memory
USING 'COMM_A_IN_MEMORY'
l_key_n
CHANGING insert_index.
MOVE address_number TO comm_a_in_memory-addrnumber.
DEFINE comm_a_in_memory_insert_new.
PERFORM READ_TABLE_INDEX_I "*056d
TABLES IADRC "*056d
USING 'IADRC' "*056d
DEFAULT_ADDRESS_INDEX. "*056d
IF IADRC-FLAGCOMM&1 = 'X'. "*056d
MOVE 'X' TO COMM_A_IN_MEMORY-&2_FLAG. "*056d
ENDIF. "*056d
move c_on to comm_a_in_memory-&1_flag. "*056i
END-OF-DEFINITION.
COMM_A_IN_MEMORY_INSERT_NEW 2 TEL. "*056d
comm_a_in_memory_insert_new tel.
comm_a_in_memory_insert_new fax.
comm_a_in_memory_insert_new ttx.
comm_a_in_memory_insert_new tlx.
comm_a_in_memory_insert_new smtp.
comm_a_in_memory_insert_new rml.
comm_a_in_memory_insert_new x400.
comm_a_in_memory_insert_new rfc.
comm_a_in_memory_insert_new prt. "*178i
comm_a_in_memory_insert_new ssf. "*178i
comm_a_in_memory_insert_new uri. "*178i
comm_a_in_memory_insert_new pag. "*178i
PERFORM insert_tab_index_i
TABLES comm_a_in_memory
USING 'COMM_A_IN_MEMORY'
insert_index.
ENDIF. "*078i
Da dieser FB auch für das Ziehen der Nummern für persönliche
Adressen verwendet wird, darf für diese Fälle kein Eintrag in den
Verwendungsnachweis erfolgen:
IF ADDRESS_HANDLE(20) = 'ADRC ADRP ADDRNUMBER'. "*114d
if personal_address = c_yes. "114i"236d
else. "*236d
Eintrag in den Verwendungsnachweis erzeugen
Der Eintrag muß der erste sein (Nummer gerade gezogen), also kriegt
er laufende Nummer = 1 (Owner) bzw. 2 (Nicht-Owner).
Alle weiteren Verwendungen (FB ADDR_REFERENCE_INSERT) ziehen"*102i
eine interne Nummer aus Nummernkreis '01', Objekt 'ADRV'. "*102i
Der Nummernkreis wird mit Von-Nummer 1000000000 ausgeliefert bzw.
on-the-fly angelegt (FB ADDR_RFERENCE_INSERT)
Die Owner-Objekte kriegen hier automatisch das explizite Owner-Flag
in der ADRV (Nummernziehen = Anlegen = Besitzen).
MOVE space TO iadrv.
MOVE sy-mandt TO iadrv-client.
MOVE address_number TO iadrv-addrnumber.
IF owner = c_yes. "*189i
MOVE '0000000001' TO iadrv-consnumber.
ELSE. "*189i
MOVE '0000000002' TO iadrv-consnumber. "*189i
ENDIF. "*189i
MOVE address_reference-appl_table TO iadrv-appl_table.
MOVE address_reference-appl_field TO iadrv-appl_field.
MOVE address_reference-appl_key TO iadrv-appl_key.
MOVE address_reference-addr_group TO iadrv-addr_group.
IF owner = c_yes.
MOVE c_yes TO iadrv-owner.
ELSE.
MOVE c_no TO iadrv-owner.
ENDIF.
PERFORM op_code_insert CHANGING iadrv-op_code. "*008i
APPEND iadrv.
DESCRIBE TABLE iadrv LINES ref_index.
MOVE default_address_index TO l_key_ir-index.
MOVE iadrv-consnumber TO l_key_ir-consnumber.
PERFORM get_table_index_for_insert
TABLES ixadrv
USING 'IXADRV'
l_key_ir
CHANGING insert_index.
CLEAR ixadrv. "*506i
MOVE space TO ixadrv. "*506d
MOVE default_address_index TO ixadrv-anr.
MOVE iadrv-consnumber TO ixadrv-consnumber.
MOVE ref_index TO ixadrv-index.
*007d PERFORM MODIFY_TAB_INDEX_I
*007d TABLES IXADRV
*007d USING 'IXADRV'
*007d INSERT_INDEX.
PERFORM insert_tab_index_i "*007i
TABLES ixadrv "*007i
USING 'IXADRV' "*007i
insert_index. "*007i
endif. "ADDRESS_HANDLE(20) = 'ADRC ADRP ADDRNUMBER'. "*236d
Falls möglich, sollen jetzt schon die SO_KEYS gezogen "*1056i
werden. "*1056i
LOOP AT iadcp "*1056i
WHERE addrnumber = address_number "*1056i
AND persnumber <> space "*1056i
AND nation = space "*1056i
AND so_key = space "*1056i
AND op_code <> c_ignore "*1056i
AND op_code <> c_delete. "*1056i
PERFORM get_number_for_so_key "*1056i
USING iadcp-addrnumber "*1056i
iadcp-persnumber. "*1056i
ENDLOOP. "*1056i
**383i+
--------------------------- ADRV_IN_MEMORY pflegen
MOVE address_number TO l_key_n-number.
PERFORM get_table_index_for_insert
TABLES adrv_in_memory
USING 'ADRV_IN_MEMORY'
l_key_n
CHANGING insert_index.
CLEAR adrv_in_memory.
MOVE address_number TO adrv_in_memory-addrnumber.
MOVE 'X' TO adrv_in_memory-read_flag.
PERFORM modify_tab_index_i
TABLES adrv_in_memory
USING 'ADRV_IN_MEMORY'
insert_index.
**383i-
Erzeugen Transport-Einträge
IF NOT generate_transport_entries IS INITIAL.
CALL FUNCTION 'ADDR_TRANSPORT_ENTRIES'
EXPORTING
addrnumber = address_number
e071k_wa = e071k_wa
table_name = table_name
field_name = field_name
objkey = objkey
TABLES
e071k_tab = e071k_tab
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
MESSAGE a885 WITH 'ADDR_TRANSPORT_ENTRIES' RAISING internal_error.
ENDIF.
ENDIF.
ENDFUNCTION.
2008 May 20 9:33 AM
Thanks for your reaction, but this is just the code of the FM.
When calling this FM after calling the FM
ADDR_INSERT.
I got the error that the handle is not correct, but this is because in the FM addr_appl_to_int is empty. but why?
READ TABLE addr_appl_to_int WITH KEY l_key_h BINARY SEARCH.
IF sy-subrc = 0.
read_index = sy-tabix.
early_date = addr_appl_to_int-date_from.
DESCRIBE TABLE addr_appl_to_int LINES max_lines.
ELSE.
MESSAGE e030 WITH address_handle RAISING address_handle_not_exist.
ENDIF.
2015 Apr 14 6:37 AM
| User | Count |
|---|---|
| 3 | |
| 2 | |
| 2 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 |