Age: 160 Joined: 04 Oct 2007 Posts: 1218 Location: Санкт-Петербург
Posted: Sat Nov 29, 2008 4:26 pm Post subject: BAPI_PRICES_CONDITIONS
BAPI_PRICES_CONDITIONS - BAPI for Price and Rebate Usage Condition Records
Code:
* nur die rein den BAPI betreffenden Abschnitte
DATA:
dd02l_tabname LIKE dd02l-tabname,
* BAPI_PRICES_CONDITIONS-Tabellen
ti_bapicondct TYPE TABLE OF bapicondct WITH HEADER LINE,
ti_bapicondhd TYPE TABLE OF bapicondhd WITH HEADER LINE,
ti_bapicondit TYPE TABLE OF bapicondit WITH HEADER LINE,
ti_bapicondqs TYPE TABLE OF bapicondqs WITH HEADER LINE,
ti_bapicondvs TYPE TABLE OF bapicondvs WITH HEADER LINE,
to_bapiret2 TYPE TABLE OF bapiret2 WITH HEADER LINE,
to_bapiknumhs TYPE TABLE OF bapiknumhs,
to_mem_initial TYPE TABLE OF cnd_mem_initial WITH HEADER LINE,
help_vakey LIKE ti_bapicondct-varkey.
* Fehlerauswertung
DATA: BEGIN OF fehler_tab OCCURS 0, " Tabelle für Fehlermeldungen
line LIKE sy-lisel, " 255 Char
END OF fehler_tab.
* returncode(2).
TABLES: a914, a915, a916, a918.
* Neue KonditionsNr holen für Neuanlage Kondition
DATA: knumh_new TYPE knumh.
DATA: ls_return TYPE bapiret2.
* weiter Daten zu Konditionen
DATA: help_konp LIKE konp.
DATA: help_konm LIKE konm.
DATA: help_konw LIKE konw.
SELECTION-SCREEN BEGIN OF BLOCK block5 WITH FRAME TITLE text-bl5.
PARAMETERS:
p_preis AS CHECKBOX MODIF ID upd,
p_proz TYPE kbetr_kond MODIF ID upd,
p_datab LIKE a005-datab MODIF ID upd,
p_datbi LIKE a005-datbi MODIF ID upd,
p_waers LIKE a916-waerk DEFAULT 'EUR' MODIF ID upd.
PARAMETERS:
p_kappl LIKE a914-kappl DEFAULT 'V' NO-DISPLAY.
SELECTION-SCREEN END OF BLOCK block5.
*---------------------------------------------------------------------*
* Form preisanpassung
*---------------------------------------------------------------------*
FORM preisanpassung USING alter_preis TYPE kbetr_kond " CURR 11.2
neuer_preis TYPE kbetr_kond.
neuer_preis = alter_preis + ( alter_preis * p_proz / 100 ).
ENDFORM. " preisanpassung
*
*---------------------------------------------------------------------*
* Form fill_a914
*---------------------------------------------------------------------*
FORM fill_a914.
* Bapi für Tabelle A914 füllen
*** alle markierten zutreffenden Konditionen aus A914 auslesen
LOOP AT et_row_no. " enthält die markierten Zeilen
IF p_ekinfo = ''.
READ TABLE i_ausg INDEX et_row_no-row_id.
SELECT SINGLE * FROM a914 CLIENT SPECIFIED
WHERE mandt = sy-mandt
AND kappl = p_kappl " Applikation, V = Vetrieb
AND kschl = i_ausg-kschl
AND vkorg = i_ausg-vkorg
AND vtweg = i_ausg-vtweg
AND matnr = i_ausg-matnr
AND kfrst = i_ausg-kfrst
AND datbi = i_ausg-datbi
and datab = i_ausg-datab.
IF sy-subrc NE 0. " SELECT SINGLE * FROM a914
CONTINUE.
ENDIF. " sy-subrc ne 0. " SELECT SINGLE * FROM a914
PERFORM zeitvergleich USING
'A914' a914-kschl a914-knumh
i_ausg-datab i_ausg-datab_n
i_ausg-datbi i_ausg-datbi_n
i_ausg-kbetr i_ausg-kbetr_n.
ELSE. " p_ekinfo = ''
READ TABLE i_ausg_ek INDEX et_row_no-row_id.
SELECT SINGLE * FROM a914 CLIENT SPECIFIED
WHERE mandt = sy-mandt
AND kappl = p_kappl " Applikation, V = Vetrieb
AND kschl = i_ausg_ek-kschl
AND vkorg = i_ausg_ek-vkorg
AND vtweg = i_ausg_ek-vtweg
AND matnr = i_ausg_ek-matnr
AND kfrst = i_ausg_ek-kfrst
AND datbi = i_ausg_ek-datbi
and datab = i_ausg_ek-datab.
IF sy-subrc NE 0. " SELECT SINGLE * FROM a914
CONTINUE.
ENDIF. " sy-subrc ne 0. " SELECT SINGLE * FROM a914
PERFORM zeitvergleich USING
'A914' a914-kschl a914-knumh
i_ausg_ek-datab i_ausg_ek-datab_n
i_ausg_ek-datbi i_ausg_ek-datbi_n
i_ausg_ek-kbetr i_ausg_ek-kbetr_n.
ENDIF." p_ekinfo = ''
ENDLOOP. " at ET_ROW_NO
ENDFORM. " fill_a914
*---------------------------------------------------------------------*
* Form zeitvergleich
*---------------------------------------------------------------------*
FORM zeitvergleich USING tabelle kschl knumh_alt
datab_alt datab_neu
datbi_alt datbi_neu
kbetr_alt kbetr_neu.
* so, wie ist das denn mit dem Gültigkeitszeitraum
IF datbi_neu GT datbi_alt.
* das neue Ende-Datum endet nach dem alten
IF datab_neu LE sy-datum.
* und die Kondition ist ab sofort gültig
* ja gut, der einfache Fall 1a,
* Teil 1: die alte Kondition enden lassen
* Teil 2: und eine neue mit dem neuen Preis anlegen
IF datbi_alt GE sy-datum.
* alte Kondition ist noch gültig !!
PERFORM bapi_fuellen USING tabelle 'AENDERN' ''
kschl knumh_alt
datab_alt gestern kbetr_alt.
ENDIF. " datbi_alt ge sy-datum
PERFORM bapi_fuellen USING tabelle 'ANLEGEN' 'X'
kschl knumh_alt
datab_neu datbi_neu kbetr_neu.
ELSE. " datab_neu le sy-datum
* Gültigkeit ab liegt in der Zukunft
* ja gut, der einfache Fall 1b,
* Teil 1: die alte Kondition in der Zukunft enden lassen
* Teil 2: und eine neue mit dem neuen Preis anlegen
if datab_alt = datab_neu.
zukuenftig = datab_neu.
else. " datab_alt = datab_neu
zukuenftig = datab_neu - 1.
endif. " datab_alt = datab_neu
PERFORM bapi_fuellen USING tabelle 'AENDERN' ''
kschl knumh_alt
datab_alt zukuenftig kbetr_alt.
PERFORM bapi_fuellen USING tabelle 'ANLEGEN' 'X'
kschl knumh_alt
datab_neu datbi_neu kbetr_neu.
ENDIF. " datab_neu le sy-datum
ELSEIF datbi_neu = datbi_alt.
* dieselbe Kondition soll geändert werden???
IF datab_neu LE sy-datum.
* und die Kondition ist ab sofort gültig
* ja gut, der einfache Fall 1a,
* Teil 1: die alte Kondition enden lassen
* Teil 2: und eine neue mit dem neuen Preis anlegen
IF datbi_alt GE sy-datum.
* alte Kondition ist noch gültig !!
PERFORM bapi_fuellen USING tabelle 'AENDERN' ''
kschl knumh_alt
datab_alt gestern kbetr_alt.
ENDIF. " datbi_alt ge sy-datum
PERFORM bapi_fuellen USING tabelle 'ANLEGEN' 'X'
kschl knumh_alt
datab_neu datbi_neu kbetr_neu.
ELSE. " datab_neu le sy-datum
* Gültigkeit ab liegt in der Zukunft
* ja gut, der einfache Fall 1b,
* Teil 1: die alte Kondition in der Zukunft enden lassen
* Teil 2: und eine neue mit dem neuen Preis anlegen
if datab_alt = datab_neu.
* es soll eindeutig der gleiche Satz geändert werden
PERFORM bapi_fuellen USING tabelle 'AENDERN' 'X'
kschl knumh_alt
datab_alt datbi_alt kbetr_neu.
else. " datab_alt = datab_neu
zukuenftig = datab_neu - 1.
PERFORM bapi_fuellen USING tabelle 'AENDERN' ''
kschl knumh_alt
datab_alt zukuenftig kbetr_alt.
PERFORM bapi_fuellen USING tabelle 'ANLEGEN' 'X'
kschl knumh_alt
datab_neu datbi_neu kbetr_neu.
endif. " datab_alt = datab_neu
ENDIF. " datab_neu le sy-datum
ELSE. " datbi_neu > datbi_alt
* das neue Ende-Datum endet VOR dem alten
* der komplexere Fall 2a:
IF datab_neu LE sy-datum.
* und die Kondition ist ab sofort gültig
* Teil 1: die alte Kondition sofort enden lassen
* Teil 2: und eine neue mit neuem Preis mit neuer Gültigkeit
* Teil 3: alte Kond. ab neuem Ende bis altem Ende anlegen
PERFORM bapi_fuellen USING tabelle 'AENDERN' ''
kschl knumh_alt
datab_alt gestern kbetr_alt.
PERFORM bapi_fuellen USING tabelle 'ANLEGEN' 'X'
kschl knumh_alt
datab_neu datbi_neu kbetr_neu.
zukuenftig = datab_neu + 1.
PERFORM bapi_fuellen USING tabelle 'ANLEGEN' ''
kschl knumh_alt
zukuenftig datbi_alt kbetr_alt.
ELSE. " datab_neu le sy-datum
* Gültigkeit ab liegt in der Zukunft
* der komplexere Fall 2b:
* Teil 1: die alte Kondition in der Zukunft enden lassen
* Teil 2: und eine neue mit dem neuen Preis anlegen
* Teil 3: alte Kond. ab neuem Ende bis altem Ende anlegen
zukuenftig = datab_neu - 1.
PERFORM bapi_fuellen USING tabelle 'AENDERN' ''
kschl knumh_alt
datab_alt zukuenftig kbetr_alt.
PERFORM bapi_fuellen USING tabelle 'ANLEGEN' 'X'
kschl knumh_alt
datab_neu datbi_neu kbetr_neu.
zukuenftig = datbi_neu + 1.
PERFORM bapi_fuellen USING tabelle 'ANLEGEN' ''
kschl knumh_alt
zukuenftig datbi_alt kbetr_alt.
ENDIF. " datab_neu le sy-datum
ENDIF. " datbi_neu > i_ausg-datbi
ENDFORM. " zeitvergleich
*---------------------------------------------------------------------*
* Form bapi_fuellen
*---------------------------------------------------------------------*
FORM bapi_fuellen USING tabelle operation erhoehung " X = JA
kschl knumh_alt
datab_neu
datbi_neu
kbetr_neu.
* hier muss also jetzt der BAPI gefüllt werden
* siehe auch https://www.sdn.sap.com/irj/sdn/thread?threadID=79265
IF operation = 'ANLEGEN'. " ==> Kondition wird NICHT 'geändert'
* Neue KonditionsNr holen für Neuanlage Kondition
CLEAR: knumh_new.
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
nr_range_nr = '01'
object = 'KONH'
IMPORTING
number = knumh_new
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
* problems with the number range
PERFORM error_message_syst CHANGING ls_return.
APPEND ls_return TO to_bapiret2.
CHECK 1 = 2.
ENDIF.
ENDIF. " operation = 'ANLEGEN'
* Inhalte aus Axxx
CLEAR: ti_bapicondct.
* ti_bapicondct-operation
*003 Löschen: Nachricht enthält Objekte, die zu Löschen sind.
*004 Änderung: Nachricht enthält Änderungen
*005 Ersetze: Diese Nachricht ersetzt vorige Nachrichten
*009 Original: erste Nachricht zum Vorgang
*023 Warte/Abgleich: Daten sollen nicht eingespielt werden
*018 Wiederversenden
IF operation = 'AENDERN'.
ti_bapicondct-operation = '004'.
ELSEIF operation = 'ANLEGEN'.
ti_bapicondct-operation = '009'.
ENDIF. " operation = 'AENDERN'
ti_bapicondct-cond_usage = dd02l_tabname(1).
ti_bapicondct-table_no = dd02l_tabname+1(3).
ti_bapicondct-applicatio = p_kappl. " Fix V
ti_bapicondct-cond_type = kschl.
IF tabelle = 'A914'.
CONCATENATE a914-vkorg a914-vtweg " a914-kunnr
a914-matnr INTO help_vakey.
ELSEIF tabelle = 'A915'.
CONCATENATE a915-vkorg a915-vtweg a915-kunnr
a915-matnr INTO help_vakey.
ELSEIF tabelle = 'A916'.
CONCATENATE a916-vkorg a916-vtweg a916-pltyp
a916-waerk INTO help_vakey.
help_vakey+13 = a916-matnr.
ELSEIF tabelle = 'A918'.
CONCATENATE a918-spart a918-matnr
INTO help_vakey.
ENDIF. " Tabelle = 'A914'
* CONDENSE help_vakey NO-GAPS.
ti_bapicondct-varkey = help_vakey.
* Konditionsdatum gültig bis
ti_bapicondct-valid_to = datbi_neu.
* ti_bapicondct-AGREE_COND =
ti_bapicondct-valid_from = datab_neu.
IF operation = 'ANLEGEN'.
ti_bapicondct-cond_no = knumh_new.
ELSEIF operation = 'AENDERN'.
ti_bapicondct-cond_no = knumh_alt.
ENDIF. " operation = 'ANLEGEN'
* ti_bapicondct-VADAT =
APPEND ti_bapicondct.
* Inhalte aus KONH mit KNUMH aus Axxx
CLEAR: ti_bapicondhd.
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You can download files in this forum
All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG. SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG. Every effort is made to ensure content integrity. Use information on this site at your own risk.