Performance of a report over a multicube?

Hi,
I have a report built on a multiprovider which sits over 3 ODS.This query takes a long time to run.
To improve the performance...i was thinking of changing the indexes for ODS..
And i cannot think of changing the query design..cuz i dont have an idea of query requirement..
I am only here for Tuning..
So r there anyother ways of improving the performance..
Thanks,
Sai.

Hi.
  Creating index enhances the performance. Also since it is ODs, check in settings whether Bex reporting is ticked.. If not selected.. and you are running reports.. it creats SIDs at the time of reporting and the performance gets affected.
Also go thru this How to build an efficient queries on multiprovider.this is a general document for the queries either Infocube/ODS built on multiprovider.
https://websmp202.sap-ag.de/~sapdownload/011000358700009385892004E/HowToMultiProvider.pdf
Hope it helps. Plz assign points if it is helpful for u.
Thanks & Regarda,
Pradeep.E

Similar Messages

  • Unable to print crystal report over web using ActiveX Control

    Post Author: jimmyp
    CA Forum: General
    We have a problem with printing crystal report over web using ActiveX Control.  When clicking print button, it only shows a blank dialog web crystal viewer page without any error.  The page just simply hangs.  We installed the PrintControl DLL and enable all the security setting for ActiveX Control for IE.  It still does not print.  Does anyone know why?  
    Environment.
    Bundle Crystal Report v10
    Asp.net 2.0
    IE 6.0 or higher.
    Appreciate for your help.
    Jimmy

    Post Author: Ian Kulmatycki
    CA Forum: General
    A team member here found this, I haven't read it, I'm not sure if our problems are related to this, but hopefully it helps someone:
    -ian
    When Secure Sockets Layer (SSL) is enabled, using the ActiveX control to print reports from a Crystal 10 DHTML viewer results in the following error message:
    "A communication error occurred, printing will be stopped."
    How can this error message be resolved?
    Resolution
    This is a known issue with Crystal Reports 10 and Crystal Enterprise 10 viewers and has been tracked. The Track ID is ADAPT00282199.
    This error occurs due to the receiving application performing a case-sensitive check for the HTTPS request header value "ON". When a sender application sends the value as "on" in lower case, the error occurs. The update below changes the receiving application to be case-insensitive.
    Hot Fixes or Service Packs address this issue as indicated below. With the updates, this issue is resolved.
    Unless indicated otherwise, Weekly Hot Fix updates from our FTP site have only been tested with English versions of products.
    For Crystal Reports 10 and Crystal Enterprise 10, the update for this issue is included in the Crystal 10 Viewers Weekly Hot Fix (WHF). This is available in English only at the following location:
    ftp://ftp.crystaldecisions.com/outgoing/EHF/viewers10win_en.zip
    This issue is addressed in the following components (and later versions):
    PageObjectModel.dll, version 10.0.5.785, dated 8/25/2004
    ReportRenderer.dll, version 10.0.5.785, dated 8/25/2004
    WebReporting.dll, version 10.0.5.785, dated 8/25/2004

  • Plz increase performance of this report

    hi all
    i want to know how can i improve the performance of my report.
    the code is given below and it takes so much time on production even for single record
    plz help
    HERE COMES THE CODE
    *& Report  ZGRSTATUS
    REPORT  ZGRSTATUS.
    TYPE-POOLS slis.
    TABLES: mseg, qamb, mkpf, rseg.
    DATA : BEGIN OF itab OCCURS 0,
           mblnr LIKE mseg-mblnr,
           zeile LIKE mseg-zeile,
           uom LIKE mseg-erfme,
           matnr LIKE mseg-matnr,
           recqty LIKE mseg-erfmg,
           qcins LIKE mseg-insmk,               "INSPECTION SIGN
           ebeln LIKE mseg-ebeln,
           ebelp LIKE mseg-ebelp,
           lifnr LIKE mseg-lifnr,
           budat LIKE mkpf-budat,
           txz01 LIKE ekpo-txz01,
           name1 LIKE lfa1-name1,
           accqty LIKE mseg-erfmg,
           rejqty LIKE mseg-erfmg,
           belnr LIKE rseg-belnr,
           dqty LIKE mseg-menge,
           cqty LIKE mseg-menge,
           qcdat like mkpf-budat,
           miro_budat like rbkp-budat,
           accuom like mseg-erfme,
           rejuom like mseg-erfme,
           qcstat like mseg-insmk,
           acstat(1) type c,
           crnote(1) type c,
           END OF itab.
    DATA : BEGIN OF itab1 OCCURS 0,
           mblnr LIKE mseg-mblnr,
           zeile LIKE mseg-zeile,
           mjahr LIKE mseg-mjahr,
           prueflos like qamb-prueflos,
           END OF itab1.
    DATA: BEGIN OF imiro OCCURS 0,
          belnr LIKE rseg-belnr,
          lfbnr LIKE rseg-lfbnr,              "DOCMENT NO SAME AS MBLRN
          shkzg LIKE rseg-shkzg,              "DEBIT CREDIT SIGN
          menge LIKE rseg-menge,
          ebeln LIKE rseg-ebeln,
          ebelp LIKE rseg-ebelp,
          budat LIKE rbkp-budat,
          END OF imiro.
    data: begin of iins occurs 0,             "NEW INTERNAL TABLE DECLARED for inspection lot numbers
          mblnr like mseg-mblnr,
          zeile like mseg-zeile,
          prueflos like qamb-prueflos,
          mjahr like qamb-mjahr,
          end of iins.
    ****************************CODE FOR SELECTION SCREEN****************************
    selection-screen begin of block par1 WITH FRAME TITLE TEXT-001.
    PARAMETERS : plant LIKE mseg-werks OBLIGATORY DEFAULT 'MFPL'.
    PARAMETERS: year LIKE mseg-mjahr OBLIGATORY DEFAULT '2007'.
    SELECT-OPTIONS : grno FOR mseg-mblnr,
                     grdate FOR mkpf-budat,
                     vendor FOR mseg-lifnr,
                     item for mseg-matnr.
    SELECTION-SCREEN END OF BLOCK par1.
    ***************************END OF CODE FOR SELECTION SCREEN**********************
    *************************FETCHING OF GR INFORMATION FROM MSEG AND MKPF*************************
    SELECT amblnr zeile aerfme amatnr aerfmg ainsmk aebeln aebelp alifnr bbudat ctxz01 d~name1
    FROM mseg AS a
    INNER JOIN mkpf AS b ON amblnr = bmblnr AND amjahr = bmjahr
    INNER JOIN ekpo AS c ON aebeln = cebeln AND aebelp = cebelp
    INNER JOIN lfa1 as d ON dlifnr = alifnr
    INTO TABLE itab
    WHERE awerks = plant AND amblnr IN grno AND bwart = '101' AND a~mjahr = year
    AND btcode2 = 'MIGO_GR' AND bbudat IN grdate AND alifnr IN vendor and amatnr IN item.
    *************************END OF RETERIEVEL***************************************
    if sy-subrc <> 0.
      Message 'NO RECORD FOUND' type 'E'.
    endif.
    *******************************SELECTING THE INSPECTED DOC NUMBERS AND CORROSPONDING INSPECTION LOT********************************
    select mblnr zeile mjahr prueflos
    from qamb into table itab1  for all entries in itab where mblnr = itab-mblnr and zeile = itab-zeile.
    **********************************END OF SELECTING THE INSPECTED DOC. NUMBERS & INSPECTION LOTS************************************
    **************************SELECTING THE DOC NO FOR ACCEPTED AND REJECTED QTY ACCORDING TO INSPECTION LOT***************************
    select mblnr zeile prueflos mjahr into table iins from qamb
      for all entries in itab1 where prueflos = itab1-prueflos and mblnr <> itab1-mblnr.
    **************************END OF SELECTING ACCEPTED AND REJECTED QTY DOCUMENTS****************************************************
    **********************************SELECTING THE DEBIT AND CREDIT QTY FOR THE MIRO TCODE*******************************************
    SELECT abelnr lfbnr shkzg menge ebeln ebelp bbudat INTO table imiro
        FROM rseg as a
        inner join rbkp as b on abelnr = bbelnr
        for all entries in itab where a~lfbnr = itab-mblnr.
    DATA : v_qcidoc LIKE qamb-prueflos,
           v_qcdoc LIKE mseg-mblnr,
           v_qcdoc1 LIKE mseg-zeile,
           v_qty LIKE mseg-menge,
           v_bwart LIKE mseg-bwart,
           v_name1 LIKE lfa1-name1,
           v_budat like mkpf-budat,
           v_newrejqty like mseg-menge,
           v_newaccqty like mseg-menge,
           CMPACCQTY LIKE MSEG-MENGE,
           CMPREJQTY LIKE MSEG-MENGE,
           aa TYPE c.
    data: begin of iartab occurs 0,
          mblnr like mseg-mblnr,
          bwart like mseg-bwart,
          qty like mseg-menge,
          erfme like mseg-erfme,
          zeile like mseg-zeile,
          budat like mkpf-budat,
          end of iartab.
    clear iartab.
    refresh iartab.
    ****************************************table for accept and reject qty************************************
    SELECT a~mblnr bwart erfmg erfme zeile budat into table iartab
      FROM mseg as a
      inner join mkpf as b on amblnr = bmblnr
      for all entries in iins
      WHERE amblnr = iins-mblnr AND azeile = iins-zeile AND xauto <> 'X' AND a~mjahr = iins-mjahr.
    ******************************************END OF ACCEPT AND REJECTED QTY.***********************************
    LOOP AT itab.
    clear: itab-accuom, itab-rejuom.
    SELECT SINGLE name1 FROM lfa1 INTO itab-name1 WHERE lifnr = itab-lifnr.
         **********************GETTING THE ACCEPTED AND REJECTED QTY FROM MSEG FOR ALL RECORDS OF ITAB*********************
      IF itab-qcins = 'X'.
      clear v_qcidoc.
      clear: v_bwart, v_qty, v_budat.
      read table itab1 with key mblnr = itab-mblnr zeile = itab-zeile.
        if sy-subrc = 0.
          v_qcidoc = itab1-prueflos.
        endif.
       LOOP AT itab1 where prueflos = v_qcidoc and mblnr <> itab-mblnr .
         LOOP AT iins where prueflos = v_qcidoc. " and mblnr <> itab-mblnr .
          v_qty = 0.
         SELECT single bwart erfmg budat
           INTO (v_bwart, v_qty, v_budat)
           FROM mseg as a
           inner join mkpf as b on amblnr = bmblnr
           WHERE amblnr = itab1-mblnr AND azeile = itab1-zeile AND xauto <> 'X' AND a~mjahr = itab1-mjahr.
           WHERE amblnr = iins-mblnr AND azeile = iins-zeile AND xauto <> 'X' AND a~mjahr = iins-mjahr.
          read table iartab with key mblnr = iins-mblnr zeile = iins-zeile.
          if sy-subrc = 0.
            v_bwart = iartab-bwart.
            v_qty = iartab-qty.
            v_budat = iartab-budat.
          endif.
          IF v_bwart = '321'.
            v_newaccqty = v_newaccqty + v_qty.
            itab-accqty = v_newaccqty.
            itab-qcdat = v_budat.
            itab-accuom = iartab-erfme.
          ELSEIF v_bwart = '122'.
            itab-qcdat = v_budat.
            v_newrejqty = v_newrejqty + v_qty.
            itab-rejqty = v_newrejqty.
            itab-rejuom = iartab-erfme.
          ENDIF.
        ENDLOOP.        "*********END OF LOOP FOR ITAB1**************
            clear: v_newaccqty, v_newrejqty.
      ENDIF.    "**********END OF MAIN ENDIF***********************
             *****************END OF CODE FOR ACCEPTED AND REJECTED QTY************************************
         ****************************GETTING DEBIT AND CREDIT QTY******************************************
      LOOP AT imiro WHERE lfbnr = itab-mblnr AND ebeln = itab-ebeln AND ebelp = itab-ebelp.
        ITAB-MIRO_BUDAT = IMIRO-BUDAT.
        itab-belnr = imiro-belnr.
        IF imiro-shkzg = 'S'.
          itab-dqty = imiro-menge.
        ELSEIF imiro-shkzg = 'H'.
          itab-cqty = imiro-menge.
        ENDIF.
      ENDLOOP.
         *****************************END OF CODE FOR DEBIT AND CREDIT QTY*******************************
      data v_sumqty like mseg-menge.
      CLEAR V_SUMQTY.
      if itab-qcins = 'X'.
      clear: cmpaccqty, cmprejqty.
      cmpaccqty = itab-accqty.
      cmprejqty = itab-rejqty.
        IF ITAB-UOM <> ITAB-ACCUOM AND ITAB-ACCUOM <> SPACE.
          CALL FUNCTION 'ZCONVERT_UOM_QTY'
           EXPORTING
             P_FR_UOM       = ITAB-UOM
             P_TO_UOM       = ITAB-ACCUOM
             P_QTY          = ITAB-ACCQTY
           IMPORTING
             P_RETVAL       = CMPACCQTY.
         ELSEIF ITAB-UOM <> ITAB-REJUOM AND ITAB-REJUOM <> SPACE.
           CALL FUNCTION 'ZCONVERT_UOM_QTY'
             EXPORTING
               P_FR_UOM       = ITAB-UOM
               P_TO_UOM       = ITAB-REJUOM
               P_QTY          = ITAB-REJQTY
             IMPORTING
               P_RETVAL       = CMPREJQTY.
         ENDIF.
        v_sumqty = CMPACCQTY + CMPREJQTY.
        if ( v_sumqty = itab-recqty ).
          itab-qcstat = 'C'.
          modify itab.
        ELSE.
          ITAB-QCSTAT = 'P'.
        endif.
      ELSE.
        ITAB-QCSTAT = 'C'.
      endif.
    IF ITAB-QCSTAT = 'C'.
      IF ITAB-DQTY = ITAB-RECQTY.
        ITAB-ACSTAT = 'C'.
      ELSE.
        ITAB-ACSTAT = 'P'.
      ENDIF.
    ELSEIF ITAB-QCSTAT = 'P'.
      IF ITAB-RECQTY = ITAB-DQTY.
        ITAB-ACSTAT = 'O'.
      ENDIF.
    ENDIF.
    IF ITAB-REJQTY > 0.
      IF ITAB-ACSTAT = 'C' AND ITAB-REJQTY > ITAB-CQTY.
        ITAB-CRNOTE = 'P'.
      ELSEIF ITAB-ACSTAT = 'C' AND ITAB-REJQTY < ITAB-CQTY.
        ITAB-CRNOTE = 'W'.
      ELSEIF ITAB-ACSTAT = 'C' AND ITAB-REJQTY = ITAB-CQTY.
        ITAB-CRNOTE = 'C'.
      ENDIF.
    ELSE.
      ITAB-CRNOTE = 'N'.
    ENDIF.
    MODIFY itab.
    ENDLOOP.    "*********************************************"END OF MAINT LOOP FOR ITAB.***********************
    DATA: it_fieldcat TYPE slis_t_fieldcat_alv,
          wa_fieldcat TYPE slis_fieldcat_alv,
          wa_layout TYPE slis_layout_alv.
    PERFORM f_layout.
    PERFORM f_fieldcat.
    PERFORM display.
    *&      Form  F_LAYOUT
          text
    FORM f_layout.
      wa_layout-colwidth_optimize = 'X'.
      wa_layout-no_subchoice = 'X'.
      wa_layout-zebra = 'X'.
    ENDFORM.                    "F_LAYOUT
    *&      Form  F_FIELDCAT
          text
    FORM f_fieldcat.
      DATA wa_col TYPE i VALUE 1.
      wa_fieldcat-col_pos = wa_col + 1.
      wa_fieldcat-seltext_l = 'GR. NO'.
      wa_fieldcat-fieldname = 'MBLNR'.
      wa_fieldcat-tabname = itab.
      APPEND wa_fieldcat TO it_fieldcat.
      CLEAR wa_fieldcat.
      wa_fieldcat-col_pos = wa_col + 1.
      wa_fieldcat-seltext_l = 'GR DATE'.
      wa_fieldcat-fieldname = 'BUDAT'.
      wa_fieldcat-tabname = itab.
      APPEND wa_fieldcat TO it_fieldcat.
      CLEAR wa_fieldcat.
      wa_fieldcat-col_pos = wa_col + 1.
      wa_fieldcat-seltext_l = 'PO NO'.
      wa_fieldcat-fieldname = 'EBELN'.
      wa_fieldcat-tabname = itab.
      APPEND wa_fieldcat TO it_fieldcat.
      CLEAR wa_fieldcat.
      wa_fieldcat-col_pos = wa_col + 1.
      wa_fieldcat-no_zero = 'X'.
      wa_fieldcat-seltext_l = 'PARTY ID'.
      wa_fieldcat-fieldname = 'LIFNR'.
      wa_fieldcat-tabname = itab.
      APPEND wa_fieldcat TO it_fieldcat.
      CLEAR wa_fieldcat.
      wa_fieldcat-col_pos = wa_col + 1.
      wa_fieldcat-seltext_l = 'PARTY NAME'.
      wa_fieldcat-fieldname = 'NAME1'.
      wa_fieldcat-tabname = itab.
      APPEND wa_fieldcat TO it_fieldcat.
      CLEAR wa_fieldcat.
      wa_fieldcat-col_pos = wa_col + 1.
      wa_fieldcat-no_zero = 'X'.
      wa_fieldcat-outputlen = '18'.
      wa_fieldcat-seltext_l = 'ITEM ID'.
      wa_fieldcat-fieldname = 'MATNR'.
      wa_fieldcat-tabname = itab.
      APPEND wa_fieldcat TO it_fieldcat.
      CLEAR wa_fieldcat.
      wa_fieldcat-col_pos = wa_col + 1.
      wa_fieldcat-seltext_l = 'DESCRIPTION'.
      wa_fieldcat-fieldname = 'TXZ01'.
      wa_fieldcat-tabname = itab.
      APPEND wa_fieldcat TO it_fieldcat.
      CLEAR wa_fieldcat.
      wa_fieldcat-col_pos = wa_col + 1.
      wa_fieldcat-seltext_l = 'UOM'.
      wa_fieldcat-fieldname = 'UOM'.
      wa_fieldcat-tabname = itab.
      APPEND wa_fieldcat TO it_fieldcat.
      CLEAR wa_fieldcat.
      wa_fieldcat-col_pos = wa_col + 1.
      wa_fieldcat-seltext_l = 'INS REQ'.
      wa_fieldcat-fieldname = 'QCINS'.
      wa_fieldcat-tabname = itab.
      APPEND wa_fieldcat TO it_fieldcat.
      CLEAR wa_fieldcat.
      wa_fieldcat-col_pos = wa_col + 1.
      wa_fieldcat-no_zero = 'X'.
      wa_fieldcat-seltext_l = 'GR QTY'.
      wa_fieldcat-fieldname = 'RECQTY'.
      wa_fieldcat-tabname = itab.
      APPEND wa_fieldcat TO it_fieldcat.
      CLEAR wa_fieldcat.
      wa_fieldcat-col_pos = wa_col + 1.
      wa_fieldcat-seltext_l = 'QC DATE'.
      wa_fieldcat-fieldname = 'QCDAT'.
      wa_fieldcat-tabname = itab.
      APPEND wa_fieldcat TO it_fieldcat.
      CLEAR wa_fieldcat.
      wa_fieldcat-col_pos = wa_col + 1.
      wa_fieldcat-no_zero = 'X'.
      wa_fieldcat-seltext_l = 'ACC QTY'.
      wa_fieldcat-fieldname = 'ACCQTY'.
      wa_fieldcat-tabname = itab.
      APPEND wa_fieldcat TO it_fieldcat.
      CLEAR wa_fieldcat.
      wa_fieldcat-col_pos = wa_col + 1.
      wa_fieldcat-no_zero = 'X'.
      wa_fieldcat-seltext_l = 'ACC UOM'.
      wa_fieldcat-fieldname = 'ACCUOM'.
      wa_fieldcat-tabname = itab.
      APPEND wa_fieldcat TO it_fieldcat.
      CLEAR wa_fieldcat.
      wa_fieldcat-col_pos = wa_col + 1.
      wa_fieldcat-no_zero = 'X'.
      wa_fieldcat-seltext_l = 'REJ QTY'.
      wa_fieldcat-fieldname = 'REJQTY'.
      wa_fieldcat-tabname = itab.
      APPEND wa_fieldcat TO it_fieldcat.
      CLEAR wa_fieldcat.
      wa_fieldcat-col_pos = wa_col + 1.
      wa_fieldcat-no_zero = 'X'.
      wa_fieldcat-seltext_l = 'REJ UOM'.
      wa_fieldcat-fieldname = 'REJUOM'.
      wa_fieldcat-tabname = itab.
      APPEND wa_fieldcat TO it_fieldcat.
      CLEAR wa_fieldcat.
      wa_fieldcat-col_pos = wa_col + 1.
      wa_fieldcat-seltext_l = 'MIRO NO'.
      wa_fieldcat-fieldname = 'BELNR'.
      wa_fieldcat-tabname = itab.
      APPEND wa_fieldcat TO it_fieldcat.
      CLEAR wa_fieldcat.
      wa_fieldcat-col_pos = wa_col + 1.
      wa_fieldcat-seltext_l = 'MIRO DATE'.
      wa_fieldcat-fieldname = 'MIRO_BUDAT'.
      wa_fieldcat-tabname = itab.
      APPEND wa_fieldcat TO it_fieldcat.
      CLEAR wa_fieldcat.
      wa_fieldcat-col_pos = wa_col + 1.
      wa_fieldcat-no_zero = 'X'.
      wa_fieldcat-seltext_l = 'DB.QTY'.
      wa_fieldcat-fieldname = 'DQTY'.
      wa_fieldcat-tabname = itab.
      APPEND wa_fieldcat TO it_fieldcat.
      CLEAR wa_fieldcat.
      wa_fieldcat-col_pos = wa_col + 1.
      wa_fieldcat-no_zero = 'X'.
      wa_fieldcat-seltext_l = 'CR.QTY'.
      wa_fieldcat-fieldname = 'CQTY'.
      wa_fieldcat-tabname = itab.
      APPEND wa_fieldcat TO it_fieldcat.
      CLEAR wa_fieldcat.
      wa_fieldcat-col_pos = wa_col + 1.
      wa_fieldcat-seltext_l = 'QC STATUS'.
      wa_fieldcat-fieldname = 'QCSTAT'.
      wa_fieldcat-tabname = itab.
      APPEND wa_fieldcat to it_fieldcat.
      clear wa_fieldcat.
      wa_fieldcat-col_pos = wa_col + 1.
      wa_fieldcat-seltext_l = 'A/C STATUS'.
      wa_fieldcat-fieldname = 'ACSTAT'.
      wa_fieldcat-tabname = itab.
      APPEND wa_fieldcat to it_fieldcat.
      clear wa_fieldcat.
      wa_fieldcat-col_pos = wa_col + 1.
      wa_fieldcat-seltext_l = 'CR NOTE STATUS'.
      wa_fieldcat-fieldname = 'CRNOTE'.
      wa_fieldcat-tabname = itab.
      APPEND wa_fieldcat to it_fieldcat.
      clear wa_fieldcat.
    ENDFORM.                    "F_FIELDCAT
    *&      Form  DISPLAY
          text
    FORM display.
      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
        EXPORTING
          i_callback_program = sy-repid
          is_layout          = wa_layout
          I_CALLBACK_USER_COMMAND  = 'HANDLE_USER_COMMAND'
          it_fieldcat        = it_fieldcat
        TABLES
          t_outtab           = itab.
    ENDFORM.                    "DISPLAY
    FORM HANDLE_USER_COMMAND USING R_UCOMM     LIKE SY-UCOMM
                                 RS_SELFIELD TYPE SLIS_SELFIELD.
       CASE R_UCOMM.
        WHEN '&IC1'.
        clear itab-ebeln.
          IF RS_SELFIELD-FIELDNAME = 'EBELN'.
            READ TABLE ITAB INDEX RS_SELFIELD-TABINDEX.
            SET PARAMETER ID 'BES' FIELD ITAB-EBELN.
            call transaction 'ME23N' AND SKIP FIRST SCREEN.
            CLEAR RS_SELFIELD.
          ELSEIF RS_SELFIELD-FIELDNAME = 'MBLNR'.
            READ TABLE ITAB INDEX RS_SELFIELD-TABINDEX.
            SET PARAMETER ID 'MBN' FIELD ITAB-MBLNR.
            SET PARAMETER ID 'MJA' FIELD year.
            call transaction 'MIGO' AND SKIP FIRST SCREEN.
            CLEAR RS_SELFIELD.
          ENDIF.
      ENDCASE.
    ENDFORM.                    "HANDLE_USER_COMMAND

    Ways of Performance Tuning
    1.     Selection Criteria
    2.     Select Statements
    •     Select Queries
    •     SQL Interface
    •     Aggregate Functions
    •     For all Entries
    Select Over more than one internal table
    Selection Criteria
    1.     Restrict the data to the selection criteria itself, rather than filtering it out using the ABAP code using CHECK statement. 
    2.     Select with selection list.
    SELECT * FROM SBOOK INTO SBOOK_WA.
      CHECK: SBOOK_WA-CARRID = 'LH' AND
             SBOOK_WA-CONNID = '0400'.
    ENDSELECT.
    The above code can be much more optimized by the code written below which avoids CHECK, selects with selection list
    SELECT  CARRID CONNID FLDATE BOOKID FROM SBOOK INTO TABLE T_SBOOK
      WHERE SBOOK_WA-CARRID = 'LH' AND
                  SBOOK_WA-CONNID = '0400'.
    Select Statements   Select Queries
    1.     Avoid nested selects
    SELECT * FROM EKKO INTO EKKO_WA.
      SELECT * FROM EKAN INTO EKAN_WA
          WHERE EBELN = EKKO_WA-EBELN.
      ENDSELECT.
    ENDSELECT.
    The above code can be much more optimized by the code written below.
    SELECT PF1 PF2 FF3 FF4 INTO TABLE ITAB
        FROM EKKO AS P INNER JOIN EKAN AS F
          ON PEBELN = FEBELN.
    Note: A simple SELECT loop is a single database access whose result is passed to the ABAP program line by line. Nested SELECT loops mean that the number of accesses in the inner loop is multiplied by the number of accesses in the outer loop. One should therefore use nested SELECT loops only if the selection in the outer loop contains very few lines or the outer loop is a SELECT SINGLE statement.
    2.     Select all the records in a single shot using into table clause of select statement rather than to use Append statements.
    SELECT * FROM SBOOK INTO SBOOK_WA.
      CHECK: SBOOK_WA-CARRID = 'LH' AND
             SBOOK_WA-CONNID = '0400'.
    ENDSELECT.
    The above code can be much more optimized by the code written below which avoids CHECK, selects with selection list and puts the data in one shot using into table
    SELECT  CARRID CONNID FLDATE BOOKID FROM SBOOK INTO TABLE T_SBOOK
      WHERE SBOOK_WA-CARRID = 'LH' AND
                  SBOOK_WA-CONNID = '0400'.
    3.     When a base table has multiple indices, the where clause should be in the order of the index, either a primary or a secondary index.
    To choose an index, the optimizer checks the field names specified in the where clause and then uses an index that has the same order of the fields. In certain scenarios, it is advisable to check whether a new index can speed up the performance of a program. This will come handy in programs that access data from the finance tables.
    4.     For testing existence, use Select.. Up to 1 rows statement instead of a Select-Endselect-loop with an Exit. 
    SELECT * FROM SBOOK INTO SBOOK_WA
      UP TO 1 ROWS
      WHERE CARRID = 'LH'.
    ENDSELECT.
    The above code is more optimized as compared to the code mentioned below for testing existence of a record.
    SELECT * FROM SBOOK INTO SBOOK_WA
        WHERE CARRID = 'LH'.
      EXIT.
    ENDSELECT.
    5.     Use Select Single if all primary key fields are supplied in the Where condition .
    If all primary key fields are supplied in the Where conditions you can even use Select Single.
    Select Single requires one communication with the database system, whereas Select-Endselect needs two.
    Select Statements SQL Interface
    1.     Use column updates instead of single-row updates
    to update your database tables.
    SELECT * FROM SFLIGHT INTO SFLIGHT_WA.
      SFLIGHT_WA-SEATSOCC =
        SFLIGHT_WA-SEATSOCC - 1.
      UPDATE SFLIGHT FROM SFLIGHT_WA.
    ENDSELECT.
    The above mentioned code can be more optimized by using the following code
    UPDATE SFLIGHT
           SET SEATSOCC = SEATSOCC - 1.
    2.     For all frequently used Select statements, try to use an index.
    SELECT * FROM SBOOK CLIENT SPECIFIED INTO SBOOK_WA
      WHERE CARRID = 'LH'
        AND CONNID = '0400'.
    ENDSELECT.
    The above mentioned code can be more optimized by using the following code
    SELECT * FROM SBOOK CLIENT SPECIFIED INTO SBOOK_WA
      WHERE MANDT IN ( SELECT MANDT FROM T000 )
        AND CARRID = 'LH'
        AND CONNID = '0400'.
    ENDSELECT.
    3.     Using buffered tables improves the performance considerably.
    Bypassing the buffer increases the network considerably
    SELECT SINGLE * FROM T100 INTO T100_WA
      BYPASSING BUFFER
      WHERE     SPRSL = 'D'
            AND ARBGB = '00'
            AND MSGNR = '999'.
    The above mentioned code can be more optimized by using the following code
    SELECT SINGLE * FROM T100  INTO T100_WA
      WHERE     SPRSL = 'D'
            AND ARBGB = '00'
            AND MSGNR = '999'.
    Select Statements  Aggregate Functions
    •     If you want to find the maximum, minimum, sum and average value or the count of a database column, use a select list with aggregate functions instead of computing the aggregates yourself.
    Some of the Aggregate functions allowed in SAP are  MAX, MIN, AVG, SUM, COUNT, COUNT( * )
    Consider the following extract.
                Maxno = 0.
                Select * from zflight where airln = ‘LF’ and cntry = ‘IN’.
                 Check zflight-fligh > maxno.
                 Maxno = zflight-fligh.
                Endselect.
    The  above mentioned code can be much more optimized by using the following code.
    Select max( fligh ) from zflight into maxno where airln = ‘LF’ and cntry = ‘IN’.
    Select Statements  For All Entries
    •     The for all entries creates a where clause, where all the entries in the driver table are combined with OR. If the number of entries in the driver table is larger than rsdb/max_blocking_factor, several similar SQL statements are executed to limit the length of the WHERE clause.
         The plus
    •     Large amount of data
    •     Mixing processing and reading of data
    •     Fast internal reprocessing of data
    •     Fast
         The Minus
    •     Difficult to program/understand
    •     Memory could be critical (use FREE or PACKAGE size)
    Points to be must considered FOR ALL ENTRIES
    •     Check that data is present in the driver table
    •     Sorting the driver table
    •     Removing duplicates from the driver table
    Consider the following piece of extract
              Loop at int_cntry.
      Select single * from zfligh into int_fligh
      where cntry = int_cntry-cntry.
      Append int_fligh.
                          Endloop.
    The above mentioned can be more optimized by using the following code.
    Sort int_cntry by cntry.
    Delete adjacent duplicates from int_cntry.
    If NOT int_cntry[] is INITIAL.
                Select * from zfligh appending table int_fligh
                For all entries in int_cntry
                Where cntry = int_cntry-cntry.
    Endif.
    Select Statements Select Over more than one Internal table
    1.     Its better to use a views instead of nested Select statements.
    SELECT * FROM DD01L INTO DD01L_WA
      WHERE DOMNAME LIKE 'CHAR%'
            AND AS4LOCAL = 'A'.
      SELECT SINGLE * FROM DD01T INTO DD01T_WA
        WHERE   DOMNAME    = DD01L_WA-DOMNAME
            AND AS4LOCAL   = 'A'
            AND AS4VERS    = DD01L_WA-AS4VERS
            AND DDLANGUAGE = SY-LANGU.
    ENDSELECT.
    The above code can be more optimized by extracting all the data from view DD01V_WA
    SELECT * FROM DD01V INTO  DD01V_WA
      WHERE DOMNAME LIKE 'CHAR%'
            AND DDLANGUAGE = SY-LANGU.
    ENDSELECT
    2.     To read data from several logically connected tables use a join instead of nested Select statements. Joins are preferred only if all the primary key are available in WHERE clause for the tables that are joined. If the primary keys are not provided in join the Joining of tables itself takes time.
    SELECT * FROM EKKO INTO EKKO_WA.
      SELECT * FROM EKAN INTO EKAN_WA
          WHERE EBELN = EKKO_WA-EBELN.
      ENDSELECT.
    ENDSELECT.
    The above code can be much more optimized by the code written below.
    SELECT PF1 PF2 FF3 FF4 INTO TABLE ITAB
        FROM EKKO AS P INNER JOIN EKAN AS F
          ON PEBELN = FEBELN.
    3.     Instead of using nested Select loops it is often better to use subqueries.
    SELECT * FROM SPFLI
      INTO TABLE T_SPFLI
      WHERE CITYFROM = 'FRANKFURT'
        AND CITYTO = 'NEW YORK'.
    SELECT * FROM SFLIGHT AS F
        INTO SFLIGHT_WA
        FOR ALL ENTRIES IN T_SPFLI
        WHERE SEATSOCC < F~SEATSMAX
          AND CARRID = T_SPFLI-CARRID
          AND CONNID = T_SPFLI-CONNID
          AND FLDATE BETWEEN '19990101' AND '19990331'.
    ENDSELECT.
    The above mentioned code can be even more optimized by using subqueries instead of for all entries.
    SELECT * FROM SFLIGHT AS F INTO SFLIGHT_WA
        WHERE SEATSOCC < F~SEATSMAX
          AND EXISTS ( SELECT * FROM SPFLI
                         WHERE CARRID = F~CARRID
                           AND CONNID = F~CONNID
                           AND CITYFROM = 'FRANKFURT'
                           AND CITYTO = 'NEW YORK' )
          AND FLDATE BETWEEN '19990101' AND '19990331'.
    ENDSELECT.
    1.     Table operations should be done using explicit work areas rather than via header lines.
    READ TABLE ITAB INTO WA WITH KEY K = 'X‘ BINARY SEARCH.
    IS MUCH FASTER THAN USING
    READ TABLE ITAB INTO WA WITH KEY K = 'X'.
    If TAB has n entries, linear search runs in O( n ) time, whereas binary search takes only O( log2( n ) ).
    2.     Always try to use binary search instead of linear search. But don’t forget to sort your internal table before that.
    READ TABLE ITAB INTO WA WITH KEY K = 'X'. IS FASTER THAN USING
    READ TABLE ITAB INTO WA WITH KEY (NAME) = 'X'.
    3.     A dynamic key access is slower than a static one, since the key specification must be evaluated at runtime.
    4.     A binary search using secondary index takes considerably less time.
    5.     LOOP ... WHERE is faster than LOOP/CHECK because LOOP ... WHERE evaluates the specified condition internally.
    LOOP AT ITAB INTO WA WHERE K = 'X'.
    ENDLOOP.
    The above code is much faster than using
    LOOP AT ITAB INTO WA.
      CHECK WA-K = 'X'.
    ENDLOOP.
    6.     Modifying selected components using “ MODIFY itab …TRANSPORTING f1 f2.. “ accelerates the task of updating  a line of an internal table.
    WA-DATE = SY-DATUM.
    MODIFY ITAB FROM WA INDEX 1 TRANSPORTING DATE.
    The above code is more optimized as compared to
    WA-DATE = SY-DATUM.
    MODIFY ITAB FROM WA INDEX 1.
    7.     Accessing the table entries directly in a "LOOP ... ASSIGNING ..." accelerates the task of updating a set of lines of an internal table considerably
    Modifying selected components only makes the program faster as compared to Modifying all lines completely.
    e.g,
    LOOP AT ITAB ASSIGNING <WA>.
      I = SY-TABIX MOD 2.
      IF I = 0.
        <WA>-FLAG = 'X'.
      ENDIF.
    ENDLOOP.
    The above code works faster as compared to
    LOOP AT ITAB INTO WA.
      I = SY-TABIX MOD 2.
      IF I = 0.
        WA-FLAG = 'X'.
        MODIFY ITAB FROM WA.
      ENDIF.
    ENDLOOP.
    8.    If collect semantics is required, it is always better to use to COLLECT rather than READ BINARY and then ADD.
    LOOP AT ITAB1 INTO WA1.
      READ TABLE ITAB2 INTO WA2 WITH KEY K = WA1-K BINARY SEARCH.
      IF SY-SUBRC = 0.
        ADD: WA1-VAL1 TO WA2-VAL1,
             WA1-VAL2 TO WA2-VAL2.
        MODIFY ITAB2 FROM WA2 INDEX SY-TABIX TRANSPORTING VAL1 VAL2.
      ELSE.
        INSERT WA1 INTO ITAB2 INDEX SY-TABIX.
      ENDIF.
    ENDLOOP.
    The above code uses BINARY SEARCH for collect semantics. READ BINARY runs in O( log2(n) ) time. The above piece of code can be more optimized by
    LOOP AT ITAB1 INTO WA.
      COLLECT WA INTO ITAB2.
    ENDLOOP.
    SORT ITAB2 BY K.
    COLLECT, however, uses a hash algorithm and is therefore independent
    of the number of entries (i.e. O(1)) .
    9.    "APPEND LINES OF itab1 TO itab2" accelerates the task of appending a table to another table considerably as compared to “ LOOP-APPEND-ENDLOOP.”
    APPEND LINES OF ITAB1 TO ITAB2.
    This is more optimized as compared to
    LOOP AT ITAB1 INTO WA.
      APPEND WA TO ITAB2.
    ENDLOOP.
    10.   “DELETE ADJACENT DUPLICATES“ accelerates the task of deleting duplicate entries considerably as compared to “ READ-LOOP-DELETE-ENDLOOP”.
    DELETE ADJACENT DUPLICATES FROM ITAB COMPARING K.
    This is much more optimized as compared to
    READ TABLE ITAB INDEX 1 INTO PREV_LINE.
    LOOP AT ITAB FROM 2 INTO WA.
      IF WA = PREV_LINE.
        DELETE ITAB.
      ELSE.
        PREV_LINE = WA.
      ENDIF.
    ENDLOOP.
    11.   "DELETE itab FROM ... TO ..." accelerates the task of deleting a sequence of lines considerably as compared to “  DO -DELETE-ENDDO”.
    DELETE ITAB FROM 450 TO 550.
    This is much more optimized as compared to
    DO 101 TIMES.
      DELETE ITAB INDEX 450.
    ENDDO.
    12.   Copying internal tables by using “ITAB2[ ] = ITAB1[ ]” as compared to “LOOP-APPEND-ENDLOOP”.
    ITAB2[] = ITAB1[].
    This is much more optimized as compared to
    REFRESH ITAB2.
    LOOP AT ITAB1 INTO WA.
      APPEND WA TO ITAB2.
    ENDLOOP.
    13.   Specify the sort key as restrictively as possible to run the program faster.
    “SORT ITAB BY K.” makes the program runs faster as compared to “SORT ITAB.”
    Internal Tables         contd…
    Hashed and Sorted tables
    1.     For single read access hashed tables are more optimized as compared to sorted tables.
    2.      For partial sequential access sorted tables are more optimized as compared to hashed tables
    Hashed And Sorted Tables
    Point # 1
    Consider the following example where HTAB is a hashed table and STAB is a sorted table
    DO 250 TIMES.
      N = 4 * SY-INDEX.
      READ TABLE HTAB INTO WA WITH TABLE KEY K = N.
      IF SY-SUBRC = 0.
      ENDIF.
    ENDDO.
    This runs faster for single read access as compared to the following same code for sorted table
    DO 250 TIMES.
      N = 4 * SY-INDEX.
      READ TABLE STAB INTO WA WITH TABLE KEY K = N.
      IF SY-SUBRC = 0.
      ENDIF.
    ENDDO.
    Point # 2
    Similarly for Partial Sequential access the STAB runs faster as compared to HTAB
    LOOP AT STAB INTO WA WHERE K = SUBKEY.
    ENDLOOP.
    This runs faster as compared to
    LOOP AT HTAB INTO WA WHERE K = SUBKEY.
    ENDLOOP.

  • Interactive report over db_link never comes back

    Hi,
    I have an interactive report (over db_links) which takes 20 sec. to run in sql workshop, but it never comes back when I run it as an interactive report! I always get an error page due to timeout.
    Any idea why?
    Thanks.

    Hi
    The interactive report will change the actual SQL executed even if you have no filters, aggregations etc on. If you look at a trace file you will see COUNT OVER() and the apex max row count stuff.
    As the SQL text is different, the optimizer may choose a different execution plan which affects where the different parts of the work is performed (on the local site or the external site). This can change execution times vastly.
    So run a 10046 trace without the interactive report and run one with the interactive report. Once you've done this you can determine the more desirable one and think about putting a
    /*+ DRIVING_SITE(table_name) */hint in the interactive report query.
    Hope this helps.
    Cheers
    Ben
    http://www.munkyben.wordpress.com
    Don't forget to mark replies helpful or correct ;)

  • Performance issue in Report (getting time out error)

    Hi experts,
    I am doing Performance for a Report (getting time out error)
    Please see the code below and .
    while looping internal table IVBAP after 25 minutes its showing  time out error at this poit ->
    SELECT MAX( ERDAT ) .
    please send alternate code for this .
    Advance thanks
    from
    Nagendra
    Get Sales Order Details
    CLEAR IVBAP.
    REFRESH IVBAP.
    SELECT VBELN POSNR MATNR NETWR KWMENG WERKS FROM VBAP
       INTO CORRESPONDING FIELDS OF TABLE IVBAP
         FOR ALL ENTRIES IN IVBAK
           WHERE VBELN =  IVBAK-VBELN
           AND   MATNR IN Z_MATNR
           AND   WERKS IN Z_WERKS
           AND   ABGRU = ' '.
    Check for Obsolete Materials - Get Product Hierarhy/Mat'l Description
      SORT IVBAP BY MATNR WERKS.
      CLEAR: WK_MATNR, WK_WERKS, WK_PRDHA, WK_MAKTX,
             WK_BLOCK, WK_MMSTA, WK_MSTAE.
      LOOP AT IVBAP.
          CLEAR WK_INVDATE.                                   "I6677.sn
          SELECT MAX( ERDAT ) FROM VBRP INTO WK_INVDATE WHERE
          AUBEL EQ IVBAP-VBELN AND
          AUPOS EQ IVBAP-POSNR.
          IF SY-SUBRC = 0.
              MOVE WK_INVDATE TO IVBAP-INVDT.
              MODIFY IVBAP.
          ENDIF.                                               "I6677.e n
          SELECT SINGLE * FROM MBEW WHERE             "I6759.sn
          MATNR EQ IVBAP-MATNR AND
          BWKEY EQ IVBAP-WERKS AND
          BWTAR EQ SPACE.
          IF SY-SUBRC = 0.
             MOVE MBEW-STPRS TO IVBAP-STPRS.
             IVBAP-TOT = MBEW-STPRS * IVBAP-KWMENG.
             MODIFY IVBAP.
          ENDIF.                                      "I6759.en
        IF IVBAP-MATNR NE WK_MATNR OR IVBAP-WERKS NE WK_WERKS.
          CLEAR: WK_BLOCK, WK_MMSTA, WK_MSTAE, WK_PRDHA, WK_MAKTX.
          MOVE IVBAP-MATNR TO WK_MATNR.
          MOVE IVBAP-WERKS TO WK_WERKS.
          SELECT SINGLE MMSTA FROM MARC INTO MARC-MMSTA
            WHERE MATNR = WK_MATNR
            AND   WERKS = WK_WERKS.
          IF NOT MARC-MMSTA IS INITIAL.
            MOVE '*' TO WK_MMSTA.
          ENDIF.
          SELECT SINGLE LVORM PRDHA MSTAE MSTAV FROM MARA
            INTO (MARA-LVORM, MARA-PRDHA, MARA-MSTAE, MARA-MSTAV)
            WHERE MATNR = WK_MATNR.
          IF ( NOT MARA-MSTAE IS INITIAL ) OR
             ( NOT MARA-MSTAV IS INITIAL ) OR
             ( NOT MARA-LVORM IS INITIAL ).
             MOVE '*' TO WK_MSTAE.
          ENDIF.
          MOVE MARA-PRDHA TO WK_PRDHA.
          SELECT SINGLE MAKTX FROM MAKT INTO WK_MAKTX
            WHERE MATNR = WK_MATNR
              AND SPRAS = SY-LANGU.
        ENDIF.
        IF Z_BLOCK EQ 'B'.
          IF WK_MMSTA EQ ' ' AND WK_MSTAE EQ ' '.
            DELETE IVBAP.
            CONTINUE.
          ENDIF.
        ELSEIF Z_BLOCK EQ 'U'.
          IF WK_MMSTA EQ '' OR WK_MSTAE EQ ''.
            DELETE IVBAP.
            CONTINUE.
          ENDIF.
        ELSE.
          IF WK_MMSTA EQ '' OR WK_MSTAE EQ ''.
            MOVE '*' TO WK_BLOCK.
          ENDIF.
        ENDIF.
        IF WK_PRDHA IN Z_PRDHA.                                    "I4792
          MOVE WK_BLOCK TO IVBAP-BLOCK.
          MOVE WK_PRDHA TO IVBAP-PRDHA.
          MOVE WK_MAKTX TO IVBAP-MAKTX.
          MODIFY IVBAP.
        ELSE.                                                     "I4792
          DELETE IVBAP.                                           "I4792
        ENDIF.                                                    "I4792
        IF NOT Z_ALNUM[] IS INITIAL.                              "I9076
          SELECT SINGLE * FROM MAEX                               "I9076
            WHERE MATNR = IVBAP-MATNR                             "I9076
              AND ALNUM IN Z_ALNUM.                               "I9076
          IF SY-SUBRC <> 0.                                       "I9076
            DELETE IVBAP.                                         "I9076
          ENDIF.                                                  "I9076
        ENDIF.                                                    "I9076
      ENDLOOP.

    Hi Nagendra!
    Get Sales Order Details
    CLEAR IVBAP.
    REFRESH IVBAP.
    check ivbak is not initial
    SELECT VBELN POSNR MATNR NETWR KWMENG WERKS FROM VBAP
    INTO CORRESPONDING FIELDS OF TABLE IVBAP
    FOR ALL ENTRIES IN IVBAK
    WHERE VBELN = IVBAK-VBELN
    AND MATNR IN Z_MATNR
    AND WERKS IN Z_WERKS
    AND ABGRU = ' '.
    Check for Obsolete Materials - Get Product Hierarhy/Mat'l Description
    SORT IVBAP BY MATNR WERKS.
    CLEAR: WK_MATNR, WK_WERKS, WK_PRDHA, WK_MAKTX,
    WK_BLOCK, WK_MMSTA, WK_MSTAE.
    avoid select widin loop. instead do selection outside loop.u can use read statement......and then loop if required.
    LOOP AT IVBAP.
    CLEAR WK_INVDATE. "I6677.sn
    SELECT MAX( ERDAT ) FROM VBRP INTO WK_INVDATE WHERE
    AUBEL EQ IVBAP-VBELN AND
    AUPOS EQ IVBAP-POSNR.
    IF SY-SUBRC = 0.
    MOVE WK_INVDATE TO IVBAP-INVDT.
    MODIFY IVBAP.
    ENDIF. "I6677.e n
    SELECT SINGLE * FROM MBEW WHERE "I6759.sn
    MATNR EQ IVBAP-MATNR AND
    BWKEY EQ IVBAP-WERKS AND
    BWTAR EQ SPACE.
    IF SY-SUBRC = 0.
    MOVE MBEW-STPRS TO IVBAP-STPRS.
    IVBAP-TOT = MBEW-STPRS * IVBAP-KWMENG.
    MODIFY IVBAP.
    ENDIF. "I6759.en
    IF IVBAP-MATNR NE WK_MATNR OR IVBAP-WERKS NE WK_WERKS.
    CLEAR: WK_BLOCK, WK_MMSTA, WK_MSTAE, WK_PRDHA, WK_MAKTX.
    MOVE IVBAP-MATNR TO WK_MATNR.
    MOVE IVBAP-WERKS TO WK_WERKS.
    SELECT SINGLE MMSTA FROM MARC INTO MARC-MMSTA
    WHERE MATNR = WK_MATNR
    AND WERKS = WK_WERKS.
    IF NOT MARC-MMSTA IS INITIAL.
    MOVE '*' TO WK_MMSTA.
    ENDIF.
    SELECT SINGLE LVORM PRDHA MSTAE MSTAV FROM MARA
    INTO (MARA-LVORM, MARA-PRDHA, MARA-MSTAE, MARA-MSTAV)
    WHERE MATNR = WK_MATNR.
    IF ( NOT MARA-MSTAE IS INITIAL ) OR
    ( NOT MARA-MSTAV IS INITIAL ) OR
    ( NOT MARA-LVORM IS INITIAL ).
    MOVE '*' TO WK_MSTAE.
    ENDIF.
    MOVE MARA-PRDHA TO WK_PRDHA.
    SELECT SINGLE MAKTX FROM MAKT INTO WK_MAKTX
    WHERE MATNR = WK_MATNR
    AND SPRAS = SY-LANGU.
    ENDIF.
    IF Z_BLOCK EQ 'B'.
    IF WK_MMSTA EQ ' ' AND WK_MSTAE EQ ' '.
    DELETE IVBAP.
    CONTINUE.
    ENDIF.
    ELSEIF Z_BLOCK EQ 'U'.
    IF WK_MMSTA EQ '' OR WK_MSTAE EQ ''.
    DELETE IVBAP.
    CONTINUE.
    ENDIF.
    ELSE.
    IF WK_MMSTA EQ '' OR WK_MSTAE EQ ''.
    MOVE '*' TO WK_BLOCK.
    ENDIF.
    ENDIF.
    IF WK_PRDHA IN Z_PRDHA. "I4792
    MOVE WK_BLOCK TO IVBAP-BLOCK.
    MOVE WK_PRDHA TO IVBAP-PRDHA.
    MOVE WK_MAKTX TO IVBAP-MAKTX.
    MODIFY IVBAP.
    ELSE. "I4792
    DELETE IVBAP. "I4792
    ENDIF. "I4792
    IF NOT Z_ALNUM[] IS INITIAL. "I9076
    SELECT SINGLE * FROM MAEX "I9076
    WHERE MATNR = IVBAP-MATNR "I9076
    AND ALNUM IN Z_ALNUM. "I9076
    IF SY-SUBRC 0. "I9076
    DELETE IVBAP. "I9076
    ENDIF. "I9076
    ENDIF. "I9076
    endloop.
    U have used many select queries widin loop-endloop which is a big hindrance as far as performance is concerned.Avoid such practice.
    Thanks
    Deepika

  • Performance of a Report Based On VirtualProvider

    Dear BW experts,
    We have created a new BEx 3.x report, which contains about 6 queries, and 2 pre queries.
    The report runs very slowly, the upload time is about 40 seconds.
    The report itself contains one tab with 11 tables.
    The MultiProvider that the queries are based on is a virtual InfoCube, so we can't use aggregates.
    Could someone advice us how to optimize the performance of the report?
    Thanks you in advance.
    Best Regards,
    Inbal.

    Hi,
    Query variables are not passed only to the virtual provider by default, i.e enter dataset of the extractor is pulled the data manager and then it is filtered out which could the issue for the long runtimes.
    If the datasource of the virtual provider has selections then we could passed those from the query to the datasource while query execution at the inverse start routine and reduce the amount of data actual pulled by the virtual provider and hence improve the performance of the query.
    Below is the link to the sap documentation on inverse routine.
    http://help.sap.com/saphelp_erp60_sp/helpdata/en/45/f5af4a4db53482e10000000a1553f6/content.htm
    Thanks,
    Arun

  • How to improve the query performance in to report level and designer level

    How to improve the query performance in to report level and designer level......?
    Plz let me know the detail view......

    first its all based on the design of the database, universe and the report.
    at the universe Level, you have to check your Contexts very well to get the optimal performance of the universe and also your joins, keep your joins with key fields, will give you the best performance.
    at the report level, try to make the reports dynamic as much as you can, (Parameters) and so on.
    and when you create a paremeter try to get it match with the key fields in the database.
    good luck
    Amr

  • Low Performance in the report with cell defition

    Hi all,
    In one of our queries (3.5), we had to use lots of cell definition. And after execution of the report, it stays in "Formatting Result Area" and "Retrieving Result from BW Server" for a very long time (about 30 minutes).
    There is already aggregate on the infoprovider and report uses it.
    Is there any way to increase reporting performance of a report with lots of cell definitions ?
    Thanks
    SP

    Arun,
    Can you please explain what is precalculation and how to use it in Bex?
    Thanks in advance.
    SP

  • Performance issue in report programming..

    Hi,
    I am using one customized Function Module  whithin a loop of internal table containing fields of PROJ table for about 200 records . And in  the source code of function module there is set of select queries for different tables like COSS COSP , AUFK , PRPS , BPJA PRHI , AFPO , AFKO etc . so due to that my performance of a report is very low , So how can i improve it .
    Is there any other way to change a code.
    regards
    Chetan

    Hi  John ,
    I am using SAP ECC 6.0 .
    The report  is used to update a  ztable which is already created for Project System plan data .
    So i am calling function module  which will return a internal table , I am appending this to other internal table and refreshing it , like this I  am doing for each project within a loop of PROJ internal table , finaly by using the final itab I am modifying the ztable fields.
    Code is as below..
    select pspid from proj client specified into corresponding fields of
              table t_itab1 where mandt = sy-mandt
                              and pspnr in s_pspnr
                              and vbukr = p_vbukr
                              and prctr in s_prctr.
    loop at t_itab1.
        l_pspid = t_itab1-pspid.
    CALL FUNCTION 'ZPS_FUN_BUDGETS'
          EXPORTING
            L_PSPID       = l_pspid
            L_VBUKR       = p_vbukr
          TABLES
            T_DATA        = t_itab2 .
      loop at t_itab2.
          append t_itab2 to t_itab.
        endloop.
        clear   : t_itab2.
        refresh : t_itab2.
      endloop.
    LOOP AT t_itab.
    ***MODIFY ZTABLE.*****
    ENDLOOP.
    Regards
    Chetan

  • Performance issue of report

    Hi Friends,
    Can you please give me the exact answer for the below question.
    Suppose my report program is taking long time to execute, what are the reasons that may effect the report.
    and what are the remedies should i follow, please provide appropriate answer.
    Advance thanks,
    Chandra.

    hi,,
    Go to tranx SE30 here you will get Tips and Trciks for the performance tuning.
    Check it carefully and check whether you can do something for improving performance of you code.
    It will help you a lot and will reduce your Execution time.
    If you are using READ TABLE command in your program then you can check whether you can use HASHED TABLE it will improve performance of your code a lot but it has some restrictions.
    I will explain some of the points to improve the performance of the report try to write code according to that ok.
    SOME STEPS USED TO IMPROVE UR PERFORMANCE:
    1. Avoid using SELECT...ENDSELECT... construct and use SELECT ... INTO TABLE.
    2. Use WHERE clause in your SELECT statement to restrict the volume of data retrieved.
    3. Design your Query to Use as much index fields as possible from left to right in your WHERE statement
    4. Use FOR ALL ENTRIES in your SELECT statement to retrieve the matching records at one shot.
    5. Avoid using nested SELECT statement, SELECT within LOOPs.
    6. Avoid using INTO CORRESPONDING FIELDS OF TABLE. Instead use INTO TABLE.
    7. Avoid using SELECT * and Select only the required fields from the table.
    8. Avoid nested loops when working with large internal tables.
    9. Use assign instead of into in LOOPs for table types with large work areas
    10. When in doubt call transaction SE30 and use the examples and check your code
    11. Whenever using READ TABLE use BINARY SEARCH addition to speed up the search. Be sure to sort the internal table before binary search. This is a general thumb rule but typically if you are sure that the data in internal table is less than 200 entries you need not do SORT and use BINARY SEARCH since this is an overhead in performance.
    12. Use "CHECK" instead of IF/ENDIF whenever possible.
    13. Use "CASE" instead of IF/ENDIF whenever possible.
    14. Use "MOVE" with individual variable/field moves instead of "MOVE-
    CORRESPONDING", creates more coding but is more effcient.
    Reward points if helpful.
    regards,
    rekha

  • Performance Issue Crystal Report and Oracle

    Hello,
    We have one procedure that takes 3 input parameters and returns Cursor from Procedure that is used to design the report. There is no caluculation involved here and cursor is opended dynamically. We are using Oracle Native connection.
    When we click on preview button it takes lots of time ( >10 Mins) to show complete data. While we call the same procedure in application and generate HTML report using Cursor returned it is done in < 15 Seconds. Can some point me where to look into to improve the performance of Crystal Report.
    DB: Oracle 10G
    CR: Version XI

    Hi Vadiraja
    The performance of a report is related to:
    External factors:
    1. The amount of time the database server takes to process the SQL query.
    ( Crystal Reports send the SQL query to the database, the database process it, and returns the data set to Crystal Reports. )
    2. Network traffics.
    3. Local computer processor speed.
    ( When Crystal Reports receives the data set, it generates a temp file to further filter the data when necessary, as well as to group, sort, process formulas, ... )
    4. The number of record returned
    ( If a sql query returns a large number of records, it will take longer to format and display than if was returning a smaller data set.)
    Report design:
    1. Where is the Record Selection evaluated.
    Ensure your Record Selection Formula can be translated in SQL, so the data can be filter down on the server, otherwise the filtering will be done in a temp file on the local machine which will be much slower.
    They have many functions that cannot be translated in SQL because they may not have a standard SQL for it.
    For example, control structure like IF THEN ELSE cannot be translated into SQL. It will always be evaluated in Crystal Reports. But if you use an IF THEN ELSE on a parameter, it will convert the result of the condition to SQL, but as soon as uses database fileds in the conditions it will not be translated in SQL.
    2. How many subreports the report contains and in section section they are located.
    Minimise the number of subreports used, or avoid using subreports if possible because
    subreports are reports within a report, and if you have a subreport in a details section, and the report returns 100 records, the subreport will be evaluated 100 times, so it will query the database 100 times. It is often the biggest factor why a report takes a long time to preview.
    3. How many records will be returned to the report.
    Large number of records will slow down the preview of the reports.
    Ensure you only returns the necessary data on the report, by creating a Record Selection Formula, or basing your report off a Stored Procedure, or a Command Object that only returns the desired data set.
    4. Do you use the special field "Page N of M", or "TotalPageCount"
    When the special field "Page N of M" or "TotalPageCount" is used on a report, it will have to generate each page of the report before it displays the first page, therfore it will take more time to display the first page of the report.
    If you want to improve the speed of a report, remove the special field "Page N of M" or "Total Page Count" or formula that uses the function "TotalPageCount". If those aren't use when you view a report it only format the page requested.
    It won't format the whole report.
    5. Link tables on indexed fields whenever possible.
    6. Remove unused tables, unused formulas, unused running totals from the report.
    7. Suppress unnecessary sections.
    8. For summaries, use conditional formulas instead of running totals when possible.
    9. Whenever possible, limit records through selection, not suppression.
    10. Use SQL expressions to convert fields to be used in record selection instead of using formula functions.
    For example, if you need to concatenate 2 fields together, instead of doing it in a formula, you can create a SQL Expression Field. It will concatenate the fields on the database server, instead of doing in Crystal Reports. SQL Expression Fields are added to the SELECT clause of the SQL Query send to the database.
    11. Using one command as the datasource can be faster if you returns only the desired data set.
    It can be faster if the SQL query written only return the desired data.
    12. Perform grouping on server
    This is only relevant if you only need to return the summary to your report but not the details. It will be faster as less data will be returned to the reports.
    Regards
    Girish Bhosale

  • Performance issue webi report-BOXI3.1

    Hi,
    We have a requirement for a report where we will give user a set of objects (26 u2013 31) to do analysis using interactive viewing feature. Here we are facing severe performance issues and memory issues as the data that we are calling is huge( around 6 million records). At the report level we will be summarizing the data.
    No of rows in the report is depending on the no of objects.
    Mode of view : Interactive view.
    Note:
    1. Objects which are using in conditional level those have indexes.
    2. No of report level variable are two.
    3. Version of Business objects: BOXI3.1
    4. OS: Sun Solaris
    Please let me know if there are any means by which the memory requirements for the report can be minimized/ performance of the report can be improved.
    Thanks,
    Subash

    Subash,
    At the report level we will be summarizing the data ... any means by which the memory requirements for the report can be minimized/ performance of the report can be improved
    Is there any way that you can summarize this on the database side versus the report level?  The database should be sized with memory and disk space properly to handle these types of summarizations versus expecting the application to perform it.
    Thanks,
    John

  • Displaying report in .pdf format while Running oracle reports over the web

    I am running a report over the web via IE. I am suing .pdf
    format as the file type. The problem I am facing is that the
    report comes out with a blank in acrobat reader if there are
    just one or two records - i.e less thatn one pagefull. THe
    reports displays output only when there ar more than one
    pagefull of records.
    Any explanation for this bezarre behavior and any suggestions?
    I will very much appreciate your help.
    Regards
    Prasad.

    in R12 I found 2 choice
    1) when submitting requests (if available) you can set the output format by using the Options button (upon sompletion section):
    layout --> format --> select format you need (RTF/HTML/EXCEL/PDF)
    2) in the request form (view->request) selecr the report you want to reprint in the Tools menu select print/republish, in the html page that pop up select output format you want, number of copies =1 submit
    www2p

  • How to optimize the performance of crystal report?

    Hi,
    -I have to design a crystal report with best possible optimization. Optimization is main concern since report will run against 1-2 million data set. Though I am using parameter to fetch only the required data, required data can go till 1 million records.
    -Based on the input passed by the user I have to group the data in report. And for each selected parameter the Detail section I am printing is different. For example:-If user selects store then detail section is different and if user select Host then detail section will be different.
    -Report can be grouped by Time Field also. So to full fill this requirement I would have to create a sub report since other parameters are of string type and can be used in one formula to get parameter based grouping in report. However If I try to return Time filed from the same formula I get the errors the "Return type should be of String typeu201D. This forces me to create sub report for Time based grouping. If user selects Time Field to be grouped on, all the information in the main report gets suppressed and only the sub report gets printed.
    If user select store, Host and User in parameter to be grouped on, sub report gets suppressed.
    Now with the above mentioned points I tried to optimize the report in following way.
    -Printing 1 million records in the report does not make sense; hence we wanted to show the summary of all the records in chart section but wanted to print just 5000 records in detailed section. Suppressing detailed section after 5000 records does not help much since suppressing just saves the time in printing and does not limit the number of records to be fetched from the DB.I have a subreport also so it fetches the data 2 times from the DB hence makes the performance of the report worse.
    To solve this problem I used command object and put the charts in the subreport and detail in main report.
    In main report's Command Object I limited the number to records to be fetched from the DB to 5000 using rownum<5000 but in subreport's Command Object I did not set any limit in the query but I am doing all my aggregation in SQL which means do summary operation in DB and get only summarized data from DB.
    -To solve section problem I am using Template object (new feature added in CR 2008).In which I am returning the field based on the "Group By" parameter selected by user.
    -For time Field I have created two sub reports, one for chart and other one for details in the same way described in point one(Printing 1 million recordsu2026u2026).
    After implementing these points my crystal reports performance improved drastically. The report that was taking 24 minute to come back now taking only 2 minutes.
    However I want my report to come back with one minute. It returns if I remove the sub reports for Time Based Grouping but I can not do so.
    My questions here are,
    -Can I stop Subreport from fetching the data from DB if itu2019s suppressed?
    -I believe using Conditional Template Object is a better option rather than having multiple detailed sections to print the data for a selected Group. However any suggestion here to improve the performance will be appreciable.
    -since crystal report does not provide any option to limit the number of records to be fetched from DB, I am forced to use command object with rownum in where condition.
        Please let me know about other option(s) to get this done...If there is any.
    I am using Crystal report 2008.And we have developed our application the use JRC to export crystal report in PDF.
    Regards,
    Amrita
    Edited by: Amrita Singh on May 12, 2009 11:36 AM

    1) I have to design a crystal report with best possible optimization. Optimization is main concern since report will run against 1-2 million data set. Though I am using parameter to fetch only the required data, required data can go till 1 million records.
    2) Based on the input passed by the user I have to group the data in report. And for each selected parameter the Detail section I am printing is different. For example:-If user selects store then detail section is different and if user select Host then detail section will be different.
    3) Report can be grouped by Time Field also. So to full fill this requirement I would have to create a sub report since other parameters are of string type and can be used in one formula to get parameter based grouping in report. However If I try to return Time filed from the same formula I get the errors the "Return type should be of String typeu201D. This forces me to create sub report for Time based grouping. If user selects Time Field to be grouped on, all the information in the main report gets suppressed and only the sub report gets printed.
    If user select store, Host and User in parameter to be grouped on, sub report gets suppressed.
    Now with the above mentioned points I tried to optimize the report in following way.
    1) Printing 1 million records in the report does not make sense; hence we wanted to show the summary of all the records in chart section but wanted to print just 5000 records in detailed section. Suppressing detailed section after 5000 records does not help much since suppressing just saves the time in printing and does not limit the number of records to be fetched from the DB.I have a subreport also so it fetches the data 2 times from the DB hence makes the performance of the report worse.
    To solve this problem I used command object and put the charts in the subreport and detail in main report.
    In main report's Command Object I limited the number to records to be fetched from the DB to 5000 using rownum<5000 but in subreport's Command Object I did not set any limit in the query but I am doing all my aggregation in SQL which means do summary operation in DB and get only summarized data from DB.
    2)To solve section problem I am using Template object (new feature added in CR 2008).In which I am returning the field based on the "Group By" parameter selected by user.
    Edited by: Amrita Singh on May 12, 2009 12:26 PM

  • Crystal reports over SAP r/3 tables

    I am trying to write a Crystal report over SAP r/3 tables (BSIK and LFA1) with no success.
    I have CRpts installed along with the "client side" SAP integration kit.  When i try to create a new connection to my development ERP system i am asked to select an available system, but the dialogue box is empty.   I can however connect to a SAP BW query successfully using the SAP toolbar that has been added when installing the integration kit.
    Is there anywhere a set if instructions to successfully install and configure CRpts to report over SAP r/3 tables ?
    Andrew Fox

    Make sure to define an environment variable called SAPLOGON_INI_FILE in the system your CR designer is installed on. The variable should contain the path to your SAPlogon.ini file including the file name. eg if saplogon.ini is found under c:\Windows then the variable shoud be set to c:\Windows\saplogon.ini . Restart the CR designer and try again.
    If the system list remains empty then locate to saplogon.ini file, open it using Notepad and choose the Save as option. All you have to do is to overwrite the existing file (ie. do not change the name) after changing the encoding to UTF-8 (drop-down list at the bottom of the Save as window)
    Regards,
    Stratos

Maybe you are looking for

  • Values in CK13N not matching with cost element report

    Dear SAP Experts, when I go to t code CK13N in the column (Itemization of column) I can see for the cost elemnt total values as 241023 with the Qty as 10000, but when I check in the material & the report FBL3N not sure from where its taking 241023. W

  • Ipod and Itrip failure!!??

    I have a 4th gen iPod (i think, 20 gig, no buttons across the top not video??) I have been using an itrip with it for over a year and no probs. I recently updated to ipod driver/update 3.1 and the last two days I will plug the itrip in an dhit play a

  • What is maximum length of CAT5e cable that HH3 can...

    The wireless signal is weak in our home office in the garden so I installed a CAT5e cable to give me a LAN connection to the computer.  The cable is 30 m long and I have checked the connections (from the LAN connection lead into the router to the con

  • Flex and ColdFusion web services

    I have a simple CFC created that encompasses a function that has a query. I want to be able to use the web service in my Flex app, but I am having issues with getting the information from the CFC. My function is simple: <cffunction name="listBySubjec

  • What's with the automatic country codes?

    Upgraded and have had the unwanted facebook contact list added automatically. On top of this, all contacts' phone numbers have been automatically assigned a country code, which is not applicable. How does one get rid of all this unwanted stuff. I was