Thursday, November 6, 2014

ABAP queries with dynamic WHERE clause

     DATA l_where(100) OCCURS 0 WITH HEADER LINE.
   
     APPEND 'laufd = p_laufd' TO l_where.
     APPEND ' and ' TO l_where.
     APPEND 'laufi = p_laufi' TO l_where.

     SELECT * FROM reguh INTO CORRESPONDING FIELDS OF TABLE it_reguh
     WHERE (l_where).  // Dynamically generate the WHERE clause

Wednesday, June 5, 2013

Delete duplicate from internal table

Duplicated rows in internal table can be easily deleted using standard code "DELETE ADJACENT DUPLICATES"

for example :

DELETE ADJACENT DUPLICATES FROM itab COMPARING ALL FIELDS.


This code will compare all the fields in the internal table and only delete the the rows if all the fields are duplicated with previous rows.





DELETE ADJACENT DUPLICATES FROM itab COMPARING col1.

This code will compare a particular field(s) in the internal table and only delete the the rows if these field(s) is/are duplicated with previous rows.

Make sure that your internal table is sorted by the fields you want to be checked for duplicates BEFORE deleting the duplicates.

for example: 

SORT itab BY col1.
DELETE ADJACENT DUPLICATES FROM itab COMPARING col1. 
  

Tuesday, April 30, 2013

Abap substring

data: datechar(10).
 
To build the date lets use sy-datum, which has the current system date. 

  write SY-DATUM+4(2) to datechar+0(2).
  write '/' datechar+2(1).
  write SY-DATUM+6(2) to datechar+3(2).
  write '/' TO datechar+5(1).
  write SY-DATUM+0(4) to datechar+6(4).
 
Value of SY-DATUM 20130501
 
Here's how the field changes with the execution of each line.

05________
05/_______
05/01_____
05/01/____
05/01/2013

Thursday, December 6, 2012

Abap Identify Number and Characters

The following sample shows how to identify number and characters in a string.

report z_identify.

data: test(10) type c value 'ABC123456'.
data: length type i.

length = strlen( test ).

if test(length) co '1234567890'.
  write:/ 'This is a number'.
else.
  write:/ 'This is not a number'.
endif.

Saturday, September 15, 2012

Abap send email library

The below include program is used to send email with CC and attachment functionality:

*&---------------------------------------------------------------------*
*&  Include         
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*  Purpose:
*  Provide generic subroutines for any ABAP programs with intention of
*  sending email (SAPOffice or Internet) with attachments
*&---------------------------------------------------------------------*


  DATA: objpack LIKE sopcklsti1 OCCURS  2 WITH HEADER LINE"Packing list
  DATA: objhead LIKE solisti1   OCCURS  1 WITH HEADER LINE"Object header
  DATA: objtxt  LIKE solisti1   OCCURS 10 WITH HEADER LINE"Email body message
  DATA: objbin  LIKE solisti1   OCCURS 10 WITH HEADER LINE"Binary attachments (PDF)
  DATA: objhex  LIKE solix      OCCURS 10 WITH HEADER LINE"Hex attachments (XLS)
  DATA: reclist LIKE somlreci1  OCCURS  5 WITH HEADER LINE"Recipient list
  DATA: doc_chng LIKE sodocchgi1. "Email information

  DATA: tab_lines LIKE sy-tabix. "Number of records of the content table being filled

  DATA: pk_lines LIKE sy-tabix. "Number of lines of the attachment packing list


*&---------------------------------------------------------------------*
*&      Form  initialize_email
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
  FORM initialize_email.
    REFRESH: objpack,
             objhead,
             objtxt,
             objbin,
             objhex,
             reclist.
    CLEAR:   doc_chng, pk_lines.
  ENDFORM.                    "initialize_email

*&---------------------------------------------------------------------*
*&      Form  build_email_body
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->L_SUBJ     text
*----------------------------------------------------------------------*
  FORM build_email_body TABLES it_body STRUCTURE solisti1
                        USING l_subj.

* Setup the email body message
    IF NOT it_body[] IS INITIAL.
      REFRESH objtxt.
      objtxt[] = it_body[].
    ELSE.
      objtxt = l_subj.
      APPEND objtxt.
    ENDIF.

