Application Development and Automation 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: 
Read only

BDC for VK12

Former Member
0 Likes
2,486

hi all,

I want to update record in VK12.

I want to do it using BDC.

How to do it.

Regards

Amruta

Hi ,

I am sending the FV11 BDC ..This Transaction is same as VK12 . For your reference see the cod .

-


************************************************************************

  • Program Name : ZFV11_NEW

  • Program Description : To Upload Condition Records-FV11

  • Author : J

  • Start Date : 11/06/2007

***********************************************************************

REPORT zfv11

NO STANDARD PAGE HEADING LINE-SIZE 255.

      • DO NOT CHANGE - the generated data section - DO NOT CHANGE ***

*

  • If it is nessesary to change the data section use the rules:

  • 1.) Each definition of a field exists of two lines

  • 2.) The first line shows exactly the comment

  • '* data element: ' followed with the data element

  • which describes the field.

  • If you don't have a data element use the

  • comment without a data element name

  • 3.) The second line shows the fieldname of the

  • structure, the fieldname must consist of

  • a fieldname and optional the character '_' and

  • three numbers and the field length in brackets

  • 4.) Each field must be type C.

*

      • Generated data section with specific formatting - DO NOT CHANGE ***

TABLES : t100.

DATA: BEGIN OF record OCCURS 0,

  • data element: KSCHA

kschl(004), "Condition Type

  • data element: SELKZ_LIST

  • selkz(001),

  • data element: WERKS_D

werks(004), "Plant

  • data element: ELIFN

lifnr(010), "Vendor

  • data element: MATNR

matnr(018), "Material No.

  • data element: KBETR_KOND

kbetr(016), "Amount

  • data element: KODATAB

datab(010), "Condition Validity Date from

  • data element: KODATBI

datbi(010), "Condition Validity To

  • data element: MWSKZ

mwsk1(002),

END OF record.

DATA : BEGIN OF it_new OCCURS 0, " Internal Table for Header Data

kschl(004),

werks(004),

lifnr(010),

END OF it_new.

DATA : BEGIN OF it_item OCCURS 0, " Internal table for Item Data

werks(004),

lifnr(010),

matnr(018),

kbetr(016),

datab(010),

datbi(010),

mwsk1(002),

END OF it_item.

DATA : cnt(2) TYPE n,

fld(25) TYPE c.

TYPE-POOLS: truxs.

DATA: it_raw TYPE truxs_t_text_data.

DATA : n TYPE n.

DATA:

BEGIN OF t_data OCCURS 0,

data TYPE string,

END OF t_data.

DATA:BEGIN OF it_mess OCCURS 0,

msgtyp(5),

lms(200),

msgv1(50),

END OF it_mess.

DATA : p_mode TYPE c.

DATA:it_msgtab TYPE STANDARD TABLE OF bdcmsgcoll WITH HEADER LINE,

it_msgtab1 TYPE STANDARD TABLE OF bdcmsgcoll WITH HEADER LINE.

DATA : l_mstring(150).

DATA : BEGIN OF bdcdata OCCURS 0.

INCLUDE STRUCTURE bdcdata.

DATA: END OF bdcdata.

PARAMETERS : p_file1 LIKE rlgrap-filename.

INITIALIZATION.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file1.

PERFORM file_selection.

PERFORM data_upload.

PERFORM table_control.

LOOP AT it_new.

REFRESH bdcdata.

PERFORM bdc_dynpro USING 'SAPMV13A' '0100'.

PERFORM bdc_field USING 'BDC_CURSOR'

'RV13A-KSCHL'.

PERFORM bdc_field USING 'BDC_OKCODE'

'/00'.

PERFORM bdc_field USING 'RV13A-KSCHL'

it_new-kschl.

PERFORM bdc_dynpro USING 'SAPLV14A' '0100'.

PERFORM bdc_field USING 'BDC_CURSOR'

'RV130-SELKZ(01)'.

PERFORM bdc_field USING 'BDC_OKCODE'

'=WEIT'.

PERFORM bdc_dynpro USING 'SAPMV13A' '1363'.

PERFORM bdc_field USING 'BDC_CURSOR'

'KONP-KBETR(01)'.

PERFORM bdc_field USING 'BDC_OKCODE'

'/00'.

PERFORM bdc_field USING 'KOMG-WERKS'

it_new-werks.

PERFORM bdc_field USING 'KOMG-LIFNR'

it_new-lifnr.

************************

"""""""""""""

  • DATA: "X(5) TYPE N,

  • N(5) TYPE N.

  • N = 0.

  • LOOP AT it_item.

  • N = N + 1.

  • ENDLOOP.

  • "X = 1.

  • CNT = 1.

  • DO N TIMES.

  • IF CNT > 19.

*

  • perform bdc_field using 'BDC_OKCODE' 'KOMG-MATNR(01)'.

  • perform bdc_field using 'BDC_OKCODE' '=P+'.

  • PERFORM bdc_dynpro USING 'SAPMV13A' '1363'.

  • CNT = 1.

  • ENDIF.

***********************

cnt = 1.

LOOP AT it_item WHERE werks EQ it_new-werks AND lifnr EQ it_new-lifnr . "FROM x TO x.

CONCATENATE 'KOMG-MATNR(' cnt ')' INTO fld.

PERFORM bdc_field USING fld it_item-matnr.

CONCATENATE 'KONP-KBETR(' cnt')' INTO fld.

PERFORM bdc_field USING fld it_item-kbetr.

CONCATENATE 'RV13A-DATAB(' cnt ')' INTO fld.

PERFORM bdc_field USING fld it_item-datab.

CONCATENATE 'RV13A-DATBI(' cnt ')' INTO fld.

PERFORM bdc_field USING fld it_item-datbi.

CONCATENATE 'KONP-MWSK1(' cnt ')' INTO fld.

PERFORM bdc_field USING fld it_item-mwsk1.

cnt = cnt + 1.

if cnt = 20.

perform bdc_field using 'BDC_OKCODE' 'KOMG-MATNR(19)'.

perform bdc_field using 'BDC_OKCODE' '=P+'.

PERFORM bdc_dynpro USING 'SAPMV13A' '1363'.

CNT = 1.

endif.

CLEAR it_item.

ENDLOOP.

  • ENDDO.

PERFORM bdc_dynpro USING 'SAPMV13A' '1363'.

PERFORM bdc_field USING 'BDC_CURSOR'

'KONP-MWSK1(01)'.

PERFORM bdc_field USING 'BDC_OKCODE'

'=SICH'.

CALL TRANSACTION 'FV11' USING bdcdata MODE 'A'

UPDATE 'S'

MESSAGES INTO it_msgtab.

CLEAR bdcdata[].

PERFORM error.

ENDLOOP.

----


  • Start new screen -Subroutine for screen s *

----


FORM bdc_dynpro USING program dynpro.

CLEAR bdcdata.

bdcdata-program = program.

bdcdata-dynpro = dynpro.

bdcdata-dynbegin = 'X'.

APPEND bdcdata.

ENDFORM. "BDC_DYNPRO

----


  • Insert field -Subroutine for field s *

----


FORM bdc_field USING fnam fval.

CLEAR bdcdata.

bdcdata-fnam = fnam.

bdcdata-fval = fval.

APPEND bdcdata.

ENDFORM. "BDC_FIELD

&----


*& Form file_selection

----


FORM file_selection .

CALL FUNCTION 'F4_FILENAME'

EXPORTING

program_name = syst-cprog

dynpro_number = syst-dynnr

field_name = 'P_FILE1'

IMPORTING

file_name = p_file1.

ENDFORM. " file_selection

&----


*& Form data_upload

----


FORM data_upload .

CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'

EXPORTING

  • I_FIELD_SEPERATOR =

i_line_header = 'X'

i_tab_raw_data = it_raw

i_filename = p_file1

TABLES

i_tab_converted_data = record

EXCEPTIONS

conversion_failed = 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.

ENDIF.

ENDFORM. " data_upload

&----


*& Form error

----


FORM error .

LOOP AT it_msgtab.

IF it_msgtab-msgtyp = 'E'.

SELECT SINGLE * FROM t100 WHERE sprsl = it_msgtab-msgspra

AND arbgb = it_msgtab-msgid

AND msgnr = it_msgtab-msgnr.

IF sy-subrc = 0.

l_mstring = t100-text.

IF l_mstring CS '&1'.

REPLACE '&1' WITH it_msgtab-msgv1 INTO l_mstring.

REPLACE '&2' WITH it_msgtab-msgv2 INTO l_mstring.

REPLACE '&3' WITH it_msgtab-msgv3 INTO l_mstring.

REPLACE '&4' WITH it_msgtab-msgv4 INTO l_mstring.

ELSE.

REPLACE '&' WITH it_msgtab-msgv1 INTO l_mstring.

REPLACE '&' WITH it_msgtab-msgv2 INTO l_mstring.

REPLACE '&' WITH it_msgtab-msgv3 INTO l_mstring.

REPLACE '&' WITH it_msgtab-msgv4 INTO l_mstring.

ENDIF.

CONDENSE l_mstring.

it_mess-msgtyp = it_msgtab-msgtyp.

it_mess-lms = l_mstring.

it_mess-msgv1 = it_msgtab-msgv1.

APPEND it_mess.

  • WRITE: / it_msgtab-msgtyp, l_mstring(150).

ELSE.

  • WRITE: / it_msgtab.

it_mess-msgtyp = it_msgtab-msgtyp.

it_mess-lms = l_mstring.

it_mess-msgv1 = it_msgtab-msgv1.

APPEND it_mess.

ENDIF.

ENDIF.

ENDLOOP.

ENDFORM. " error

&----


*& Form table_Control

----


FORM table_control .

  • SORT record BY lifnr matnr.

LOOP AT record.

ON CHANGE OF record-lifnr.

MOVE-CORRESPONDING record TO it_new.

APPEND it_new.

ENDON.

MOVE-CORRESPONDING record TO it_item.

APPEND it_item.

ENDLOOP.

ENDFORM. " table_Control

-


Reward If useful

Thanks

Jagadeesh.G

3 REPLIES 3
Read only

RaymondGiuseppi
Active Contributor
0 Likes
1,345

