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

how to follow best coding practices and make this code runable.

Former Member
0 Likes
468

How to change this code to make it work and follow best coding practices.

This code is to add fields to internal table LIST which already exist.

In the loop are all the selections which are to be made.

But i am new to ABAP and not sure how to make this work.

please help me.

DATA: wa_list LIKE LINE OF list,
      l_v_index TYPE i.
DATA: t_price_result1 TYPE STANDARD TABLE OF komv WITH HEADER LINE INITIAL SIZE 0.
DATA: wa_result LIKE LINE OF t_price_result1.

LOOP AT list INTO wa_list.

  l_v_index = sy-tabix.

*GET MATERIAL DOCUMENT(MBLNR) AND DELIVERY NUMBER(XBLNR)

  SELECT  mkpf~mblnr
          mkpf~xblnr
   into (wa_list-mblnr, wa_list-xblnr )
*            INTO i_list
   from mkpf inner join mseg
*   up to 1 rows
    on mkpf~mandt = mseg~mandt
    and mkpf~mblnr = mseg~mblnr
    and mkpf~mjahr = mseg~mjahr
    where mseg~matnr = wa_list-matnr
     and mseg~charg = wa_list-charg
     and mseg~kunnr = wa_list-kunnr
     and mseg~sobkz = wa_list-sobkz
     and mseg~werks = wa_list-werks
     and mkpf~budat in budat.
                                                            "RFC3762
  ENDSELECT.

  wa_list-mblnr = list-mblnr.
  wa_list-xblnr = list-xblnr.


* GET POSNR FROM TABLE LIPS
  SELECT posnr
  FROM lips
  INTO list-posnr
  up to 1 rows
  WHERE vbeln = wa_list-xblnr AND
             matnr = wa_list-matnr.
  ENDSELECT.

  wa_list-posnr = list-posnr.

* GET SALES ORDER #
  SELECT vbelv
  FROM vbfa
  INTO list-vbelv
  up to 1 rows
*        INTO wa_list
  WHERE vbeln =  wa_list-xblnr.
  ENDSELECT.
  wa_list-vbelv = list-vbelv.
*GET PO
  SELECT bstkd
  FROM vbkd
  INTO list-bstkd
  up to 1 rows
  WHERE vbeln =  wa_list-vbelv
      AND posnr = 0.
  ENDSELECT.

  wa_list-bstkd = list-bstkd.
*get serial number
  SELECT SINGLE obknr
   FROM ser01
   INTO list-obknr

   WHERE lief_nr = wa_list-xblnr
       AND posnr = wa_list-posnr.

wa_list-obknr = list-obknr.

SELECT sernr
FROM objk
INTO list-sernr
up to 1 rows
WHERE obknr = wa_list-obknr.
ENDSELECT.
wa_list-sernr = wa_list-sernr.

*get date
SELECT budat FROM mkpf
INTO list-budat
up to 1 rows
 where mblnr = wa_list-mblnr.
ENDSELECT.

wa_list-budat = list-budat.

*get CLP
SELECT   vkorg vtweg spart
INTO (list-vkorg, list-vtweg, list-spart)
up to 1 rows
FROM vbak WHERE vbeln = wa_list-vbelv.
ENDSELECT.

wa_list-vkorg = list-vkorg.
wa_list-vtweg = list-vtweg.
wa_list-spart = list-spart.


SELECT pstyv
INTO list-pstyv
FROM  vbap
up to 1 rows
 WHERE vbeln = wa_list-vbelv AND posnr = wa_list-posnr.
ENDSELECT.
wa_list-pstyv = list-pstyv.


CALL FUNCTION 'Z_SD_PRICING_CONDITION'
EXPORTING
i_organization                  = wa_list-vkorg
i_dist_channel                  = wa_list-vtweg
i_division                      = wa_list-spart
i_customer                      = wa_list-kunnr
i_plant                         = wa_list-werks
*      i_pricng_date                   = sy-datum
i_material                      = wa_list-matnr
*   I_SALES_UNIT                    = 'EA'
*   I_QUANTITY                      = '1.000'
i_stor_loc                      = '0001'
i_item_cat                      = 'TAN'
*   I_AUART                         =
*   I_REFRESH                       = 'X'
*   I_KOMP                          =
*   I_KOMK                          =
* IMPORTING
*   E_MES_TYPE                      =
*   E_MES_NUMBER
*   E_MESSAGE                       =

