*&---------------------------------------------------------------------* *& Report ZTRAFAG_SCHWEIZ_EXPORT *&---------------------------------------------------------------------* *& Zweck *& Ermittelt SD-Faktura-Positionen fuer Schweiz/Oesterreich aus *& Buchungskreis 1100/1200 und schreibt sie per Upsert in Tabelle *& ZSCHWEIZ. *& ZSCHWEIZ kann danach aus SAP HANA in TrafagSalesExporter geladen *& werden. *& *& HANA-Anbindung *& - Tabelle/View-Basis: ZSCHWEIZ *& - im .NET-Programm Standort mit Quellsystem SAP_HANA verwenden *& - HANA-Schema auf das ABAP/HANA-Schema setzen *& - grafische Quelle: Alias Z, Tabelle/View ZSCHWEIZ *& - grafische Feldmappings koennen auf die unten vorgeschlagenen *& Felder gemappt werden. *& *& Fachliche Annahmen *& - Hauswaehrung ist fuehrend. *& - Nettofakturawert wird pro Belegposition ermittelt. *& - Gutschriften/Stornos werden ueber den Fakturatyp negativ bewertet. *& - Buchungskreis 1100 = Schweiz. *& - Buchungskreis 1200 = Oesterreich. *& - TSC/Reporting-Land werden aus BUKRS abgeleitet; Kundenland *& (KNA1-LAND1) bleibt als Infofeld erhalten. *& *& DDIC-Vorschlag fuer ZSCHWEIZ *& Client-dependent Tabelle, Auslieferungsklasse A, Datenpflege erlaubt. *& *& Schluesselfelder: *& MANDT MANDT SAP Mandant *& BUKRS BUKRS Buchungskreis *& GJAHR GJAHR Geschaeftsjahr aus FKDAT *& VBELN VBELN_VF Fakturanummer *& POSNR POSNR_VF Fakturaposition *& *& Datenfelder: *& LAND1 LAND1 Reporting-Land aus BUKRS, z.B. CH/AT *& CUSTOMER_LAND LAND1 Kundenland aus KNA1-LAND1 *& TSC CHAR10 Reporting-Standort, z.B. TRCH/TRAT *& FKDAT FKDAT Fakturadatum *& FKART FKART Fakturatyp *& VBTYP VBTYP SD-Belegkategorie *& KUNNR KUNNR Auftraggeber/Sold-to *& NAME1 NAME1_GP Kundenname *& MATNR MATNR Material *& ARKTX ARKTX Positionsbezeichnung *& PRODH PRODH_D Produkthierarchie *& FKIMG FKIMG Fakturamenge *& VRKME VRKME Verkaufsmengeneinheit *& WAERK WAERK Belegwaehrung *& HWAER WAERS Hauswaehrung aus T001 *& NETWR_DC CURR 23,2 Positions-Netto in Belegwaehrung *& TAX_DC CURR 23,2 Positions-Steuer in Belegwaehrung *& NETWR_HC CURR 23,2 Positions-Netto in Hauswaehrung *& TAX_HC CURR 23,2 Positions-Steuer in Hauswaehrung *& KURRF KURRF Rechnungsumrechnungskurs *& IS_CREDIT BOOLE_D X = Gutschrift/Storno negativ bewertet *& PARTY_CLASS CHAR10 2ND/3RD fuer spaetere IC-Abgrenzung *& ERDAT_SRC ERDAT Anlage-/Quell-Erfassungsdatum *& AEDAT_SRC AEDAT Aenderungsdatum, falls vorhanden *& CREATED_AT TIMESTAMPL Insert-Zeitpunkt *& CHANGED_AT TIMESTAMPL Update-Zeitpunkt *& CREATED_BY SYUNAME Insert-User *& CHANGED_BY SYUNAME Update-User *& *& Sekundaerindex empfohlen: *& Z01: BUKRS, LAND1, GJAHR, FKDAT *& Z02: KUNNR, GJAHR *&---------------------------------------------------------------------* REPORT ztrafag_schweiz_export. TABLES: vbrk, vbrp, kna1. TYPES: BEGIN OF ty_billing, bukrs TYPE vbrk-bukrs, vbeln TYPE vbrk-vbeln, fkdat TYPE vbrk-fkdat, fkart TYPE vbrk-fkart, vbtyp TYPE vbrk-vbtyp, waerk TYPE vbrk-waerk, kurrf TYPE vbrk-kurrf, kunag TYPE vbrk-kunag, erdat TYPE vbrk-erdat, posnr TYPE vbrp-posnr, matnr TYPE vbrp-matnr, arktx TYPE vbrp-arktx, prodh TYPE vbrp-prodh, fkimg TYPE vbrp-fkimg, vrkme TYPE vbrp-vrkme, netwr TYPE vbrp-netwr, mwsbp TYPE vbrp-mwsbp, customer_land TYPE kna1-land1, name1 TYPE kna1-name1, hwaer TYPE t001-waers, END OF ty_billing. TYPES: BEGIN OF ty_zschweiz, mandt TYPE mandt, bukrs TYPE bukrs, gjahr TYPE gjahr, vbeln TYPE vbeln_vf, posnr TYPE posnr_vf, land1 TYPE land1, customer_land TYPE land1, tsc TYPE c LENGTH 10, fkdat TYPE fkdat, fkart TYPE fkart, vbtyp TYPE vbtyp, kunnr TYPE kunnr, name1 TYPE name1_gp, matnr TYPE matnr, arktx TYPE arktx, prodh TYPE prodh_d, fkimg TYPE fkimg, vrkme TYPE vrkme, waerk TYPE waerk, hwaer TYPE waers, netwr_dc TYPE p LENGTH 23 DECIMALS 2, tax_dc TYPE p LENGTH 23 DECIMALS 2, netwr_hc TYPE p LENGTH 23 DECIMALS 2, tax_hc TYPE p LENGTH 23 DECIMALS 2, kurrf TYPE kurrf, is_credit TYPE boole_d, party_class TYPE c LENGTH 10, erdat_src TYPE erdat, aedat_src TYPE aedat, created_at TYPE timestampl, changed_at TYPE timestampl, created_by TYPE syuname, changed_by TYPE syuname, END OF ty_zschweiz. DATA: gt_billing TYPE STANDARD TABLE OF ty_billing WITH EMPTY KEY, gt_zschweiz TYPE STANDARD TABLE OF zschweiz WITH EMPTY KEY, gs_zschweiz TYPE zschweiz. SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-t01. PARAMETERS: p_gjahr TYPE gjahr DEFAULT sy-datum(4) OBLIGATORY. SELECT-OPTIONS: s_bukrs FOR vbrk-bukrs, s_fkart FOR vbrk-fkart, s_vbeln FOR vbrk-vbeln. PARAMETERS: p_test AS CHECKBOX DEFAULT abap_true. SELECTION-SCREEN END OF BLOCK b01. INITIALIZATION. TEXT-t01 = 'Finance Export Selektion'. s_bukrs-sign = 'I'. s_bukrs-option = 'EQ'. s_bukrs-low = '1100'. APPEND s_bukrs. s_bukrs-low = '1200'. APPEND s_bukrs. START-OF-SELECTION. PERFORM read_billing_data. PERFORM map_to_zschweiz. PERFORM persist_zschweiz. FORM read_billing_data. DATA(lv_date_from) = CONV fkdat( |{ p_gjahr }0101| ). DATA(lv_date_to) = CONV fkdat( |{ p_gjahr }1231| ). SELECT h~bukrs, h~vbeln, h~fkdat, h~fkart, h~vbtyp, h~waerk, h~kurrf, h~kunag, h~erdat, i~posnr, i~matnr, i~arktx, i~prodh, i~fkimg, i~vrkme, i~netwr, i~mwsbp, k~land1 AS customer_land, k~name1, c~waers AS hwaer FROM vbrk AS h INNER JOIN vbrp AS i ON i~vbeln = h~vbeln LEFT OUTER JOIN kna1 AS k ON k~kunnr = h~kunag LEFT OUTER JOIN t001 AS c ON c~bukrs = h~bukrs WHERE h~bukrs IN @s_bukrs AND h~fkdat BETWEEN @lv_date_from AND @lv_date_to AND h~vbeln IN @s_vbeln AND h~fkart IN @s_fkart AND h~fksto = @space INTO TABLE @gt_billing. WRITE: / 'Gelesene Fakturapositionen:', lines( gt_billing ). ENDFORM. FORM map_to_zschweiz. DATA: lv_sign TYPE i, lv_netwr_hc TYPE p LENGTH 23 DECIMALS 2, lv_tax_hc TYPE p LENGTH 23 DECIMALS 2, lv_timestamp TYPE timestampl, lv_party TYPE c LENGTH 10. GET TIME STAMP FIELD lv_timestamp. LOOP AT gt_billing ASSIGNING FIELD-SYMBOL(). CLEAR: gs_zschweiz, lv_netwr_hc, lv_tax_hc, lv_party. lv_sign = 1. IF -vbtyp = 'O' OR -vbtyp = 'N' OR -fkart CP 'G*' OR -fkart CP 'S*'. lv_sign = -1. ENDIF. PERFORM convert_to_house_currency USING -netwr -waerk -hwaer -fkdat -kurrf CHANGING lv_netwr_hc. PERFORM convert_to_house_currency USING -mwsbp -waerk -hwaer -fkdat -kurrf CHANGING lv_tax_hc. PERFORM classify_party USING -kunnr -name1 CHANGING lv_party. gs_zschweiz-mandt = sy-mandt. gs_zschweiz-bukrs = -bukrs. gs_zschweiz-gjahr = p_gjahr. gs_zschweiz-vbeln = -vbeln. gs_zschweiz-posnr = -posnr. gs_zschweiz-land1 = SWITCH #( -bukrs WHEN '1100' THEN 'CH' WHEN '1200' THEN 'AT' ELSE -customer_land ). gs_zschweiz-customer_land = -customer_land. gs_zschweiz-tsc = SWITCH #( -bukrs WHEN '1100' THEN 'TRCH' WHEN '1200' THEN 'TRAT' ELSE -bukrs ). gs_zschweiz-fkdat = -fkdat. gs_zschweiz-fkart = -fkart. gs_zschweiz-vbtyp = -vbtyp. gs_zschweiz-kunnr = -kunag. gs_zschweiz-name1 = -name1. gs_zschweiz-matnr = -matnr. gs_zschweiz-arktx = -arktx. gs_zschweiz-prodh = -prodh. gs_zschweiz-fkimg = -fkimg * lv_sign. gs_zschweiz-vrkme = -vrkme. gs_zschweiz-waerk = -waerk. gs_zschweiz-hwaer = -hwaer. gs_zschweiz-netwr_dc = -netwr * lv_sign. gs_zschweiz-tax_dc = -mwsbp * lv_sign. gs_zschweiz-netwr_hc = lv_netwr_hc * lv_sign. gs_zschweiz-tax_hc = lv_tax_hc * lv_sign. gs_zschweiz-kurrf = -kurrf. gs_zschweiz-is_credit = COND #( WHEN lv_sign < 0 THEN abap_true ELSE abap_false ). gs_zschweiz-party_class = lv_party. gs_zschweiz-erdat_src = -erdat. gs_zschweiz-aedat_src = sy-datum. gs_zschweiz-created_at = lv_timestamp. gs_zschweiz-changed_at = lv_timestamp. gs_zschweiz-created_by = sy-uname. gs_zschweiz-changed_by = sy-uname. APPEND gs_zschweiz TO gt_zschweiz. ENDLOOP. WRITE: / 'Aufbereitete ZSCHWEIZ-Zeilen:', lines( gt_zschweiz ). ENDFORM. FORM convert_to_house_currency USING iv_amount TYPE any iv_from TYPE waerk iv_to TYPE waers iv_date TYPE fkdat iv_kurrf TYPE kurrf CHANGING cv_amount TYPE any. IF iv_from = iv_to OR iv_from IS INITIAL OR iv_to IS INITIAL. cv_amount = iv_amount. RETURN. ENDIF. CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY' EXPORTING date = iv_date foreign_amount = iv_amount foreign_currency = iv_from local_currency = iv_to rate = iv_kurrf IMPORTING local_amount = cv_amount EXCEPTIONS no_rate_found = 1 overflow = 2 no_factors_found = 3 no_spread_found = 4 derived_2_times = 5 OTHERS = 6. IF sy-subrc <> 0. "Fallback: Wenn SD bereits einen Rechnungsumrechnungskurs liefert, "verwenden wir diesen, damit die Position nicht verloren geht. IF iv_kurrf IS NOT INITIAL. cv_amount = iv_amount * iv_kurrf. ELSE. cv_amount = 0. ENDIF. ENDIF. ENDFORM. FORM classify_party USING iv_kunnr TYPE kunnr iv_name1 TYPE name1_gp CHANGING cv_party TYPE c. DATA(lv_name) = to_upper( iv_name1 ). IF lv_name CS 'TRAFAG' OR lv_name CS 'MAGNETIC SENSE' OR lv_name CS 'MAGNETS SENSE' OR lv_name CS 'GESELLSCHAFT FUER SENSORIK' OR lv_name CS 'GESELLSCHAFT FUR SENSORIK'. cv_party = '2ND'. ELSE. cv_party = '3RD'. ENDIF. ENDFORM. FORM persist_zschweiz. IF p_test = abap_true. WRITE: / 'Testlauf aktiv: keine Daten in ZSCHWEIZ geschrieben.'. PERFORM write_totals. RETURN. ENDIF. MODIFY zschweiz FROM TABLE gt_zschweiz. IF sy-subrc = 0. COMMIT WORK AND WAIT. WRITE: / 'ZSCHWEIZ Upsert erfolgreich. Zeilen:', lines( gt_zschweiz ). ELSE. ROLLBACK WORK. MESSAGE 'ZSCHWEIZ Upsert fehlgeschlagen' TYPE 'E'. ENDIF. PERFORM write_totals. ENDFORM. FORM write_totals. TYPES: BEGIN OF ty_total, land1 TYPE land1, hwaer TYPE waers, netwr_hc TYPE p LENGTH 23 DECIMALS 2, tax_hc TYPE p LENGTH 23 DECIMALS 2, rows TYPE i, END OF ty_total. DATA lt_totals TYPE HASHED TABLE OF ty_total WITH UNIQUE KEY land1 hwaer. LOOP AT gt_zschweiz ASSIGNING FIELD-SYMBOL(). ASSIGN lt_totals[ land1 = -land1 hwaer = -hwaer ] TO FIELD-SYMBOL(). IF sy-subrc <> 0. INSERT VALUE #( land1 = -land1 hwaer = -hwaer ) INTO TABLE lt_totals ASSIGNING . ENDIF. -netwr_hc = -netwr_hc + -netwr_hc. -tax_hc = -tax_hc + -tax_hc. -rows = -rows + 1. ENDLOOP. SKIP. WRITE: / 'Summen nach Land/Hauswaehrung'. LOOP AT lt_totals ASSIGNING FIELD-SYMBOL(). WRITE: / -land1, -hwaer, 'Netto:', -netwr_hc, 'Steuer:', -tax_hc, 'Zeilen:', -rows. ENDLOOP. ENDFORM.