Use VK17 transaction which is bacth input enabled (OSS [Note 886773 - FAQ: General condition technique|https://service.sap.com/sap/support/notes/886773])

Build your program via tool SHDB.

Regards

Read only

Former Member
1,345

Hi ,

I am sending the FV11 BDC ..This Transaction is same as VK12 . For your reference see the cod .

-


************************************************************************

  • Program Name : ZFV11_NEW

  • Program Description : To Upload Condition Records-FV11

  • Author : J

  • Start Date : 11/06/2007

***********************************************************************

REPORT zfv11

NO STANDARD PAGE HEADING LINE-SIZE 255.

      • DO NOT CHANGE - the generated data section - DO NOT CHANGE ***

*

  • If it is nessesary to change the data section use the rules:

  • 1.) Each definition of a field exists of two lines

  • 2.) The first line shows exactly the comment

  • '* data element: ' followed with the data element

  • which describes the field.

  • If you don't have a data element use the

  • comment without a data element name

  • 3.) The second line shows the fieldname of the

  • structure, the fieldname must consist of

  • a fieldname and optional the character '_' and

  • three numbers and the field length in brackets

  • 4.) Each field must be type C.

*

      • Generated data section with specific formatting - DO NOT CHANGE ***

TABLES : t100.

DATA: BEGIN OF record OCCURS 0,

  • data element: KSCHA

kschl(004), "Condition Type

  • data element: SELKZ_LIST

  • selkz(001),

  • data element: WERKS_D

werks(004), "Plant

  • data element: ELIFN

lifnr(010), "Vendor

  • data element: MATNR

matnr(018), "Material No.

  • data element: KBETR_KOND

kbetr(016), "Amount

  • data element: KODATAB

datab(010), "Condition Validity Date from

  • data element: KODATBI

datbi(010), "Condition Validity To

  • data element: MWSKZ

mwsk1(002),

END OF record.

DATA : BEGIN OF it_new OCCURS 0, " Internal Table for Header Data

kschl(004),

werks(004),

lifnr(010),

END OF it_new.

DATA : BEGIN OF it_item OCCURS 0, " Internal table for Item Data

werks(004),

lifnr(010),

matnr(018),

kbetr(016),

datab(010),

datbi(010),

mwsk1(002),

END OF it_item.

DATA : cnt(2) TYPE n,

fld(25) TYPE c.

TYPE-POOLS: truxs.

DATA: it_raw TYPE truxs_t_text_data.

DATA : n TYPE n.

DATA:

BEGIN OF t_data OCCURS 0,

data TYPE string,

END OF t_data.

DATA:BEGIN OF it_mess OCCURS 0,

msgtyp(5),

lms(200),

msgv1(50),

END OF it_mess.

DATA : p_mode TYPE c.

DATA:it_msgtab TYPE STANDARD TABLE OF bdcmsgcoll WITH HEADER LINE,

it_msgtab1 TYPE STANDARD TABLE OF bdcmsgcoll WITH HEADER LINE.

DATA : l_mstring(150).

DATA : BEGIN OF bdcdata OCCURS 0.

INCLUDE STRUCTURE bdcdata.

DATA: END OF bdcdata.

PARAMETERS : p_file1 LIKE rlgrap-filename.

INITIALIZATION.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file1.

PERFORM file_selection.

PERFORM data_upload.

PERFORM table_control.

LOOP AT it_new.

REFRESH bdcdata.

PERFORM bdc_dynpro USING 'SAPMV13A' '0100'.

PERFORM bdc_field USING 'BDC_CURSOR'

'RV13A-KSCHL'.

PERFORM bdc_field USING 'BDC_OKCODE'

'/00'.

PERFORM bdc_field USING 'RV13A-KSCHL'

it_new-kschl.

PERFORM bdc_dynpro USING 'SAPLV14A' '0100'.

PERFORM bdc_field USING 'BDC_CURSOR'

'RV130-SELKZ(01)'.

PERFORM bdc_field USING 'BDC_OKCODE'

'=WEIT'.

PERFORM bdc_dynpro USING 'SAPMV13A' '1363'.

PERFORM bdc_field USING 'BDC_CURSOR'

'KONP-KBETR(01)'.

PERFORM bdc_field USING 'BDC_OKCODE'

'/00'.

PERFORM bdc_field USING 'KOMG-WERKS'

it_new-werks.

PERFORM bdc_field USING 'KOMG-LIFNR'

it_new-lifnr.

************************

"""""""""""""

  • DATA: "X(5) TYPE N,

  • N(5) TYPE N.

  • N = 0.

  • LOOP AT it_item.

  • N = N + 1.

  • ENDLOOP.

  • "X = 1.

  • CNT = 1.

  • DO N TIMES.

  • IF CNT > 19.

*

  • perform bdc_field using 'BDC_OKCODE' 'KOMG-MATNR(01)'.

  • perform bdc_field using 'BDC_OKCODE' '=P+'.

  • PERFORM bdc_dynpro USING 'SAPMV13A' '1363'.

  • CNT = 1.

  • ENDIF.

***********************

cnt = 1.

LOOP AT it_item WHERE werks EQ it_new-werks AND lifnr EQ it_new-lifnr . "FROM x TO x.

CONCATENATE 'KOMG-MATNR(' cnt ')' INTO fld.

PERFORM bdc_field USING fld it_item-matnr.

CONCATENATE 'KONP-KBETR(' cnt')' INTO fld.

PERFORM bdc_field USING fld it_item-kbetr.

CONCATENATE 'RV13A-DATAB(' cnt ')' INTO fld.

PERFORM bdc_field USING fld it_item-datab.

CONCATENATE 'RV13A-DATBI(' cnt ')' INTO fld.

PERFORM bdc_field USING fld it_item-datbi.

CONCATENATE 'KONP-MWSK1(' cnt ')' INTO fld.

PERFORM bdc_field USING fld it_item-mwsk1.

cnt = cnt + 1.

if cnt = 20.

perform bdc_field using 'BDC_OKCODE' 'KOMG-MATNR(19)'.

perform bdc_field using 'BDC_OKCODE' '=P+'.

PERFORM bdc_dynpro USING 'SAPMV13A' '1363'.

CNT = 1.

endif.

CLEAR it_item.

ENDLOOP.

  • ENDDO.

PERFORM bdc_dynpro USING 'SAPMV13A' '1363'.

PERFORM bdc_field USING 'BDC_CURSOR'

'KONP-MWSK1(01)'.

PERFORM bdc_field USING 'BDC_OKCODE'

'=SICH'.

CALL TRANSACTION 'FV11' USING bdcdata MODE 'A'

UPDATE 'S'

MESSAGES INTO it_msgtab.

CLEAR bdcdata[].

PERFORM error.

ENDLOOP.

----


  • Start new screen -Subroutine for screen s *

----


FORM bdc_dynpro USING program dynpro.

CLEAR bdcdata.

bdcdata-program = program.

bdcdata-dynpro = dynpro.

bdcdata-dynbegin = 'X'.

APPEND bdcdata.

ENDFORM. "BDC_DYNPRO

----


  • Insert field -Subroutine for field s *

----


FORM bdc_field USING fnam fval.

CLEAR bdcdata.

bdcdata-fnam = fnam.

bdcdata-fval = fval.

APPEND bdcdata.

ENDFORM. "BDC_FIELD

&----


*& Form file_selection

----


FORM file_selection .

CALL FUNCTION 'F4_FILENAME'

EXPORTING

program_name = syst-cprog

dynpro_number = syst-dynnr

field_name = 'P_FILE1'

IMPORTING

file_name = p_file1.

ENDFORM. " file_selection

&----


*& Form data_upload

----


FORM data_upload .

CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'

EXPORTING

  • I_FIELD_SEPERATOR =

i_line_header = 'X'

i_tab_raw_data = it_raw

i_filename = p_file1

TABLES

i_tab_converted_data = record

EXCEPTIONS

conversion_failed = 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.

ENDIF.

ENDFORM. " data_upload

&----


*& Form error

----


FORM error .

LOOP AT it_msgtab.

IF it_msgtab-msgtyp = 'E'.

SELECT SINGLE * FROM t100 WHERE sprsl = it_msgtab-msgspra

AND arbgb = it_msgtab-msgid

AND msgnr = it_msgtab-msgnr.

IF sy-subrc = 0.

l_mstring = t100-text.

IF l_mstring CS '&1'.

REPLACE '&1' WITH it_msgtab-msgv1 INTO l_mstring.

REPLACE '&2' WITH it_msgtab-msgv2 INTO l_mstring.

REPLACE '&3' WITH it_msgtab-msgv3 INTO l_mstring.

REPLACE '&4' WITH it_msgtab-msgv4 INTO l_mstring.

ELSE.

REPLACE '&' WITH it_msgtab-msgv1 INTO l_mstring.

REPLACE '&' WITH it_msgtab-msgv2 INTO l_mstring.

REPLACE '&' WITH it_msgtab-msgv3 INTO l_mstring.

REPLACE '&' WITH it_msgtab-msgv4 INTO l_mstring.

ENDIF.

CONDENSE l_mstring.

it_mess-msgtyp = it_msgtab-msgtyp.

it_mess-lms = l_mstring.

it_mess-msgv1 = it_msgtab-msgv1.

APPEND it_mess.

  • WRITE: / it_msgtab-msgtyp, l_mstring(150).

ELSE.

  • WRITE: / it_msgtab.

it_mess-msgtyp = it_msgtab-msgtyp.

it_mess-lms = l_mstring.

it_mess-msgv1 = it_msgtab-msgv1.

APPEND it_mess.

ENDIF.

ENDIF.

ENDLOOP.

ENDFORM. " error

&----


*& Form table_Control

----


FORM table_control .

  • SORT record BY lifnr matnr.

LOOP AT record.

ON CHANGE OF record-lifnr.

MOVE-CORRESPONDING record TO it_new.

APPEND it_new.

ENDON.

MOVE-CORRESPONDING record TO it_item.

APPEND it_item.

ENDLOOP.

ENDFORM. " table_Control

-


Reward If useful

Thanks

Jagadeesh.G

Read only

Clemenss
Active Contributor
0 Likes
1,345

Hi amrutha,

here a program of mine for concition creation/modification - may it help you...


REPORT  z_zta_preis
  NO STANDARD PAGE HEADING
  MESSAGE-ID 0h.
INCLUDE:
  <icon>.
TYPE-POOLS:
  sydes,
  slis.
CONSTANTS:
  con_true   TYPE flag VALUE 'X'.