TABLES
t_price_result                  = t_price_result1
* EXCEPTIONS
*   CUSTOMER_NOT_FOUND              = 1
*   PLANT_NOT_FOUND                 = 2
*   MATERIAL_NOT_FOUND              = 3
**   PLANT_MATERIAL_NOT_FOUND       = 4
*   SALES_DATA_NOT_FOUND            = 5
*   ORG_UNIT_NOT_FOUND              = 6
*   UNABLE_TO_CALCULATE_PRICE       = 7
*   UNABLE_TO_FORMAT_PRICE          = 8
*   MANDATORY_INFOR_MISSING         = 9
*   OTHERS                          = 10
.

LOOP AT t_price_result1.
  IF  t_price_result1-kschl = 'ZPR2'.
    wa_list-kbetr = t_price_result1-kbetr.
  ELSE.
    wa_list-kbetr = 0.
  ENDIF.
ENDLOOP.
MODIFY list FROM wa_list INDEX l_v_index.
ENDLOOP.

How to change this code to make it work and follow best coding practices.

This code is to add fields to internal table LIST which already exist.

In the loop are all the selections which are to be made.

But i am new to ABAP and not sure how to make this work.

please help me.

DATA: wa_list LIKE LINE OF list,
      l_v_index TYPE i.
DATA: t_price_result1 TYPE STANDARD TABLE OF komv WITH HEADER LINE INITIAL SIZE 0.
DATA: wa_result LIKE LINE OF t_price_result1.

LOOP AT list INTO wa_list.

  l_v_index = sy-tabix.

*GET MATERIAL DOCUMENT(MBLNR) AND DELIVERY NUMBER(XBLNR)

  SELECT  mkpf~mblnr
          mkpf~xblnr
   into (wa_list-mblnr, wa_list-xblnr )
*            INTO i_list
   from mkpf inner join mseg
*   up to 1 rows
    on mkpf~mandt = mseg~mandt
    and mkpf~mblnr = mseg~mblnr
    and mkpf~mjahr = mseg~mjahr
    where mseg~matnr = wa_list-matnr
     and mseg~charg = wa_list-charg
     and mseg~kunnr = wa_list-kunnr
     and mseg~sobkz = wa_list-sobkz
     and mseg~werks = wa_list-werks
     and mkpf~budat in budat.
                                                            "RFC3762
  ENDSELECT.

  wa_list-mblnr = list-mblnr.
  wa_list-xblnr = list-xblnr.


* GET POSNR FROM TABLE LIPS
  SELECT posnr
  FROM lips
  INTO list-posnr
  up to 1 rows
  WHERE vbeln = wa_list-xblnr AND
             matnr = wa_list-matnr.
  ENDSELECT.

  wa_list-posnr = list-posnr.

* GET SALES ORDER #
  SELECT vbelv
  FROM vbfa
  INTO list-vbelv
  up to 1 rows
*        INTO wa_list
  WHERE vbeln =  wa_list-xblnr.
  ENDSELECT.
  wa_list-vbelv = list-vbelv.
*GET PO
  SELECT bstkd
  FROM vbkd
  INTO list-bstkd
  up to 1 rows
  WHERE vbeln =  wa_list-vbelv
      AND posnr = 0.
  ENDSELECT.

  wa_list-bstkd = list-bstkd.
*get serial number
  SELECT SINGLE obknr
   FROM ser01
   INTO list-obknr

   WHERE lief_nr = wa_list-xblnr
       AND posnr = wa_list-posnr.

wa_list-obknr = list-obknr.

SELECT sernr
FROM objk
INTO list-sernr
up to 1 rows
WHERE obknr = wa_list-obknr.
ENDSELECT.
wa_list-sernr = wa_list-sernr.

