Загрузка данных
FUNCTION SD_CUSTOMER_CHECK.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" VALUE(PI_BAPIKNA101) LIKE BAPIKNA101
*" STRUCTURE BAPIKNA101
*" VALUE(PI_BAPIKNA102) LIKE BAPIKNA102
*" STRUCTURE BAPIKNA102
*" EXPORTING
*" VALUE(PE_COUNTRY) LIKE BAPIKNA101-COUNTRY
*" VALUE(PE_LANGUAGE) LIKE BAPIKNA101-LANGU
*" VALUE(PE_CURRENCY) LIKE BAPIKNA101-CURRENCY
*" VALUE(PE_RETURN) LIKE BAPIRETURN STRUCTURE BAPIRETURN
*"----------------------------------------------------------------------
*
*-(1) initial routines-------------------------------------------------*
*
* (i) data declaration: fields, items, tables:
*
DATA: ADDRESS_01 LIKE BAPIKNA101,
ADDRESS_02 LIKE BAPIKNA102,
COUNTRY LIKE BAPIKNA101-COUNTRY, "01
COUNTRY_UNIQUE_FLAG LIKE BDWFAP_PAR-CALLTRANS, "..
LANGUAGE LIKE BAPIKNA101-LANGU,
CURRENCY LIKE BAPIKNA101-CURRENCY,
CURRENCY_UNIQUE_FLAG LIKE BDWFAP_PAR-CALLTRANS, "01
BUKRS LIKE TVKO-BUKRS, "..
TEL1_EXT LIKE BAPIKNA101_1-TEL1_EXT,
FAX_EXTENS LIKE BAPIKNA101_1-FAX_EXTENS,
NUMBER_NORMAL LIKE ADR2-TELNR_LONG, "..
WORST_ERROR LIKE ADDR_ERROR-MSG_TYPE, "01
CHAR1 TYPE C,
I_BAPIADDR2 LIKE BAPIADDR2, "01
T_MESSAGES LIKE ADDR_ERROR OCCURS 0 WITH HEADER LINE, "01
BEGIN OF DPLTAB OCCURS 3,
KUNNR LIKE KNA1-KUNNR,
NAME1 LIKE KNA1-NAME1,
STRAS LIKE KNA1-STRAS,
PSTLZ LIKE KNA1-PSTLZ,
ORT01 LIKE KNA1-ORT01,
LAND1 LIKE KNA1-LAND1,
END OF DPLTAB.
STATICS: MCOD1 LIKE KNA1-MCOD1,
MCOD2 LIKE KNA1-MCOD2,
MCOD3 LIKE KNA1-MCOD3.
CLEAR PE_RETURN.
*
* (ii) fill data
*
ADDRESS_01 = PI_BAPIKNA101.
ADDRESS_02 = PI_BAPIKNA102.
*
*-(2) Checks:----------------------------------------------------------*
*
* (a) required data:
*
IF ADDRESS_01-NAME IS INITIAL
OR ADDRESS_01-CITY IS INITIAL.
PE_RETURN-TYPE = 'E'.
SY-MSGID = C_MSG_ID.
SY-MSGNO = '827'.
SY-MSGV1 = SPACE.
SY-MSGV2 = SPACE.
SY-MSGV3 = SPACE.
SY-MSGV4 = SPACE.
ELSE.
ENDIF.
CHECK PE_RETURN IS INITIAL.
IF ADDRESS_01-COUNTRY IS INITIAL
AND ADDRESS_01-COUNTRYISO IS INITIAL.
***** and address_01-countrniso eq space "01
***** and address_01-countraiso eq space. "01
PE_RETURN-TYPE = 'E'.
SY-MSGID = C_MSG_ID.
SY-MSGNO = '827'.
SY-MSGV1 = SPACE.
SY-MSGV2 = SPACE.
SY-MSGV3 = SPACE.
SY-MSGV4 = SPACE.
ELSE.
ENDIF.
CHECK PE_RETURN IS INITIAL.
*
* (b) "internal" checks: Structure address_01 / address_02
* (i) required data:
* - language
*
IF ADDRESS_01-LANGU IS INITIAL
AND ADDRESS_01-LANGU_ISO IS INITIAL.
PE_RETURN-TYPE = 'E'.
SY-MSGID = C_MSG_ID.
SY-MSGNO = '885'.
SY-MSGV1 = 'PI_ADDRESS'.
SY-MSGV2 = SPACE.
SY-MSGV3 = SPACE.
SY-MSGV4 = SPACE.
ENDIF.
CHECK PE_RETURN IS INITIAL.
*
* - reference customer
*
CALL FUNCTION 'VIEW_KNA1'
EXPORTING
KUNDE = ADDRESS_02-REF_CUSTMR
IMPORTING
ANSCHRIFT = KNA1
EXCEPTIONS
NO_KNA1 = 1
ERROR_MESSAGE = 2.
CASE SY-SUBRC.
WHEN 1 OR 2.
PE_RETURN-TYPE = 'E'.
SY-MSGID = C_MSG_ID.
SY-MSGNO = '890'.
SY-MSGV1 = SPACE. "02(ii)
SY-MSGV2 = SPACE.
SY-MSGV3 = SPACE.
SY-MSGV4 = SPACE.
ENDCASE.
CHECK PE_RETURN IS INITIAL.
*
* - sales organisation
*
SELECT * FROM TVKO
WHERE VKORG = ADDRESS_02-SALESORG.
ENDSELECT.
IF SY-SUBRC <> 0.
PE_RETURN-TYPE = 'E'.
SY-MSGID = C_MSG_ID.
SY-MSGNO = '892'.
SY-MSGV1 = SPACE. "02(ii)
SY-MSGV2 = SPACE.
SY-MSGV3 = SPACE.
SY-MSGV4 = SPACE.
ELSE. "01
BUKRS = TVKO-BUKRS. "01
ENDIF.
CHECK PE_RETURN IS INITIAL.
*
* - company code data
*
IF NOT ADDRESS_01-INTERNET IS INITIAL. "#1
SELECT * FROM KNB1 "..
WHERE KUNNR EQ ADDRESS_02-REF_CUSTMR
AND BUKRS EQ BUKRS.
ENDSELECT.
IF SY-SUBRC <> 0.
PE_RETURN-TYPE = 'E'.
SY-MSGID = C_MSG_ID.
SY-MSGNO = '889'. "02(ii)
SY-MSGV1 = SPACE. "02(ii)
SY-MSGV2 = SPACE.
SY-MSGV3 = SPACE.
SY-MSGV4 = SPACE.
ENDIF.
CHECK PE_RETURN IS INITIAL. "..
ENDIF. "01
*
* - distribution channel and division
*
VTCOM-MANDT = SY-MANDT.
VTCOM-KUNNR = ADDRESS_02-REF_CUSTMR.
VTCOM-VKORG = ADDRESS_02-SALESORG.
VTCOM-VTWEG = ADDRESS_02-DISTR_CHAN.
VTCOM-SPART = ADDRESS_02-DIVISION.
CALL FUNCTION 'VIEW_KNVV'
EXPORTING
COMWA = VTCOM
IMPORTING
KNVV_WA = KNVV
EXCEPTIONS
NO_KNVV = 1
ERROR_MESSAGE = 2.
CASE SY-SUBRC.
WHEN 1 OR 2.
PE_RETURN-TYPE = 'E'.
SY-MSGID = C_MSG_ID.
SY-MSGNO = '893'.
SY-MSGV1 = SPACE. "02(ii)
SY-MSGV2 = SPACE.
SY-MSGV3 = SPACE.
SY-MSGV4 = SPACE.
ENDCASE.
CHECK PE_RETURN IS INITIAL.
*
* - for reference customer entry in tax table KNVI
*
SELECT * FROM KNVI
WHERE KUNNR EQ ADDRESS_02-REF_CUSTMR.
ENDSELECT.
IF SY-SUBRC <> 0.
PE_RETURN-TYPE = 'E'.
SY-MSGID = C_MSG_ID.
SY-MSGNO = '891'. "02(ii)
SY-MSGV1 = SPACE. "02(ii)
SY-MSGV2 = SPACE.
SY-MSGV3 = SPACE.
SY-MSGV4 = SPACE.
ENDIF.
CHECK PE_RETURN IS INITIAL.
*
* (c) "external" checks: Structure address_01
* (i) data checks:
* (1) check data: country valid
*
***** Comment: In the following the field address_01-country "01
* has the same value like the value which will "..
* be write in the data-base file KNA1
*
* if address_01-country eq space.
* if address_01-countrniso eq space.
* address_01-country = address_01-countraiso.
* else.
* address_01-country = address_01-countrniso.
* endif.
***** endif.
* If countryiso is not initial call convert function
* currency_code_iso_to_sap.
* If at the same time country is initial carry out the
* following checks with the convert value of countryiso
*
IF NOT ADDRESS_01-COUNTRYISO IS INITIAL.
CALL FUNCTION 'COUNTRY_CODE_ISO_TO_SAP'
EXPORTING
ISO_CODE = ADDRESS_01-COUNTRYISO
IMPORTING
SAP_CODE = COUNTRY
UNIQUE = COUNTRY_UNIQUE_FLAG
EXCEPTIONS
NOT_FOUND = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
PE_RETURN-TYPE = 'E'.
SY-MSGID = C_MSG_ID.
SY-MSGNO = '013'.
SY-MSGV1 = ADDRESS_01-COUNTRYISO.
SY-MSGV2 = SPACE.
SY-MSGV3 = SPACE.
SY-MSGV4 = SPACE.
ENDIF.
CHECK PE_RETURN IS INITIAL.
ENDIF.
IF ADDRESS_01-COUNTRY IS INITIAL.
ADDRESS_01-COUNTRY = COUNTRY. "..
ENDIF. "01
IF T005-LAND1 NE ADDRESS_01-COUNTRY.
SELECT SINGLE * FROM T005 WHERE LAND1 = ADDRESS_01-COUNTRY.
IF SY-SUBRC NE 0.
PE_RETURN-TYPE = 'E'.
SY-MSGID = C_MSG_ID.
SY-MSGNO = '013'.
SY-MSGV1 = ADDRESS_01-COUNTRY.
SY-MSGV2 = SPACE.
SY-MSGV3 = SPACE.
SY-MSGV4 = SPACE.
ENDIF.
ENDIF.
CHECK PE_RETURN IS INITIAL.
*
* (2) Check datas: country / postal_code
* (fct. module from group SSRV)
CALL FUNCTION 'POSTAL_CODE_CHECK'
EXPORTING
COUNTRY = ADDRESS_01-COUNTRY
ONE_TIME_ACCOUNT = ' '
POSTAL_CODE = ADDRESS_01-POSTL_CODE
EXCEPTIONS
NOT_VALID = 4
ERROR_MESSAGE = 5
OTHERS = 1.
CASE SY-SUBRC.
WHEN 4 OR 5.
*
* remark: subscreens can not support positioning of the cursor,
* hence: set cursor field 'g_pstlz' has no meaning.
*
PE_RETURN-TYPE = 'E'.
ENDCASE.
CHECK PE_RETURN IS INITIAL.
*
* (3) postal code essential ?
*
IF ADDRESS_01-POSTL_CODE IS INITIAL.
IF NOT ADDRESS_01-COUNTRY IS INITIAL.
IF T005-LAND1 <> ADDRESS_01-COUNTRY.
SELECT SINGLE * FROM T005 WHERE LAND1 = ADDRESS_01-COUNTRY.
IF SY-SUBRC <> 0.
PE_RETURN-TYPE = 'E'.
SY-MSGID = C_MSG_ID.
SY-MSGNO = '013'.
SY-MSGV1 = ADDRESS_01-COUNTRY.
SY-MSGV2 = SPACE.
SY-MSGV3 = SPACE.
SY-MSGV4 = SPACE.
ENDIF.
ENDIF.
IF T005-LNPLZ > 0.
PE_RETURN-TYPE = 'E'.
SY-MSGID = C_MSG_ID.
SY-MSGNO = '200'.
SY-MSGV1 = SPACE.
SY-MSGV2 = SPACE.
SY-MSGV3 = SPACE.
SY-MSGV4 = SPACE.
ENDIF.
ENDIF.
ENDIF.
CHECK PE_RETURN IS INITIAL.
*
* (4) cross-check country / region
*
IF NOT ADDRESS_01-REGION IS INITIAL
AND NOT ADDRESS_01-COUNTRY IS INITIAL.
SELECT SINGLE * FROM T005S WHERE LAND1 = ADDRESS_01-COUNTRY
AND BLAND = ADDRESS_01-REGION.
IF SY-SUBRC NE 0.
PE_RETURN-TYPE = 'E'.
SY-MSGID = C_MSG_ID.
SY-MSGNO = '031'.
SY-MSGV1 = ADDRESS_01-REGION.
SY-MSGV2 = ADDRESS_01-COUNTRY.
SY-MSGV3 = SPACE.
SY-MSGV4 = SPACE.
ENDIF.
ENDIF.
CHECK PE_RETURN IS INITIAL.
*
* (5) check e-mail address
*
IF NOT ADDRESS_01-INTERNET IS INITIAL.
IF ADDRESS_01-INTERNET CS '@'.
ELSE.
PE_RETURN-TYPE = 'E'.
SY-MSGID = C_MSG_ID.
SY-MSGNO = '830'.
SY-MSGV1 = ADDRESS_01-INTERNET.
SY-MSGV2 = SPACE.
SY-MSGV3 = SPACE.
SY-MSGV4 = SPACE.
ENDIF.
ENDIF.
CHECK PE_RETURN IS INITIAL.
*
* (6) check date of birth is valid
*
IF NOT ADDRESS_01-DATE_BIRTH IS INITIAL.
IF ADDRESS_01-DATE_BIRTH GT SY-DATUM.
PE_RETURN-TYPE = 'E'.
SY-MSGID = C_MSG_ID.
SY-MSGNO = '835'.
SY-MSGV1 = SPACE.
SY-MSGV2 = SPACE.
SY-MSGV3 = SPACE.
SY-MSGV4 = SPACE.
ENDIF.
ENDIF.
CHECK PE_RETURN IS INITIAL.
* "01
* (7) check language and language iso "..
*
* If language iso is not initial call convert function
* language_code_iso_to_sap.
* If at the same time language is initial carry out the
* following checks with the convert value of language iso
*
IF NOT ADDRESS_01-LANGU_ISO IS INITIAL.
CALL FUNCTION 'LANGUAGE_CODE_ISO_TO_SAP'
EXPORTING
ISO_CODE = ADDRESS_01-LANGU_ISO
IMPORTING
SAP_CODE = LANGUAGE
EXCEPTIONS
NOT_FOUND = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
PE_RETURN-TYPE = 'E'.
SY-MSGID = C_MSG_ID.
SY-MSGNO = '016'.
SY-MSGV1 = ADDRESS_01-LANGU_ISO.
SY-MSGV2 = SPACE.
SY-MSGV3 = SPACE.
SY-MSGV4 = SPACE.
ENDIF.
CHECK PE_RETURN IS INITIAL.
ENDIF.
IF ADDRESS_01-LANGU IS INITIAL.
ADDRESS_01-LANGU = LANGUAGE.
ENDIF.
IF T002-SPRAS NE ADDRESS_01-LANGU .
SELECT SINGLE * FROM T002 WHERE SPRAS = ADDRESS_01-LANGU.
IF SY-SUBRC NE 0.
PE_RETURN-TYPE = 'E'.
SY-MSGID = C_MSG_ID.
SY-MSGNO = '016'.
SY-MSGV1 = ADDRESS_01-LANGU.
SY-MSGV2 = SPACE.
SY-MSGV3 = SPACE.
SY-MSGV4 = SPACE.
ENDIF.
ENDIF.
CHECK PE_RETURN IS INITIAL.
*
* (8) check currency and currency iso
*
* If currency iso is not initial call convert function
* currency_code_iso_to_sap.
* If at the same time currency is initial carry out the
* following checks with the convert value of currency iso
*
IF NOT ADDRESS_01-CURRENCY_ISO IS INITIAL.
CALL FUNCTION 'CURRENCY_CODE_ISO_TO_SAP'
EXPORTING
ISO_CODE = ADDRESS_01-CURRENCY_ISO
IMPORTING
SAP_CODE = CURRENCY
UNIQUE = CURRENCY_UNIQUE_FLAG
EXCEPTIONS
NOT_FOUND = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
PE_RETURN-TYPE = 'E'.
SY-MSGID = C_MSG_ID.
SY-MSGNO = '034'.
SY-MSGV1 = ADDRESS_01-CURRENCY_ISO.
SY-MSGV2 = SPACE.
SY-MSGV3 = SPACE.
SY-MSGV4 = SPACE.
ENDIF.
CHECK PE_RETURN IS INITIAL.
ENDIF.
IF ADDRESS_01-CURRENCY IS INITIAL.
ADDRESS_01-CURRENCY = CURRENCY.
ENDIF.
IF TCURC-WAERS NE ADDRESS_01-CURRENCY.
SELECT SINGLE * FROM TCURC WHERE WAERS = ADDRESS_01-CURRENCY.
IF SY-SUBRC NE 0.
PE_RETURN-TYPE = 'E'.
SY-MSGID = C_MSG_ID.
SY-MSGNO = '034'.
SY-MSGV1 = ADDRESS_01-CURRENCY.
SY-MSGV2 = SPACE.
SY-MSGV3 = SPACE.
SY-MSGV4 = SPACE.
ENDIF.
ENDIF.
CHECK PE_RETURN IS INITIAL.
*
* (9) title check, if ZAV is active
*
IF ZAV_FLAG = C_X.
IF NOT ADDRESS_01-FORM_OF_AD IS INITIAL.
SELECT SINGLE * FROM TSAD3T WHERE TITLE_MEDI
= ADDRESS_01-FORM_OF_AD.
IF SY-SUBRC NE 0.
PE_RETURN-TYPE = 'E'.
SY-MSGID = C_MSG_ID.
SY-MSGNO = '838'.
SY-MSGV1 = SPACE.
SY-MSGV2 = SPACE.
SY-MSGV3 = SPACE.
SY-MSGV4 = SPACE.
ENDIF.
ENDIF.
ENDIF.
*
* (10) check telephone and fax number
*
IF ZAV_FLAG = C_X.
IF NOT ADDRESS_01-TELEPHONE IS INITIAL.
I_BAPIADDR2-TEL1_NUMBR = ADDRESS_01-TELEPHONE.
TEL1_EXT = 0.
CALL FUNCTION 'TELNUMBER_STRUCT_TO_NORMAL'
EXPORTING
COUNTRY = ADDRESS_01-COUNTRY
TELNUMBER = I_BAPIADDR2-TEL1_NUMBR
EXTENSION_IN = TEL1_EXT
IMPORTING
NUMBER_NORMAL = NUMBER_NORMAL
WORST_ERROR = WORST_ERROR
TABLES
MESSAGES = T_MESSAGES
EXCEPTIONS
ERROR_MESSAGE = 1.
ENDIF.
IF NOT T_MESSAGES IS INITIAL.
IF WORST_ERROR = 'E'.
PE_RETURN-TYPE = 'E'.
SY-MSGID = T_MESSAGES-MSG_ID.
SY-MSGNO = T_MESSAGES-MSG_NUMBER.
SY-MSGV1 = T_MESSAGES-MSG_VAR1.
SY-MSGV2 = T_MESSAGES-MSG_VAR2.
SY-MSGV3 = T_MESSAGES-MSG_VAR3.
SY-MSGV4 = T_MESSAGES-MSG_VAR4.
ELSE.
REFRESH T_MESSAGES.
CLEAR T_MESSAGES.
ENDIF.
ENDIF.
CHECK PE_RETURN IS INITIAL.
IF NOT ADDRESS_01-FAX_NUMBER IS INITIAL.
I_BAPIADDR2-FAX_NUMBER = ADDRESS_01-FAX_NUMBER.
FAX_EXTENS = 0.
CALL FUNCTION 'TELNUMBER_STRUCT_TO_NORMAL'
EXPORTING
COUNTRY = ADDRESS_01-COUNTRY
TELNUMBER = I_BAPIADDR2-FAX_NUMBER
EXTENSION_IN = FAX_EXTENS
IMPORTING
NUMBER_NORMAL = NUMBER_NORMAL
WORST_ERROR = WORST_ERROR
TABLES
MESSAGES = T_MESSAGES
EXCEPTIONS
ERROR_MESSAGE = 1.
ENDIF.
IF NOT T_MESSAGES IS INITIAL.
IF WORST_ERROR = 'E'.
PE_RETURN-TYPE = 'E'.
SY-MSGID = T_MESSAGES-MSG_ID.
SY-MSGNO = T_MESSAGES-MSG_NUMBER.
SY-MSGV1 = T_MESSAGES-MSG_VAR1.
SY-MSGV2 = T_MESSAGES-MSG_VAR2.
SY-MSGV3 = T_MESSAGES-MSG_VAR3.
SY-MSGV4 = T_MESSAGES-MSG_VAR4.
ELSE.
REFRESH T_MESSAGES.
CLEAR T_MESSAGES.
ENDIF.
ENDIF.
CHECK PE_RETURN IS INITIAL. "..
ENDIF. "01
*
*-(3) Fill the converted iso fields -----------------------------------*
*
PE_COUNTRY = COUNTRY. "01
PE_LANGUAGE = LANGUAGE. "01
PE_CURRENCY = CURRENCY. "01
*
* (4) Special check: --------------------------------------------------*
* check duplicate, if and only if entry (char1 <> '-')
* in T100C (see transaction OBA5)
* Remark: If mcod1-3 (see table TFMC) is equal to
* the corresponding fields of table KNA1,
* then they new entry is a duplicate from the
* old one.
*
* (i) compare address with another address;
* if they are equal, fill dpltab;
*
CALL FUNCTION 'READ_CUSTOMIZED_MESSAGE'
EXPORTING
I_ARBGB = 'F2'
I_DTYPE = '-'
I_MSGNR = '145'
IMPORTING
E_MSGTY = CHAR1.
CHECK CHAR1 <> '-'.
*
* fill the fields kna1-mcod1-3
*
PERFORM MATCHCODEFIELDS_FILL USING ADDRESS_01.
*
* check only for changed fields
*
CHECK KNA1-MCOD1 <> MCOD1
OR KNA1-MCOD2 <> MCOD2
OR KNA1-MCOD3 <> MCOD3.
CLEAR DPLTAB.
REFRESH DPLTAB.
CLEAR KNA1-KUNNR.
SELECT * FROM KNA1 INTO *KNA1
WHERE MCOD1 = KNA1-MCOD1
AND MCOD2 = KNA1-MCOD2
AND MCOD3 = KNA1-MCOD3
AND KUNNR <> KNA1-KUNNR.
MOVE-CORRESPONDING *KNA1 TO DPLTAB.
APPEND DPLTAB.
ENDSELECT.
*
* (ii) warning message: There are customers with same
* address data (the duplicates are in table dpltab)
*
MCOD1 = KNA1-MCOD1.
MCOD2 = KNA1-MCOD2.
MCOD3 = KNA1-MCOD3.
IF SY-SUBRC = 0.
CALL FUNCTION 'CUSTOMIZED_MESSAGE'
EXPORTING
I_ARBGB = 'F2'
I_DTYPE = 'W'
I_MSGNR = '145'.
PE_RETURN-TYPE = 'E'.
ENDIF.
CHECK PE_RETURN IS INITIAL.
ENDFUNCTION.