TYPES:
* work and display table
  BEGIN OF typ_preisdaten,
  icon     TYPE icon_d,
  matnr    TYPE artnr,
  lifnr    TYPE lifnr,
  ekorg    TYPE ekorg,
  knumh    TYPE knumh,
  datab    TYPE kodatab,
  datbi    TYPE kodatbi,
  kbetr    TYPE kbetr_cond,
  konwa    TYPE konwa,
  kpein    TYPE kpein,
  kmein    TYPE kmein,
  vkorg    TYPE vkorg,
  vtweg    TYPE vtweg,
  knumh_vk TYPE knumh,
  datab_vk TYPE kodatab,
  datbi_vk TYPE kodatbi,
  kbetr_vk TYPE kbetr_cond,
  konwa_vk TYPE konwa,
  kpein_vk TYPE kpein,
  kmein_vk TYPE kmein,
  END OF typ_preisdaten,
  typ_t_preisdaten TYPE TABLE OF typ_preisdaten,

* Data A018 purchasing conditions
  BEGIN OF typ_a018_dta,
  knumh TYPE knumh,
  matnr TYPE matnr,
  ekorg TYPE ekorg,
  lifnr TYPE lifnr,
  datab TYPE datab,
  datbi TYPE datbi,
  END OF typ_a018_dta,
  typ_t_a018_dta TYPE TABLE OF typ_a018_dta,

* Data A004 Sales conditiona
  BEGIN OF typ_a004_dta,
  matnr TYPE a004-matnr,
  datbi TYPE a004-datbi,
  datab TYPE a004-datab,
  knumh TYPE a004-knumh,
  END OF typ_a004_dta,
  typ_t_a004_dta TYPE TABLE OF typ_a004_dta,

* condition details KONP
  BEGIN OF typ_konp_dta,
  knumh TYPE konp-knumh,
  kopos TYPE konp-kopos,
  kbetr TYPE konp-kbetr,
  kpein TYPE konp-kpein,
  kmein TYPE konp-kmein,
  konwa TYPE konp-konwa,
  END OF typ_konp_dta.

* Global data
DATA:
  v_commit_count TYPE border,
  vg_dynnr       TYPE dynpronr,
  vsel_matnr     TYPE mara-matnr,
  vsel_vmsta     TYPE mvke-vmsta,                      "CLI20041130
  gt_preisdaten  TYPE typ_t_preisdaten,

* BTCI Data
  bdcdata TYPE TABLE OF bdcdata WITH HEADER LINE.
*----------------------------------------------------------------------*
* Selection screen
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK sel WITH FRAME TITLE text-sel.
SELECT-OPTIONS:
  s_matnr FOR vsel_matnr,
  s_vmsta FOR vsel_vmsta.                 "CLI20041130
PARAMETERS:
  p_datab TYPE datab,
  p_ekorg TYPE ekorg,
  p_vkorg TYPE vkorg,
  p_vtweg TYPE vtweg,
  p_ekappl TYPE kappl,
  p_ekschl TYPE kschl,
  p_vkappl TYPE kappl,
  p_vkschl TYPE kschl.

SELECTION-SCREEN END OF BLOCK sel.
SELECTION-SCREEN BEGIN OF BLOCK lop WITH FRAME TITLE text-lop.
PARAMETERS:
  p_ekdays TYPE tfmatage,
  p_layout TYPE slis_vari NO-DISPLAY,
  p_btmode TYPE ctu_mode,
  p_echt   TYPE allgecht,
  p_detail TYPE flag.
SELECTION-SCREEN END OF BLOCK lop.

AT SELECTION-SCREEN OUTPUT.
* display only fields not to be changed

  PERFORM pbo.

AT SELECTION-SCREEN ON p_datab.
  IF p_datab < sy-datum.
    MESSAGE e000 WITH 'Please enter'
                      'valid-from-date' 'from' sy-datum.
*    & & & &
  ENDIF." P_DATAB < sy-datum.

INITIALIZATION.
  PERFORM initialize.

START-OF-SELECTION.
  vg_dynnr = sy-dynnr.

* determine purchase prices
  PERFORM get_ek_preisdaten CHANGING gt_preisdaten.

* add existing sales prices
  PERFORM get_vk_preisdaten CHANGING gt_preisdaten.

* Individually Set new sales prices
  PERFORM set_preis_vk      CHANGING gt_preisdaten.

* Protokoll
  PERFORM alv_display       USING    gt_preisdaten.
*&---------------------------------------------------------------------*
*&      Form  INITIALIZE
*&---------------------------------------------------------------------*
*       Selection screen init
*----------------------------------------------------------------------*
FORM initialize.
  s_vmsta = 'INE'.                          "CLI20041130
  s_vmsta-low = '98'.                       "CLI20041130
  APPEND s_vmsta.                           "CLI20041130
  p_datab = sy-datum + 1.
  p_ekorg = '7000'.
  p_vkorg = '7000'.
  p_vtweg = '03'.
  p_ekappl = 'M'.
  p_vkappl = 'V'.
  p_ekschl = 'ZBP0'.
  p_vkschl = 'ZBP0'.
  p_ekdays = 14.
  p_btmode = 'N'.
ENDFORM.                    " INITIALIZE

*&---------------------------------------------------------------------*
*&      Form  GET_EK_PREISDATEN
*&---------------------------------------------------------------------*
*       determine purchse price conditions; append valid
*----------------------------------------------------------------------*
*      <--PT_PREISDATEN
*----------------------------------------------------------------------*
FORM get_ek_preisdaten CHANGING pt_preisdaten TYPE typ_t_preisdaten.
  DATA:
    l_tabix      TYPE sytabix,
    l_a018_lines TYPE sytfill,
    l_txt        TYPE text80,
    lt_matnr     TYPE TABLE OF matnr,
    lt_a018_dta  TYPE typ_t_a018_dta,
    lt_a018_mat  TYPE typ_t_a018_dta.
  FIELD-SYMBOLS:
    <matnr>      TYPE matnr,
    <a018_dta>   TYPE LINE OF typ_t_a018_dta.

* Base QTYof article in sales area
* without deteion mark LOEKZ in MARA 
* sales block according selection
  SELECT mara~matnr INTO TABLE lt_matnr  
  FROM mvke                                         
  JOIN mara ON mara~matnr = mvke~matnr
  WHERE mvke~matnr IN s_matnr             
    AND vkorg      = p_vkorg                       
    AND vtweg      = p_vtweg                      
    AND pmatn      = space                        
    AND mara~lvorm = space                     
    AND mvke~lvorm = space                     
    AND ( vmsta    = space  or                    
          VMSTD    > P_datab or                   
          vmsta    IN s_vmsta ).
  IF sy-subrc <> 0.
    MESSAGE s228.
*   No valid entry found
    EXIT.
  ENDIF." sy-subrc <> 0.
  PERFORM statistics
    USING 'S' sy-dbcnt '* Articles of VKORG selected

* read existing Purch.conditions
  SELECT knumh matnr ekorg lifnr datab datbi
    INTO CORRESPONDING FIELDS OF TABLE lt_a018_dta
    FROM a018
    FOR ALL ENTRIES IN lt_matnr
    WHERE matnr  = lt_matnr-table_line
      AND kappl  = p_ekappl
      AND kschl  = p_ekschl
      AND ekorg  = p_ekorg
      AND datab <= p_datab
      AND datbi >= p_datab
      AND esokz  = '0'.
  SORT lt_a018_dta BY matnr.
  DESCRIBE TABLE lt_a018_dta LINES l_a018_lines.

* Missing  conditions for statistics
* Preise für die existierenden
  LOOP AT lt_matnr ASSIGNING <matnr>.
    READ TABLE lt_a018_dta ASSIGNING <a018_dta>
      WITH KEY matnr = <matnr> BINARY SEARCH.
    IF sy-subrc = 0.

* collect conditions records for Article
      CLEAR: lt_a018_mat.
      l_tabix = sy-tabix.
      WHILE <a018_dta>-matnr = <matnr>
        AND l_tabix <= l_a018_lines.
        APPEND <a018_dta> TO lt_a018_mat.
        ADD 1 TO l_tabix.
        CHECK l_tabix <= l_a018_lines.
        READ TABLE lt_a018_dta ASSIGNING <a018_dta>
          INDEX l_tabix.
      ENDWHILE." <a018_dta>-matnr = <matnr>.

      PERFORM append_ek_preis_zur_condition
        CHANGING lt_a018_mat pt_preisdaten.
    ELSE.
      CONCATENATE
        'Article' <matnr>
        ': Missing purch condition' p_ekschl
        INTO l_txt SEPARATED BY space.
      PERFORM statistics USING 'S' 0 l_txt.
    ENDIF." sy-subrc = 0.
  ENDLOOP." at lt_matnr assigning <matnr>.
  SORT pt_preisdaten BY matnr.
ENDFORM.                    " GET_EK_PREISDATEN

*&---------------------------------------------------------------------*
*&      Form  SET_PREIS_VK
*&---------------------------------------------------------------------*
*       set sales condtion (in update run)
*----------------------------------------------------------------------*
*      <--PT_PREISDATEN
*----------------------------------------------------------------------*
FORM set_preis_vk CHANGING  pt_preisdaten TYPE typ_t_preisdaten.
  FIELD-SYMBOLS:
    <pre><code> TYPE LINE OF typ_t_preisdaten.
  LOOP AT pt_preisdaten ASSIGNING <pre><code>.
    CASE <pre><code>-icon.
      WHEN icon_create.
        PERFORM price_create CHANGING <pre><code>.
      WHEN icon_change.
        PERFORM price_change CHANGING <pre><code>.
      WHEN icon_date.
        PERFORM price_date   CHANGING <pre><code>.
      WHEN OTHERS.
    ENDCASE." <pre><code>-icon.
  ENDLOOP." at pt_preisdaten assigning <pre><code>.
ENDFORM.                    " SET_PREIS_VK

*&---------------------------------------------------------------------*
*&      Form  ALV_DISPLAY
*&---------------------------------------------------------------------*
*       issue protocol
*----------------------------------------------------------------------*
*      -->PT_PREISDATEN  text
*----------------------------------------------------------------------*
FORM alv_display USING     pt_preisdaten TYPE typ_t_preisdaten.
* cleanup depending on detail option
  PERFORM alv_list USING     pt_preisdaten.
ENDFORM.                    " ALV_DISPLAY

*&---------------------------------------------------------------------*
*&      Form  PBO
*&---------------------------------------------------------------------*
*       darken fixed fields
*----------------------------------------------------------------------*
FORM pbo.
  LOOP AT SCREEN.
    CASE screen-name.
      WHEN 'P_EKAPPL' OR
           'P_VKAPPL' OR
           'P_EKSCHL' OR
           'P_VKSCHL' OR
           'P_EKORG'  OR
           'P_VKORG'  OR
           'P_VTWEG'.
        screen-input = 0.
    ENDCASE." screen-name.
    MODIFY SCREEN.
  ENDLOOP." at screen.
