Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

Settlement date and TO date should be updated against to billing plan start date in T-code:VA42

Former Member
0 Kudos

Hi Experts,

I maintained Billing plan start date and contact in excel file . I can able to updating only billing plan start date by using this upload file but here settlement date and To date's are not being modified against to billing plan start date in VA42 .

I have used many BAPI's but no luck:(

File:

CONTRACT NO Billing plan date

052*********** 2018042018

051*********** 2018062018

Source code:

PARAMETERS : p_fname1 TYPE localfile.
TABLES: fpla.
DATA:lv_posnr TYPE vbap-posnr.
DATA: BEGIN OF ifplt OCCURS 10.
INCLUDE STRUCTURE fpltvb.
DATA: END OF ifplt.

**internal table of item lines of an order
DATA: BEGIN OF itab_item_lines OCCURS 10.
INCLUDE STRUCTURE av03r.
DATA: END OF itab_item_lines.
DATA : it_data TYPE TABLE OF alsmex_tabline INITIAL SIZE 0,
is_data TYPE alsmex_tabline.

TYPES : BEGIN OF ty_excel,
zzcontract TYPE zzc4c_contract, " SAP - Contact Number
afdat TYPE fkdat, " Billing date for billing index and printout
END OF ty_excel,
tt_excel TYPE TABLE OF ty_excel.

DATA:p_ifname TYPE rlgrap-filename,
lv_count TYPE i,
lv_tabix TYPE sy-index.

"Sales Document: Header Data
TYPES : BEGIN OF ty_vbak,
vbeln TYPE vbeln_va, "Sales Document
vbtyp TYPE vbtyp, "SD document category
END OF ty_vbak.

TYPES : BEGIN OF ty_final,
vbeln TYPE vbeln, "Sales Document
afdat TYPE fkdat,
END OF ty_final.

**Table and Workarea Declaration
DATA : lt_vbak TYPE TABLE OF ty_vbak,
gs_vbak TYPE ty_vbak,
lt_final TYPE TABLE OF ty_final,
ls_final TYPE ty_final.

* If Input file name is not initial.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fname1.

CALL FUNCTION 'F4_FILENAME'
* EXPORTING
* PROGRAM_NAME = SYST-CPROG
* DYNPRO_NUMBER = SYST-DYNNR
* FIELD_NAME = ' '
IMPORTING
file_name = p_fname1.

START-OF-SELECTION.
p_ifname = p_fname1.

IF NOT p_ifname IS INITIAL.
* Upload EXCEL data into internal table
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = p_ifname
i_begin_col = '1'
i_begin_row = '1'
i_end_col = '20'
i_end_row = '100000'
TABLES
intern = it_data
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDIF.

* Append EXCEL Data into a internal table
IF it_data IS NOT INITIAL.
LOOP AT it_data INTO is_data.
IF is_data-row NE '0001'.
AT NEW row.
CLEAR ls_final.
ENDAT.
CASE is_data-col .
WHEN '001'.
MOVE is_data-value TO ls_final-vbeln.
WHEN '002'.
MOVE is_data-value TO ls_final-afdat.
ENDCASE.
AT END OF row.
APPEND ls_final TO lt_final.
ENDAT.
ENDIF.
CLEAR : is_data.
ENDLOOP.
ENDIF.

**Check Whether contract number is exist in VBAK table or not while uploading excel file data.
IF lt_final IS NOT INITIAL.
SORT lt_final BY vbeln.
**Select VBAK
SELECT vbeln " Contract No
vbtyp
FROM vbak
INTO TABLE lt_vbak
FOR ALL ENTRIES IN lt_final
WHERE vbeln = lt_final-vbeln
AND vbtyp = 'G'.
ENDIF.

**Exclude contracts if it is not exist .
LOOP AT lt_final INTO ls_final .
lv_tabix = sy-tabix.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = ls_final-vbeln
IMPORTING
output = ls_final-vbeln.

READ TABLE lt_vbak WITH KEY vbeln = ls_final-vbeln
TRANSPORTING NO FIELDS.
IF sy-subrc NE 0.
DELETE lt_final INDEX lv_tabix.
ENDIF.
ENDLOOP.


**Declared workareas & Tables for Billing plan
DATA :ls_zfpla_old LIKE fplavb,
ls_zfpla2_new LIKE fplavb,
ls_zfplt_old LIKE fpltvb ,
ls_zfplt2_new LIKE fpltvb ,
ls_ifplt LIKE fpltvb.

DATA :lt_zfpla_old TYPE TABLE OF fplavb,
lt_zfpla2_new TYPE TABLE OF fplavb ,
lt_zfplt_old TYPE TABLE OF fpltvb ,
lt_zfplt2_new TYPE TABLE OF fpltvb .


TYPES: BEGIN OF ty_vbkd,
vbeln TYPE vbeln,
posnr TYPE posnr,
fplnr TYPE fplnr,
END OF ty_vbkd,

BEGIN OF ty_fpla,
fplnr TYPE fplnr,
bedat TYPE bedat_fp,
endat TYPE endat_fp,
vbeln TYPE vbeln,
END OF ty_fpla.

DATA:ls_vbkd TYPE ty_vbkd,
lt_vbkd TYPE TABLE OF ty_vbkd,
lt_vbkd_item TYPE TABLE OF ty_vbkd,
ls_fpla TYPE ty_fpla,
lt_fpla TYPE TABLE OF ty_fpla.


