Enterprise Resource Planning Blogs by Members
Gain new perspectives and knowledge about enterprise resource planning in blog posts from community members. Share your own comments and ERP insights today!
cancel
Showing results for 
Search instead for 
Did you mean: 
vardhan_naik3
Explorer
52,491
Brief overview of BAPI_PRICES_CONDITIONS:  is the unreleased BAPI and deficient in many aspects as there is missing documentation and also the BAPI has structural defects. This BAPI fairs not so well when compared to VK11 BDC updates [ or other application transactions ] or Idoc Creation. However like all BAPIs, we can rollback our changes in mass and the use of it to load all conditions from excel file and if any error, rollback is one of the reasons I would recommend to use this.

However the BAPI_PRICES_CONDITIONS has many structural issues that need to be addressed.

  1. There is no update task when a condition is committed.

  2. Test mode.

  3. There are no validations happening in the  BAPI

  4. If the conditions are overlapped, one needs to handle it in more detail.

  5. If the condition is in non blocked mode, we need to pass the certain fields.

  6. The change pointers which are used to workflow approval need to be considered


 

All these are covered in this blog post.

  1. Update Task: As the BAPI does not do an update task , we need to careful with rollback and commit based on BAPI return parameters .

  2. Use it in Test mode: Especially one can use in test mode with condition like TESTMODE, thus conditions are not lost. It should also be part of training to first run in test mode then save as we can conserve condition numbers.

  3. Validations in BAPI: As the BAPI does not do custom validations, it would be good to do validations before we call the BAPI

  4. Conditions overlapped: BAPI itself does not handle condition overlap. So it needs to be broken down into 4 distinct areas , which means we need to call the BAPI for all overlaps in four phasesPHASE 1: All old conditions valid from outside but valid to lying in the new condition validfrom-validto.  But since valid to is a key in the condition table, we need to delete operation 003( Delete) and then change operation (004).PHASE 2:  Delete all old conditions within the the current validfrom-validto.

               PHASE 3: All old conditions valid to outside but valid from lying in the new condition                 validfrom-validto.  All these conditions can just be changed operation 004.

    PHASE 4: Create new condition , operation 009.

  5. Blocked condition: Just like the condition key is passed through varkey, the blocked status can be passed by vardate.                                                                                            ls_bapicondhd-varkey         ls_varkey_header.
    ls_bapicondhd-vardate        ls_vardat_header.

  6. Change pointer: The trick here is to pass in PHASE 4 for the new condition where db_ykonp is essentially empty except for certain fields. The change pointer can be invoked using function SD_CONDITION_CHANGE_DOCS_WRITE.


Check the code snippet below for the above five main handling.

Code Snippet
 LOOP AT gt_upload ASSIGNING <fs_gt_upload>.
lv_amount = <fs_gt_upload>-old_price +
<fs_gt_upload>-act .

READ TABLE lt_tcurc ASSIGNING <fs_lt_tcurc>
WITH KEY waers = <fs_gt_upload>-waers.
IF sy-subrc IS NOT INITIAL.
<fs_gt_upload>-icon = icon_cancel.
IF <fs_gt_upload>-waers IS NOT INITIAL.
<fs_gt_upload>-message = 'Invalid Currency'.
ELSE.
<fs_gt_upload>-message = 'Currency is not Filled'.
ENDIF.
ENDIF.

READ TABLE lt_marm ASSIGNING <fs_lt_marm>
WITH KEY matnr = <fs_gt_upload>-matnr
meinh = <fs_gt_upload>-kmein.
IF sy-subrc IS NOT INITIAL.
<fs_gt_upload>-icon = icon_cancel.
IF <fs_gt_upload>-kmein IS NOT INITIAL.
<fs_gt_upload>-message = 'Invalid UOM'.
ELSE.
<fs_gt_upload>-message = 'UOM is not Filled'.
ENDIF.
ENDIF.

READ TABLE lt_mara ASSIGNING <fs_lt_mara>
WITH KEY matnr = <fs_gt_upload>-matnr.
IF sy-subrc IS NOT INITIAL.
<fs_gt_upload>-icon = icon_cancel.
IF <fs_gt_upload>-matnr IS NOT INITIAL.
<fs_gt_upload>-message = 'Invalid Material'.
ELSE.
<fs_gt_upload>-message = 'Material is not Filled'.
ENDIF.
ENDIF.

READ TABLE lt_kna1 ASSIGNING <fs_lt_kna1>
WITH KEY kunnr = <fs_gt_upload>-kunnr.
IF sy-subrc IS NOT INITIAL.
<fs_gt_upload>-icon = icon_cancel.
IF <fs_gt_upload>-kunnr IS NOT INITIAL.
<fs_gt_upload>-message = 'Invalid Customer'.
ELSE.
<fs_gt_upload>-message = 'Customer is not Filled'.
ENDIF.
ENDIF.

READ TABLE lt_history ASSIGNING <fs_lt_history>
WITH KEY kschl = <fs_gt_upload>-kschl
vkorg = <fs_gt_upload>-vkorg
vtweg = <fs_gt_upload>-vtweg
kunnr = <fs_gt_upload>-kunnr
matnr = <fs_gt_upload>-matnr
effective_date = <fs_gt_upload>-effective_date
effective_time = <fs_gt_upload>-effective_time.
IF sy-subrc IS INITIAL.
<fs_gt_upload>-icon = icon_cancel.
<fs_gt_upload>-message = 'Record already exists in table ZSD_VK11_REASON.'.
ENDIF.
IF <fs_gt_upload>-kbetr IS INITIAL.
<fs_gt_upload>-icon = icon_cancel.
<fs_gt_upload>-message = 'Amount is not filled.'.
CONTINUE.
ENDIF.
IF <fs_gt_upload>-effective_date IS INITIAL.
<fs_gt_upload>-icon = icon_cancel.
<fs_gt_upload>-message = 'Effective Date is not filled.'.
CONTINUE.
ENDIF.
IF <fs_gt_upload>-datab IS INITIAL.
<fs_gt_upload>-icon = icon_cancel.
<fs_gt_upload>-message = 'Valid from is not filled.'.
CONTINUE.
ENDIF.
IF <fs_gt_upload>-datbi IS INITIAL.
<fs_gt_upload>-icon = icon_cancel.
<fs_gt_upload>-message = 'Valid to is not filled.'.
CONTINUE.
ENDIF.
IF <fs_gt_upload>-kschl IS INITIAL.
<fs_gt_upload>-icon = icon_cancel.
<fs_gt_upload>-message = 'Condition Type is not filled.'.
CONTINUE.
ENDIF.
IF <fs_gt_upload>-vkorg IS INITIAL.
<fs_gt_upload>-icon = icon_cancel.
<fs_gt_upload>-message = 'Sales Org is not filled.'.
CONTINUE.
ENDIF.
IF <fs_gt_upload>-vtweg IS INITIAL.
<fs_gt_upload>-icon = icon_cancel.
<fs_gt_upload>-message = 'Distribution Channel is not filled.'.
CONTINUE.
ENDIF.
IF <fs_gt_upload>-kunnr IS INITIAL.
<fs_gt_upload>-icon = icon_cancel.
<fs_gt_upload>-message = 'Customer is not filled.'.
CONTINUE.
ENDIF.
IF <fs_gt_upload>-matnr IS INITIAL.
<fs_gt_upload>-icon = icon_cancel.
<fs_gt_upload>-message = 'Material is not filled.'.
CONTINUE.
ENDIF.

IF lv_amount = <fs_gt_upload>-kbetr.
ELSE.
<fs_gt_upload>-icon = icon_cancel.
<fs_gt_upload>-message = 'Amount does not match Old Price + Price Change Components.'.
CONTINUE.
ENDIF.

CHECK <fs_gt_upload>-icon <> icon_cancel.
*1 Get all records before and into the current From/To
REFRESH: lt_a305[].
SELECT a305~kappl
a305~kschl
a305~vkorg
a305~vtweg
a305~kunnr
a305~matnr
a305~kfrst
a305~datbi
a305~datab
a305~kbstat
a305~knumh
konp~konwa
konp~kbetr
konp~kmein
konp~kpein
FROM a305
INNER JOIN konp ON konp~knumh = a305~knumh
APPENDING CORRESPONDING FIELDS OF TABLE lt_a305
WHERE a305~kappl = lcon_applicatio_v AND
a305~kschl = <fs_gt_upload>-kschl AND
a305~vkorg = <fs_gt_upload>-vkorg AND
a305~vtweg = <fs_gt_upload>-vtweg AND
a305~kunnr = <fs_gt_upload>-kunnr AND
a305~matnr = <fs_gt_upload>-matnr AND
a305~kfrst = lcon_kfrst_a AND
a305~datbi GE <fs_gt_upload>-datab AND
a305~datbi LE <fs_gt_upload>-datbi AND
a305~datab LT <fs_gt_upload>-datab.


LOOP AT lt_a305 ASSIGNING <fs_lt_a305>.
IF <fs_gt_upload>-icon <> icon_cancel.
ELSE.
EXIT.
ENDIF.
IF <fs_lt_a305>-kfrst = lcon_kfrst_a.
*1a Get all records before and into the current From/To:
* Delete the record
REFRESH: lt_bapicondct[],
lt_bapicondhd[],
lt_bapicondit[],
lt_bapicondqs[],
lt_bapicondvs[],
lte_bapiret2[],
lte_bapiknumhs[],
lte_mem_initial[].

