‎2011 Aug 01 9:41 AM
Am creating new prices for conditions 'ZC01' using BAPI_PRICES_CONDITIONS.......I build my data on the ff structures : TI_BAPICONDCT, TI_BAPICONDHD,TI_BAPICONDIT,TI_BAPICONDQS, TI_BAPICONDVS.
The bapi returns message type s,ID CND_EXCHANGE, msg no 003 and message Record KNUMH = 0002252141, VARNUMH = 00000000000000000000000000000000: the data is consistent, UPDKZ = 'I'
How do I populate these fields TI_BAPICONDHD-VARKEY, TI_BAPICONDCT-VARKEY.
Please assist
‎2011 Aug 01 9:55 AM
METHOD pricing_condition.
Data Declaration
DATA: ls_messages TYPE bapiret2,
ls_conditions TYPE zem_lc_discsummary,
lv_count TYPE kopos,
ls_bapicondct TYPE bapicondct,
ls_bapicondhd TYPE bapicondhd,
ls_bapicondit TYPE bapicondit,
lt_bapicondct TYPE STANDARD TABLE OF bapicondct,
lt_bapicondhd TYPE STANDARD TABLE OF bapicondhd,
lt_bapicondit TYPE STANDARD TABLE OF bapicondit,
lt_bapicondqs TYPE STANDARD TABLE OF bapicondqs,
lt_bapicondvs TYPE STANDARD TABLE OF bapicondvs,
lt_bapiknumhs TYPE STANDARD TABLE OF bapiknumhs,
lt_mem_initial TYPE STANDARD TABLE OF cnd_mem_initial,
ls_cond_head TYPE konh,
lv_message TYPE string,
ls_cond_item TYPE konp,
iv_opr TYPE msgfn,
ls_a956 TYPE a956,
lv_vbeln TYPE vbeln,
lv_from_date TYPE sy-datum.
CLEAR: es_message, et_messages.
lv_count = '00'.
Calculate start date
lv_from_date0(4) = sy-datum0(4).
lv_from_date+4(2) = 01.
lv_from_date+6(2) = 01.
Set the operation mode
IF iv_opr = 'I'.
iv_opr = gv_opr_create.
ELSEIF iv_opr = 'U'.
iv_opr = gv_opr_update.
ELSEIF iv_opr = 'D'.
iv_opr = gv_opr_delete.
ENDIF.
Pick the condition records for update/delete
IF iv_opr NE gv_opr_create.
SELECT SINGLE *
FROM konh
INTO ls_cond_head
WHERE knumh = iv_knumh.
IF sy-subrc NE 0.
EXIT.
ENDIF.
SELECT SINGLE *
FROM konp
INTO ls_cond_item
WHERE knumh = iv_knumh
AND kopos = 1.
IF sy-subrc NE 0.
EXIT.
ENDIF.
ENDIF.
BAPI Structure for Condition Tables
ls_bapicondct-operation = iv_opr.
ls_bapicondct-cond_usage = gv_condusg_a.
ls_bapicondct-table_no = iv_table.
ls_bapicondct-applicatio = gv_appl.
ls_bapicondct-cond_type = iv_condtype.
ls_bapicondct-varkey = iv_varkey.
IF iv_opr = gv_opr_create. "
ls_bapicondct-valid_from = lv_from_date. " what are these dates?
ls_bapicondct-valid_to = iv_to_date.
ls_bapicondct-cond_no = '$000000001' .
ELSE.
ls_bapicondct-valid_from = ls_cond_head-datab.
ls_bapicondct-valid_to = ls_cond_head-datbi.
ls_bapicondct-cond_no = iv_knumh .
ENDIF.
APPEND ls_bapicondct TO lt_bapicondct.
BAPI Structure of KONH
ls_bapicondhd-operation = iv_opr.
ls_bapicondhd-created_by = sy-uname.
ls_bapicondhd-creat_date = sy-datum.
ls_bapicondhd-cond_usage = gv_condusg_a.
ls_bapicondhd-table_no = iv_table.
ls_bapicondhd-applicatio = gv_appl.
ls_bapicondhd-cond_type = iv_condtype.
ls_bapicondhd-varkey = iv_varkey.
IF iv_opr = gv_opr_create.
ls_bapicondhd-cond_no = `$000000001`.
ls_bapicondhd-valid_from = lv_from_date. " what are these dates?
ls_bapicondhd-valid_to = iv_to_date.
ELSE.
ls_bapicondhd-cond_no = iv_knumh.
ls_bapicondhd-valid_from = ls_cond_head-datab.
ls_bapicondhd-valid_to = ls_cond_head-datbi.
ENDIF.
APPEND ls_bapicondhd TO lt_bapicondhd.
BAPI Structure of KONP TABLE
LOOP AT it_conditions INTO ls_conditions. " YOU MIGHT REQUIRED TO READ THIS TABLE BY COND NO
lv_count = lv_count + 1.
ls_bapicondit-operation = iv_opr.
IF iv_opr = gv_opr_create.
ls_bapicondit-cond_no = `$000000001`.
ls_bapicondit-cond_count = lv_count.
ELSE.
ls_bapicondit-cond_no = iv_knumh.
ls_bapicondit-cond_count = ls_cond_item-zaehk_ind.
ENDIF.
ls_bapicondit-applicatio = gv_appl.
ls_bapicondit-cond_type = iv_condtype.
ls_bapicondit-scaletype = gv_scale_type.
ls_bapicondit-calctypcon = gv_calc_type.
ls_bapicondit-conditidx = '1'.
ls_bapicondit-cond_value = iv_discval.
ls_bapicondit-condcurr = '%'. "ls_vbap-waerk.
APPEND ls_bapicondit TO lt_bapicondit.
ENDLOOP.
BAPI for pricing Condition Records
CALL FUNCTION `BAPI_PRICES_CONDITIONS`
TABLES
ti_bapicondct = lt_bapicondct
ti_bapicondhd = lt_bapicondhd
ti_bapicondit = lt_bapicondit
ti_bapicondqs = lt_bapicondqs
ti_bapicondvs = lt_bapicondvs
to_bapiret2 = et_messages
to_bapiknumhs = lt_bapiknumhs
to_mem_initial = lt_mem_initial
EXCEPTIONS
update_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_message.
es_message-type = zcl_wda_em_lc_discounts=>gv_msgtyp_e.
es_message-message = lv_message.
ev_failed = abap_true.
CLEAR: lv_message.
ELSE.
CALL FUNCTION `BAPI_TRANSACTION_COMMIT`.
ENDIF.
IF ev_failed = abap_true.
EXIT.
ENDIF.
Get the condition record number
READ TABLE et_messages INTO ls_messages
WITH KEY id = 'CND_EXCHANGE'
number ='003'.
IF sy-subrc EQ 0.
ev_knumh = ls_messages-message_v1.
ENDIF.
check the deletion flag in KONP record.
IF iv_opr = gv_opr_delete.
CLEAR: ls_cond_item.
SELECT SINGLE *
FROM konp
INTO ls_cond_item
WHERE knumh EQ iv_knumh
AND kopos EQ 1.
DELETE konp FROM ls_cond_item.
DELETE konh FROM ls_cond_head.
IF sy-subrc EQ 0 AND ls_cond_item-loevm_ko EQ 'X'.
lv_vbeln = ls_cond_head-vakey+0(10).
lv_posnr = ls_cond_head-vakey+10(6).
lv_vbeln = ls_cond_head-vakey.
SELECT SINGLE *
FROM a956
INTO ls_a956
WHERE kappl EQ ls_cond_head-kappl
AND kschl EQ ls_cond_head-kschl
AND zz_sow_number EQ lv_vbeln
AND kfrst EQ space
AND datbi EQ ls_cond_head-datbi
AND knumh EQ iv_knumh.
IF sy-subrc EQ 0.
DELETE a956 FROM ls_a956.
ENDIF.
ENDIF.
ENDIF.
CLEAR: ls_bapicondct, lt_bapicondct[], ls_bapicondhd, lt_bapicondhd[],lv_count,lv_vbeln,
ls_bapicondit, lt_bapicondit[], ls_cond_head,ls_cond_item, ls_a956.
ENDMETHOD.
‎2011 Aug 01 9:55 AM
METHOD pricing_condition.
Data Declaration
DATA: ls_messages TYPE bapiret2,
ls_conditions TYPE zem_lc_discsummary,
lv_count TYPE kopos,
ls_bapicondct TYPE bapicondct,
ls_bapicondhd TYPE bapicondhd,
ls_bapicondit TYPE bapicondit,
lt_bapicondct TYPE STANDARD TABLE OF bapicondct,
lt_bapicondhd TYPE STANDARD TABLE OF bapicondhd,
lt_bapicondit TYPE STANDARD TABLE OF bapicondit,
lt_bapicondqs TYPE STANDARD TABLE OF bapicondqs,
lt_bapicondvs TYPE STANDARD TABLE OF bapicondvs,
lt_bapiknumhs TYPE STANDARD TABLE OF bapiknumhs,
lt_mem_initial TYPE STANDARD TABLE OF cnd_mem_initial,
ls_cond_head TYPE konh,
lv_message TYPE string,
ls_cond_item TYPE konp,
iv_opr TYPE msgfn,
ls_a956 TYPE a956,
lv_vbeln TYPE vbeln,
lv_from_date TYPE sy-datum.
CLEAR: es_message, et_messages.
lv_count = '00'.
Calculate start date
lv_from_date0(4) = sy-datum0(4).
lv_from_date+4(2) = 01.
lv_from_date+6(2) = 01.
Set the operation mode
IF iv_opr = 'I'.
iv_opr = gv_opr_create.
ELSEIF iv_opr = 'U'.
iv_opr = gv_opr_update.
ELSEIF iv_opr = 'D'.
iv_opr = gv_opr_delete.
ENDIF.
Pick the condition records for update/delete
IF iv_opr NE gv_opr_create.
SELECT SINGLE *
FROM konh
INTO ls_cond_head
WHERE knumh = iv_knumh.
IF sy-subrc NE 0.
EXIT.
ENDIF.
SELECT SINGLE *
FROM konp
INTO ls_cond_item
WHERE knumh = iv_knumh
AND kopos = 1.
IF sy-subrc NE 0.
EXIT.
ENDIF.
ENDIF.
BAPI Structure for Condition Tables
ls_bapicondct-operation = iv_opr.
ls_bapicondct-cond_usage = gv_condusg_a.
ls_bapicondct-table_no = iv_table.
ls_bapicondct-applicatio = gv_appl.
ls_bapicondct-cond_type = iv_condtype.
ls_bapicondct-varkey = iv_varkey.
IF iv_opr = gv_opr_create. "
ls_bapicondct-valid_from = lv_from_date. " what are these dates?
ls_bapicondct-valid_to = iv_to_date.
ls_bapicondct-cond_no = '$000000001' .
ELSE.
ls_bapicondct-valid_from = ls_cond_head-datab.
ls_bapicondct-valid_to = ls_cond_head-datbi.
ls_bapicondct-cond_no = iv_knumh .
ENDIF.
APPEND ls_bapicondct TO lt_bapicondct.
BAPI Structure of KONH
ls_bapicondhd-operation = iv_opr.
ls_bapicondhd-created_by = sy-uname.
ls_bapicondhd-creat_date = sy-datum.
ls_bapicondhd-cond_usage = gv_condusg_a.
ls_bapicondhd-table_no = iv_table.
ls_bapicondhd-applicatio = gv_appl.
ls_bapicondhd-cond_type = iv_condtype.
ls_bapicondhd-varkey = iv_varkey.
IF iv_opr = gv_opr_create.
ls_bapicondhd-cond_no = `$000000001`.
ls_bapicondhd-valid_from = lv_from_date. " what are these dates?
ls_bapicondhd-valid_to = iv_to_date.
ELSE.
ls_bapicondhd-cond_no = iv_knumh.
ls_bapicondhd-valid_from = ls_cond_head-datab.
ls_bapicondhd-valid_to = ls_cond_head-datbi.
ENDIF.
APPEND ls_bapicondhd TO lt_bapicondhd.
BAPI Structure of KONP TABLE
LOOP AT it_conditions INTO ls_conditions. " YOU MIGHT REQUIRED TO READ THIS TABLE BY COND NO
lv_count = lv_count + 1.
ls_bapicondit-operation = iv_opr.
IF iv_opr = gv_opr_create.
ls_bapicondit-cond_no = `$000000001`.
ls_bapicondit-cond_count = lv_count.
ELSE.
ls_bapicondit-cond_no = iv_knumh.
ls_bapicondit-cond_count = ls_cond_item-zaehk_ind.
ENDIF.
ls_bapicondit-applicatio = gv_appl.
ls_bapicondit-cond_type = iv_condtype.
ls_bapicondit-scaletype = gv_scale_type.
ls_bapicondit-calctypcon = gv_calc_type.
ls_bapicondit-conditidx = '1'.
ls_bapicondit-cond_value = iv_discval.
ls_bapicondit-condcurr = '%'. "ls_vbap-waerk.
APPEND ls_bapicondit TO lt_bapicondit.
ENDLOOP.
BAPI for pricing Condition Records
CALL FUNCTION `BAPI_PRICES_CONDITIONS`
TABLES
ti_bapicondct = lt_bapicondct
ti_bapicondhd = lt_bapicondhd
ti_bapicondit = lt_bapicondit
ti_bapicondqs = lt_bapicondqs
ti_bapicondvs = lt_bapicondvs
to_bapiret2 = et_messages
to_bapiknumhs = lt_bapiknumhs
to_mem_initial = lt_mem_initial
EXCEPTIONS
update_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_message.
es_message-type = zcl_wda_em_lc_discounts=>gv_msgtyp_e.
es_message-message = lv_message.
ev_failed = abap_true.
CLEAR: lv_message.
ELSE.
CALL FUNCTION `BAPI_TRANSACTION_COMMIT`.
ENDIF.
IF ev_failed = abap_true.
EXIT.
ENDIF.
Get the condition record number
READ TABLE et_messages INTO ls_messages
WITH KEY id = 'CND_EXCHANGE'
number ='003'.
IF sy-subrc EQ 0.
ev_knumh = ls_messages-message_v1.
ENDIF.
check the deletion flag in KONP record.
IF iv_opr = gv_opr_delete.
CLEAR: ls_cond_item.
SELECT SINGLE *
FROM konp
INTO ls_cond_item
WHERE knumh EQ iv_knumh
AND kopos EQ 1.
DELETE konp FROM ls_cond_item.
DELETE konh FROM ls_cond_head.
IF sy-subrc EQ 0 AND ls_cond_item-loevm_ko EQ 'X'.
lv_vbeln = ls_cond_head-vakey+0(10).
lv_posnr = ls_cond_head-vakey+10(6).
lv_vbeln = ls_cond_head-vakey.
SELECT SINGLE *
FROM a956
INTO ls_a956
WHERE kappl EQ ls_cond_head-kappl
AND kschl EQ ls_cond_head-kschl
AND zz_sow_number EQ lv_vbeln
AND kfrst EQ space
AND datbi EQ ls_cond_head-datbi
AND knumh EQ iv_knumh.
IF sy-subrc EQ 0.
DELETE a956 FROM ls_a956.
ENDIF.
ENDIF.
ENDIF.
CLEAR: ls_bapicondct, lt_bapicondct[], ls_bapicondhd, lt_bapicondhd[],lv_count,lv_vbeln,
ls_bapicondit, lt_bapicondit[], ls_cond_head,ls_cond_item, ls_a956.
ENDMETHOD.
‎2011 Aug 01 10:19 AM
I have done all of this but my question is how do I populate varkey.. This is how I am doing it at this point and I think its wrong.
Which fields constitutes VARKEY.
concatenate SY-MANDT 'V' item904-KSCHL item904-vkorg item904-vtweg item904-kunnr item904-matnr item904-databi into v_varkey.
‎2011 Aug 01 9:59 AM
check the table KONH,KONV,KONA, KONP tables. you can easily pass the parameters that are required.
BAPI Structure for Condition Tables
ls_bapicondct-operation = iv_opr. " 004, 009, ... ARE THE ENTRIES
ls_bapicondct-cond_usage = gv_condusg_a. " use A
ls_bapicondct-table_no = iv_table. " this is the conditon table
ls_bapicondct-applicatio = gv_appl. " ue "A"
ls_bapicondct-cond_type = iv_condtype. " your condition type
ls_bapicondct-varkey = iv_varkey. " your variable key
IF iv_opr = gv_opr_create. "
ls_bapicondct-valid_from = lv_from_date. " dates
ls_bapicondct-valid_to = iv_to_date.
ls_bapicondct-cond_no = '$000000001' .
ELSE.
ls_bapicondct-valid_from = ls_cond_head-datab.
ls_bapicondct-valid_to = ls_cond_head-datbi.
ls_bapicondct-cond_no = iv_knumh .
ENDIF.
APPEND ls_bapicondct TO lt_bapicondct.
BAPI Structure of KONH
ls_bapicondhd-operation = iv_opr.
ls_bapicondhd-created_by = sy-uname.
ls_bapicondhd-creat_date = sy-datum.
ls_bapicondhd-cond_usage = gv_condusg_a.
ls_bapicondhd-table_no = iv_table.
ls_bapicondhd-applicatio = gv_appl.
ls_bapicondhd-cond_type = iv_condtype.
ls_bapicondhd-varkey = iv_varkey.
IF iv_opr = gv_opr_create.
ls_bapicondhd-cond_no = `$000000001`.
ls_bapicondhd-valid_from = lv_from_date. " what are these dates?
ls_bapicondhd-valid_to = iv_to_date.
ELSE.
ls_bapicondhd-cond_no = iv_knumh.
ls_bapicondhd-valid_from = ls_cond_head-datab.
ls_bapicondhd-valid_to = ls_cond_head-datbi.
ENDIF.
APPEND ls_bapicondhd TO lt_bapicondhd.
BAPI Structure of KONP TABLE
LOOP AT it_conditions INTO ls_conditions. " YOU MIGHT REQUIRED TO READ THIS TABLE BY COND NO
lv_count = lv_count + 1.
ls_bapicondit-operation = iv_opr.
IF iv_opr = gv_opr_create.
ls_bapicondit-cond_no = `$000000001`.
ls_bapicondit-cond_count = lv_count.
ELSE.
ls_bapicondit-cond_no = iv_knumh.
ls_bapicondit-cond_count = ls_cond_item-zaehk_ind.
ENDIF.
ls_bapicondit-applicatio = gv_appl.
ls_bapicondit-cond_type = iv_condtype.
ls_bapicondit-scaletype = gv_scale_type.
ls_bapicondit-calctypcon = gv_calc_type.
ls_bapicondit-conditidx = '1'.
ls_bapicondit-cond_value = iv_discval.
ls_bapicondit-condcurr = '%'. "ls_vbap-waerk.
APPEND ls_bapicondit TO lt_bapicondit.
ENDLOOP.
BAPI for pricing Condition Records
CALL FUNCTION `BAPI_PRICES_CONDITIONS`
TABLES
ti_bapicondct = lt_bapicondct
ti_bapicondhd = lt_bapicondhd
ti_bapicondit = lt_bapicondit
ti_bapicondqs = lt_bapicondqs
ti_bapicondvs = lt_bapicondvs
to_bapiret2 = et_messages
to_bapiknumhs = lt_bapiknumhs
to_mem_initial = lt_mem_initial
EXCEPTIONS
update_error = 1
OTHERS = 2.
‎2011 Aug 01 10:24 AM
Create a PRICING CONDITION @ VK11 transaction...
you can check the CONDITION TABLE 904 after creating the condition record for the VARKEY.
VARKEY is completely based on the configuration.
so before you create a condition record programatically, you need to know what should be the VARKEY.
‎2011 Aug 01 12:49 PM
Am still having the same error. I passed the varkey according to the key fields of Table A904. Which is the table I am creating a condition for. I don't want to do a BDC.
‎2011 Aug 01 12:51 PM
is this is the message you have received?
The bapi returns message type s,ID CND_EXCHANGE, msg no 003 and message Record KNUMH = 0002252141, VARNUMH = 00000000000000000000000000000000: the data is consistent, UPDKZ = 'I'
then you have successfully created the condition record number.
check my code, you cna actually get the condition record number to exporting parameter
Edited by: ssm on Aug 1, 2011 5:21 PM
‎2011 Aug 01 1:47 PM
It does create the record number but when I go to VK13 the condition and the new date with the new prices is not created. It appears on table KONP though.
‎2011 Aug 01 1:58 PM
if it is in the KONP, then you can see it in VK13. try with different options
Edited by: ssm on Aug 1, 2011 6:30 PM
‎2011 Aug 01 2:35 PM
Example of the different options? On VK13 i choose ZCO1 and the table value for A904.....Which options are you talking about?
‎2011 Aug 01 2:42 PM
@ vk11 , you must have the input fields.. try with different dates or different values...
or ask the functional guy to show atleast a record in vk13 tcode
‎2011 Aug 02 12:27 PM
‎2011 Aug 02 12:40 PM
Ofcourse, BDC looks good initially...
i had bad experiences with that, so i always opt standard BAPI or FM's.
if you have to create some other condition type, then you need to do the BDC again as the condition type screen completely depends on the configuration. your code is not reusable, i still suggest to make use of this FM, that will be helpful and can reuse.
‎2011 Aug 02 1:44 PM
‎2011 Aug 02 2:17 PM
Let me create a FM that calls the BAPI and see what happenes. Thanx very much
‎2011 Aug 02 2:19 PM