*Select VBKD
**To get the Billing plan no at header level
IF lt_final IS NOT INITIAL.
SELECT vbeln
posnr
fplnr
FROM vbkd
INTO TABLE lt_vbkd
FOR ALL ENTRIES IN lt_final
WHERE vbeln EQ lt_final-vbeln
AND posnr EQ space.
ENDIF.

*** Select FPLA
*To get the billing document number based on VBKD
IF lt_vbkd IS NOT INITIAL.
SELECT fplnr
bedat
endat
vbeln
FROM fpla
INTO TABLE lt_fpla
FOR ALL ENTRIES IN lt_vbkd
WHERE vbeln EQ lt_vbkd-vbeln
AND fplnr EQ lt_vbkd-fplnr.
ENDIF.

LOOP AT lt_fpla INTO ls_fpla.
* read document, X-tables are created
CALL FUNCTION 'SD_SALES_DOCUMENT_READ'
EXPORTING
document_number = ls_fpla-vbeln
EXCEPTIONS
error_message = 01.
IF sy-subrc NE 0.
* PERFORM message_100 USING vbeln.
EXIT.
ENDIF.

* get all item lines of document
CALL FUNCTION 'SD_SALES_ITEM_LIST_READ'
TABLES
eivbap = itab_item_lines
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
* PERFORM message_100 USING vbeln.
EXIT.
ENDIF.
* Loop at item lines and change the billing plans
LOOP AT itab_item_lines.
* CHECK itab_item_lines-posnr IN posnr.
* read billing plan header for actual item line
CLEAR: fpla, ifplt. REFRESH ifplt.
CALL FUNCTION 'SD_SALES_BILLINGPLAN_READ'
EXPORTING
i_vbeln = ls_fpla-vbeln
i_posnr = itab_item_lines-posnr
IMPORTING
e_fpla = fpla
TABLES
e_fplt = ifplt
EXCEPTIONS
no_billingplan_allowed = 1
no_billingplan_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDLOOP.
CLEAR:itab_item_lines.
REFRESH :itab_item_lines.

* Read the billing plan
IF ls_fpla-fplnr IS NOT INITIAL.
CALL FUNCTION 'BILLING_SCHEDULE_READ'
EXPORTING
fplnr = ls_fpla-fplnr
** i_vfkdat = ls_final-afdat "ls_fpla-bedat
** i_bfkdat = ls_fpla-endat
TABLES
zfpla = lt_zfpla_old "Internal table for billing plans
zfplt = lt_zfplt_old. "Internal tables for date from billing plans
ENDIF.

LOOP AT ifplt INTO ls_ifplt.
READ TABLE lt_zfplt_old ASSIGNING FIELD-SYMBOL(<ls_zfplt_date>)
WITH KEY taxk9 = ' '.
IF sy-subrc EQ 0.
<ls_zfplt_date>-fkdat = ls_ifplt-fkdat. " " To date
<ls_zfplt_date>-nfdat = ls_ifplt-nfdat. "Settlement date
<ls_zfplt_date>-taxk9 = 'X'.
ENDIF.
ENDLOOP.
UNASSIGN <ls_zfplt_date>.
* Pass the old billing plan internal tables to new internal tables for update .
lt_zfplt2_new[] = lt_zfplt_old[].
lt_zfpla2_new[] = lt_zfpla_old[].

****To pass the billing date from excel file
READ TABLE lt_final INTO ls_final
WITH KEY vbeln = ls_fpla-vbeln." BINARY SEARCH.
IF sy-subrc EQ 0.
READ TABLE lt_zfpla2_new ASSIGNING FIELD-SYMBOL(<ls_zfpla2_new>) WITH KEY fplnr = ls_fpla-fplnr.
IF sy-subrc EQ 0.
<ls_zfpla2_new>-bedat = ls_final-afdat."Billing date
<ls_zfpla2_new>-updkz = 'U'. "--> UPDATE
LOOP AT lt_zfplt2_new INTO ls_zfplt2_new WHERE fplnr EQ ls_fpla-fplnr.
ls_zfplt2_new-updkz = 'U'. "--> UPDATE
IF ls_zfplt2_new-updkz IS NOT INITIAL.
MODIFY lt_zfplt2_new FROM ls_zfplt2_new.
CLEAR: ls_zfplt2_new.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.
UNASSIGN <ls_zfpla2_new>.


**Update the billing plan details(Billing date)
IF lt_zfpla2_new IS NOT INITIAL.
CALL FUNCTION 'BILLING_SCHEDULE_SAVE' "IN UPDATE TASK
TABLES
fpla_new = lt_zfpla2_new "--> NEW
fpla_old = lt_zfpla_old
fplt_new = lt_zfplt2_new " --> NEW
fplt_old = lt_zfplt_old.
ENDIF.

IF sy-subrc EQ 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = ' '. "'X'.
ENDIF.

CLEAR:ls_vbkd ,
ls_fpla.

REFRESH lt_zfplt2_new[].
REFRESH lt_zfplt_old[].
REFRESH lt_zfpla_old[].
REFRESH lt_zfpla2_new[].
ENDLOOP.

DESCRIBE TABLE lt_fpla LINES lv_count.
WRITE:/ 'Successfully updated records :', lv_count.

1 REPLY 1

Former Member
0 Kudos

Any one please help out on this query ..