CLEAR: ls_bapicondct,
ls_bapicondhd,
ls_bapicondit,
ls_bapicondqs,
ls_bapicondvs,
lse_bapiret2,
lse_bapiknumhs,
lse_mem_initial,
ls_varkey_a305_header,
ls_varkey_header,
ls_vardat_a305_header,
ls_vardat_header,
ls_varkey_item.
ls_bapicondct-operation = lcon_operation_003.
ls_bapicondct-cond_usage = lcon_cond_usage_a .
ls_bapicondct-table_no = lcon_table_no_305.
ls_varkey_a305_header-vkorg = <fs_lt_a305>-vkorg.
ls_varkey_a305_header-vtweg = <fs_lt_a305>-vtweg.
ls_varkey_a305_header-kunnr = <fs_lt_a305>-kunnr.
ls_varkey_a305_header-matnr = <fs_lt_a305>-matnr.
ls_varkey_a305_header-KFRST = <fs_lt_a305>-KFRST.
ls_varkey_header = ls_varkey_a305_header.
ls_vardat_a305_header-kbstat = <fs_lt_a305>-kbstat.
ls_vardat_header = ls_vardat_a305_header.
ls_bapicondct-cond_no = <fs_lt_a305>-knumh.


CLEAR: lv_knumh.
lv_knumh = ls_bapicondct-cond_no .

ls_bapicondct-applicatio = lcon_applicatio_v .
ls_bapicondct-cond_type = <fs_lt_a305>-kschl.
IF ls_bapicondct-cond_type IS INITIAL.
ls_bapicondct-cond_type = lcon_cond_type_pr00.
ENDIF.

ls_bapicondct-varkey = ls_varkey_header.
ls_bapicondct-vadat = ls_vardat_header.
ls_bapicondct-valid_to = <fs_lt_a305>-datbi. " lcon_valid_to.
ls_bapicondct-valid_from = <fs_lt_a305>-datab.
APPEND ls_bapicondct TO lt_bapicondct.

ls_bapicondhd-operation = ls_bapicondct-operation. "lcon_operation_009.
ls_bapicondhd-cond_no = ls_bapicondct-cond_no. "lcon_knumh_i .
ls_bapicondhd-created_by = sy-uname.
ls_bapicondhd-creat_date = sy-datum.
ls_bapicondhd-cond_usage = lcon_cond_usage_a .
ls_bapicondhd-table_no = ls_bapicondct-table_no.
ls_bapicondhd-applicatio = lcon_applicatio_v .
ls_bapicondhd-cond_type = ls_bapicondct-cond_type.
ls_bapicondhd-varkey = ls_varkey_header.
ls_bapicondhd-vardate = ls_vardat_header.
ls_bapicondhd-valid_from = <fs_lt_a305>-datab.
ls_bapicondhd-valid_to = <fs_lt_a305>-datbi. " lcon_valid_to.
APPEND ls_bapicondhd TO lt_bapicondhd.

ls_bapicondit-operation = ls_bapicondct-operation. "lcon_operation_009.
ls_bapicondit-cond_no = ls_bapicondct-cond_no. "lcon_knumh_i .
ls_bapicondit-cond_count = lcon_cond_count_i .
ls_bapicondit-applicatio = lcon_applicatio_v .
ls_bapicondit-cond_type = ls_bapicondct-cond_type.
* text_no
ls_bapicondit-scaletype = lcon_scale_type_c.
* scalebasin
* scale_qty
* unitmeasur
* measur_iso
* scale_val
* currenckey
* curren_iso
ls_bapicondit-calctypcon = lcon_calc_type_c.
ls_bapicondit-cond_value = <fs_lt_a305>-kbetr.
ls_bapicondit-condcurr = <fs_lt_a305>-konwa.
* ls_bapicondit-cond_iso
ls_bapicondit-cond_p_unt = <fs_lt_a305>-kpein.
ls_bapicondit-cond_unit = <fs_lt_a305>-kmein.
* conunitiso
* pricelevel
* numconvert
* denominato
* base_uom
* baseqtyiso
* lowerlimit
* upperlimit
* plcondval
* currency
* curr_iso
* condcurren
* isocurrenc
* plan_basis
* rate_unit
* exclusion
* customer
* vendor_no
* tax_code
* indidelete
* conditidx
* matlsettl
* accruals
* reb_retroa
* statofagre
* promot_no
* sales_deal
* salesquote
* add_val_dy
* fix_val_dy
* pmnttrms
* numborders
* minconbava
* maxconbava
* maxconval
* incr_scale
* pricscale
* relprcg
* promotion
* rebagreemt
* withtaxcod
* contract
* contractno
* flow_type
* indimatmai
ls_bapicondit-status = <fs_lt_a305>-KFRST.
* umsabst
* matlsettl_external
* matlsettl_guid
* matlsettl_version

APPEND ls_bapicondit TO lt_bapicondit.

refresh: db_xkondat[],
db_ykondat[],
db_xkonh[],
db_ykonh[],
db_xkonp[],
db_ykonp[],
db_xkonm[],
db_xkonw[],
db_ykonm[],
db_ykonw[].

select * from konh APPENDING CORRESPONDING FIELDS OF TABLE
db_ykonh where knumh = <fs_lt_a305>-knumh.
loop at db_ykonh ASSIGNING <fs_db_ykonh>.
<fs_db_ykonh>-updkz = 'U'.
ENDLOOP.

select * from konp APPENDING CORRESPONDING FIELDS OF TABLE
db_ykonp where knumh = <fs_lt_a305>-knumh.
loop at db_ykonp ASSIGNING <fs_db_ykonp>.
<fs_db_ykonp>-updkz = 'U'.
ENDLOOP.

CALL FUNCTION 'BAPI_PRICES_CONDITIONS'
EXPORTING
* PI_INITIALMODE = ' '
* PI_BLOCKNUMBER =
pi_physical_deletion = lv_del
TABLES
ti_bapicondct = lt_bapicondct
ti_bapicondhd = lt_bapicondhd
ti_bapicondit = lt_bapicondit
ti_bapicondqs = lt_bapicondqs
ti_bapicondvs = lt_bapicondvs
to_bapiret2 = lte_bapiret2
to_bapiknumhs = lte_bapiknumhs
to_mem_initial = lte_mem_initial
EXCEPTIONS
update_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.

select * from konh APPENDING CORRESPONDING FIELDS OF TABLE
db_xkonh where knumh = <fs_lt_a305>-knumh.
loop at db_xkonh ASSIGNING <fs_db_xkonh>.
<fs_db_xkonh>-updkz = 'U'.
ENDLOOP.

select * from konp APPENDING CORRESPONDING FIELDS OF TABLE
db_xkonp where knumh = <fs_lt_a305>-knumh.
loop at db_xkonp ASSIGNING <fs_db_xkonp>.
<fs_db_xkonp>-updkz = 'U'.
ENDLOOP.


if db_xkondat[] is INITIAL.
loop at db_xkonh.
db_xkondat-knumh = db_xkonh-knumh.
db_xkondat-DATAN = ls_bapicondhd-valid_from.
read TABLE db_ykonh with key knumh = db_xkonh-knumh.
if sy-subrc is INITIAL.
db_xkondat-datab = db_ykonh-DATAB.
db_xkondat-datbi = db_ykonh-DATBI.
db_xkondat-kz = db_ykonh-updkz.
append db_xkondat.
else.
db_xkondat-datab = db_xkonh-DATAB.
db_xkondat-datbi = db_xkonh-DATBI.
db_xkondat-kz = db_xkonh-updkz.
append db_xkondat.
endif.
ENDLOOP.
endif.

if db_ykondat[] is INITIAL.
loop at db_ykonh.
db_ykondat-knumh = db_ykonh-knumh.
db_ykondat-DATAN = db_ykonh-DATAB.
db_ykondat-datab = db_ykonh-DATAB.
db_ykondat-datbi = db_ykonh-DATBI.
db_ykondat-kz = db_ykonh-updkz.
append db_ykondat.
ENDLOOP.
endif.

* write change documents
CALL FUNCTION 'SD_CONDITION_CHANGE_DOCS_WRITE'
TABLES
p_xkondat = db_xkondat
p_ykondat = db_ykondat
p_xkonh = db_xkonh
p_ykonh = db_ykonh
p_xkonp = db_xkonp
p_ykonp = db_ykonp
p_xkonm = db_xkonm
p_xkonw = db_xkonw
p_ykonm = db_ykonm
p_ykonw = db_ykonw.

LOOP AT lte_bapiret2 ASSIGNING <fs_lte_bapiret2>
WHERE type = 'E'.
EXIT.
ENDLOOP.
IF sy-subrc IS INITIAL.
<fs_gt_upload>-icon = icon_cancel.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
* IMPORTING
* RETURN =
.
ELSE.

