Pages

Friday, June 12, 2015

DYnamic structure and table ceration


*** Test - TBDeleted
datals_segstruc TYPE REF TO cl_abap_structdescr,
      r_data_str TYPE REF TO data.

FIELD-SYMBOLS<fs> TYPE ANY.

ls_segstruc ?= cl_abap_typedescr=>DESCRIBE_BY_NAME'MARA' ).

CREATE DATA:
      r_data_tab TYPE HANDLE r_type_table,
             r_data_str TYPE HANDLE ls_segstruc.

FIELD-SYMBOLS<fs_table> TYPE INDEX TABLE,
               <fs_wa>    TYPE ANY.

ASSIGN:
r_data_tab->TO <fs_table>,
        r_data_str->TO <fs_wa>.

Sunday, October 19, 2014

Table EVENTS in Table Maintenance Generator in SE11

Events can be created inside Table maintenence generator using Environment and modification.

Use TOTAL table which is available in the GLOBAL fields of the EVENTS routine to access all the existing data of the current ZTable.

*---------------------------------------------------------------------*
* Handle Table events to restrict user from entering wrong SH and     *
* In-Transit location if 1 entry is already maintained in the table   *
*---------------------------------------------------------------------*
*  P R O G R A M   C H A N G E   H I S T O R Y                        *
*---------------------------------------------------------------------*
* ##) Correction  Date......  SAP User ID.  Description.............. *
*---------------------------------------------------------------------*
  DATAls_currrent_entry TYPE zfi_pri_gethub,
        ls_existing_entry TYPE zfi_pri_gethub.

  MOVE zfi_pri_gethub TO ls_currrent_entry.

  LOOP AT total INTO ls_existing_entry.
    IF ls_existing_entry-ship_to EQ ls_currrent_entry-ship_to.
      IF ls_existing_entry-in_transit_sloc EQ ls_currrent_entry-in_transit_sloc.
        MESSAGE '1 Ship-to can have only 1 In-transit Location' TYPE 'E'.
      ENDIF.
    ENDIF.
  ENDLOOP.

ENDFORM.                    "new_entry

Wednesday, August 13, 2014

Easy way of passing values from custom program to Exits - without IMPORT/EXPORT or memory id

Often its required to transfer values from custom program to EXITS while calling any Object creation BAPi.
Using IMPORT/EXPORT to memory or INDX is not very reliable especially when the custom programs are ran in background mode.

One of the easy way is to :
- use SAVE_TEXT to update the value to the Biz object in the custom program
_ call the creation BAPI for Deivery, order, billing etc.
- during the creation process, find an exit where the VALUEs can be impported using READ_TEXT.
- after creation process , once control comes back to the custom program, delete the value from the object using DELETE_TEXT.

custom program

DATAlt_range TYPE TABLE OF zrange.
FIELD-SYMBOLS TYPE zrange,
                LIKE xvbpa.

DATAlv_name TYPE tdobname,
      lt_lines TYPE STANDARD TABLE OF tline,
      ls_lines LIKE LINE OF lt_lines,
      ls_lips  TYPE lips,
      lv_ebelp TYPE ebelp.

CONSTANTSco_savelang  TYPE thead-tdspras VALUE 'E'.

* check for availability of PO doc
IF ekko-ebeln IS INITIAL.
  RETURN.
ENDIF.

* Read ZRANGE for triggering of below logic
SELECT FROM zrange INTO TABLE lt_range
  WHERE application  'HUBSTOSA' AND
        program_name 'MV50AFZ1' AND
        identifier  ekko-ekorg.

IF sy-subrc EQ 0.
  SORT lt_range BY fieldname.
  "Check doc type
  READ TABLE lt_range ASSIGNING  WITH KEY fieldname 'LFART' BINARY SEARCH.
  IF sy-subrc NE AND  IS NOT ASSIGNED.
    RETURN.
  ELSEIF  IS ASSIGNED.
    IF -low NE likp-lfart.
      RETURN.
    ENDIF.
  ENDIF.
  READ TABLE lt_range ASSIGNING  WITH KEY fieldname 'BSART' BINARY SEARCH.
  IF sy-subrc NE AND  IS NOT ASSIGNED.
    RETURN.
  ELSEIF  IS ASSIGNED.
    IF -low NE ekko-bsart.
      RETURN.
    ENDIF.
  ENDIF.
ELSE.
  RETURN.
ENDIF.


CHECK sy-tcode EQ 'ZSD_SCHEDULE_HUB' OR sy-batch EQ 'X'.

READ TABLE xvbpa[] ASSIGNING  WITH KEY parvw 'ZB'."during change this Partner will be there
IF sy-subrc EQ 0.
  RETURN."it means this code has been called during DN creation time. We need thi code during DN change
ENDIF.

********* Read Text *********