ENDFORM.                    " PBO

*&---------------------------------------------------------------------*
*&      Form  APPEND_EK_PREIS_ZUR_condITION
*&---------------------------------------------------------------------*
*       determine purch price of default supplier
*       from conditions for material
*----------------------------------------------------------------------*
*      -->PT_A018_MAT
*      <--PT_PREISDATEN
*----------------------------------------------------------------------*
FORM append_ek_preis_zur_condition
  CHANGING pt_a018_mat    TYPE typ_t_a018_dta
           pt_preisdaten TYPE typ_t_preisdaten.
  DATA:
    l_preisdaten TYPE typ_preisdaten,
    l_txt       TYPE text80,
    l_tfill     TYPE sytfill,
    l_n_lif     TYPE sytfill,
    lt_konp_dta TYPE TABLE OF typ_konp_dta,
    lt_lifnr    TYPE TABLE OF lifnr,
    l_ekvaldays  TYPE tfmatage.
  FIELD-SYMBOLS:
    <a018_dta> TYPE typ_a018_dta,
    <lifnr>    TYPE lifnr,
    <konp_dta> TYPE typ_konp_dta.

* 1. consistency check: numer conditions records = number suppliers
  DESCRIBE TABLE pt_a018_mat LINES l_tfill.
  IF l_tfill > 1.
    LOOP AT pt_a018_mat ASSIGNING <a018_dta>.
      APPEND <a018_dta>-lifnr TO lt_lifnr.
    ENDLOOP." at pt_a018_mat assigning <a018_dta>.
    PERFORM normalize_table CHANGING lt_lifnr.
    DESCRIBE TABLE lt_lifnr LINES l_n_lif.
    IF l_tfill <> l_n_lif.

* Inconsistent - report and skip
      CONCATENATE
        'Artikel' <a018_dta>-matnr
        ': Inconsistent purchase condition' p_ekschl
        INTO l_txt SEPARATED BY space.
      PERFORM statistics USING 'S' 0 l_txt.
      EXIT.
    ENDIF." l_tfill <> l_n_lif.

* default supplier from EINA
    SELECT lifnr
      INTO TABLE lt_lifnr
      FROM eina
      WHERE matnr = <a018_dta>-matnr
        AND relif = con_true.

* 2. consistency check: default supplier found and unique
    DESCRIBE TABLE lt_lifnr LINES l_tfill.
    IF l_tfill = 1.

* OK - keep records for default supplier
      READ TABLE lt_lifnr ASSIGNING <lifnr> INDEX 1.
      DELETE pt_a018_mat WHERE NOT lifnr = <lifnr>.
    ELSE.
* report error and skip
      CONCATENATE
        'Articl' <a018_dta>-matnr
        ': Inconsistent default supplier' p_ekschl
        INTO l_txt SEPARATED BY space.
      PERFORM statistics USING 'S' 0 l_txt.
      EXIT.
    ENDIF." l_tfill = 1.
  ENDIF." l_tfill > 1.

* sjoulkd be one condition record left
  DESCRIBE TABLE pt_a018_mat LINES l_tfill.
  IF l_tfill <> 1.
* report and skip
    CONCATENATE
      'Articlel' <a018_dta>-matnr
      ': Inconsistent  price condition' p_ekschl
      INTO l_txt SEPARATED BY space.
    PERFORM statistics USING 'S' 0 l_txt.
    EXIT.
  ENDIF.
  READ TABLE pt_a018_mat ASSIGNING <a018_dta> INDEX 1.
* conditionen aus KONP

  SELECT knumh kopos kbetr kpein kmein konwa
  INTO CORRESPONDING FIELDS OF TABLE lt_konp_dta
  FROM konp
  WHERE knumh = <a018_dta>-knumh
    AND loevm_ko = space  " not deleted
    AND krech    = 'C'    " calc rule qty
    AND kzbzg    = space. " no scale conditions

  IF sy-subrc <> 0.
* repprt and skip
    CONCATENATE
      'Article' <a018_dta>-matnr
      ': Inconsistent Price condition' p_ekschl
      INTO l_txt SEPARATED BY space.
    PERFORM statistics USING 'S' 0 l_txt.
    EXIT.
  ELSE."if sy-subrc <> 0.
* shuld be one record
    IF sy-dbcnt <> 1.
* report and skip
      CONCATENATE
        'Articlel' <a018_dta>-matnr
        ': Inconsistent Price condition' p_ekschl
        INTO l_txt SEPARATED BY space.
      PERFORM statistics USING 'S' 0 l_txt.
      EXIT.
    ELSE.
      READ TABLE lt_konp_dta ASSIGNING <konp_dta> INDEX 1.
      l_preisdaten-ekorg = p_vkorg.
      l_preisdaten-icon  = icon_okay.
      MOVE-CORRESPONDING:
        <a018_dta> TO l_preisdaten,
        <konp_dta> TO l_preisdaten.
      APPEND l_preisdaten TO pt_preisdaten.
      PERFORM statistics
        USING 'S' 1 '* purchase price determinded for article'.
      l_ekvaldays = l_preisdaten-datbi - l_preisdaten-datab.
      IF l_ekvaldays <= p_ekdays.
        WRITE l_ekvaldays TO l_txt LEFT-JUSTIFIED.
        CONCATENATE
          'Warning article' <a018_dta>-matnr
          ': Purchase-Price valid only' l_txt 'days'
          INTO l_txt SEPARATED BY space.
        PERFORM statistics USING 'S' 0 l_txt.
      ENDIF." l_ekvaldays <= P_EKDAYS.
    ENDIF." sy-dbcnt <> 1.
  ENDIF." sy-subrc <> 0.
ENDFORM.                    " APPEND_EK_PREIS_ZUR_condITION

*&---------------------------------------------------------------------*
*&      Form  statistics
*&---------------------------------------------------------------------*
*       Statistics-Handler
*----------------------------------------------------------------------*
*      -->P_FUNC  S - Store, L - List
*      -->P_TEXT
*----------------------------------------------------------------------*
FORM statistics  USING    p_func  TYPE char01
                          p_count TYPE sy-dbcnt
                          p_text  TYPE text80.
  DATA:
* Fehlerstruktur
    BEGIN OF l_gp_error,
    txt    TYPE text80,
    count  TYPE sydbcnt VALUE 1,
    END OF l_gp_error,
* output length
    l_outlen TYPE sy-tleng.

* Static table
  STATICS:
    lt_gp_error LIKE TABLE OF l_gp_error.
  CASE p_func.
    WHEN 'S'. "Store Message

* collect and count message
      l_gp_error-txt = p_text.
      l_gp_error-count = p_count.
      COLLECT l_gp_error INTO lt_gp_error.
    WHEN 'L'. "List Messages

* issue messages
      SORT lt_gp_error.
      LOOP AT lt_gp_error INTO l_gp_error.
        AT FIRST.
          FORMAT COLOR COL_HEADING INTENSIFIED.
          DESCRIBE FIELD l_gp_error-count OUTPUT-LENGTH l_outlen.
          WRITE:
            sy-vline,
            p_text,
            sy-vline,
            AT (l_outlen) 'Count',
            sy-vline,
            AT sy-linsz sy-vline.
          FORMAT COLOR COL_NORMAL INTENSIFIED.
        ENDAT." first.
        WRITE:
          sy-vline,
          l_gp_error-txt,
            sy-vline,
            l_gp_error-count NO-ZERO,
            sy-vline,
          AT sy-linsz sy-vline.
      ENDLOOP." at lt_gp_error into l_gp_error.
  ENDCASE." p_func.
ENDFORM.                    " statistics

*&---------------------------------------------------------------------*
*&      Form  alv_LIST
*&---------------------------------------------------------------------*
*       ALV display Detail protocol
*----------------------------------------------------------------------*
*      -->PT_LIST
*----------------------------------------------------------------------*
FORM alv_list  USING    pt_list TYPE table.
  DATA:
    l_variant        TYPE  disvariant,
    l_repid          TYPE sy-repid,
    l_alv_layout     TYPE slis_layout_alv,
    l_is_print       TYPE slis_print_alv,
    lt_alv_fieldcat TYPE slis_t_fieldcat_alv,
     lt_events       TYPE  slis_t_event.
  IF p_detail IS INITIAL.
    CLEAR: pt_list.
    APPEND INITIAL LINE TO pt_list.
  ENDIF." p_detail IS INITIAL.
  l_repid = sy-repid.
  l_variant-variant  = p_layout.
  l_variant-report   = l_repid.
  l_variant-username = sy-uname.
  l_variant-variant  = p_layout.
  PERFORM alv_events CHANGING lt_events.

  PERFORM alv_layout CHANGING l_alv_layout.

  PERFORM alv_fieldcat_for_itab TABLES pt_list
    CHANGING lt_alv_fieldcat.

  PERFORM alv_fieldcat_enhance CHANGING lt_alv_fieldcat.

  l_is_print-no_print_selinfos  = con_true.
  l_is_print-no_print_listinfos = con_true.

  CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
    EXPORTING
*   I_INTERFACE_CHECK              = ' '
*   I_BYPASSING_BUFFER             =
*   I_BUFFER_ACTIVE                = ' '
      i_callback_program             = l_repid
*   I_CALLBACK_PF_STATUS_SET       = ' '
*   I_CALLBACK_USER_COMMAND        = ' '
*   I_STRUCTURE_NAME               =
      is_layout                      = l_alv_layout
      it_fieldcat                    = lt_alv_fieldcat
*   IT_EXCLUDING                   =
*   IT_SPECIAL_GROUPS              =
*   IT_SORT                        =
*   IT_FILTER                      =
*   IS_SEL_HIDE                    =
*   I_DEFAULT                      = con_true
      i_save                         = 'A'
      is_variant                     = l_variant
      it_events                      =  lt_events
*   IT_EVENT_EXIT                  =
      is_print                       = l_is_print
*   IS_REPREP_ID                   =
*   I_SCREEN_START_COLUMN          = 0
*   I_SCREEN_START_LINE            = 0
*   I_SCREEN_END_COLUMN            = 0
*   I_SCREEN_END_LINE              = 0
* IMPORTING
*   E_EXIT_CAUSED_BY_CALLER        =
*   ES_EXIT_CAUSED_BY_USER         =
    TABLES
      t_outtab                       = pt_list
      EXCEPTIONS
        program_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.
  ENDIF.