LOOP AT lte_bapiret2 ASSIGNING <fs_lte_bapiret2>
WHERE type = 'S' OR type = 'W'.
EXIT.
ENDLOOP.
IF sy-subrc IS INITIAL.
* CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
* EXPORTING
* wait = 'X'.
ELSE.
<fs_gt_upload>-icon = icon_cancel.
ENDIF.
ENDIF.

ENDIF.

IF <fs_gt_upload>-icon <> icon_cancel.
ELSE.
EXIT.
ENDIF.
*1b Get all records before and into the current From/To:
* Change the record to = current From - 1.
IF <fs_lt_a305>-kfrst = lcon_kfrst_a.
REFRESH: lt_bapicondct[],
lt_bapicondhd[],
lt_bapicondit[],
lt_bapicondqs[],
lt_bapicondvs[],
lte_bapiret2[],
lte_bapiknumhs[],
lte_mem_initial[].

CLEAR: ls_bapicondct,
ls_bapicondhd,
ls_bapicondit,
ls_bapicondqs,
ls_bapicondvs,
lse_bapiret2,
lse_bapiknumhs,
lse_mem_initial,
ls_varkey_a305_header,
ls_varkey_header,
ls_vardat_a305_header,
ls_vardat_header,
ls_varkey_item.
ls_bapicondct-operation = lcon_operation_004. "lcon_operation_009.
ls_bapicondct-cond_usage = lcon_cond_usage_a .
ls_bapicondct-table_no = lcon_table_no_305.
ls_varkey_a305_header-vkorg = <fs_lt_a305>-vkorg.
ls_varkey_a305_header-vtweg = <fs_lt_a305>-vtweg.
ls_varkey_a305_header-kunnr = <fs_lt_a305>-kunnr.
ls_varkey_a305_header-matnr = <fs_lt_a305>-matnr.
ls_varkey_a305_header-kfrst = <fs_lt_a305>-kfrst.
ls_varkey_header = ls_varkey_a305_header.
ls_vardat_a305_header-kbstat = <fs_lt_a305>-kbstat.
ls_vardat_header = ls_vardat_a305_header.
ls_bapicondct-cond_no = <fs_lt_a305>-knumh.


CLEAR: lv_knumh.
lv_knumh = ls_bapicondct-cond_no .

ls_bapicondct-applicatio = lcon_applicatio_v .
ls_bapicondct-cond_type = <fs_lt_a305>-kschl.
IF ls_bapicondct-cond_type IS INITIAL.
ls_bapicondct-cond_type = lcon_cond_type_pr00.
ENDIF.

ls_bapicondct-varkey = ls_varkey_header.
ls_bapicondct-vadat = ls_vardat_header.
ls_bapicondct-valid_to = <fs_gt_upload>-datab - 1.
ls_bapicondct-valid_from = <fs_lt_a305>-datab.
APPEND ls_bapicondct TO lt_bapicondct.

ls_bapicondhd-operation = ls_bapicondct-operation. "lcon_operation_009.
ls_bapicondhd-cond_no = ls_bapicondct-cond_no. "lcon_knumh_i .
ls_bapicondhd-created_by = sy-uname.
ls_bapicondhd-creat_date = sy-datum.
ls_bapicondhd-cond_usage = lcon_cond_usage_a .
ls_bapicondhd-table_no = ls_bapicondct-table_no.
ls_bapicondhd-applicatio = lcon_applicatio_v .
ls_bapicondhd-cond_type = ls_bapicondct-cond_type.
ls_bapicondhd-varkey = ls_varkey_header.
ls_bapicondhd-vardate = ls_vardat_header.
ls_bapicondhd-valid_from = <fs_gt_upload>-datab - 1.
ls_bapicondhd-valid_to = <fs_lt_a305>-datbi. " lcon_valid_to.
APPEND ls_bapicondhd TO lt_bapicondhd.

ls_bapicondit-operation = ls_bapicondct-operation. "lcon_operation_009.
ls_bapicondit-cond_no = ls_bapicondct-cond_no. "lcon_knumh_i .
ls_bapicondit-cond_count = lcon_cond_count_i .
ls_bapicondit-applicatio = lcon_applicatio_v .
ls_bapicondit-cond_type = ls_bapicondct-cond_type.
* text_no
ls_bapicondit-scaletype = lcon_scale_type_c.
* scalebasin
* scale_qty
* unitmeasur
* measur_iso
* scale_val
* currenckey
* curren_iso
ls_bapicondit-calctypcon = lcon_calc_type_c.
ls_bapicondit-cond_value = <fs_lt_a305>-kbetr.
ls_bapicondit-condcurr = <fs_lt_a305>-konwa.
* ls_bapicondit-cond_iso
ls_bapicondit-cond_p_unt = <fs_lt_a305>-kpein.
ls_bapicondit-cond_unit = <fs_lt_a305>-kmein.
* conunitiso
* pricelevel
* numconvert
* denominato
* base_uom
* baseqtyiso
* lowerlimit
* upperlimit
* plcondval
* currency
* curr_iso
* condcurren
* isocurrenc
* plan_basis
* rate_unit
* exclusion
* customer
* vendor_no
* tax_code
* indidelete
* conditidx
* matlsettl
* accruals
* reb_retroa
* statofagre
* promot_no
* sales_deal
* salesquote
* add_val_dy
* fix_val_dy
* pmnttrms
* numborders
* minconbava
* maxconbava
* maxconval
* incr_scale
* pricscale
* relprcg
* promotion
* rebagreemt
* withtaxcod
* contract
* contractno
* flow_type
* indimatmai
ls_bapicondit-status = <fs_lt_a305>-kfrst.
* umsabst
* matlsettl_external
* matlsettl_guid
* matlsettl_version

APPEND ls_bapicondit TO lt_bapicondit.


refresh: db_xkondat[],
db_ykondat[],
db_xkonh[],
db_ykonh[],
db_xkonp[],
db_ykonp[],
db_xkonm[],
db_xkonw[],
db_ykonm[],
db_ykonw[].

select * from konh APPENDING CORRESPONDING FIELDS OF TABLE
db_ykonh where knumh = <fs_lt_a305>-knumh.
loop at db_ykonh ASSIGNING <fs_db_ykonh>.
<fs_db_ykonh>-updkz = 'U'.
ENDLOOP.

select * from konp APPENDING CORRESPONDING FIELDS OF TABLE
db_ykonp where knumh = <fs_lt_a305>-knumh.
loop at db_ykonp ASSIGNING <fs_db_ykonp>.
<fs_db_ykonp>-updkz = 'U'.
ENDLOOP.

CALL FUNCTION 'BAPI_PRICES_CONDITIONS'
EXPORTING
* PI_INITIALMODE = ' '
* PI_BLOCKNUMBER =
pi_physical_deletion = lv_del
TABLES
ti_bapicondct = lt_bapicondct
ti_bapicondhd = lt_bapicondhd
ti_bapicondit = lt_bapicondit
ti_bapicondqs = lt_bapicondqs
ti_bapicondvs = lt_bapicondvs
to_bapiret2 = lte_bapiret2
to_bapiknumhs = lte_bapiknumhs
to_mem_initial = lte_mem_initial
EXCEPTIONS
update_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.

select * from konh APPENDING CORRESPONDING FIELDS OF TABLE
db_xkonh where knumh = <fs_lt_a305>-knumh.
loop at db_xkonh ASSIGNING <fs_db_xkonh>.
<fs_db_xkonh>-updkz = 'U'.
ENDLOOP.

select * from konp APPENDING CORRESPONDING FIELDS OF TABLE
db_xkonp where knumh = <fs_lt_a305>-knumh.
loop at db_xkonp ASSIGNING <fs_db_xkonp>.
<fs_db_xkonp>-updkz = 'U'.
ENDLOOP.


if db_xkondat[] is INITIAL.
loop at db_xkonh.
db_xkondat-knumh = db_xkonh-knumh.
db_xkondat-DATAN = ls_bapicondhd-valid_from.
read TABLE db_ykonh with key knumh = db_xkonh-knumh.
if sy-subrc is INITIAL.
db_xkondat-datab = db_ykonh-DATAB.
db_xkondat-datbi = db_ykonh-DATBI.
db_xkondat-kz = db_ykonh-updkz.
append db_xkondat.
else.
db_xkondat-datab = db_xkonh-DATAB.
db_xkondat-datbi = db_xkonh-DATBI.
db_xkondat-kz = db_xkonh-updkz.
append db_xkondat.
endif.
ENDLOOP.
endif.

if db_ykondat[] is INITIAL.
loop at db_ykonh.
db_ykondat-knumh = db_ykonh-knumh.
db_ykondat-DATAN = db_ykonh-DATAB.
db_ykondat-datab = db_ykonh-DATAB.
db_ykondat-datbi = db_ykonh-DATBI.
db_ykondat-kz = db_ykonh-updkz.
append db_ykondat.
ENDLOOP.
endif.

* write change documents
CALL FUNCTION 'SD_CONDITION_CHANGE_DOCS_WRITE'
TABLES
p_xkondat = db_xkondat
p_ykondat = db_ykondat
p_xkonh = db_xkonh
p_ykonh = db_ykonh
p_xkonp = db_xkonp
p_ykonp = db_ykonp
p_xkonm = db_xkonm
p_xkonw = db_xkonw
p_ykonm = db_ykonm
p_ykonw = db_ykonw.