* Subject of email
    MOVE l_subj TO doc_chng-obj_descr.

    DESCRIBE TABLE objtxt LINES tab_lines.
    READ TABLE objtxt INDEX tab_lines.

    doc_chng-doc_size = ( tab_lines - 1 ) * 255 + STRLEN( objtxt ).

* Prepare the packing list for email body
*    DESCRIBE TABLE objpack LINES pk_lines.
    CLEAR objpack-transf_bin.
    objpack-head_start = 1.
    objpack-head_num   = 0.
    objpack-body_start = 1.
    objpack-body_num   = tab_lines.
    objpack-doc_type   = 'RAW'.
    APPEND objpack.
  ENDFORM.                    "build_email_body

*&---------------------------------------------------------------------*
*&      Form  build_hex_attachment
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
  FORM build_hex_attachment TABLES it_hex
                            USING l_filename LIKE sopcklsti1-obj_descr
                                  l_filetype LIKE sopcklsti1-doc_type.

    DATA: it_objhex LIKE solix OCCURS 0 WITH HEADER LINE.

    IF NOT it_hex[] IS INITIAL.
      CALL FUNCTION 'SCMS_TEXT_TO_BINARY'
*       EXPORTING
*         FIRST_LINE            = 0
*         LAST_LINE             = 0
*         APPEND_TO_TABLE       = ' '
*         MIMETYPE              = ' '
*         ENCODING              =
*       IMPORTING
*         OUTPUT_LENGTH         =
        TABLES
          text_tab              = it_hex
          binary_tab            = it_objhex
        EXCEPTIONS
          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.
      ELSE.
        APPEND LINES OF it_objhex TO objhex.

* IT_OBJHEX is used as OBJHEX can contain multiple attachments

        DESCRIBE TABLE it_objhex LINES tab_lines.

        objpack-transf_bin = 'X'.
        objpack-head_start = 1.
        objpack-head_num   = 0.
        objpack-body_start = pk_lines + 1.
        objpack-body_num   = tab_lines.
        objpack-doc_type   = l_filetype.
*        objpack-obj_name   = 'ATTACHMENT'.
        objpack-obj_descr = l_filename.
        objpack-doc_size   = tab_lines * 255.
        APPEND objpack.

        pk_lines = objpack-body_start + objpack-body_num - 1.
      ENDIF.

    ENDIF.
  ENDFORM.                    "build_hex_attachment

*&---------------------------------------------------------------------*
*&      Form  build_recip_list
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
  FORM build_recip_list USING l_recipient
                              l_reciptype LIKE somlreci1-rec_type.
    MOVE l_recipient TO reclist-receiver.

    reclist-rec_type = l_reciptype.
    reclist-copy = ''.

    APPEND reclist.
  ENDFORM.                    "build_recip_list


*&---------------------------------------------------------------------*
*&      Form  build_recip_cc_list
*&---------------------------------------------------------------------*

  FORM build_recip_cc_list USING l_recipient
                              l_reciptype LIKE somlreci1-rec_type.
    MOVE l_recipient TO reclist-receiver.

    reclist-rec_type = l_reciptype.
    reclist-copy = 'X'.

    APPEND reclist.
  ENDFORM.                    "build_recip_cc_list


*&---------------------------------------------------------------------*
*&      Form  send_email
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
  FORM send_email.

    IF reclist[] IS INITIAL.
      PERFORM build_recip_list USING sy-uname
                                     'B'.
    ENDIF.

    CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
      EXPORTING
        document_data                    = doc_chng
*     PUT_IN_OUTBOX                    = ' '
       commit_work                      = 'X'
*   IMPORTING
*     SENT_TO_ALL                      =
*     NEW_OBJECT_ID                    =
      TABLES
        packing_list                     = objpack
       object_header                    = objhead
*{   REPLACE        DEVK935771                                        2
*\*     CONTENTS_BIN                     =
      CONTENTS_BIN                     = objbin
*}   REPLACE
       contents_txt                     = objtxt
       contents_hex                     = objhex
*     OBJECT_PARA                      =
*     OBJECT_PARB                      =
        receivers                        = reclist
     EXCEPTIONS
       too_many_receivers               = 1
       document_not_sent                = 2
       document_type_not_exist          = 3
       operation_no_authorization       = 4
       parameter_error                  = 5
       x_error                          = 6
       enqueue_error                    = 7
       OTHERS                           = 8
              .
    IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