*get date
SELECT budat FROM mkpf
INTO list-budat
up to 1 rows
 where mblnr = wa_list-mblnr.
ENDSELECT.

wa_list-budat = list-budat.

*get CLP
SELECT   vkorg vtweg spart
INTO (list-vkorg, list-vtweg, list-spart)
up to 1 rows
FROM vbak WHERE vbeln = wa_list-vbelv.
ENDSELECT.

wa_list-vkorg = list-vkorg.
wa_list-vtweg = list-vtweg.
wa_list-spart = list-spart.


SELECT pstyv
INTO list-pstyv
FROM  vbap
up to 1 rows
 WHERE vbeln = wa_list-vbelv AND posnr = wa_list-posnr.
ENDSELECT.
wa_list-pstyv = list-pstyv.


CALL FUNCTION 'Z_SD_PRICING_CONDITION'
EXPORTING
i_organization                  = wa_list-vkorg
i_dist_channel                  = wa_list-vtweg
i_division                      = wa_list-spart
i_customer                      = wa_list-kunnr
i_plant                         = wa_list-werks
*      i_pricng_date                   = sy-datum
i_material                      = wa_list-matnr
*   I_SALES_UNIT                    = 'EA'
*   I_QUANTITY                      = '1.000'
i_stor_loc                      = '0001'
i_item_cat                      = 'TAN'
*   I_AUART                         =
*   I_REFRESH                       = 'X'
*   I_KOMP                          =
*   I_KOMK                          =
* IMPORTING
*   E_MES_TYPE                      =
*   E_MES_NUMBER
*   E_MESSAGE                       =

TABLES
t_price_result                  = t_price_result1
* EXCEPTIONS
*   CUSTOMER_NOT_FOUND              = 1
*   PLANT_NOT_FOUND                 = 2
*   MATERIAL_NOT_FOUND              = 3
**   PLANT_MATERIAL_NOT_FOUND       = 4
*   SALES_DATA_NOT_FOUND            = 5
*   ORG_UNIT_NOT_FOUND              = 6
*   UNABLE_TO_CALCULATE_PRICE       = 7
*   UNABLE_TO_FORMAT_PRICE          = 8
*   MANDATORY_INFOR_MISSING         = 9
*   OTHERS                          = 10
.

LOOP AT t_price_result1.
  IF  t_price_result1-kschl = 'ZPR2'.
    wa_list-kbetr = t_price_result1-kbetr.
  ELSE.
    wa_list-kbetr = 0.
  ENDIF.
ENDLOOP.
MODIFY list FROM wa_list INDEX l_v_index.
ENDLOOP.

2 REPLIES 2
Read only

Former Member
0 Likes
438

Hi,

Lets first start from your Select Statement.....Replace your SELECT ....ENDSELECT by SELECT Into Internal Table

Your program is having a SELECT...ENDSELECT within LOOP...ENDLOOP........One should avoid doing this as far as possible.

SELECT mkpf~mblnr

mkpf~xblnr

INTO itab

for all entires i_list

from mkpf inner join mseg

on mkpfmandt = msegmandt

and mkpfmblnr = msegmblnr

and mkpfmjahr = msegmjahr

where mseg~matnr = i_list-matnr

and mseg~charg = i_list-charg

and mseg~kunnr = i_list-kunnr

and mseg~sobkz = i_list-sobkz

and mseg~werks = i_list-werks

and mkpf~budat in budat.

Restructure youe complete code with this approach and Share your Finding's.

You can also think of using a SAP Standard FM.

Anyway..What is the objective/Output of this report?

Read only

Former Member
0 Likes
438

Hi Pinjo,

Here is the restructured code for you.

Few points you need to keepin mind.

1. Do not your SELECT ENDSELECT. It degrade your performance. Instead of this use Select query and populate it in into internal table.

2. do not use Select query inside Loop Endloop instead of this you can use FOR ALL ENTRIES IN statement.

Thanks,

Chidanand