LOOP AT lte_bapiret2 ASSIGNING <fs_lte_bapiret2>
WHERE type = 'E'.
EXIT.
ENDLOOP.
IF sy-subrc IS INITIAL.
<fs_gt_upload>-icon = icon_cancel.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
* IMPORTING
* RETURN =
.
ELSE.

LOOP AT lte_bapiret2 ASSIGNING <fs_lte_bapiret2>
WHERE type = 'S' OR type = 'W'.
EXIT.
ENDLOOP.
IF sy-subrc IS INITIAL.
* CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
* EXPORTING
* wait = 'X'.
ELSE.
<fs_gt_upload>-icon = icon_cancel.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.

CHECK <fs_gt_upload>-icon <> icon_cancel.

*2 Get all records into the current From/To
REFRESH: lt_a305[].
SELECT a305~kappl
a305~kschl
a305~vkorg
a305~vtweg
a305~kunnr
a305~matnr
a305~kfrst
a305~datbi
a305~datab
a305~kbstat
a305~knumh
konp~konwa
konp~kbetr
konp~kmein
konp~kpein
FROM a305
INNER JOIN konp ON konp~knumh = a305~knumh
APPENDING CORRESPONDING FIELDS OF TABLE lt_a305
WHERE a305~kappl = lcon_applicatio_v AND
a305~kschl = <fs_gt_upload>-kschl AND
a305~vkorg = <fs_gt_upload>-vkorg AND
a305~vtweg = <fs_gt_upload>-vtweg AND
a305~kunnr = <fs_gt_upload>-kunnr AND
a305~matnr = <fs_gt_upload>-matnr AND
a305~kfrst = lcon_kfrst_a AND
a305~datbi LE <fs_gt_upload>-datbi AND
a305~datab GE <fs_gt_upload>-datab.

LOOP AT lt_a305 ASSIGNING <fs_lt_a305>.
IF <fs_gt_upload>-icon <> icon_cancel.
ELSE.
EXIT.
ENDIF.
IF <fs_lt_a305>-kfrst = lcon_kfrst_a.
*2a Get all records into the current From/To
* Delete the record
REFRESH: lt_bapicondct[],
lt_bapicondhd[],
lt_bapicondit[],
lt_bapicondqs[],
lt_bapicondvs[],
lte_bapiret2[],
lte_bapiknumhs[],
lte_mem_initial[].

CLEAR: ls_bapicondct,
ls_bapicondhd,
ls_bapicondit,
ls_bapicondqs,
ls_bapicondvs,
lse_bapiret2,
lse_bapiknumhs,
lse_mem_initial,
ls_varkey_a305_header,
ls_varkey_header,
ls_vardat_a305_header,
ls_vardat_header,
ls_varkey_item.
ls_bapicondct-operation = lcon_operation_003.
ls_bapicondct-cond_usage = lcon_cond_usage_a .
ls_bapicondct-table_no = lcon_table_no_305.
ls_varkey_a305_header-vkorg = <fs_lt_a305>-vkorg.
ls_varkey_a305_header-vtweg = <fs_lt_a305>-vtweg.
ls_varkey_a305_header-kunnr = <fs_lt_a305>-kunnr.
ls_varkey_a305_header-matnr = <fs_lt_a305>-matnr.
ls_varkey_a305_header-kfrst = <fs_lt_a305>-kfrst.
ls_varkey_header = ls_varkey_a305_header.
ls_vardat_a305_header-kbstat = <fs_lt_a305>-kbstat.
ls_vardat_header = ls_vardat_a305_header.
ls_bapicondct-cond_no = <fs_lt_a305>-knumh.


CLEAR: lv_knumh.
lv_knumh = ls_bapicondct-cond_no .

ls_bapicondct-applicatio = lcon_applicatio_v .
ls_bapicondct-cond_type = <fs_lt_a305>-kschl.
IF ls_bapicondct-cond_type IS INITIAL.
ls_bapicondct-cond_type = lcon_cond_type_pr00.
ENDIF.

ls_bapicondct-varkey = ls_varkey_header.
ls_bapicondct-vadat = ls_vardat_header.
ls_bapicondct-valid_to = <fs_lt_a305>-datbi. " lcon_valid_to.
ls_bapicondct-valid_from = <fs_lt_a305>-datab.
APPEND ls_bapicondct TO lt_bapicondct.

ls_bapicondhd-operation = ls_bapicondct-operation. "lcon_operation_009.
ls_bapicondhd-cond_no = ls_bapicondct-cond_no. "lcon_knumh_i .
ls_bapicondhd-created_by = sy-uname.
ls_bapicondhd-creat_date = sy-datum.
ls_bapicondhd-cond_usage = lcon_cond_usage_a .
ls_bapicondhd-table_no = ls_bapicondct-table_no.
ls_bapicondhd-applicatio = lcon_applicatio_v .
ls_bapicondhd-cond_type = ls_bapicondct-cond_type.
ls_bapicondhd-varkey = ls_varkey_header.
ls_bapicondhd-vardate = ls_vardat_header.
ls_bapicondhd-valid_from = <fs_lt_a305>-datab.
ls_bapicondhd-valid_to = <fs_lt_a305>-datbi. " lcon_valid_to.
APPEND ls_bapicondhd TO lt_bapicondhd.

ls_bapicondit-operation = ls_bapicondct-operation. "lcon_operation_009.
ls_bapicondit-cond_no = ls_bapicondct-cond_no. "lcon_knumh_i .
ls_bapicondit-cond_count = lcon_cond_count_i .
ls_bapicondit-applicatio = lcon_applicatio_v .
ls_bapicondit-cond_type = ls_bapicondct-cond_type.
* text_no
ls_bapicondit-scaletype = lcon_scale_type_c.
* scalebasin
* scale_qty
* unitmeasur
* measur_iso
* scale_val
* currenckey
* curren_iso
ls_bapicondit-calctypcon = lcon_calc_type_c.
ls_bapicondit-cond_value = <fs_lt_a305>-kbetr.
ls_bapicondit-condcurr = <fs_lt_a305>-konwa.
* ls_bapicondit-cond_iso
ls_bapicondit-cond_p_unt = <fs_lt_a305>-kpein.
ls_bapicondit-cond_unit = <fs_lt_a305>-kmein.
* conunitiso
* pricelevel
* numconvert
* denominato
* base_uom
* baseqtyiso
* lowerlimit
* upperlimit
* plcondval
* currency
* curr_iso
* condcurren
* isocurrenc
* plan_basis
* rate_unit
* exclusion
* customer
* vendor_no
* tax_code
* indidelete
* conditidx
* matlsettl
* accruals
* reb_retroa
* statofagre
* promot_no
* sales_deal
* salesquote
* add_val_dy
* fix_val_dy
* pmnttrms
* numborders
* minconbava
* maxconbava
* maxconval
* incr_scale
* pricscale
* relprcg
* promotion
* rebagreemt
* withtaxcod
* contract
* contractno
* flow_type
* indimatmai
ls_bapicondit-status = <fs_lt_a305>-kfrst.
* umsabst
* matlsettl_external
* matlsettl_guid
* matlsettl_version

APPEND ls_bapicondit TO lt_bapicondit.

refresh: db_xkondat[],
db_ykondat[],
db_xkonh[],
db_ykonh[],
db_xkonp[],
db_ykonp[],
db_xkonm[],
db_xkonw[],
db_ykonm[],
db_ykonw[].

select * from konh APPENDING CORRESPONDING FIELDS OF TABLE
db_ykonh where knumh = <fs_lt_a305>-knumh.
loop at db_ykonh ASSIGNING <fs_db_ykonh>.
<fs_db_ykonh>-updkz = 'U'.
ENDLOOP.

select * from konp APPENDING CORRESPONDING FIELDS OF TABLE
db_ykonp where knumh = <fs_lt_a305>-knumh.
loop at db_ykonp ASSIGNING <fs_db_ykonp>.
<fs_db_ykonp>-updkz = 'U'.
ENDLOOP.

CALL FUNCTION 'BAPI_PRICES_CONDITIONS'
EXPORTING
* PI_INITIALMODE = ' '
* PI_BLOCKNUMBER =
pi_physical_deletion = lv_del
TABLES
ti_bapicondct = lt_bapicondct
ti_bapicondhd = lt_bapicondhd
ti_bapicondit = lt_bapicondit
ti_bapicondqs = lt_bapicondqs
ti_bapicondvs = lt_bapicondvs
to_bapiret2 = lte_bapiret2
to_bapiknumhs = lte_bapiknumhs
to_mem_initial = lte_mem_initial
EXCEPTIONS
update_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.


select * from konh APPENDING CORRESPONDING FIELDS OF TABLE
db_xkonh where knumh = <fs_lt_a305>-knumh.
loop at db_xkonh ASSIGNING <fs_db_xkonh>.
<fs_db_xkonh>-updkz = 'U'.
ENDLOOP.

select * from konp APPENDING CORRESPONDING FIELDS OF TABLE
db_xkonp where knumh = <fs_lt_a305>-knumh.
loop at db_xkonp ASSIGNING <fs_db_xkonp>.
<fs_db_xkonp>-updkz = 'U'.
ENDLOOP.