*{   DELETE         DEVK935721                                        1
*\    ELSE.
*\      SUBMIT rsconn01 AND RETURN.
*}   DELETE
    ENDIF.


  ENDFORM.                    "send_email



*&---------------------------------------------------------------------*
*&      Form  send_email_w_from_addr
*&---------------------------------------------------------------------*
*       T01K918835
*----------------------------------------------------------------------*
  FORM send_email_w_from_addr USING l_from.

    TYPES:
      BEGIN OF ty_s_imp00,
        imp01 TYPE c,                    "Sent To All
        imp02 TYPE sofolenti1-object_id, "New Object ID
        imp03 TYPE soudk,                "Sender ID
      END OF ty_s_imp00.

    DATA:
      lw_imp00     TYPE ty_s_imp00,
      lt_sosct     TYPE sosctab,
      lt_obcat     TYPE TABLE OF sxobjcat.

    IF reclist[] IS INITIAL.
      PERFORM build_recip_list USING sy-uname
                                     'B'.
    ENDIF.


    CALL FUNCTION 'SO_DOCUMENT_SEND_API1'
      EXPORTING
        document_data              = doc_chng
        put_in_outbox              = 'X'
        sender_address             = l_from
        sender_address_type        = 'SMTP'
        commit_work                = 'X'
      IMPORTING
        sent_to_all                = lw_imp00-imp01
        new_object_id              = lw_imp00-imp02
        sender_id                  = lw_imp00-imp03
      TABLES
        packing_list               = objpack
*       contents_bin               =
        contents_hex               = objhex
        contents_txt               = objtxt
        receivers                  = reclist
      EXCEPTIONS
       too_many_receivers               = 1
       document_not_sent                = 2
       document_type_not_exist          = 3
       operation_no_authorization       = 4
       parameter_error                  = 5
       x_error                          = 6
       enqueue_error                    = 7
       OTHERS                           = 8.
    .
    IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ELSE.