SORT xlips[] BY vgpos."text ID will always be there for the 1st item of the delivery as per Report logic
READ TABLE xlips[] INTO ls_lips INDEX 1.
MOVE ls_lips-vgpos+1(5TO lv_ebelp.

IF sy-subrc EQ 0.

  MOVE ls_lips-vgbel TO lv_name.

  CALL FUNCTION 'READ_TEXT'
    EXPORTING
*     client                  = sy-mandt
      id                      'L04'
      language                co_savelang
      name                    lv_name
      object                  'EKPO'
    TABLES
      lines                   lt_lines
    EXCEPTIONS
      id                      1
      language                2
      name                    3
      not_found               4
      object                  5
      reference_check         6
      wrong_access_to_archive 7
      OTHERS                  8.
  IF sy-subrc <> 0.
    RETURN.
  ENDIF.

  READ TABLE lt_lines INTO ls_lines INDEX 1.
  IF sy-subrc EQ 0.
    "Loop has been used here, so that in case of data issues, when multiple
    "DNs are created, all DN should have the HUB Partner number
    LOOP AT  xvbpa[] ASSIGNING  WHERE parvw 'WE'.
      MOVE ls_lines-tdline TO -kunnr.
      SELECT adrnr UP TO ROWS INTO -adrnr
        FROM kna1 WHERE kunnr -kunnr.
      ENDSELECT.
    ENDLOOP.
  ENDIF.

ENDIF.


------- call BAPI for Outboud delivery creation
Include          MV50AFZ1
FORM USEREXIT_SAVE_DOCUMENT_PREPARE.

SORT xlips[] BY vgpos."text ID will always be there for the 1st item of the delivery as per Report logic
READ TABLE xlips[] INTO ls_lips INDEX 1.
MOVE ls_lips-vgpos+1(5TO lv_ebelp.

IF sy-subrc EQ 0.

  MOVE ls_lips-vgbel TO lv_name.

  CALL FUNCTION 'READ_TEXT'
    EXPORTING
*     client                  = sy-mandt
      id                      'L04'
      language                co_savelang
      name                    lv_name
      object                  'EKPO'
    TABLES
      lines                   lt_lines
    EXCEPTIONS
      id                      1
      language                2
      name                    3
      not_found               4
      object                  5
      reference_check         6
      wrong_access_to_archive 7
      OTHERS                  8.
  IF sy-subrc <> 0.
    RETURN.
  ENDIF.

  READ TABLE lt_lines INTO ls_lines INDEX 1.
  IF sy-subrc EQ 0.
    "Loop has been used here, so that in case of data issues, when multiple
    "DNs are created, all DN should have the HUB Partner number
    LOOP AT  xvbpa[] ASSIGNING  WHERE parvw 'WE'.
      MOVE ls_lines-tdline TO -kunnr.
      SELECT adrnr UP TO ROWS INTO -adrnr
        FROM kna1 WHERE kunnr -kunnr.
      ENDSELECT.
    ENDLOOP.
  ENDIF.


---------------------- return to custom program


    ELSE.
*****
      CALL FUNCTION 'DELETE_TEXT'
        EXPORTING
          client          sy-mandt
          id              ls_thead-tdid
          language        co_savelang
          name            ls_thead-tdname
          object          ls_thead-tdobject
          savemode_direct 'X'
        EXCEPTIONS
          not_found       1
          OTHERS          2.
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ENDIF.

    ENDIF.

Changing PARTNER details before Outbound delivery commit to system

By this point OB is already decided for splitting and all validation has happened.
We want to skip the validations and change the Partner numbers.

REMEMEBER: Mandatory partners determined by the TPAER table cannot be changed. Actaully it can be changed but system hangs while ceration of the Delv since it tries to delete the partner from VLPMA table.

Here READ_TEXT is reading the partner numbers passed from the custom Report to generate OB:


DATAlt_range TYPE TABLE OF zrange.
FIELD-SYMBOLS TYPE zrange,
                LIKE xvbpa.

DATAlv_name TYPE tdobname,
      lt_lines TYPE STANDARD TABLE OF tline,
      ls_lines LIKE LINE OF lt_lines,
      ls_lips  TYPE lips,
      lv_ebelp TYPE ebelp.

CONSTANTSco_savelang  TYPE thead-tdspras VALUE 'E'.

* check for availability of PO doc
IF ekko-ebeln IS INITIAL.
  RETURN.
ENDIF.

* Read ZRANGE for triggering of below logic
SELECT FROM zrange INTO TABLE lt_range
  WHERE application  'HUBSTOSA' AND
        program_name 'MV50AFZ1' AND
        identifier  ekko-ekorg.

IF sy-subrc EQ 0.
  SORT lt_range BY fieldname.
  "Check doc type
  READ TABLE lt_range ASSIGNING  WITH KEY fieldname 'LFART' BINARY SEARCH.
  IF sy-subrc NE AND  IS NOT ASSIGNED.
    RETURN.
  ELSEIF  IS ASSIGNED.
    IF -low NE likp-lfart.
      RETURN.
    ENDIF.
  ENDIF.
  READ TABLE lt_range ASSIGNING  WITH KEY fieldname 'BSART' BINARY SEARCH.
  IF sy-subrc NE AND  IS NOT ASSIGNED.
    RETURN.
  ELSEIF  IS ASSIGNED.
    IF -low NE ekko-bsart.
      RETURN.
    ENDIF.
  ENDIF.
ELSE.
  RETURN.
ENDIF.


CHECK sy-tcode EQ 'ZSD_SCHEDULE_HUB' OR sy-batch EQ 'X'.

READ TABLE xvbpa[] ASSIGNING  WITH KEY parvw 'ZB'."during change this Partner will be there
IF sy-subrc EQ 0.
  RETURN."it means this code has been called during DN creation time. We need thi code during DN change
ENDIF.

********* Read Text *********

SORT xlips[] BY vgpos."text ID will always be there for the 1st item of the delivery as per Report logic
READ TABLE xlips[] INTO ls_lips INDEX 1.
MOVE ls_lips-vgpos+1(5TO lv_ebelp.

IF sy-subrc EQ 0.

  MOVE ls_lips-vgbel TO lv_name.

  CALL FUNCTION 'READ_TEXT'
    EXPORTING
*     client                  = sy-mandt
      id                      'L04'
      language                co_savelang
      name                    lv_name
      object                  'EKPO'
    TABLES
      lines                   lt_lines
    EXCEPTIONS
      id                      1
      language                2
      name                    3
      not_found               4
      object                  5
      reference_check         6
      wrong_access_to_archive 7
      OTHERS                  8.
  IF sy-subrc <> 0.
    RETURN.
  ENDIF.

  READ TABLE lt_lines INTO ls_lines INDEX 1.
  IF sy-subrc EQ 0.
    "Loop has been used here, so that in case of data issues, when multiple
    "DNs are created, all DN should have the HUB Partner number
    LOOP AT  xvbpa[] ASSIGNING  WHERE parvw 'WE'.
      MOVE ls_lines-tdline TO -kunnr.
      SELECT adrnr UP TO ROWS INTO -adrnr
        FROM kna1 WHERE kunnr -kunnr.
      ENDSELECT.
    ENDLOOP.
  ENDIF.

ENDIF.

Changing Outbound delivery data before creation

BADI and User exit for OB before even Delivery data checks starts.
- before delivery split criteria is determined.
- before sending data to GN_DELIVERY_CREATE
- changing data for OB created from STO - BAPI_OUTB_DELIVERY_CREATE_STO

Basic idea is to target the Delivery creation structure - it_komdlgn

inside GN_DELIVERY_CREATE at the beginning it self you have a BADI. But this BADI has all IMPORTING parameters for the Method - IMPORT. SO its not directly possible to change the data.
Use STACK table assignment using Field-symbols to change the data.

BADI - shp_badi_gn_delivery_create
Implementation:
IF_EX_SHP_GN_DELIVERY_CREATE~IMPORT

Requirement - to change the LFDAT field which is read from EKET table and Spitting of MATNR is done based on that.
METHOD if_ex_shp_gn_delivery_create~import.

  DATAlt_range TYPE TABLE OF zrange.
  FIELD-SYMBOLS TYPE zrange,
                  TYPE komdlgn,
                  TYPE ANY TABLE.

  DATAlv_name TYPE tdobname,
        lt_lines TYPE STANDARD TABLE OF tline,
        ls_lines LIKE LINE OF lt_lines,
        ls_lips  TYPE lips,
        lv_ebeln TYPE ebeln,
        lv_ekorg TYPE ekorg,
        lv_bsart TYPE bsart,
        lv_prog TYPE string VALUE '(SAPLV50S)XKOMDLGN[]'.

  CONSTANTSco_savelang  TYPE thead-tdspras VALUE 'E'.

*** Dynamic accessing of variables in Stack programs
  ASSIGN (lv_progTO .
  CHECK  IS ASSIGNED.


* Read table available in BADI to get SA num
  READ TABLE xkomdlgn ASSIGNING  INDEX 1.
  CHECK sy-subrc EQ 0.
  MOVE -vgbel TO lv_name."for READ_TEXT
  MOVE -vgbel TO lv_ebeln."for SELECT query

* Get SA details for verification with ZRANGE table
  SELECT ekorg bsart UP TO ROWS INTO (lv_ekorg,lv_bsart)
    FROM ekko
    WHERE ebeln EQ lv_ebeln.
  ENDSELECT.

* Read ZRANGE for triggering of below logic
  SELECT FROM zrange INTO TABLE lt_range
    WHERE application  'HUBSTOSA' AND
          program_name 'MV50AFZ1' AND
          identifier  lv_ekorg.


  IF sy-subrc EQ 0.
    SORT lt_range BY fieldname.
    READ TABLE lt_range ASSIGNING  WITH KEY fieldname 'BSART' BINARY SEARCH.
    IF sy-subrc NE AND  IS NOT ASSIGNED.
      RETURN.
    ELSEIF  IS ASSIGNED.
      IF -low NE lv_bsart.
        RETURN.
      ENDIF.
    ENDIF.
  ELSE.
    RETURN.
  ENDIF.
*

  CHECK sy-tcode EQ 'ZSD_SCHEDULE_HUB' OR sy-batch EQ 'X'.

*
  CALL FUNCTION 'READ_TEXT'
    EXPORTING
*     client                  = sy-mandt
      id                      'L04'
      language                co_savelang
      name                    lv_name
      object                  'EKPO'
    TABLES
      lines                   lt_lines
    EXCEPTIONS
      id                      1
      language                2
      name                    3
      not_found               4
      object                  5
      reference_check         6
      wrong_access_to_archive 7
      OTHERS                  8.
  IF sy-subrc <> 0.
    RETURN.
  ENDIF.
  READ TABLE lt_lines INTO ls_lines INDEX 2.

  LOOP AT  ASSIGNING .
    MOVE ls_lines-tdline TO -lfdat.
  ENDLOOP.

ENDMETHOD.

Thursday, March 13, 2014

field synbols and internal table loops


* Begin of insert - TIN2841 - def#8785

  CHECK sy-uname eq 'TIN2841'.
  TYPES : begin of ty_crmtpop,
          YYSALES_ORG TYPE char4,
          YYSLA       TYPE char2,
          END OF ty_crmtpop.

  TYPES : begin of ty_crmtpopx,
          YYSALES_ORG TYPE char1,
          YYSLA       TYPE char1,
          END OF ty_crmtpopx.

  data: lwa_crmtpop TYPE ty_CRMTPOP,
        lwa_crmtpopx TYPE ty_crmtpopx,
        lwa_ship TYPE bad_shipping_mess.
  FIELD-SYMBOLS: TYPE table,
                  TYPE any,
                  TYPE table,
                  TYPE any,
                    TYPE CRMT_SHIP_COND,"shipping cond
                    TYPE CRMT_SALES_ORG_RESP."sales org

  CONSTANTS: lv_ref_kind TYPE char8 VALUE 'REF_KIND'.

  ASSIGN COMPONENT 'SHIPPING' OF STRUCTURE IT_BUS_TRANS_MSG to

.

  IF sy-subrc = 0 AND IS ASSIGNED.
    READ TABLE ASSIGNING WITH KEY (lv_ref_kind) 

= 'A'.
  ENDIF.

  ASSIGN COMPONENT 'ORGMAN' OF STRUCTURE IT_BUS_TRANS_MSG to .

*  READ TABLE IT_BUS_TRANS_MSG-ORGMAN ASSIGNING .
  IF sy-subrc eq 0 and IS ASSIGNED.
    READ TABLE ASSIGNING WITH KEY (lv_ref_kind) = 

'A'.
  ENDIF.

ASSIGN COMPONENT 'SALES_ORG_RESP' of STRUCTURE to .
ASSIGN COMPONENT 'SHIP_COND' of STRUCTURE to .

  CALL METHOD CL_CRM_ORGMAN_SERVICES=>MAP_HROBJECT_TO_R3_SALES_ORG
    EXPORTING
      HROBJECT         =
*     DBREAD           =
    IMPORTING
      VKORG            = lwa_crmtpop-YYSALES_ORG
    EXCEPTIONS
      NO_AUTHORIZATION = 1
      NOT_FOUND        = 2
      others           = 3.
  IF SY-SUBRC <> 0.
    CLEAR lwa_crmtpop-YYSALES_ORG.
  ENDIF.

  lwa_crmtpop-YYSLA = .

  CLEAR l_bapiparex.
  l_bapiparex-structure = 'BAPI_CRMTPOP_HDR'. "lv_bapi_structure.
  MOVE lwa_crmtpop TO l_bapiparex-valuepart1.
  INSERT l_bapiparex INTO TABLE ct_bapiparex.

  CLEAR l_bapiparex.
  MOVE-CORRESPONDING TO i_wa_pofieldsx.
  lwa_crmtpopx-yysales_org = 'X'.
  lwa_crmtpopx-yysla = 'X'.
  l_bapiparex-structure = 'BAPI_CRMTPOP_HDRX'. "lv_bapi_structure.
  MOVE lwa_crmtpopx TO l_bapiparex-valuepart1.
  INSERT l_bapiparex INTO TABLE ct_bapiparex.

* end of insert - TIN2841 - def#8785

Wednesday, July 10, 2013

Dynamic field symbol

*DATA: v_string TYPE string VALUE '(SAPFP50M)PS'.
DATA: v_string TYPE string VALUE '(SAPFP50M)PS[]'." has to be done this way as PS is table with header line
TYPES: BEGIN OF ty_ps.
        INCLUDE STRUCTURE prelp AS prelp.
TYPES:   opera,
        auth.
TYPES: END OF ty_ps.

TYPES: ty_t_ps TYPE STANDARD TABLE OF ty_ps.

FIELD-SYMBOLS: TYPE ty_t_ps,
                      TYPE ty_ps.

ASSIGN (v_string) TO .

LOOP AT ASSIGNING WHERE infty EQ '0210'.
   -begda = sy-datum.
ENDLOOP.

Tuesday, July 10, 2012

Display Text in Module pool screen

  DATAobj_cont1 TYPE REF TO cl_gui_custom_container,
        obj_cont2 TYPE REF TO cl_gui_custom_container,
        obj_cont3 TYPE REF TO cl_gui_custom_container,
        obj_cont4 TYPE REF TO cl_gui_custom_container,
        obj_cont5 TYPE REF TO cl_gui_custom_container,
        obj_editor1 TYPE REF TO cl_gui_textedit,
        obj_editor2 TYPE REF TO cl_gui_textedit,
        obj_editor3 TYPE REF TO cl_gui_textedit,
        obj_editor4 TYPE REF TO cl_gui_textedit,
        obj_editor5 TYPE REF TO cl_gui_textedit.




MODULE fill_text_ycsmg OUTPUT.

  IF obj_editor1 IS NOT BOUND.
    CREATE OBJECT obj_cont1
      EXPORTING
        container_name 'LINK_CONT'.
    CREATE OBJECT obj_editor1
      EXPORTING
        parent obj_cont1.

    CALL METHOD obj_editor1->set_selected_textstream
      EXPORTING
        selected_text                 'To facilitate manual movements of components within the multilevel structures (Material BOM) of the product. Instead of several-step process with usage of standard transactions such as CS02 or CEWB.'
*       enable_editing_protected_text = false
      EXCEPTIONS
        error_cntl_call_method        1
        not_supported_by_gui          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.

    CALL METHOD obj_editor1->set_toolbar_mode
      EXPORTING
        toolbar_mode 0.
    CALL METHOD obj_editor1->set_readonly_mode
      EXPORTING
        readonly_mode 1.
    CALL METHOD obj_editor1->set_statusbar_mode
      EXPORTING
        statusbar_mode 0.

  ENDIF.

ENDMODULE.    





**************************
  CASE sy-ucomm.
    WHEN 'LINK'.
      CALL TRANSACTION 'YCSMG'."Link Transfer WB
    WHEN 'YCAPPH'."Allocation of S-Note comp
      CALL TRANSACTION 'YCAPPH'.
    WHEN 'YCASNH'."Manage of S-Note Comp
      CALL TRANSACTION 'YCASNH'.
    WHEN 'REPLACE'.
      SUBMIT yrep_kola_modify_linkid VIA SELECTION-SCREEN AND RETURN.
    WHEN 'UNREPLACE'.
      SUBMIT yrep_kola_modify_link_undo VIA SELECTION-SCREEN AND RETURN.
    WHEN 'BACK' OR 'CANCEL' OR 'EXIT'.
      LEAVE TO SCREEN 0.
  ENDCASE.

Monday, June 25, 2012

Dynamic SELECT query


  DATAlv_cond TYPE string,
        lv_ecmas TYPE char6,
        lv_kola TYPE char4,
        lv_matmas TYPE char6,
        lv_docmas TYPE char6.

  REFRESH p_idoc.

  IF cb_bom EQ gc_o.
    MOVE 'KOLA' TO lv_kola.
********ECMMAS,MATMAS,DOCMAS****************************************
    IF cb_ecm EQ gc_x AND cb_mat NE gc_x AND cb_doc NE gc_x.
      MOVE 'ECMMAS' TO lv_ecmas.
      CONCATENATE 'mestyp = lv_ecmas'
                  'AND sndprn =' 'lv_kola' 'AND credat IN s_odays'
                  INTO lv_cond SEPARATED BY space.
    ELSEIF cb_ecm EQ gc_x AND cb_mat EQ gc_x AND cb_doc NE gc_x.
      MOVE 'ECMMAS' TO lv_ecmas.
      MOVE 'MATMAS' TO lv_matmas.
      CONCATENATE 'mestyp = lv_ecmas OR mestyp = lv_matmas'
                  'AND sndprn =' 'lv_kola' 'AND credat IN s_odays'
                  INTO lv_cond SEPARATED BY space.
    ELSEIF cb_ecm EQ gc_x AND cb_mat EQ gc_x AND cb_doc EQ gc_x.
      MOVE 'ECMMAS' TO lv_ecmas.
      MOVE 'MATMAS' TO lv_matmas.
      MOVE 'DOCMAS' TO lv_docmas.
      CONCATENATE
      'mestyp = lv_ecmas OR mestyp = lv_matmas OR mestyp = lv_docmas'
      'AND sndprn =' 'lv_kola' 'AND credat IN s_odays'
                  INTO lv_cond SEPARATED BY space.
    ELSEIF cb_ecm NE gc_x AND cb_mat EQ gc_x AND cb_doc EQ gc_x.
      MOVE 'DOCMAS' TO lv_docmas.
      MOVE 'MATMAS' TO lv_matmas.
      CONCATENATE 'mestyp = lv_docmas OR mestyp = lv_matmas'
                  'AND sndprn =' 'lv_kola' 'AND credat IN s_odays'
                  INTO lv_cond SEPARATED BY space.
    ELSEIF cb_ecm NE gc_x AND cb_mat NE gc_x AND cb_doc EQ gc_x.
      MOVE 'DOCMAS' TO lv_docmas.
      CONCATENATE 'mestyp = lv_docmas'
                  'AND sndprn =' 'lv_kola' 'AND credat IN s_odays'
                  INTO lv_cond SEPARATED BY space.
    ELSEIF cb_ecm NE gc_x AND cb_mat EQ gc_x AND cb_doc NE gc_x.
      MOVE 'MATMAS' TO lv_matmas.
      CONCATENATE 'mestyp = lv_matmas'
                  'AND sndprn =' 'lv_kola' 'AND credat IN s_odays'
                  INTO lv_cond SEPARATED BY space.
    ENDIF.

    IF NOT lv_cond IS INITIAL.
      SELECT docnum status credat cretim mestyp
             mescod mesfct upddat updtim
          INTO CORRESPONDING FIELDS OF TABLE p_idoc
          FROM edidc
          WHERE (lv_cond).
    ENDIF.
********CHRMAS,CLSMAS,ECMREV****************************************

Monday, September 26, 2011

VELO: Creating vehicle and Sales order in SAP VMS systems

below code gives an option of creating Vehicles along with SO in VMS system in SAP. User has option o creating multiple Vehicle and SO with multiple or single vehicle. as of now the code has been tested with few Materials which has to be of the Material Group VEHI and configurable (consult your SAP Funct expert).

The below code still gives an Pop-up while creating the SO for the Vehicle. But this Pop-up can be cancelled by the User and it doesnt effect on the Vehicle creation process. I am still working on the pop-up screen and trying to fix it so that the program can run in the background:

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


*&---------------------------------------------------------------------*
*& Report  YCREATEVEH_TEST
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ycreateveh_test.

DATA: gt_vehicle TYPE STANDARD TABLE OF bapivehicle,
      gt_vehicle1 
TYPE STANDARD TABLE OF bapivehicle,
      gw_vehicle 
TYPE bapivehicle,
      gt_config  
TYPE STANDARD TABLE OF bapicucfg,
      gt_config1  
TYPE STANDARD TABLE OF bapicucfg,
      gw_config  
TYPE bapicucfg,
      gt_inst    
TYPE STANDARD TABLE OF bapicuins,
      gt_inst1    
TYPE STANDARD TABLE OF bapicuins,
      gw_inst    
TYPE bapicuins,
      gt_charval 
TYPE STANDARD TABLE OF bapicuval,
      gt_charval1 
TYPE STANDARD TABLE OF bapicuval,
      gw_charval 
TYPE bapicuval,
      gw_req     
TYPE bapirequestedtablesx,
      gt_return  
TYPE STANDARD TABLE OF bapiret2,
      gw_edidd   
TYPE edidd,
      gt_condkey 
TYPE STANDARD TABLE OF bapicuvk,
      gt_qual    
TYPE STANDARD TABLE OF bapivehiclequalifiers,
      gw_qual     
TYPE bapivehiclequalifiers.
TYPES: tt_ret TYPE STANDARD TABLE OF bapiret2.

PARAMETERS: p_veh TYPE i,"no. o veh
            p_mat 
TYPE mara-matnr DEFAULT 'IT8911',
            p_1 
RADIOBUTTON GROUP g1,
            p_2 
RADIOBUTTON GROUP g1.

START-
OF-SELECTION.

  gw_vehicle-materialnumber = p_mat.
"'B100'."'IT8911'."'B100'.                       "E1EDP19
  gw_vehicle-plant          = 
'1000'.
  
APPEND gw_vehicle TO gt_vehicle.
  
CLEAR: gw_vehicle,gw_edidd.

  gw_config-config_id = 
'1'."E1CUCFG-CONFIG_ID
  gw_config-root_id   = 
'1'." E1CUCFG-ROOT_ID
  
APPEND gw_config TO gt_config.
  
CLEAR: gw_config,gw_config.

  gw_inst-config_id = 
'1'.
  gw_inst-inst_id   = 
'1'."E1CUINS-INST_ID
  gw_inst-obj_type  = 
'MARA'."E1CUINS-OBJ_TYPE
  gw_inst-class_type = 
'300'."E1CUINS-CLASS_TYPE
  
APPEND gw_inst TO gt_inst.
  
CLEAR: gw_inst,gw_edidd.


  gw_charval-charc          = 
'B001'."E1CUVAL-CHARC
  gw_charval-
value          = '1'."E1CUVAL-VALUE
  
APPEND gw_charval TO gt_charval.
  
CLEAR gw_charval.
  gw_charval-charc          = 
'B002'.
  gw_charval-
value          = '1'.
  
APPEND gw_charval TO gt_charval.
  
CLEAR gw_charval.
  gw_charval-charc          = 
'B003'.
  gw_charval-
value          = '2'.
  
APPEND gw_charval TO gt_charval.
  
CLEAR gw_charval.
  gw_charval-charc          = 
'B005'.
  gw_charval-
value          = '1'.
  
APPEND gw_charval TO gt_charval.
  
CLEAR gw_charval.
  gw_charval-charc          = 
'B006'.
  gw_charval-
value          = '1'.
  
APPEND gw_charval TO gt_charval.
  
CLEAR gw_charval.
  gw_charval-charc          = 
'B007'.
  gw_charval-
value          = '1'.
  
APPEND gw_charval TO gt_charval.
  
CLEAR gw_charval.
  gw_charval-charc          = 
'B008'.
  gw_charval-
value          = '1'.
  
APPEND gw_charval TO gt_charval.
  
CLEAR gw_charval.
  gw_charval-charc          = 
'VF_TST01'.
  gw_charval-
value          = '0001'.
  
APPEND gw_charval TO gt_charval.
  
CLEAR gw_charval.

  gw_req-extensionout = 
'X'.
  gw_req-config_data  = 
'X'.

*IF sy-uname EQ 'TIN2841'.
*
*  BREAK-POINT.
*ENDIF.
*
** This BAPI is responsible for creation of Vehicle.
  
DO p_veh TIMES.

    
CALL FUNCTION 'BAPI_VEHICLE_CREATE'
     
EXPORTING
       vehicleaction                 = 
'CREA'
       requestedtablex               = gw_req
      
TABLES
        vehicle                       = gt_vehicle
        config_data                   = gt_config
        config_instances              = gt_inst
        config_charsvalues            = gt_charval
         vehicle_qualifiers            = gt_qual
*     EXTENSIONIN                   =
       created_vehicle               = gt_vehicle1
       created_config_data           = gt_config1
       created_config_instance       = gt_inst1
       created_config_charsval       = gt_charval1
*     EXTENSIONOUT                  =
       
return                        = gt_return
*     CONFIG_CONDKEY                =
       created_config_condkey        = gt_condkey
              .

    
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
   
EXPORTING
     
wait          = 'X'
* IMPORTING
*   RETURN        =
              .
  
PERFORM write_log USING gt_return.
  
ENDDO.

  
IF sy-uname EQ 'TIN2841'.

*    BREAK-POINT.
  
ENDIF.

  
DATA: gw_head TYPE bapivehiactiondata_head,
        gw_head1 
TYPE bapivehiactiondata_head,
        gw_headx 
TYPE bapivehiactiondata_headx,
        gw_id    
TYPE bapivehicle_id_type,
        gt_item 
TYPE STANDARD TABLE OF bapivehiactiondata_item,
        gw_item 
TYPE bapivehiactiondata_item,
        gt_ref  
TYPE STANDARD TABLE OF bapiconfig_references,
        gw_ref 
TYPE bapiconfig_references,
        gt_ret   
TYPE STANDARD TABLE OF bapiret2,
        gw_ret   
TYPE bapiret2,
        lv_mess 
TYPE string,
        gw_itemx 
TYPE bapivehiactiondata_itemx.



  
IF p_1 EQ 'X'." Different SO
    
PERFORM differnt_so.
  
ELSEIF p_2 EQ 'X'.
    
PERFORM same_so.
    
PERFORM write_log USING gt_ret.
  
ENDIF.

*&---------------------------------------------------------------------*
*&      Form  DIFFERNT_SO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM differnt_so .

  
LOOP AT gt_vehicle1 INTO gw_vehicle."for every vehicle created

    gw_head-plant = gw_vehicle-plant.
    gw_head-material = gw_vehicle-materialnumber.
    gw_head-salesorg = 
'1000'.
    gw_head-distr_chan = 
'10'.
    gw_head-division = 
'00'.
    gw_head-doc_type = 
'OR'.
    gw_head-sold_to = 
'0000002200'.
    gw_head-purch_no = 
'ABC1234'.
    gw_head-payer = 
'0000002200'.
    gw_head-req_dat_h = 
'20110515'.
    gw_head-ship_to = 
'0000002000'.
    gw_head-material_external = gw_vehicle-materialnumber_external.
    gw_head-material_guid = gw_vehicle-materialnumber_guid.
    gw_head-material_version = gw_vehicle-materialnumber_version.

    
MOVE 'X' TO: gw_headx-plant,gw_headx-material,gw_headx-salesorg,
                 gw_headx-distr_chan,gw_headx-division,gw_headx-doc_type,
                 gw_headx-material_external,gw_headx-material_guid,
                 gw_headx-material_version,gw_headx-sold_to,
                 gw_headx-purch_no,gw_headx-req_dat_h,
                 gw_headx-ship_to,gw_headx-ship_to.

    
MOVE-CORRESPONDING gw_vehicle TO gw_item.
    gw_item-po_number = 
'ABC1234'.
    
APPEND gw_item TO gt_item.

    
MOVE 'X' TO: gw_itemx-vehicleguid,gw_itemx-vehicleguid32,gw_itemx-vehiclenumber,
                     gw_itemx-po_number.
*  READ TABLE gt_qual INTO gw_qual INDEX 1.
    gw_ref-vehicleidentifier = gw_vehicle-vehicleguid32.
    
READ TABLE gt_config1 INTO gw_config INDEX 1.
    gw_ref-config_id = gw_config-config_id.
    gw_ref-inst_id   = gw_config-root_id.
    
APPEND gw_ref TO gt_ref.
    gw_id-vehicle_id_type = 
'G'.


    
CALL FUNCTION 'BAPI_VEHICLE_CHANGE_MULTIPLE'
      
EXPORTING
        vehicleaction                     = 
'CUOR'
        vehiactiondata_head               = gw_head
   requestedtablex                   = gw_req
     vehiactiondata_headx              = gw_headx
   vehiactiondata_itemx              = gw_itemx
        vehicle_id_type                   = gw_id
* IMPORTING
*   CHANGED_VEHIACTIONDATA_HEAD       = gw_head1
      
TABLES
        vehiactiondata_item               = gt_item
        config_references                 = gt_ref
        config_data                       = gt_config1
        config_instances                  = gt_inst1
        config_charsvalues                = gt_charval
*   VEHICLE_QUALIFIERS                =
*   EXTENSIONIN                       =
*   CHANGED_VEHIACTIONDATA_ITEM       =
*   CHANGED_VEHICLE                   =
*   CHANGED_CONFIG_DATA               =
*   CHANGED_CONFIG_INSTANCE           =
*   CHANGED_CONFIG_CHARSVAL           =
*   EXTENSIONOUT                      =
       
return                            = gt_ret
       config_varcondnkeys               = gt_condkey
*   CHANGED_CONFIG_VARCONDNKEYS       =
*       vehicle_data                      = gt_vehicle1
              .
    
CLEAR: gt_item,gt_ref,gw_itemx,gw_head,gw_headx.

* Write Log
    
PERFORM write_log USING gt_ret.

  
ENDLOOP.

  
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
* EXPORTING
*   WAIT          =
* IMPORTING
*   RETURN        =
            .

*IF sy-uname EQ 'TIN2841'.
*
*  BREAK-POINT.
*ENDIF.
ENDFORM.                    " DIFFERNT_SO
*&---------------------------------------------------------------------*
*&      Form  SAME_SO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM same_so .

  
LOOP AT gt_vehicle1 INTO gw_vehicle."for every vehicle created
*READ TABLE gt_vehicle1 INTO gw_vehicle INDEX 1.
*    IF sy-subrc EQ 0.

      gw_head-plant = gw_vehicle-plant.
      gw_head-material = gw_vehicle-materialnumber.
      gw_head-salesorg = 
'1000'.
      gw_head-distr_chan = 
'10'.
      gw_head-division = 
'00'.
      gw_head-doc_type = 
'OR'.
      gw_head-sold_to = 
'0000002200'.
      gw_head-purch_no = 
'ABC1234'.
      gw_head-payer = 
'0000002200'.
      gw_head-req_dat_h = 
'20110515'.
      gw_head-ship_to = 
'0000002000'.
      gw_head-material_external = gw_vehicle-materialnumber_external.
      gw_head-material_guid = gw_vehicle-materialnumber_guid.
      gw_head-material_version = gw_vehicle-materialnumber_version.

      
MOVE 'X' TO: gw_headx-plant,gw_headx-material,gw_headx-salesorg,
                   gw_headx-distr_chan,gw_headx-division,gw_headx-doc_type,
                   gw_headx-material_external,gw_headx-material_guid,
                   gw_headx-material_version,gw_headx-sold_to,
                   gw_headx-purch_no,gw_headx-req_dat_h,
                   gw_headx-ship_to,gw_headx-ship_to.

      
MOVE-CORRESPONDING gw_vehicle TO gw_item.
      gw_item-po_number = 
'ABC1234'.
      
APPEND gw_item TO gt_item.

      
MOVE 'X' TO: gw_itemx-vehicleguid,gw_itemx-vehicleguid32,gw_itemx-vehiclenumber,
                       gw_itemx-po_number.
*  READ TABLE gt_qual INTO gw_qual INDEX 1.

      gw_ref-vehicleidentifier = gw_vehicle-vehicleguid32.
      
READ TABLE gt_config1 INTO gw_config INDEX sy-tabix."loop pass
      gw_ref-config_id = gw_config-config_id.
      gw_ref-inst_id   = gw_config-root_id.
      
APPEND gw_ref TO gt_ref.

    
ENDLOOP.

    gw_id-vehicle_id_type = 
'G'.

    
CALL FUNCTION 'BAPI_VEHICLE_CHANGE_MULTIPLE'
      
EXPORTING
        vehicleaction                     = 
'CUOR'
        vehiactiondata_head               = gw_head
   requestedtablex                   = gw_req
     vehiactiondata_headx              = gw_headx
   vehiactiondata_itemx              = gw_itemx
        vehicle_id_type                   = gw_id
* IMPORTING
*   CHANGED_VEHIACTIONDATA_HEAD       = gw_head1
      
TABLES
        vehiactiondata_item               = gt_item
        config_references                 = gt_ref
        config_data                       = gt_config1
        config_instances                  = gt_inst1
        config_charsvalues                = gt_charval
*   VEHICLE_QUALIFIERS                =
*   EXTENSIONIN                       =
*   CHANGED_VEHIACTIONDATA_ITEM       =
*   CHANGED_VEHICLE                   =
*   CHANGED_CONFIG_DATA               =
*   CHANGED_CONFIG_INSTANCE           =
*   CHANGED_CONFIG_CHARSVAL           =
*   EXTENSIONOUT                      =
       
return                            = gt_ret
       config_varcondnkeys               = gt_condkey
*   CHANGED_CONFIG_VARCONDNKEYS       =
       vehicle_data                      = gt_vehicle1
              .

*  ENDLOOP.

    
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
* EXPORTING
*   WAIT          =
* IMPORTING
*   RETURN        =
              .
*  ENDIF.

*IF sy-uname EQ 'TIN2841'.
*
*  BREAK-POINT.
*ENDIF.

ENDFORM.                    " SAME_SO
*&---------------------------------------------------------------------*
*&      Form  WRITE_LOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM write_log USING pt_ret TYPE tt_ret.
  
LOOP AT pt_ret INTO gw_ret.
    
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
      
EXPORTING
        msgid               = gw_ret-
id
        msgnr               = gw_ret-
number
        msgv1               = gw_ret-message_v1
        msgv2               = gw_ret-message_v2
        msgv3               = gw_ret-message_v3
        msgv4               = gw_ret-message_v4
      
IMPORTING
        message_text_output = lv_mess.
    
NEW-LINE.
    
WRITE lv_mess.

*WRITE: gw_ret-TYPE, gw_ret-MESSAGE_V1, gw_ret-MESSAGE_V2.
  
ENDLOOP.
ENDFORM.                    " WRITE_LOG


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