if db_xkondat[] is INITIAL.
loop at db_xkonh.
db_xkondat-knumh = db_xkonh-knumh.
db_xkondat-DATAN = ls_bapicondhd-valid_from.
read TABLE db_ykonh with key knumh = db_xkonh-knumh.
if sy-subrc is INITIAL.
db_xkondat-datab = db_ykonh-DATAB.
db_xkondat-datbi = db_ykonh-DATBI.
db_xkondat-kz = db_ykonh-updkz.
append db_xkondat.
else.
db_xkondat-datab = db_xkonh-DATAB.
db_xkondat-datbi = db_xkonh-DATBI.
db_xkondat-kz = db_xkonh-updkz.
append db_xkondat.
endif.
ENDLOOP.
endif.

if db_ykondat[] is INITIAL.
loop at db_ykonh.
db_ykondat-knumh = db_ykonh-knumh.
db_ykondat-DATAN = db_ykonh-DATAB.
db_ykondat-datab = db_ykonh-DATAB.
db_ykondat-datbi = db_ykonh-DATBI.
db_ykondat-kz = db_ykonh-updkz.
append db_ykondat.
ENDLOOP.
endif.

* write change documents
CALL FUNCTION 'SD_CONDITION_CHANGE_DOCS_WRITE'
TABLES
p_xkondat = db_xkondat
p_ykondat = db_ykondat
p_xkonh = db_xkonh
p_ykonh = db_ykonh
p_xkonp = db_xkonp
p_ykonp = db_ykonp
p_xkonm = db_xkonm
p_xkonw = db_xkonw
p_ykonm = db_ykonm
p_ykonw = db_ykonw.


LOOP AT lte_bapiret2 ASSIGNING <fs_lte_bapiret2>
WHERE type = 'E'.
EXIT.
ENDLOOP.
IF sy-subrc IS INITIAL.
<fs_gt_upload>-icon = icon_cancel.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
* IMPORTING
* RETURN =
.
ELSE.

LOOP AT lte_bapiret2 ASSIGNING <fs_lte_bapiret2>
WHERE type = 'S' OR type = 'W'.
EXIT.
ENDLOOP.
IF sy-subrc IS INITIAL.
* CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
* EXPORTING
* wait = 'X'.
ELSE.
<fs_gt_upload>-icon = icon_cancel.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.

CHECK <fs_gt_upload>-icon <> icon_cancel.

*3 Get all records where from in the current From/To
* Delete the record
REFRESH: lt_a305[].
SELECT a305~kappl
a305~kschl
a305~vkorg
a305~vtweg
a305~kunnr
a305~matnr
a305~kfrst
a305~datbi
a305~datab
a305~kbstat
a305~knumh
konp~konwa
konp~kbetr
konp~kmein
konp~kpein
FROM a305
INNER JOIN konp ON konp~knumh = a305~knumh
APPENDING CORRESPONDING FIELDS OF TABLE lt_a305
WHERE a305~kappl = lcon_applicatio_v AND
a305~kschl = <fs_gt_upload>-kschl AND
a305~vkorg = <fs_gt_upload>-vkorg AND
a305~vtweg = <fs_gt_upload>-vtweg AND
a305~kunnr = <fs_gt_upload>-kunnr AND
a305~matnr = <fs_gt_upload>-matnr AND
a305~kfrst = lcon_kfrst_a AND
a305~datbi GT <fs_gt_upload>-datab AND
a305~datab GE <fs_gt_upload>-datab AND
a305~datab LE <fs_gt_upload>-datbi .

LOOP AT lt_a305 ASSIGNING <fs_lt_a305>.
IF <fs_gt_upload>-icon <> icon_cancel.
ELSE.
EXIT.
ENDIF.
IF <fs_lt_a305>-kfrst = lcon_kfrst_a.

*3 Get all records where from in the current From/To
* Delete
* REFRESH: lt_bapicondct[],
* lt_bapicondhd[],
* lt_bapicondit[],
* lt_bapicondqs[],
* lt_bapicondvs[],
* lte_bapiret2[],
* lte_bapiknumhs[],
* lte_mem_initial[].
*
* CLEAR: ls_bapicondct,
* ls_bapicondhd,
* ls_bapicondit,
* ls_bapicondqs,
* ls_bapicondvs,
* lse_bapiret2,
* lse_bapiknumhs,
* lse_mem_initial,
* ls_varkey_a305_header,
* ls_varkey_header,
* ls_vardat_a305_header,
* ls_vardat_header,
* ls_varkey_item.
* ls_bapicondct-operation = lcon_operation_003.
* ls_bapicondct-cond_usage = lcon_cond_usage_a .
* ls_bapicondct-table_no = lcon_table_no_305.
* ls_varkey_a305_header-vkorg = <fs_lt_a305>-vkorg.
* ls_varkey_a305_header-vtweg = <fs_lt_a305>-vtweg.
* ls_varkey_a305_header-kunnr = <fs_lt_a305>-kunnr.
* ls_varkey_a305_header-matnr = <fs_lt_a305>-matnr.
* ls_varkey_a305_header-KFRST = <fs_lt_a305>-KFRST.
* ls_varkey_header = ls_varkey_a305_header.
* ls_vardat_a305_header-kbstat = <fs_lt_a305>-kbstat.
* ls_vardat_header = ls_vardat_a305_header.
* ls_bapicondct-cond_no = <fs_lt_a305>-knumh.
*
*
* CLEAR: lv_knumh.
* lv_knumh = ls_bapicondct-cond_no .
*
* ls_bapicondct-applicatio = lcon_applicatio_v .
* ls_bapicondct-cond_type = <fs_lt_a305>-kschl.
* IF ls_bapicondct-cond_type IS INITIAL.
* ls_bapicondct-cond_type = lcon_cond_type_pr00.
* ENDIF.
*
* ls_bapicondct-varkey = ls_varkey_header.
* ls_bapicondct-vadat = ls_vardat_header.
* ls_bapicondct-valid_to = <fs_lt_a305>-datbi. " lcon_valid_to.
* ls_bapicondct-valid_from = <fs_lt_a305>-datab.
* APPEND ls_bapicondct TO lt_bapicondct.
*
* ls_bapicondhd-operation = ls_bapicondct-operation. "lcon_operation_009.
* ls_bapicondhd-cond_no = ls_bapicondct-cond_no. "lcon_knumh_i .
* ls_bapicondhd-created_by = sy-uname.
* ls_bapicondhd-creat_date = sy-datum.
* ls_bapicondhd-cond_usage = lcon_cond_usage_a .
* ls_bapicondhd-table_no = ls_bapicondct-table_no.
* ls_bapicondhd-applicatio = lcon_applicatio_v .
* ls_bapicondhd-cond_type = ls_bapicondct-cond_type.
* ls_bapicondhd-varkey = ls_varkey_header.
* ls_bapicondhd-vardate = ls_vardat_header.
* ls_bapicondhd-valid_from = <fs_lt_a305>-datab.
* ls_bapicondhd-valid_to = <fs_lt_a305>-datbi. " lcon_valid_to.
* APPEND ls_bapicondhd TO lt_bapicondhd.
*
* ls_bapicondit-operation = ls_bapicondct-operation. "lcon_operation_009.
* ls_bapicondit-cond_no = ls_bapicondct-cond_no. "lcon_knumh_i .
* ls_bapicondit-cond_count = lcon_cond_count_i .
* ls_bapicondit-applicatio = lcon_applicatio_v .
* ls_bapicondit-cond_type = ls_bapicondct-cond_type.
** text_no
* ls_bapicondit-scaletype = lcon_scale_type_c.
** scalebasin
** scale_qty
** unitmeasur
** measur_iso
** scale_val
** currenckey
** curren_iso
* ls_bapicondit-calctypcon = lcon_calc_type_c.
* ls_bapicondit-cond_value = <fs_lt_a305>-kbetr.
* ls_bapicondit-condcurr = <fs_lt_a305>-konwa.
** ls_bapicondit-cond_iso
* ls_bapicondit-cond_p_unt = <fs_lt_a305>-kpein.
* ls_bapicondit-cond_unit = <fs_lt_a305>-kmein.
** conunitiso
** pricelevel
** numconvert
** denominato
** base_uom
** baseqtyiso
** lowerlimit
** upperlimit
** plcondval
** currency
** curr_iso
** condcurren
** isocurrenc
** plan_basis
** rate_unit
** exclusion
** customer
** vendor_no
** tax_code
** indidelete
** conditidx
** matlsettl
** accruals
** reb_retroa
** statofagre
** promot_no
** sales_deal
** salesquote
** add_val_dy
** fix_val_dy
** pmnttrms
** numborders
** minconbava
** maxconbava
** maxconval
** incr_scale
** pricscale
** relprcg
** promotion
** rebagreemt
** withtaxcod
** contract
** contractno
** flow_type
** indimatmai
* ls_bapicondit-status = <fs_lt_a305>-KFRST.
** umsabst
** matlsettl_external
** matlsettl_guid
** matlsettl_version
*
* APPEND ls_bapicondit TO lt_bapicondit.
*
* CALL FUNCTION 'BAPI_PRICES_CONDITIONS'
* EXPORTING
** PI_INITIALMODE = ' '
** PI_BLOCKNUMBER =
* pi_physical_deletion = lv_del
* TABLES
* ti_bapicondct = lt_bapicondct
* ti_bapicondhd = lt_bapicondhd
* ti_bapicondit = lt_bapicondit
* ti_bapicondqs = lt_bapicondqs
* ti_bapicondvs = lt_bapicondvs
* to_bapiret2 = lte_bapiret2
* to_bapiknumhs = lte_bapiknumhs
* to_mem_initial = lte_mem_initial
* EXCEPTIONS
* update_error = 1
* OTHERS = 2.
* IF sy-subrc <> 0.
** Implement suitable error handling here
* ENDIF.
* LOOP AT lte_bapiret2 ASSIGNING <fs_lte_bapiret2>
* WHERE type = 'E'.
* EXIT.
* ENDLOOP.
* IF sy-subrc IS INITIAL.
* <fs_gt_upload>-icon = icon_cancel.
* CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
** IMPORTING
** RETURN =
* .
* ELSE.
*
* LOOP AT lte_bapiret2 ASSIGNING <fs_lte_bapiret2>
* WHERE type = 'S' OR type = 'W'.
* EXIT.
* ENDLOOP.
* IF sy-subrc IS INITIAL.
** CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
** EXPORTING
** wait = 'X'.
* ELSE.
* <fs_gt_upload>-icon = icon_cancel.
* ENDIF.
* ENDIF.
ENDIF.