* Force the email sending immediately.

      CLEAR: lt_sosct, lt_obcat.
      COMMIT WORK AND WAIT.

      SELECT  * FROM sosc
        INTO TABLE lt_sosct
        WHERE objtp = lw_imp00-imp02+0(3AND
              objyr = lw_imp00-imp02+3(2AND
              objno = lw_imp00-imp02+5.

      IF sy-subrc = 0.

        CALL FUNCTION 'SX_SEND_DISPATCHER'
          EXPORTING
            sosc_tab          = lt_sosct
          TABLES
            obj_cat           = lt_obcat
          EXCEPTIONS
            internal_error    = 1
            directsend_failed = 2
            OTHERS            = 3.

        IF sy-subrc <> 0.
          MESSAGE s005(z1) WITH space 'Email' 'Sent'.
        ELSE.
          MESSAGE s004(z1) WITH space 'Email' 'Sent'.
        ENDIF.

      ELSE.
        MESSAGE s005(z1) WITH space 'Email' 'Sent'.
      ENDIF.


    ENDIF.



  ENDFORM.                    "send_email
*{   INSERT         DEVK935771                                        1
FORM build_pdf_attachment TABLES it_pdf
                            USING l_filename LIKE sopcklsti1-obj_descr
                                  l_filetype LIKE sopcklsti1-doc_type.

  DATA: it_objbin  LIKE solisti1 OCCURS 0 WITH HEADER LINE.

  if it_pdf[] is not initial.
    CALL FUNCTION 'SX_TABLE_LINE_WIDTH_CHANGE'
*     EXPORTING
*       LINE_WIDTH_SRC                    =
*       LINE_WIDTH_DST                    =
*       TRANSFER_BIN                      = ' '
      TABLES
        content_in                        = it_pdf
        content_out                       = it_objbin
     EXCEPTIONS
       ERR_LINE_WIDTH_SRC_TOO_LONG       = 1
       ERR_LINE_WIDTH_DST_TOO_LONG       = 2
       ERR_CONV_FAILED                   = 3
       OTHERS                            = 4
              .
    IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    else.
        APPEND LINES OF it_objbin TO objbin.
* IT_OBJBIN is used as OBJBIN can contain multiple attachments

        DESCRIBE TABLE it_objbin LINES tab_lines.

        objpack-transf_bin = 'X'.
        objpack-head_start = 1.
        objpack-head_num   = 0.
        objpack-body_start = pk_lines + 1.
        objpack-body_num   = tab_lines.
        objpack-doc_type   = l_filetype.
*        objpack-obj_name   = 'ATTACHMENT'.
        objpack-obj_descr = l_filename.
        objpack-doc_size   = tab_lines * 255.
        APPEND objpack.

        pk_lines = objpack-body_start + objpack-body_num - 1.
    ENDIF.

  ENDIF.
ENDFORM.
*}   INSERT

ABAP Folder Selection input box

The below program will create a input selection that will pop up the folder selection box.




REPORT  z_select_folder.

CONSTANTS: c_default_folder TYPE rlgrap-filename VALUE 'C:\'.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-002.
PARAMETERS :  p_folder LIKE rlgrap-filename OBLIGATORY DEFAULT c_default_folder.
SELECTION-SCREEN END OF BLOCK b1.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_folder.
  PERFORM select_folder CHANGING p_folder.


FORM select_folder  CHANGING p_p_folder.
  DATA: l_path TYPE string.

  CALL METHOD cl_gui_frontend_services=>directory_browse
    EXPORTING
      window_title         = 'Select Folder'
      initial_folder       = 'C:\'
    CHANGING
      selected_folder      = l_path
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  MOVE l_path TO p_p_folder.
ENDFORM.                    " SELECT_FOLDER

Sunday, February 12, 2012

SAP Execute MIRO using BAPI_INCOMINGINVOICE_CREATE

This is the sample program to create incoming vendor invoice (MIRO) using BAPI_INCOMINGINVOICE_CREATE



REPORT  zt_bapimiro.

DATA: wa_header LIKE bapi_incinv_create_header.

DATA: it_item TYPE STANDARD TABLE OF bapi_incinv_create_item,
      wa_item TYPE bapi_incinv_create_item.

DATA: it_ret LIKE bapiret2 OCCURS 0 WITH HEADER LINE.

DATA: g_invno LIKE bapi_incinv_fld-inv_doc_no,
      g_fyear LIKE bapi_incinv_fld-fisc_year.

wa_header-invoice_ind = 'X'.
wa_header-doc_date = '20120131'.   "Enter the document date
wa_header-pstng_date = '20120208'"Enter the posting date
wa_header-ref_doc_no = 'Test'.
wa_header-comp_code = '3100'.
wa_header-gross_amount = '5908.11'.  "Enter the gross amount(aft. tax) for the invoice
wa_header-calc_tax_ind = 'X'.
wa_header-currency = 'USD'.

wa_item-invoice_doc_item = '000001'.
wa_item-po_number = '4590038150'.    "Enter the PO number
wa_item-po_item = '00120'.           "Enter the PO item number
wa_item-ref_doc = '5007548571'.      "Enter the GR number
wa_item-ref_doc_year = '2012'.       "Enter the GR fiscal year
wa_item-ref_doc_it = '0001'.         "Enter the GR item number
wa_item-tax_code = 'V7'.             "Enter the tax code applicable
wa_item-item_amount = '5521.60'.     "Enter the item amount
wa_item-quantity = '2380'.           "Enter the invoice quantity
wa_item-po_unit = 'EA'.              "Enter the UoM
APPEND wa_item TO it_item.

CALL FUNCTION 'BAPI_INCOMINGINVOICE_CREATE'
  EXPORTING
    headerdata                = wa_header
*   ADDRESSDATA               =
 IMPORTING
   invoicedocnumber          = g_invno
   fiscalyear                = g_fyear
  TABLES
    itemdata                  = it_item
*   ACCOUNTINGDATA            =
*   GLACCOUNTDATA             =
*   MATERIALDATA              =
*   TAXDATA                   =
*   WITHTAXDATA               =
*   VENDORITEMSPLITDATA       =
    return                    = it_ret
*   EXTENSIONIN               =
          .

IF g_invno IS NOT INITIAL.
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
*   EXPORTING
*     WAIT          =
*   IMPORTING
*     RETURN        =
            .
ENDIF.
WRITE:/1 g_invno, g_fyear.

LOOP AT it_ret.
  WRITE:/1 it_ret-message.
ENDLOOP.