ENDFORM.                    " alv_LIST
*&---------------------------------------------------------------------*
*&      Form  alv_events
*&---------------------------------------------------------------------*
*       Events assigned
*----------------------------------------------------------------------*
*      <--P_I_EVENTS
*----------------------------------------------------------------------*
FORM alv_events CHANGING p_i_events TYPE slis_t_event.
  FIELD-SYMBOLS:
    <event> TYPE LINE OF slis_t_event.
  CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
* EXPORTING
*   I_LIST_TYPE           = 0
    IMPORTING
      et_events             = p_i_events
    EXCEPTIONS
      list_type_wrong       = 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.
  ENDIF.

  LOOP AT p_i_events ASSIGNING <event>.
    CASE <event>-name.
      WHEN 'TOP_OF_PAGE'.
        <event>-form = 'ALV_TOP_OF_PAGE'.
      WHEN 'END_OF_LIST'.
        <event>-form = 'ALV_END_OF_LIST'.
      WHEN OTHERS.
        DELETE p_i_events.
    ENDCASE." <event>-name.
  ENDLOOP." at p_i_events assigning <event>.
ENDFORM.                    " alv_events
*&---------------------------------------------------------------------*
*&      Form  alv_fieldcat_enhance
*&---------------------------------------------------------------------*
*       Individual enhancement of field catalogue
*----------------------------------------------------------------------*
*      <--PT_ALV_FIELDCAT
*----------------------------------------------------------------------*
FORM alv_fieldcat_enhance
  CHANGING pt_alv_fieldcat TYPE slis_t_fieldcat_alv.
  FIELD-SYMBOLS:
    <alv_fieldcat> TYPE slis_fieldcat_alv.
  LOOP AT pt_alv_fieldcat ASSIGNING <alv_fieldcat>.
    CASE <alv_fieldcat>-fieldname.
      WHEN 'ICON'.
        <alv_fieldcat>-icon = con_true.
        <alv_fieldcat>-seltext_s =
        <alv_fieldcat>-seltext_m =
        <alv_fieldcat>-seltext_l =
        <alv_fieldcat>-reptext_ddic =
        'Status'.
      WHEN  'KBETR'.
        <alv_fieldcat>-cfieldname = 'KONWA'.
        <alv_fieldcat>-seltext_s =
        <alv_fieldcat>-seltext_m =
        <alv_fieldcat>-seltext_l =
        <alv_fieldcat>-reptext_ddic =
        'Price PO'.
      WHEN  'KBETR_VK'.
        <alv_fieldcat>-cfieldname = 'KONWA_VK'.
        <alv_fieldcat>-seltext_s =
        <alv_fieldcat>-seltext_m =
        <alv_fieldcat>-seltext_l =
        <alv_fieldcat>-reptext_ddic =
        'Price Sale'.
      WHEN 'KNUMH' OR 'KNUMH_VK'.
        <alv_fieldcat>-tech = con_true.

      WHEN 'LIFNR'.
        <alv_fieldcat>-seltext_s =
        <alv_fieldcat>-seltext_m =
        <alv_fieldcat>-seltext_l =
        <alv_fieldcat>-reptext_ddic =
        'Supplier'.
      WHEN 'DATAB' OR 'DATAB_VK' .
        <alv_fieldcat>-seltext_s =
        <alv_fieldcat>-seltext_m =
        <alv_fieldcat>-seltext_l =
        <alv_fieldcat>-reptext_ddic =
        'Valid from'.
    ENDCASE." <alv_fieldcat>-fieldname.
  ENDLOOP." at pt_alv_fieldcat assigning <fieldcat_alv>.
ENDFORM.                    " alv_fieldcat_enhance

*&---------------------------------------------------------------------*
*&      Form  SAPGUI_PROGRESS_INDICATOR
*&---------------------------------------------------------------------*
*       
*----------------------------------------------------------------------*
*      -->P_TEXT
*      -->P_SHARE
*      -->P_TOTAL
*----------------------------------------------------------------------*
FORM sapgui_progress_indicator                              "#EC CALLED
  USING
  p_text TYPE c
  p_share TYPE sytfill
  p_total TYPE sytfill.
  STATICS:
    l_time LIKE sy-uzeit,
    l_txt  TYPE text80.
  DATA:
    l_seconds_since_lastcall TYPE sytfill,
    l_share TYPE p,
    l_pct TYPE sytfill,
    l_txt1 LIKE tline-tdline,
    l_txt2 LIKE tline-tdline.
  GET TIME.
  l_seconds_since_lastcall = sy-uzeit - l_time.
  CHECK l_seconds_since_lastcall >= 1 OR l_txt <> p_text.
  l_txt = p_text.
  l_time = sy-uzeit.
  IF p_total > 0.
    l_share = p_share.
    l_share = p_share.
    l_pct = l_share * 100 / p_total.
    WRITE p_share TO l_txt1 LEFT-JUSTIFIED.
    WRITE p_total TO l_txt2 LEFT-JUSTIFIED.
    CONCATENATE
      p_text l_txt1 '/' l_txt2 INTO l_txt1 SEPARATED BY space.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
         EXPORTING
              percentage = l_pct
              text       = l_txt1.
  ELSE.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
         EXPORTING
*             percentage = l_pct
              text       = p_text.
  ENDIF.                               " p_total > 0.
ENDFORM.                               " SAPGUI_PROGRESS_INDICATOR
*&---------------------------------------------------------------------*
*&      Form  ALV_FIELDCAT_FOR_ITAB
*&---------------------------------------------------------------------*
*       field catalog for any internal Table (c) Clemens Li
*       * build field catalog from type description
*----------------------------------------------------------------------*
*      -->pt_outtab
*      <--PT_alv_fieldcat
*----------------------------------------------------------------------*
FORM alv_fieldcat_for_itab                                  "#EC *
  TABLES   pt_outtab       TYPE table                       "#EC *
  CHANGING pt_alv_fieldcat TYPE slis_t_fieldcat_alv.        "#EC *
  DATA:
    l_desc         TYPE sydes_desc,
    l_alv_fieldcat TYPE slis_fieldcat_alv,
    l_longfield    TYPE fname.
  FIELD-SYMBOLS:
    <typeinfo> TYPE sydes_typeinfo,
    <nameinfo> TYPE sydes_nameinfo.
  DESCRIBE FIELD pt_outtab INTO l_desc.                     "#EC *

  LOOP AT l_desc-types
      ASSIGNING <typeinfo>
      WHERE NOT idx_name IS INITIAL
        AND table_kind IS INITIAL "no entries for deep table like color
        AND back = 1. "top-level-entries only
    READ TABLE l_desc-names INDEX <typeinfo>-idx_name
      ASSIGNING <nameinfo>.
    l_alv_fieldcat-fieldname = <nameinfo>-name.
    WHILE NOT <nameinfo>-continue IS INITIAL.
      ADD 1 TO <typeinfo>-idx_name.
      READ TABLE l_desc-names INDEX <typeinfo>-idx_name
        ASSIGNING <nameinfo>.
      CONCATENATE
        l_alv_fieldcat-fieldname
        <nameinfo>-name
        INTO l_alv_fieldcat-fieldname.
    ENDWHILE." not <nameinfo>-continue IS INITIAL.
    READ TABLE l_desc-names INDEX <typeinfo>-idx_help_id
      ASSIGNING <nameinfo>.
    IF sy-subrc = 0.

* Caution: Help-ID may be Tablename-Fieldname and thus longer
* than 30 Chars; l_alv_fieldcat-rollname is 30 Chars only
      l_alv_fieldcat-rollname = <nameinfo>-name.
      l_longfield = <nameinfo>-name.
      WHILE NOT <nameinfo>-continue IS INITIAL.
        ADD 1 TO <typeinfo>-idx_help_id.
        READ TABLE l_desc-names INDEX <typeinfo>-idx_help_id
          ASSIGNING <nameinfo>.
        CONCATENATE
          l_longfield
          <nameinfo>-name
          INTO l_longfield.
      ENDWHILE." not l_desc-continue is initial.

* help id may be data element or <table>-<field>
      IF l_longfield CA '-'.

* get data type for table field
        PERFORM get_rollname_4_tabfield
          USING l_longfield CHANGING l_alv_fieldcat.
      ENDIF." l_longfield ca '-'.
    ELSE.

* No Help-ID: Use Fieldname as text
      l_alv_fieldcat-seltext_s =
      l_alv_fieldcat-seltext_m =
      l_alv_fieldcat-seltext_l =
      l_alv_fieldcat-reptext_ddic =
      <nameinfo>-name.
    ENDIF." sy-subrc = 0.

* Starting 4.7: get edit mask
    IF NOT <typeinfo>-idx_edit_mask IS INITIAL.
      READ TABLE l_desc-names INDEX <typeinfo>-idx_edit_mask
        ASSIGNING <nameinfo>.
      l_alv_fieldcat-edit_mask = <nameinfo>-name.
      IF NOT <nameinfo>-continue IS INITIAL.
        ADD 1 TO <typeinfo>-idx_edit_mask.
        READ TABLE l_desc-names INDEX <typeinfo>-idx_edit_mask
          ASSIGNING <nameinfo>.
        CONCATENATE
          l_alv_fieldcat-edit_mask
          <nameinfo>-name
          INTO l_alv_fieldcat-edit_mask.
      ENDIF." not <nameinfo>-continue IS INITIAL.
    ENDIF." not <typeinfo>-IDX_EDIT_MASK is initial.

* assign length, output length and decimals
    l_alv_fieldcat-intlen = <typeinfo>-length.
    l_alv_fieldcat-outputlen = <typeinfo>-output_length.
    l_alv_fieldcat-decimals_out = <typeinfo>-decimals.
    l_alv_fieldcat-inttype = <typeinfo>-type.
    APPEND l_alv_fieldcat TO pt_alv_fieldcat.
    CLEAR:  "prevent anything 2 B  taken for subsequent fields
      l_alv_fieldcat.
  ENDLOOP." at l_desc-types where not IDX_NAME is in initial.
ENDFORM.                    " ALV_FIELDCAT_FOR_ITAB

*&---------------------------------------------------------------------

*&      Form  get_rollname_4_tabfield
*&---------------------------------------------------------------------

*       
*----------------------------------------------------------------------
*      -->P_FNAME
*      <--P_ALV_FIELDCAT
*----------------------------------------------------------------------