IF <fs_gt_upload>-icon <> icon_cancel.
ELSE.
EXIT.
ENDIF.

IF <fs_lt_a305>-kfrst = lcon_kfrst_a.
*3 Get all records where from in the current From/To
* From = current To + 1.
REFRESH: lt_bapicondct[],
lt_bapicondhd[],
lt_bapicondit[],
lt_bapicondqs[],
lt_bapicondvs[],
lte_bapiret2[],
lte_bapiknumhs[],
lte_mem_initial[].

CLEAR: ls_bapicondct,
ls_bapicondhd,
ls_bapicondit,
ls_bapicondqs,
ls_bapicondvs,
lse_bapiret2,
lse_bapiknumhs,
lse_mem_initial,
ls_varkey_a305_header,
ls_varkey_header,
ls_vardat_a305_header,
ls_vardat_header,
ls_varkey_item.
ls_bapicondct-operation = lcon_operation_004. "lcon_operation_009.
ls_bapicondct-cond_usage = lcon_cond_usage_a .
ls_bapicondct-table_no = lcon_table_no_305.
ls_varkey_a305_header-vkorg = <fs_lt_a305>-vkorg.
ls_varkey_a305_header-vtweg = <fs_lt_a305>-vtweg.
ls_varkey_a305_header-kunnr = <fs_lt_a305>-kunnr.
ls_varkey_a305_header-matnr = <fs_lt_a305>-matnr.
ls_varkey_a305_header-kfrst = <fs_lt_a305>-kfrst.
ls_varkey_header = ls_varkey_a305_header.
ls_vardat_a305_header-kbstat = <fs_lt_a305>-kbstat.
ls_vardat_header = ls_vardat_a305_header.
ls_bapicondct-cond_no = <fs_lt_a305>-knumh.


CLEAR: lv_knumh.
lv_knumh = ls_bapicondct-cond_no .

ls_bapicondct-applicatio = lcon_applicatio_v .
ls_bapicondct-cond_type = <fs_lt_a305>-kschl.
IF ls_bapicondct-cond_type IS INITIAL.
ls_bapicondct-cond_type = lcon_cond_type_pr00.
ENDIF.

ls_bapicondct-varkey = ls_varkey_header.
ls_bapicondct-vadat = ls_vardat_header.
ls_bapicondct-valid_to = <fs_lt_a305>-datbi.
ls_bapicondct-valid_from = <fs_gt_upload>-datbi + 1.
APPEND ls_bapicondct TO lt_bapicondct.

ls_bapicondhd-operation = ls_bapicondct-operation. "lcon_operation_009.
ls_bapicondhd-cond_no = ls_bapicondct-cond_no. "lcon_knumh_i .
ls_bapicondhd-created_by = sy-uname.
ls_bapicondhd-creat_date = sy-datum.
ls_bapicondhd-cond_usage = lcon_cond_usage_a .
ls_bapicondhd-table_no = ls_bapicondct-table_no.
ls_bapicondhd-applicatio = lcon_applicatio_v .
ls_bapicondhd-cond_type = ls_bapicondct-cond_type.
ls_bapicondhd-varkey = ls_varkey_header.
ls_bapicondhd-vardate = ls_vardat_header.
ls_bapicondhd-valid_from = <fs_lt_a305>-datbi.
ls_bapicondhd-valid_to = <fs_gt_upload>-datbi + 1.
APPEND ls_bapicondhd TO lt_bapicondhd.

ls_bapicondit-operation = ls_bapicondct-operation. "lcon_operation_009.
ls_bapicondit-cond_no = ls_bapicondct-cond_no. "lcon_knumh_i .
ls_bapicondit-cond_count = lcon_cond_count_i .
ls_bapicondit-applicatio = lcon_applicatio_v .
ls_bapicondit-cond_type = ls_bapicondct-cond_type.
* text_no
ls_bapicondit-scaletype = lcon_scale_type_c.
* scalebasin
* scale_qty
* unitmeasur
* measur_iso
* scale_val
* currenckey
* curren_iso
ls_bapicondit-calctypcon = lcon_calc_type_c.
ls_bapicondit-cond_value = <fs_lt_a305>-kbetr.
ls_bapicondit-condcurr = <fs_lt_a305>-konwa.
* ls_bapicondit-cond_iso
ls_bapicondit-cond_p_unt = <fs_lt_a305>-kpein.
ls_bapicondit-cond_unit = <fs_lt_a305>-kmein.
* conunitiso
* pricelevel
* numconvert
* denominato
* base_uom
* baseqtyiso
* lowerlimit
* upperlimit
* plcondval
* currency
* curr_iso
* condcurren
* isocurrenc
* plan_basis
* rate_unit
* exclusion
* customer
* vendor_no
* tax_code
* indidelete
* conditidx
* matlsettl
* accruals
* reb_retroa
* statofagre
* promot_no
* sales_deal
* salesquote
* add_val_dy
* fix_val_dy
* pmnttrms
* numborders
* minconbava
* maxconbava
* maxconval
* incr_scale
* pricscale
* relprcg
* promotion
* rebagreemt
* withtaxcod
* contract
* contractno
* flow_type
* indimatmai
ls_bapicondit-status = <fs_lt_a305>-kfrst.
* umsabst
* matlsettl_external
* matlsettl_guid
* matlsettl_version

APPEND ls_bapicondit TO lt_bapicondit.

refresh: db_xkondat[],
db_ykondat[],
db_xkonh[],
db_ykonh[],
db_xkonp[],
db_ykonp[],
db_xkonm[],
db_xkonw[],
db_ykonm[],
db_ykonw[].

select * from konh APPENDING CORRESPONDING FIELDS OF TABLE
db_ykonh where knumh = <fs_lt_a305>-knumh.
loop at db_ykonh ASSIGNING <fs_db_ykonh>.
<fs_db_ykonh>-updkz = 'U'.
ENDLOOP.

select * from konp APPENDING CORRESPONDING FIELDS OF TABLE
db_ykonp where knumh = <fs_lt_a305>-knumh.
loop at db_ykonp ASSIGNING <fs_db_ykonp>.
<fs_db_ykonp>-updkz = 'U'.
ENDLOOP.

CALL FUNCTION 'BAPI_PRICES_CONDITIONS'
EXPORTING
* PI_INITIALMODE = ' '
* PI_BLOCKNUMBER =
pi_physical_deletion = lv_del
TABLES
ti_bapicondct = lt_bapicondct
ti_bapicondhd = lt_bapicondhd
ti_bapicondit = lt_bapicondit
ti_bapicondqs = lt_bapicondqs
ti_bapicondvs = lt_bapicondvs
to_bapiret2 = lte_bapiret2
to_bapiknumhs = lte_bapiknumhs
to_mem_initial = lte_mem_initial
EXCEPTIONS
update_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.

select * from konh APPENDING CORRESPONDING FIELDS OF TABLE
db_xkonh where knumh = <fs_lt_a305>-knumh.
loop at db_xkonh ASSIGNING <fs_db_xkonh>.
<fs_db_xkonh>-updkz = 'U'.
ENDLOOP.

select * from konp APPENDING CORRESPONDING FIELDS OF TABLE
db_xkonp where knumh = <fs_lt_a305>-knumh.
loop at db_xkonp ASSIGNING <fs_db_xkonp>.
<fs_db_xkonp>-updkz = 'U'.
ENDLOOP.


if db_xkondat[] is INITIAL.
loop at db_xkonh.
db_xkondat-knumh = db_xkonh-knumh.
db_xkondat-DATAN = ls_bapicondhd-valid_from.
read TABLE db_ykonh with key knumh = db_xkonh-knumh.
if sy-subrc is INITIAL.
db_xkondat-datab = db_ykonh-DATAB.
db_xkondat-datbi = db_ykonh-DATBI.
db_xkondat-kz = db_ykonh-updkz.
append db_xkondat.
else.
db_xkondat-datab = db_xkonh-DATAB.
db_xkondat-datbi = db_xkonh-DATBI.
db_xkondat-kz = db_xkonh-updkz.
append db_xkondat.
endif.
ENDLOOP.
endif.

if db_ykondat[] is INITIAL.
loop at db_ykonh.
db_ykondat-knumh = db_ykonh-knumh.
db_ykondat-DATAN = db_ykonh-DATAB.
db_ykondat-datab = db_ykonh-DATAB.
db_ykondat-datbi = db_ykonh-DATBI.
db_ykondat-kz = db_ykonh-updkz.
append db_ykondat.
ENDLOOP.
endif.

* write change documents
CALL FUNCTION 'SD_CONDITION_CHANGE_DOCS_WRITE'
TABLES
p_xkondat = db_xkondat
p_ykondat = db_ykondat
p_xkonh = db_xkonh
p_ykonh = db_ykonh
p_xkonp = db_xkonp
p_ykonp = db_ykonp
p_xkonm = db_xkonm
p_xkonw = db_xkonw
p_ykonm = db_ykonm
p_ykonw = db_ykonw.


LOOP AT lte_bapiret2 ASSIGNING <fs_lte_bapiret2>
WHERE type = 'E'.
EXIT.
ENDLOOP.
IF sy-subrc IS INITIAL.
<fs_gt_upload>-icon = icon_cancel.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
* IMPORTING
* RETURN =
.
ELSE.

LOOP AT lte_bapiret2 ASSIGNING <fs_lte_bapiret2>
WHERE type = 'S' OR type = 'W'.
EXIT.
ENDLOOP.
IF sy-subrc IS INITIAL.
* CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
* EXPORTING
* wait = 'X'.
ELSE.
<fs_gt_upload>-icon = icon_cancel.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.

CHECK <fs_gt_upload>-icon <> icon_cancel.
*Finally create current condition
REFRESH: lt_bapicondct[],
lt_bapicondhd[],
lt_bapicondit[],
lt_bapicondqs[],
lt_bapicondvs[],
lte_bapiret2[],
lte_bapiknumhs[],
lte_mem_initial[].

CLEAR: ls_bapicondct,
ls_bapicondhd,
ls_bapicondit,
ls_bapicondqs,
ls_bapicondvs,
lse_bapiret2,
lse_bapiknumhs,
lse_mem_initial,
ls_varkey_a305_header,
ls_varkey_header,
ls_vardat_a305_header,
ls_vardat_header,
ls_varkey_item.
ls_bapicondct-operation = lcon_operation_009.
ls_bapicondct-cond_usage = lcon_cond_usage_a .
ls_bapicondct-table_no = lcon_table_no_305.
ls_varkey_a305_header-vkorg = <fs_gt_upload>-vkorg.
ls_varkey_a305_header-vtweg = <fs_gt_upload>-vtweg.
ls_varkey_a305_header-kunnr = <fs_gt_upload>-kunnr.
ls_varkey_a305_header-matnr = <fs_gt_upload>-matnr.
ls_varkey_a305_header-kfrst = lcon_kfrst_a .
ls_varkey_header = ls_varkey_a305_header.
ls_vardat_a305_header-kbstat = lcon_kbstat_1.
ls_vardat_header = ls_vardat_a305_header.
ls_bapicondct-cond_no = lcon_knumh_i .
IF p_test IS NOT INITIAL.
ls_bapicondct-cond_no = lcon_knumh_test .
ENDIF.



CLEAR: lv_knumh.
lv_knumh = ls_bapicondct-cond_no .

ls_bapicondct-applicatio = lcon_applicatio_v .
ls_bapicondct-cond_type = <fs_gt_upload>-kschl.
IF ls_bapicondct-cond_type IS INITIAL.
ls_bapicondct-cond_type = lcon_cond_type_pr00.
ENDIF.

ls_bapicondct-varkey = ls_varkey_header.
ls_bapicondct-vadat = ls_vardat_header.
ls_bapicondct-valid_to = <fs_gt_upload>-datbi. " lcon_valid_to.
ls_bapicondct-valid_from = <fs_gt_upload>-datab.
APPEND ls_bapicondct TO lt_bapicondct.

ls_bapicondhd-operation = ls_bapicondct-operation. "lcon_operation_009.
ls_bapicondhd-cond_no = ls_bapicondct-cond_no. "lcon_knumh_i .
ls_bapicondhd-created_by = sy-uname.
ls_bapicondhd-creat_date = sy-datum.
ls_bapicondhd-cond_usage = lcon_cond_usage_a .
ls_bapicondhd-table_no = ls_bapicondct-table_no.
ls_bapicondhd-applicatio = lcon_applicatio_v .
ls_bapicondhd-cond_type = ls_bapicondct-cond_type.
ls_bapicondhd-varkey = ls_varkey_header.
ls_bapicondhd-vardate = ls_vardat_header.
ls_bapicondhd-valid_from = <fs_gt_upload>-datab.
ls_bapicondhd-valid_to = <fs_gt_upload>-datbi. " lcon_valid_to.
APPEND ls_bapicondhd TO lt_bapicondhd.

ls_bapicondit-operation = ls_bapicondct-operation. "lcon_operation_009.
ls_bapicondit-cond_no = ls_bapicondct-cond_no. "lcon_knumh_i .
ls_bapicondit-cond_count = lcon_cond_count_i .
ls_bapicondit-applicatio = lcon_applicatio_v .
ls_bapicondit-cond_type = ls_bapicondct-cond_type.
* text_no
ls_bapicondit-scaletype = lcon_scale_type_c.
* scalebasin
* scale_qty
* unitmeasur
* measur_iso
* scale_val
* currenckey
* curren_iso
ls_bapicondit-calctypcon = lcon_calc_type_c.
ls_bapicondit-cond_value = <fs_gt_upload>-kbetr.
ls_bapicondit-condcurr = <fs_gt_upload>-waers.
* ls_bapicondit-cond_iso
ls_bapicondit-cond_p_unt = <fs_gt_upload>-kpein.
ls_bapicondit-cond_unit = <fs_gt_upload>-kmein.
* conunitiso
* pricelevel
* numconvert
* denominato
* base_uom
* baseqtyiso
* lowerlimit
* upperlimit
* plcondval
* currency
* curr_iso
* condcurren
* isocurrenc
* plan_basis
* rate_unit
* exclusion
* customer
* vendor_no
* tax_code
* indidelete
* conditidx
* matlsettl
* accruals
* reb_retroa
* statofagre
* promot_no
* sales_deal
* salesquote
* add_val_dy
* fix_val_dy
* pmnttrms
* numborders
* minconbava
* maxconbava
* maxconval
* incr_scale
* pricscale
* relprcg
* promotion
* rebagreemt
* withtaxcod
* contract
* contractno
* flow_type
* indimatmai
ls_bapicondit-status = lcon_kfrst_a .
* umsabst
* matlsettl_external
* matlsettl_guid
* matlsettl_version

APPEND ls_bapicondit TO lt_bapicondit.

refresh: db_xkondat[],
db_ykondat[],
db_xkonh[],
db_ykonh[],
db_xkonp[],
db_ykonp[],
db_xkonm[],
db_xkonw[],
db_ykonm[],
db_ykonw[].

* select * from konh APPENDING CORRESPONDING FIELDS OF TABLE
* db_ykonh where knumh = <fs_lt_a305>-knumh.
* loop at db_ykonh ASSIGNING <fs_db_ykonh>.
* <fs_db_ykonh>-updkz = 'I'.
* ENDLOOP.
*
* select * from konp APPENDING CORRESPONDING FIELDS OF TABLE
* db_ykonp where knumh = <fs_lt_a305>-knumh.


CALL FUNCTION 'BAPI_PRICES_CONDITIONS'
EXPORTING
* PI_INITIALMODE = ' '
* PI_BLOCKNUMBER =
pi_physical_deletion = lv_del
TABLES
ti_bapicondct = lt_bapicondct
ti_bapicondhd = lt_bapicondhd
ti_bapicondit = lt_bapicondit
ti_bapicondqs = lt_bapicondqs
ti_bapicondvs = lt_bapicondvs
to_bapiret2 = lte_bapiret2
to_bapiknumhs = lte_bapiknumhs
to_mem_initial = lte_mem_initial
EXCEPTIONS
update_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.

clear lv_knumh_saved.
LOOP AT lte_bapiret2 ASSIGNING <fs_lte_bapiret2>
WHERE type = 'S'.
lv_knumh_saved = <fs_lte_bapiret2>-message_v1.
exit.
ENDLOOP.

clear db_ykonp.
append db_ykonp.
loop at db_ykonp ASSIGNING <fs_db_ykonp>.
<fs_db_ykonp>-knumh = lv_knumh_saved.
ENDLOOP.

select * from konh APPENDING CORRESPONDING FIELDS OF TABLE
db_xkonh where knumh = lv_knumh_saved.
loop at db_xkonh ASSIGNING <fs_db_xkonh>.
<fs_db_xkonh>-updkz = 'I'.
ENDLOOP.