FORM get_rollname_4_tabfield
  USING    p_fname        TYPE fname
  CHANGING p_alv_fieldcat TYPE slis_fieldcat_alv.
  FIELD-SYMBOLS:
    <dfies> TYPE dfies.
  DATA:
    l_tabname   TYPE ddobjname,
    lt_dfies    TYPE TABLE OF dfies,
    l_fieldname TYPE fieldname.
  SPLIT p_fname AT '-'
    INTO l_tabname l_fieldname.
  CLEAR p_alv_fieldcat-rollname.
  CALL FUNCTION 'DDIF_FIELDINFO_GET'
    EXPORTING
      tabname           = l_tabname
      fieldname         = l_fieldname
*   LANGU                = SY-LANGU
*   LFIELDNAME           = ' '
*   ALL_TYPES            = ' '
* IMPORTING
*   X030L_WA             =
*   DDOBJTYPE            =
*   DFIES_WA             =
*   LINES_DESCR          =
   TABLES
     dfies_tab            =  lt_dfies
*   FIXED_VALUES         =
   EXCEPTIONS
     not_found            = 1
     internal_error       = 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.
  ELSE.
    READ TABLE   lt_dfies ASSIGNING <dfies> INDEX 1.
    p_alv_fieldcat-rollname = <dfies>-rollname.
* if no texts maintained?
    IF <dfies>-reptext IS INITIAL AND
       <dfies>-scrtext_s IS INITIAL AND
       <dfies>-scrtext_m IS INITIAL AND
       <dfies>-scrtext_l IS INITIAL.
* No Text: Use Fieldname as text
      p_alv_fieldcat-seltext_s =
      p_alv_fieldcat-seltext_m =
      p_alv_fieldcat-seltext_l =
      p_alv_fieldcat-reptext_ddic =
      p_alv_fieldcat-fieldname.
    ENDIF." <dfies>-reptext IS INITIAL AND
  ENDIF.
ENDFORM.                    " get_rollname_4_tabfield

*&---------------------------------------------------------------------*
*&      Form  F4_ALV_LAYOUT                                            *
*&---------------------------------------------------------------------*
*       F4-help for ALV Layouts
*----------------------------------------------------------------------*
FORM f4_alv_layout CHANGING lvari LIKE disvariant-variant.  "#EC CALLED
  DATA:
    l_alv_layout TYPE disvariant.
* F4-Help layouts
  CLEAR l_alv_layout.
  l_alv_layout-report  = sy-repid.
  l_alv_layout-variant = lvari.
  CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
       EXPORTING
            is_variant    = l_alv_layout
            i_save        = 'A'
       IMPORTING
            es_variant    = l_alv_layout
       EXCEPTIONS
            not_found     = 1
            program_error = 2
            OTHERS        = 3.
  IF sy-subrc = 0.
    lvari = l_alv_layout-variant.
  ELSE.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.                                                 " F4_ALV_LAYOU

*&---------------------------------------------------------------------*
*&      Form  ALV_END_OF_LIST
*&---------------------------------------------------------------------*
*       Here anything desired
*----------------------------------------------------------------------*
FORM   alv_end_of_list .                                    "#EC CALLED
  PERFORM statistics USING 'L' 0 'Meldungsübersicht'.
  PERFORM list_selectoptions.
ENDFORM.                    " ALV_END_OF_LIST

*&---------------------------------------------------------------------*
*&      Form  ALV_LAYOUT
*&---------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
*      <--P_ALV_layout  text
*----------------------------------------------------------------------*
FORM alv_layout CHANGING p_alv_layout TYPE slis_layout_alv.
  p_alv_layout-colwidth_optimize = con_true.
  p_alv_layout-detail_initial_lines = con_true.
  p_alv_layout-zebra = con_true.
ENDFORM.                    " ALV_LAYOUT
*&---------------------------------------------------------------------*
*& Form list_selectoptions
*&---------------------------------------------------------------------*
* List Selections
*----------------------------------------------------------------------*
FORM list_selectoptions.                                    "#EC CALLED
  FIELD-SYMBOLS:
    <textpool> TYPE textpool,
    <rsparams> TYPE rsparams.
  DATA:
    l_i_textpool TYPE TABLE OF textpool,
    l_i_rsparams TYPE TABLE OF rsparams,
    l_printline  TYPE text1000,
    l_repid      TYPE raldb_repo.
  l_repid = sy-repid.

* get Select-Options values
  CALL FUNCTION 'RS_REFRESH_FROM_SELECTOPTIONS'
    EXPORTING
      curr_report = l_repid
* IMPORTING
* SP =
    TABLES
      selection_table = l_i_rsparams
   EXCEPTIONS
     not_found = 1
     no_report = 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.

* Texts from Textpool 
  READ TEXTPOOL l_repid INTO l_i_textpool LANGUAGE sy-langu.
  DELETE l_i_textpool WHERE NOT id = 'S'. "Nur Selektionsbild

* display
  FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
  ULINE.

* header
  WRITE: / sy-vline,'Selektionen für Programm', l_repid,
           'Run:',sy-datum, sy-uzeit,AT sy-linsz sy-vline.
  ULINE.
* Parameter table sorted by Screen order

* don't report initial fields
  DELETE l_i_rsparams WHERE ( low IS initial AND high IS initial ).
  PERFORM sort_screen_params TABLES l_i_rsparams.
  LOOP AT l_i_rsparams ASSIGNING <rsparams>.
    READ TABLE l_i_textpool
      WITH KEY key = <rsparams>-selname BINARY SEARCH
      ASSIGNING <textpool> .
    l_printline(1) = sy-vline.
    l_printline+2(40) = <textpool>-entry+8(40).
    l_printline+44(1) = sy-vline.
    l_printline+46(1) = <rsparams>-kind.
    l_printline+48(1) = sy-vline.
    l_printline+50(1) = <rsparams>-sign.
    l_printline+52(1) = sy-vline.
    l_printline+54(2) = <rsparams>-option.
    l_printline+57(1) = sy-vline.
    IF <rsparams>-kind = 'P'.
      l_printline+59(71) = <rsparams>-low.
    ELSE.
      l_printline+59(35) = <rsparams>-low.
      l_printline+97(1) = sy-vline.
      l_printline+99(35) = <rsparams>-high.
    ENDIF." <rsparams>-kind <> 'P'.
    l_printline+136(1) = sy-vline.
    l_printline+138(8) = <rsparams>-selname.
    WRITE: / l_printline(sy-linsz), AT sy-linsz sy-vline.
  ENDLOOP." at l_i_rsparams assigning <rsparams>.
  ULINE.
  SKIP.
ENDFORM. " list_selectoptions

*&---------------------------------------------------------------------*
*&      Form  sort_screen_params
*&---------------------------------------------------------------------*
*       Sort Parameter table by order on Screen
*----------------------------------------------------------------------*
*      -->P_I_RSPARAMS
*----------------------------------------------------------------------*
FORM sort_screen_params TABLES   p_i_rsparams STRUCTURE rsparams.
*DYNPRO_FIELD_GET
  DATA:
    l_repid TYPE program_id,
    l_i_dynp_fields TYPE TABLE OF rsdcf,
    l_i_lines TYPE TABLE OF tline,
    l_i_rsparams TYPE TABLE OF rsparams.
  FIELD-SYMBOLS:
    <rsdcf> TYPE rsdcf.
  l_repid = sy-repid.
  CALL FUNCTION 'DYNPRO_FIELD_GET'
    EXPORTING
      dynpro               = vg_dynnr
*   FLG_CHECK              = '1'
*   FLG_CONTROL            = '0'
*   LANGU                  = SY-LANGU
      program                = l_repid
    TABLES
      dynp_fields            = l_i_dynp_fields
      lines                  = l_i_lines
*   lines                  =
    EXCEPTIONS
      dynpro_not_found       = 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.
  ENDIF.
  LOOP AT l_i_dynp_fields ASSIGNING <rsdcf>.
    IF <rsdcf>-dynpro_fld CA '-'.
      <rsdcf>-dynpro_fld = <rsdcf>-dynpro_fld(sy-fdpos).
    ENDIF." <rsdcf>-dynpro_fld ca '-'.
    READ TABLE p_i_rsparams WITH KEY selname = <rsdcf>-dynpro_fld."#EC *
    CHECK sy-subrc = 0.
    LOOP AT p_i_rsparams FROM sy-index
      WHERE selname = <rsdcf>-dynpro_fld.
      APPEND p_i_rsparams TO l_i_rsparams.
      DELETE p_i_rsparams.
    ENDLOOP." at p_i_rsparams from sy-index
  ENDLOOP." at l_i_dynp_fields assigning <rsdcf>.
  p_i_rsparams[] = l_i_rsparams.
ENDFORM.                    " sort_screen_params

*&---------------------------------------------------------------------*
*&      Form ALV_TOP_OF_PAGE
*&---------------------------------------------------------------------*
*  output header
---------------------------------------------------------------------*
FORM alv_top_of_page.                                       "#EC CALLED
  DATA:
    l_len         TYPE syfdpos,
    l_txt         TYPE sylisel,
    l_datxt       TYPE sylisel,
    l_uztxt       TYPE sylisel,
    l_pagno_pos   TYPE syfdpos.

  l_pagno_pos = sy-linsz - 6.
  WRITE: sy-datum TO l_datxt, sy-uzeit TO l_uztxt.
  FORMAT COLOR COL_HEADING.
  ULINE.
  CONCATENATE
    sy-sysid sy-mandt sy-repid sy-uname l_datxt l_uztxt
    INTO l_txt SEPARATED BY space.
  l_len = strlen( l_txt ).
  WRITE: / sy-vline,
         'System-Mandant-Programm-User-Datum-Zeit:',
         AT (l_len) l_txt,
         AT l_pagno_pos(6) sy-pagno NO-SIGN,
         AT sy-linsz sy-vline,
         AT sy-linsz sy-vline.
  ULINE AT (sy-linsz).
  FORMAT COLOR COL_NORMAL.
ENDFORM." alv_top_of_page

*&---------------------------------------------------------------------*
*&      Form  NORMALIZE_TABLE
*&---------------------------------------------------------------------*
*       Table normalized: Sorted, duplicates deleted
*----------------------------------------------------------------------*
*      <--P_TABLE
*----------------------------------------------------------------------*
FORM normalize_table CHANGING p_table TYPE table.
  SORT p_table.
  DELETE ADJACENT DUPLICATES FROM p_table.
ENDFORM.                    " NORMALIZE_TABLE

*&---------------------------------------------------------------------*
*&      Form  GET_VK_PREISDATEN
*&---------------------------------------------------------------------*
*       determine vaild sales prices if exist
*----------------------------------------------------------------------*
*      <--P_PREISDATEN
*----------------------------------------------------------------------*
FORM get_vk_preisdaten  CHANGING pt_preisdaten TYPE typ_t_preisdaten.
  DATA:
    l_tabix      TYPE sytabix,
    l_a004_lines TYPE sytfill,
    lt_a004_dta  TYPE typ_t_a004_dta,
    lt_a004_mat  TYPE typ_t_a004_dta.
  FIELD-SYMBOLS:
    <a004_dta>   TYPE LINE OF typ_t_a004_dta,
    <pre><code> TYPE LINE OF typ_t_preisdaten.

* only if something to be done
  CHECK NOT pt_preisdaten IS INITIAL.

* read existzing conditions
  SELECT knumh matnr datab datbi
    INTO CORRESPONDING FIELDS OF TABLE lt_a004_dta
    FROM a004
    FOR ALL ENTRIES IN pt_preisdaten
    WHERE matnr  = pt_preisdaten-matnr
      AND kappl  = p_vkappl
      AND kschl  = p_vkschl
      AND vkorg  = p_vkorg
      AND datab <= p_datab
      AND datbi >= p_datab.
  SORT lt_a004_dta BY matnr.
  DESCRIBE TABLE lt_a004_dta LINES l_a004_lines.

* Fehlende conditionen für die Statistik,
* Preise für die existierenden
  LOOP AT pt_preisdaten ASSIGNING <pre><code>.
    READ TABLE lt_a004_dta ASSIGNING <a004_dta>
      WITH KEY matnr = <pre><code>-matnr BINARY SEARCH.
    IF sy-subrc = 0.

* conditionssätze zu einem Artikel sammeln
      CLEAR: lt_a004_mat.
      l_tabix = sy-tabix.
      WHILE <a004_dta>-matnr = <pre><code>-matnr
        AND l_tabix <= l_a004_lines.
        APPEND <a004_dta> TO lt_a004_mat.
        ADD 1 TO l_tabix.
        CHECK l_tabix <= l_a004_lines.
        READ TABLE lt_a004_dta ASSIGNING <a004_dta>
          INDEX l_tabix.
      ENDWHILE." <a004_dta>-matnr = <pre><code>-matnr

      PERFORM select_vk_preis_zur_condition
        CHANGING lt_a004_mat <pre><code>.
    ELSE.
*      PERFORM statistics USING 'S' 1 '* Kein Verkaufspreis'.
    ENDIF." sy-subrc = 0.
* Ikonen-Vergabe
    IF <pre><code>-knumh_vk IS INITIAL.

* No condition - create new
      <pre><code>-icon = icon_create.
      PERFORM statistics USING 'S' 1 '* Verkaufspreis ist anzulegen'.
    ELSEIF <pre><code>-kbetr = <pre><code>-kbetr_vk
       AND <pre><code>-konwa = <pre><code>-konwa_vk
       AND <pre><code>-kpein = <pre><code>-kpein_vk
       AND <pre><code>-kmein = <pre><code>-kmein_vk.

* condition identical - no change needed
      <pre><code>-icon = icon_equal.
      PERFORM statistics USING 'S' 1 '* Verkaufspreis ist aktuell'.
    ELSEIF <pre><code>-datab_vk = p_datab.

* condition to date - change
      <pre><code>-icon = icon_change.
      PERFORM statistics USING 'S' 1 '* Verkaufspreis ist zu ändern'.
    ELSEIF  <pre><code>-datab_vk < p_datab.

* condition old - new time slice - create with referende
      <pre><code>-icon = icon_date.
      PERFORM statistics
       USING 'S' 1 '* sales pricve to be maintained with new validity'.
    ENDIF." <pre><code>-knumh_vk is initial.
  ENDLOOP." at pt_preisdaten assigning <pre><code>.
ENDFORM.                    " GET_VK_PREISDATEN

*&---------------------------------------------------------------------*
*&      Form  SELECT_VK_PREIS_ZUR_condITION
*&---------------------------------------------------------------------*
*       PO-Price of default supplier
*       from material conditions
*----------------------------------------------------------------------*
*      -->PT_A004_MAT
*      <--PT_PREISDATEN
*----------------------------------------------------------------------*
FORM select_vk_preis_zur_condition
  CHANGING pt_a004_mat    TYPE typ_t_a004_dta
           p_preisdaten   TYPE typ_preisdaten.
  DATA:
    l_txt       TYPE text80,
    l_tfill     TYPE sytfill,
    lt_konp_dta TYPE TABLE OF typ_konp_dta.
  FIELD-SYMBOLS:
    <a004_dta> TYPE typ_a004_dta,
    <konp_dta> TYPE typ_konp_dta.

* 1. consistency check: numer cond records = number suppliers
  DESCRIBE TABLE pt_a004_mat LINES l_tfill.
  IF l_tfill <> 1.
* Inconsistent - report and skip
    CONCATENATE
      'Articlel' <a004_dta>-matnr
      ': Inconsistent sales price condition' p_vkschl
      INTO l_txt SEPARATED BY space.
    PERFORM statistics USING 'S' 0 l_txt.
    EXIT.
  ENDIF." l_tfill <> l_n_lif.

* should be one left
  DESCRIBE TABLE pt_a004_mat LINES l_tfill.
  IF l_tfill <> 1.

* report error and skip
    CONCATENATE
      'Articlel' <a004_dta>-matnr
      ': Inconsistent sales price condition' p_vkschl
      INTO l_txt SEPARATED BY space.
    PERFORM statistics USING 'S' 0 l_txt.
    EXIT.
  ENDIF.
  READ TABLE pt_a004_mat ASSIGNING <a004_dta> INDEX 1.

* conditions KONP

  SELECT knumh kopos kbetr kpein kmein konwa
  INTO CORRESPONDING FIELDS OF TABLE lt_konp_dta
  FROM konp
  WHERE knumh = <a004_dta>-knumh
    AND loevm_ko = space  " not deleted
    AND krech    = 'C'    " calculation rule amount
    AND kzbzg    = space. " No scale price

  IF sy-subrc <> 0.
* report error and skip
    CONCATENATE
      'Article' <a004_dta>-matnr
      ': Inconsistent sales price condition' p_vkschl
      INTO l_txt SEPARATED BY space.
    PERFORM statistics USING 'S' 0 l_txt.
    EXIT.
  ELSE."if sy-subrc <> 0.
* should be one record left
    IF sy-dbcnt <> 1.
* report and skip
      CONCATENATE
        'Article' <a004_dta>-matnr
        ': Inconsistent sales price condition' p_vkschl
        INTO l_txt SEPARATED BY space.
      PERFORM statistics USING 'S' 0 l_txt.
      EXIT.
    ELSE.
      READ TABLE lt_konp_dta ASSIGNING <konp_dta> INDEX 1.
      p_preisdaten-vkorg = p_vkorg.
      p_preisdaten-vtweg = p_vtweg.
      p_preisdaten-datbi_vk  = <a004_dta>-datbi.
      p_preisdaten-datab_vk  = <a004_dta>-datab.
      p_preisdaten-knumh_vk  = <a004_dta>-knumh.
      p_preisdaten-kbetr_vk  = <konp_dta>-kbetr.
      p_preisdaten-konwa_vk  = <konp_dta>-konwa.
      p_preisdaten-kpein_vk  = <konp_dta>-kpein.
      p_preisdaten-kmein_vk  = <konp_dta>-kmein.
      PERFORM statistics
        USING 'S' 1 '* Sales price determined for article'.
    ENDIF." sy-dbcnt <> 1.
  ENDIF." sy-subrc <> 0.
ENDFORM.                    " SELECT_VK_PREIS_ZUR_condITION

*&---------------------------------------------------------------------*
*&      Form  PRICE_CREATE
*&---------------------------------------------------------------------*
*       New price condition
*----------------------------------------------------------------------*
*      <--P_PREISDATEN
*----------------------------------------------------------------------*
FORM price_create CHANGING p_preisdaten TYPE typ_preisdaten.
  DATA:
    l_txt   TYPE text80,
    l_subrc TYPE sysubrc.
* BTCI aufbauen
  PERFORM bdc_dynpro      USING 'SAPMV13A' '0100'.
  PERFORM bdc_write_field       USING 'RV13A-KSCHL' p_vkschl.
  PERFORM bdc_write_field       USING 'BDC_OKCODE' '/00'.

  PERFORM bdc_dynpro      USING 'SAPMV13A' '1004'.
  PERFORM bdc_write_field       USING 'BDC_OKCODE' '=SICH'.

  PERFORM bdc_write_field       USING 'KOMG-VKORG'
                                      p_vkorg.

  PERFORM bdc_write_field       USING 'KOMG-VTWEG'
                                      p_vtweg.
  PERFORM bdc_write_field       USING 'KOMG-MATNR(01)'
                                      p_preisdaten-matnr.
  PERFORM bdc_write_curr       USING 'KONP-KBETR(01)'
                                      p_preisdaten-kbetr
                                      p_preisdaten-konwa.
  PERFORM bdc_write_field       USING 'KONP-KONWA(01)'
                                      p_preisdaten-konwa.
  PERFORM bdc_write_quan        USING 'KONP-KPEIN(01)'
                                      p_preisdaten-kpein
                                      p_preisdaten-kmein.
  PERFORM bdc_write_field       USING 'KONP-KMEIN(01)'
                                      p_preisdaten-kmein.
  PERFORM bdc_write_field       USING 'RV13A-DATAB(01)'
                                      p_datab.
  PERFORM bdc_write_field       USING 'RV13A-DATBI(01)'
                                      '31.12.9999'.
* Ausführen im Echlauf
  CHECK p_echt = con_true.
  SET PARAMETER ID 'VKS' FIELD p_vkschl.
  SET PARAMETER ID 'KON' FIELD '004'.
  PERFORM bdc_transaction USING 'VK11' CHANGING l_subrc.
  IF l_subrc = 0.
    p_preisdaten-icon = icon_okay.
    PERFORM statistics USING 'S' 1 'VK-Preis angelegt'.
    p_preisdaten-icon = icon_green_light.
    p_preisdaten-datab_vk = p_datab. "CLI20041119
    p_preisdaten-datbi_vk = '99991231'.
    p_preisdaten-kbetr_vk = p_preisdaten-kbetr.
    p_preisdaten-konwa_vk = p_preisdaten-konwa.
    p_preisdaten-kpein_vk = p_preisdaten-kpein.
    p_preisdaten-kmein_vk = p_preisdaten-kmein.
    p_preisdaten-vkorg = p_vkorg.
    p_preisdaten-vtweg = p_vtweg.
    ADD 1 TO v_commit_count.
  ELSE.
    p_preisdaten-icon = icon_red_light.
    CONCATENATE
      '(Lock-) error creating price for article'
      p_preisdaten-matnr INTO l_txt SEPARATED BY space.
    PERFORM statistics USING 'S' 0 l_txt.
  ENDIF." l_subrc = 0.