select * from konp APPENDING CORRESPONDING FIELDS OF TABLE
db_xkonp where knumh = lv_knumh_saved.
loop at db_xkonp ASSIGNING <fs_db_xkonp>.
<fs_db_xkonp>-updkz = 'I'.

ENDLOOP.

loop at db_ykonp ASSIGNING <fs_db_ykonp>.
READ TABLE db_xkonp ASSIGNING <fs_db_xkonp>
with key knumh = <fs_db_ykonp>-knumh.
if sy-subrc is INITIAL.
<fs_db_ykonp>-MANDT = <fs_db_xkonp>-mandt.
<fs_db_ykonp>-KNUMH = <fs_db_xkonp>-KNUMH.
<fs_db_ykonp>-KOPOS = <fs_db_xkonp>-kopos.
<fs_db_ykonp>-KAPPL = <fs_db_xkonp>-kappl.
<fs_db_ykonp>-KSCHL = <fs_db_xkonp>-kschl.
<fs_db_ykonp>-STFKZ = <fs_db_xkonp>-stfkz.
<fs_db_ykonp>-KRECH = <fs_db_xkonp>-krech.
<fs_db_ykonp>-KWAEH = <fs_db_xkonp>-kwaeh.
<fs_db_ykonp>-ZAEHK_IND = <fs_db_xkonp>-ZAEHK_IND.
<fs_db_ykonp>-RV13ABKONW = <fs_db_xkonp>-RV13ABKONW.
<fs_db_ykonp>-RV13AKONWA = <fs_db_xkonp>-RV13AKONWA .
<fs_db_ykonp>-UPDKZ = <fs_db_xkonp>-UPDKZ.
endif.
ENDLOOP.

if db_xkondat[] is INITIAL.
loop at db_xkonh.
db_xkondat-knumh = db_xkonh-knumh.
db_xkondat-DATAN = ls_bapicondhd-valid_from.
read TABLE db_ykonh with key knumh = db_xkonh-knumh.
if sy-subrc is INITIAL.
db_xkondat-datab = db_ykonh-DATAB.
db_xkondat-datbi = db_ykonh-DATBI.
db_xkondat-kz = 'U' ."db_ykonh-updkz.
append db_xkondat.
else.
db_xkondat-datab = db_xkonh-DATAB.
db_xkondat-datbi = db_xkonh-DATBI.
db_xkondat-kz = 'U'. "db_xkonh-updkz.
append db_xkondat.
endif.
ENDLOOP.
endif.

if db_ykondat[] is INITIAL.
* loop at db_ykonh.
* db_ykondat-knumh = db_ykonh-knumh.
* db_ykondat-DATAN = db_ykonh-DATAB.
* db_ykondat-datab = db_ykonh-DATAB.
* db_ykondat-datbi = db_ykonh-DATBI.
* db_ykondat-kz = db_ykonh-updkz.
* append db_ykondat.
* ENDLOOP.
db_ykondat[] = db_xkondat[].
loop at db_ykondat ASSIGNING <fs_db_ykondat>.
clear: <fs_db_ykondat>-datab,
<fs_db_ykondat>-datbi.

endloop.
endif.

* write change documents
CALL FUNCTION 'SD_CONDITION_CHANGE_DOCS_WRITE'
TABLES
p_xkondat = db_xkondat
p_ykondat = db_ykondat
p_xkonh = db_xkonh
p_ykonh = db_ykonh
p_xkonp = db_xkonp
p_ykonp = db_ykonp
p_xkonm = db_xkonm
p_xkonw = db_xkonw
p_ykonm = db_ykonm
p_ykonw = db_ykonw.


LOOP AT lte_bapiret2 ASSIGNING <fs_lte_bapiret2>
WHERE type = 'E'.
EXIT.
ENDLOOP.
IF sy-subrc IS INITIAL.
<fs_gt_upload>-icon = icon_cancel.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
* IMPORTING
* RETURN =
.
ELSE.

LOOP AT lte_bapiret2 ASSIGNING <fs_lte_bapiret2>
WHERE type = 'S' OR type = 'W'.
<fs_gt_upload>-message = <fs_lte_bapiret2>-message.
<fs_gt_upload>-knumh = <fs_lte_bapiret2>-message_v1.

EXIT.
ENDLOOP.
IF sy-subrc IS INITIAL.
* CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
* EXPORTING
* wait = 'X'.
<fs_gt_upload>-icon = icon_okay.
ELSE.
<fs_gt_upload>-icon = icon_cancel.
ENDIF.
ENDIF.
ENDLOOP.
LOOP AT gt_upload ASSIGNING <fs_gt_upload> WHERE icon = icon_cancel.
EXIT.
ENDLOOP.
IF sy-subrc IS NOT INITIAL AND p_test IS INITIAL AND gt_upload[] IS NOT INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.

Conclusion: Though the code is extensive, BAPI provided one more way to handle conditions where we can mass commit the BAPI at the end if all records are successful. So till SAP releases this BAPI or adds a new BAPI, custom implementation of BAPI_PRICES_CONDITIONS as explained in this blog will be useful.

 
8 Comments
Sandra_Rossi
Active Contributor
Nice to add the big warning at the beginning (for more information, cf SAP note 1135984 - Conditions cannot be created with BAPI_PRICES_CONDITIONS "When you use this function module, inconsistencies may occur; you should therefore not use it!
If inconsistencies have occurred already, refer to Note 94443. This note describes how you can solve these inconsistencies.")

Good effort but sorry I will do as SAP says 😉
vardhan_naik3
Explorer
0 Kudos
Hi Sandra,

I don't have these inconsistencies with the sample code which is why I would like to put it out there and for SAP to revisit a better solution. Yes, SAP themselves admit they don't have a better BAPI as yet and that is reflected in my conclusion with caveats added.

 

-Vardhan
DominikTylczyn
SAP Champion
SAP Champion
I've tried to address the issue of BAPI to maintain pricing condition via SAP Customer Influence program SD Sales and Billing 2019 - request 218581 BAPI to maintain pricing conditions. The idea has gathered 33 up votes.

However SAP brushed that off as "violating design rules" with a comment: "Violating design principles of ERP function modules. This is why S/4 shifted to Odata services (which is an approach that cannot be down ported to ERP)".

Frankly I can't understand why SAP doesn't provide a decent interface to upload pricing conditions.

Best regards

Dominik Tylczyński
Jelena_Perfiljeva
Active Contributor
0 Kudos
Frankly I can’t understand why SAP doesn’t provide a decent interface to upload pricing conditions.

Neither do I or SAP customers. Yet when this was brought forward as an improvement request though the proper channels, SAP declined: https://twitter.com/JelenaAtLarge/status/1098609032343011329?s=20

This has been a problem for decades. The IDoc interface that SAP has guts to suggest as an alternative is too slow and bulky. This is one of the main basic functionalities, it should be a very simple (and supported!) API.
cmayka
Discoverer
0 Kudos
When I need to create a new price condition, I do not use the BAPI_PRICE_CONDITIONS, instead I do batch input program on XK15 transaction and that works fine
ramesh1985
Participant
0 Kudos
Dear Vardhan ,

Does this logic also works in S/4 system ? or Any new function module to be used in S/4?
robert001
Discoverer
0 Kudos
Hallo Vardhan,

tank you for this really great blog.

 

Some hints:

1.)

in the where clause of the select statement from phase 3 there seems to be a minor error:

[...]

*3 Get all records where from in the current From/To
*   Delete the record
REFRESH: lt_a305[].
SELECT a305~kappl
a305~kschl
a305~vkorg
a305~vtweg
a305~kunnr
a305~matnr
a305~kfrst
a305~datbi
a305~datab
a305~kbstat
a305~knumh
konp~konwa
konp~kbetr
konp~kmein
konp~kpein
FROM a305
INNER JOIN konp ON konp~knumh = a305~knumh
APPENDING CORRESPONDING FIELDS OF TABLE lt_a305
WHERE a305~kappl = lcon_applicatio_v AND
a305~kschl = <fs_gt_upload>-kschl AND
a305~vkorg = <fs_gt_upload>-vkorg AND
a305~vtweg = <fs_gt_upload>-vtweg AND
a305~kunnr = <fs_gt_upload>-kunnr AND
a305~matnr = <fs_gt_upload>-matnr AND
a305~kfrst = lcon_kfrst_a AND
a305~datbi GT <fs_gt_upload>-datab AND
a305~datab GE <fs_gt_upload>-datab AND
a305~datab LE <fs_gt_upload>-datbi .

[...]

the bold line should be replaced with:

a305~datbi GT <fs_gt_upload>-datbi AND

 

2.) in order to get a correct working of deletion conditions, you have to set:

lv_del = abap_true.

 

Regards,

Robert
markus_schwope
Explorer
0 Kudos

I recently had situation:

  • did VK11 automatism via batch input (like mentioned above)
  • was working fine for years
  • recently due to access sequence enhancement (which is typical enhancement work with customizing) the batch input crashed of course 
  • and due to design of this old BI-FM we were NOT aware of this new dysfunction for a few weeks!

So as always: there's no easy answer, which solution is best - because of the batch-input problem I created version 2 of function with BAPI_PRICES_CONDITIONS

(not yet done finally, but guess like in the last decades I'll solve also these remaining small problems)

Labels in this area