ENDFORM.                    " PRICE_CREATE

*&---------------------------------------------------------------------*
*&      Form  PRICE_CHANGE
*&---------------------------------------------------------------------*
*      <--P_PREISDATEN
*----------------------------------------------------------------------*
FORM price_change CHANGING p_preisdaten TYPE typ_preisdaten.
  DATA:
    l_txt   TYPE text80,
    l_subrc TYPE sysubrc.
* BTCI aufbauen
  PERFORM bdc_dynpro      USING 'SAPMV13A' '0100'.
  PERFORM bdc_write_field       USING 'BDC_OKCODE' '/00'.
  PERFORM bdc_write_field       USING 'RV13A-KSCHL' p_vkschl.

  PERFORM bdc_dynpro      USING 'RV13A004' '1000'.
  PERFORM bdc_write_field       USING 'BDC_OKCODE' '=ONLI'.
  PERFORM bdc_write_field       USING 'F001'
                                      p_vkorg.
  PERFORM bdc_write_field       USING 'F002'
                                      p_vtweg.
  PERFORM bdc_write_field       USING 'F003-LOW'
                                      p_preisdaten-matnr.

  PERFORM bdc_write_field       USING 'SEL_DATE'
                                      p_datab.

  PERFORM bdc_dynpro      USING 'SAPMV13A' '1004'.
  PERFORM bdc_write_field       USING 'BDC_OKCODE' '=SICH'.
  .
  PERFORM bdc_write_curr       USING 'KONP-KBETR(01)'
                                      p_preisdaten-kbetr
                                      p_preisdaten-konwa.
  PERFORM bdc_write_field       USING 'RV13A-DATAB(01)'
                                      p_datab.
  PERFORM bdc_write_field       USING 'RV13A-DATBI(01)'
                                      '31.12.9999'.
* Ausführen im Echlauf
  CHECK p_echt = con_true.
  SET PARAMETER ID 'VKS' FIELD p_vkschl.
  SET PARAMETER ID 'KON' FIELD '004'.
  PERFORM bdc_transaction USING 'VK12' CHANGING l_subrc.
  IF l_subrc = 0.
    p_preisdaten-icon = icon_okay.
    PERFORM statistics
      USING 'S' 1 'VK-Preis geändert'.
    p_preisdaten-icon = icon_green_light.
    p_preisdaten-datab_vk = p_datab.
    p_preisdaten-datbi_vk = p_preisdaten-datbi.
    p_preisdaten-kbetr_vk = p_preisdaten-kbetr.
    p_preisdaten-konwa_vk = p_preisdaten-konwa.
    p_preisdaten-kpein_vk = p_preisdaten-kpein.
    p_preisdaten-kmein_vk = p_preisdaten-kmein.
    ADD 1 TO v_commit_count.
  ELSE.
    p_preisdaten-icon = icon_red_light.
    CONCATENATE
      '(lock-) error Price change for Article'
      p_preisdaten-matnr INTO l_txt SEPARATED BY space.
    PERFORM statistics USING 'S' 0 l_txt.
  ENDIF." l_subrc = 0.
ENDFORM.                    " PRICE_CHANGE

*&---------------------------------------------------------------------*
*&      Form  PRICE_DATE
*&---------------------------------------------------------------------*
*       New Price wit new validity period
*----------------------------------------------------------------------*
*      <--P_PREISDATEN
*----------------------------------------------------------------------*
FORM price_date CHANGING p_preisdaten TYPE typ_preisdaten.
  DATA:
    l_txt   TYPE text80,
    l_subrc TYPE sysubrc.
* BTCI aufbauen
  PERFORM bdc_dynpro      USING 'SAPMV13A' '0100'.
  PERFORM bdc_write_field       USING 'BDC_OKCODE' '/00'.
  PERFORM bdc_write_field       USING 'RV13A-KSCHL' p_vkschl.

  PERFORM bdc_dynpro      USING 'RV13A004' '1000'.
  PERFORM bdc_write_field       USING 'BDC_OKCODE' '=ONLI'.
  PERFORM bdc_write_field       USING 'F003-LOW'
                                       p_preisdaten-matnr.
  PERFORM bdc_write_field       USING 'F001'
                                      p_vkorg.
  PERFORM bdc_write_field       USING 'F002'
                                      p_vtweg.
  PERFORM bdc_write_field       USING 'SEL_DATE'
                                      p_datab.
  PERFORM bdc_write_field       USING 'DATE_AS'
                                      con_true.

  PERFORM bdc_dynpro      USING 'SAPMV13A' '1004'.
  PERFORM bdc_write_field       USING 'BDC_OKCODE' '=SICH'.
  PERFORM bdc_write_curr       USING 'KONP-KBETR(01)'
                                      p_preisdaten-kbetr
                                      p_preisdaten-konwa.
  PERFORM bdc_write_field       USING 'KONP-KONWA(01)'
                                      p_preisdaten-konwa.
  PERFORM bdc_write_quan        USING 'KONP-KPEIN(01)'
                                      p_preisdaten-kpein
                                      p_preisdaten-kmein.
  PERFORM bdc_write_field       USING 'KONP-KMEIN(01)'
                                      p_preisdaten-kmein.
  PERFORM bdc_write_field       USING 'RV13A-DATAB(01)'
                                      p_datab.
  PERFORM bdc_write_field       USING 'RV13A-DATBI(01)'
                                      '31.12.9999'.
* Ausführen im Echlauf
  CHECK p_echt = con_true.
  SET PARAMETER ID 'VKS' FIELD p_vkschl.
  SET PARAMETER ID 'KON' FIELD '004'.
  PERFORM bdc_transaction USING 'VK14' CHANGING l_subrc.
  IF l_subrc = 0.
    p_preisdaten-icon = icon_okay.
    PERFORM statistics
      USING 'S' 1 'VK-Preis aus EK mit Gültig-ab-Preis angelegt'.
    p_preisdaten-icon = icon_green_light.
    p_preisdaten-datab_vk = p_datab.
    p_preisdaten-datab_vk = p_preisdaten-datab.
    p_preisdaten-datbi_vk = '99991231'.
    p_preisdaten-kbetr_vk = p_preisdaten-kbetr.
    p_preisdaten-konwa_vk = p_preisdaten-konwa.
    p_preisdaten-kpein_vk = p_preisdaten-kpein.
    p_preisdaten-kmein_vk = p_preisdaten-kmein.
    ADD 1 TO v_commit_count.
  ELSE.
    p_preisdaten-icon = icon_red_light.
    CONCATENATE
      '(Lock-) Error crating valid-from-price for Article'
      p_preisdaten-matnr INTO l_txt SEPARATED BY space.
    PERFORM statistics USING 'S' 0 l_txt.
  ENDIF." l_subrc = 0.
ENDFORM.                    " PRICE_DATE

*&---------------------------------------------------------------------*
*&      Form  BDC_WRITE_FIELD
*&---------------------------------------------------------------------*
*       enhanced SAP BDC_FIELD
*----------------------------------------------------------------------*
*      -->FNAM
*      -->FVAL
*----------------------------------------------------------------------*
FORM bdc_write_field USING    fnam
                              fval.
  CLEAR bdcdata.
  bdcdata-fnam = fnam.
  WRITE fval TO bdcdata-fval LEFT-JUSTIFIED.
  APPEND bdcdata.
ENDFORM.                    " BDC_WRITE_FIELD

*&---------------------------------------------------------------------*
*&      Form  BDC_WRITE_QUAN
*&---------------------------------------------------------------------*
*       enhanced SAP BDC_FIELD
*----------------------------------------------------------------------*
*      -->FNAM
*      -->FVAL
*      -->QUAN
*----------------------------------------------------------------------*
FORM bdc_write_quan USING    fnam
                             fval
                             quan TYPE unit.
  CLEAR bdcdata.
  bdcdata-fnam = fnam.
  WRITE fval TO bdcdata-fval LEFT-JUSTIFIED UNIT quan.
  APPEND bdcdata.
ENDFORM.                    " BDC_WRITE_QUAN

*&---------------------------------------------------------------------*
*&      Form  BDC_WRITE_CURR
*&---------------------------------------------------------------------*
*       enhanced SAP BDC_FIELD
*----------------------------------------------------------------------*
*      -->FNAM
*      -->FVAL
*      -->CURR
*----------------------------------------------------------------------*
FORM bdc_write_curr USING    fnam
                             fval
                             curr TYPE currency.
  CLEAR bdcdata.
  bdcdata-fnam = fnam.
  WRITE fval TO bdcdata-fval LEFT-JUSTIFIED CURRENCY curr.
  APPEND bdcdata.
ENDFORM.                    " BDC_WRITE_CURR

*----------------------------------------------------------------------*
*        Start new transaction according to parameters                 *
*----------------------------------------------------------------------*
FORM bdc_transaction USING tcode CHANGING p_subrc TYPE sysubrc.
  DATA:
    messtab TYPE TABLE OF bdcmsgcoll WITH HEADER LINE,
    l_subrc LIKE sy-subrc.
  REFRESH messtab.
  CALL TRANSACTION tcode USING bdcdata
* complete conditions table locked, synchronous update
                   UPDATE 'S'
                   MODE   p_btmode "A E N
                   MESSAGES INTO messtab.
  l_subrc = sy-subrc.
  REFRESH bdcdata.
  LOOP AT messtab
    TRANSPORTING NO FIELDS WHERE msgtyp ='E' OR msgtyp ='A'.
  ENDLOOP.
  IF sy-subrc = 0 OR l_subrc <> 0.
    p_subrc = 8.
  ENDIF." sy-subrc = 0 or l_subrc <> 0.
ENDFORM.

*----------------------------------------------------------------------*
*        Start new screen                                              *
*----------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro.
  CLEAR bdcdata.
  bdcdata-program  = program.
  bdcdata-dynpro   = dynpro.
  bdcdata-dynbegin = 'X'.
  APPEND bdcdata.
ENDFORM.

Regards,

Clemens