Problem in collect statement

Hi,
i have requirement to get all unique entries from table .if i am getting duplicate record then i need to add qunatity field which i have define like rlbes-anfme.
my internal table is :
11 name1 23.00
22 name2 1,324.00
11 name1 10.00
I want output in this way
11 name1  33.00
22 name2 1,324.00
i tried to use collect statement but the problem is its not working on character type field.
if  i use packed field then i am not able to upload my file because i am getting quantity filed 1,2344.00 this way.( instead of 1325.00)
please give me any solution.
thanks,
jack

Hi,
Try this..
Create another internal table which has the same structure of your internal table.
DATA: LT_COLLECT LIKE ITAB OCCURS 0 WITH HEADER LINE.
DATA: V_QUANTITY TYPE MENGE_D.
Sort the internal table.
SORT ITAB BY field1 field2.    " Give the appropriate field names.
<b>* process the internal table which has the records.</b>
LOOP AT ITAB.
Sum up the quantity.
   V_MENGE = V_MENGE + ITAB-ANFME.  " Quantity field.
Move the first two fields.
   LT_COLLECT-FIELD1 = ITAB-FIELD1. 
   LT_COLLECT-FIELD2 = ITAB-FIELD2.
At the end of the record..append the record.
   AT END OF FIELD2.     " Give the corresponding field name.
      LT_COLLECT-ANFME = V_MENGE.
      APPEND LT_COLLECT.
     CLEAR: V_MENGE.
   ENDAT.  
ENDLOOP.
Thanks,
Naren

Similar Messages

  • Problem with Collect statement

    Hi Experts,
    I am facing a peculiar problem. Please go through the code below and it is not giving the aggregate of it_ekbe_642_pgi-menge for the same it_ekbe_642_pgi-ebeln and it_ekbe_642_pgi-ebelp.
    LOOP AT it_ekbe_642_pgi.
        it_ekbe_642_pgi_tot-ebeln =   it_ekbe_642_pgi-ebeln.
        it_ekbe_642_pgi_tot-ebelp =   it_ekbe_642_pgi-ebelp.
        it_ekbe_642_pgi_tot-budat =   it_ekbe_642_pgi-budat.
        it_ekbe_642_pgi_tot-xblnr =   it_ekbe_642_pgi-xblnr.
        it_ekbe_642_pgi_tot-menge =   it_ekbe_642_pgi-menge.
        COLLECT it_ekbe_642_pgi_tot.
      ENDLOOP.
    Please suggest.
    Thanks....
    Shibaji.

    Hi Shibaji Maitra ,
    Since you are aggregating the it_ekbe_642_pgi-menge for the same it_ekbe_642_pgi-ebeln and it_ekbe_642_pgi-ebelp.
    For using the Collect statement the order of the fields should be
    in proper order i.e. all the char fields come up & then after that
    all the numeric fields.Please check the sequence in your internal
    table and also the fields type of menge field.
    LOOP AT it_ekbe_642_pgi.
      it_ekbe_642_pgi_tot-ebeln = it_ekbe_642_pgi-ebeln.
      it_ekbe_642_pgi_tot-ebelp = it_ekbe_642_pgi-ebelp.
    it_ekbe_642_pgi_tot-xblnr = it_ekbe_642_pgi-xblnr.
    it_ekbe_642_pgi_tot-budat = it_ekbe_642_pgi-budat.
    it_ekbe_642_pgi_tot-menge = it_ekbe_642_pgi-menge.
    COLLECT it_ekbe_642_pgi_tot.
    ENDLOOP.
    Rewards points if helpful.
    Regards
    Manoj Kumar

  • Hi i have some problem with collect statement.

    hi when i am using collect statement and whn ever any field is modified it is getting doubled and showing doubled value. may i knoe what would be problem.

    Hai Kumar
    Go through the following Collect Syntax
    COLLECT
    Basic form
    COLLECT [wa INTO] itab.
    Addition
    ... SORTED BY f
    Effect
    COLLECT is used to create unique or compressed datsets. The key fields are the default key fields of the internal table itab .
    If you use only COLLECT to fill an internal table, COLLECT makes sure that the internal table does not contain two entries with the same default key fields.
    If, besides its default key fields, the internal table contains number fields (see also ABAP/4 number types ), the contents of these number fields are added together if the internal table already contains an entry with the same key fields.
    If the default key of an internal table processed with COLLECT is blank, all the values are added up in the first table line.
    If you specify wa INTO , the entry to be processed is taken from the explicitly specified work area wa . If not, it comes from the header line of the internal table itab .
    After COLLECT , the system field SY-TABIX contains the index of the - existing or new - table entry with default key fields which match those of the entry to be processed.
    Notes
    COLLECT can create unique or compressed datasets and should be used precisely for this purpose. If uniqueness or compression are unimportant, or two values with identical default key field values could not possibly occur in your particular task, you should use APPEND instead. However, for a unique or compressed dataset which is also efficient, COLLECT is the statement to use.
    If you process a table with COLLECT , you should also use COLLECT to fill it. Only by doing this can you guarantee that
    the internal table will actually be unique or compressed, as described above and
    COLLECT will run very efficiently.
    If you use COLLECT with an explicitly specified work area, it must be compatible with the line type of the internal table.
    Example
    Compressed sales figures for each company
    DATA: BEGIN OF COMPANIES OCCURS 10,
            NAME(20),
            SALES TYPE I,
          END   OF COMPANIES.
    COMPANIES-NAME = 'Duck'.  COMPANIES-SALES = 10.
    COLLECT COMPANIES.
    COMPANIES-NAME = 'Tiger'. COMPANIES-SALES = 20.
    COLLECT COMPANIES.
    COMPANIES-NAME = 'Duck'.  COMPANIES-SALES = 30.
    COLLECT COMPANIES.
    The table COMPANIES now has the following appearance:
    NAME SALES
    Duck 40
    Tiger 20
    Addition
    ... SORTED BY f
    Effect
    COLLECT ... SORTED BY f is obsolete and should no longer be used. Use APPEND ... SORTED BY f which has the same meaning.
    Note
    Performance
    The cost of a COLLECT in terms of performance increases with the width of the default key needed in the search for table entries and the number of numeric fields with values which have to be added up, if an entry is found in the internal table to match the default key fields.
    If no such entry is found, the cost is reduced to that required to append a new entry to the end of the table.
    A COLLECT statement used on a table which is 100 bytes wide and has a key which is 60 bytes wide and seven numeric fields is about approx. 50 msn (standardized microseconds).
    Note
    Runtime errors
    COLLECT_OVERFLOW : Overflow in integer field when calculating totals.
    COLLECT_OVERFLOW_TYPE_P : Overflow in type P field when calculating totals.
    Thanks & regards
    Sreenivasulu P

  • Hi friends i have doubt on collect statement.

    i have some problem with matnr which is repeating no.of times. so i tried using collect and selected some of the fields to collect. Now i need to collect those collected elements in to internal table and need to display those fields in an ouput. for example.
    loop at sumtab.
    matnr type s886-matnr,
    avg1 type p decimals 3,
    total type p decimals 3,
    endloop.
    and now using loop  i am collecting. these fields using my itab.
    loop at itab.
    move-corresponding itab to sumtab.
    collect sumtab.
    clear sumtab.
    endloop.
    ***here itab contains no.of other fields like qty,stock etc.
    so after here i am using ALV to display the itab.
    my problem is how to make SUMTAB fields tobe moved in itab.

    Hi Kalyan,
       The collect statement works like this . (ex)
    data: begin of itab occurs 0,
          name(10) type c,
          value(4) type n,
          end of itab.
    itab-name = 'JACK'.
    itab-value = 100.
    append itab.
    itab-name = 'PAT'.
    itab-value = 200.
    append itab.
    itab-name = 'JACK'.
    itab-value = 200.
    append itab.
    sort itab.
    loop itab.
    collect itab.
    write: / itab-name, itab-value.
    endloop.
    <b>o/p:</b>
    JACK 300
    PAT  200

  • Collect Statement to group on character fields

    Hi,
    I am working on some specific requirements on a support project and found a bit scenario where there is a data in an internal table and displayed the group wise total. for which the collect statement is used.
    loop at lt_matdata into lwa_matdata.
    lwa_final-docno = lwa_matdata-docno.
    lwa_final-matnr =  lwa_matdata-matnr.
    lwa_final-puqty =  lwa_matdata-puqty.
    lwa_final-amt    = lwa_matdata-amount.
    collect lwa_final into lt_final.
    endloop.
    now the problem is i need to add RATE also to the final table. if i add the field rate to the final it will display a sum. I tried to find something that helps me adding a field RATE. Please suggest a way where i can skip the sum in collect for the specific field.
    one way is i can create an another internal table and make a read statement to display the data, but wanted to know if there is any other simple and suitable solution to this.
    Thanks,
    Janisar

    Hi,
    Run this code & get the idea for your program...
    DATA: BEGIN OF line,
            col1(3) TYPE c,
            col2(2) TYPE n,
            col3    TYPE i,
            col4    type i,
          END OF line.
    DATA itab LIKE SORTED TABLE OF line
              WITH NON-UNIQUE KEY col1 col2.
    line-col1 = 'abc'. line-col2 = '12'. line-col3 = 3.
    COLLECT line INTO itab.
    line-col4 = 12.
    modify itab from line index sy-tabix transporting col4.
    WRITE / sy-tabix.
    clear line.
    line-col1 = 'def'. line-col2 = '34'. line-col3 = 5.
    COLLECT line INTO itab.
    line-col4 = 12.
    modify itab from line index sy-tabix transporting col4.
    WRITE / sy-tabix.
    clear line.
    line-col1 = 'abc'. line-col2 = '12'. line-col3 = 7.
    COLLECT line INTO itab.
    line-col4 = 12.
    modify itab from line index sy-tabix transporting col4.
    WRITE / sy-tabix.
    clear line.
    LOOP AT itab INTO line.
      WRITE: / line-col1, line-col2, line-col3, line-col4.
    ENDLOOP.
    In your code you try this,
    loop at lt_matdata into lwa_matdata.
    lwa_final-docno = lwa_matdata-docno.
    lwa_final-matnr = lwa_matdata-matnr.
    lwa_final-puqty = lwa_matdata-puqty.
    lwa_final-amt = lwa_matdata-amount.
    collect lwa_final into lt_final.
    *  ADD THESE LINES
    lwa_final-rate = lwa_matdata-rate.
    modify it_final from lwa_final index sy-tabix transporting rate.
    clear lwa_final.
    endloop.

  • Collect statement error

    Hi all,
    i have the fallowing problem.
    I'm trying to do a collect statement as fallow:
    SORT i_tran BY cuenta ASCENDING.
    LOOP AT i_tran.            
    AT NEW cuenta.             
    COLLECT i_tran INTO i_tran2.
    APPEND i_tran2.            
    CLEAR i_tran.              
    CLEAR i_tran2.             
    ENDAT.                     
    endloop.
    where i_tran is a collect internal table and i_tran2 is another internal table.
    when I execute the collect statement all the fields are fill with asterics and the field that Im interested in is set to zero.
    another problem is that is not doing the collect per cuenta. (is doing it per record, ex. if cuenta 123 has three records it executes at the collect statement for each one of them. 
    this is the structure of i_tran:
    * Registro de Transacciones
    TYPES: BEGIN OF E_TRAN,
          RECTYPE TYPE C,             "Tipo Registro N
          CCODE(15) TYPE C,           "Id Empresa (RNC)
          SEQNR(7) TYPE C,            "Secuencia Header
          SECTR(7) TYPE C,            "Secuencia Transaccion
          CUENTA(20) TYPE C,          "Cuenta Suplidor
          MONTRN TYPE I,              "Montro Transaccion (13)
          TIPCTA TYPE C,              "Tipo de Cuenta
          WAERS(3) TYPE C,            "Moneda
          CODBAN(8) TYPE C,           "Banco Destino (No. Cuenta Banco)
          DIGVER TYPE C,              "Digito Verificacion
          CODOPR(2) TYPE C,           "Codigo Operacion
          TIPIDN(2) TYPE C,           "Tipo de Identificacion
          IDENTF(15) TYPE C,          "Identificacion
          NOMBRE(35) TYPE C,          "Nombre Beneficiario
          REFERN(12) TYPE C,          "Referencia
          DESCRED(40) TYPE C,         "Descripcion Estado Destino
          FECVEN(4) TYPE C,           "Fecha Vencimiento
          FCONTC TYPE C,              "Forma de Contacto
          EMAIL(40) TYPE C,           "E-mail Beneficiario
          NUMFAX(12) TYPE C,          "Numero de Fax
          RESERV(2) TYPE C,           "Reservado para uso futuro
          NUMAUT(15) TYPE C,          "Numero Autorizacion
          CODRET(3) TYPE C,           "Codigo Retorno Remoto
          CODRZR(3) TYPE C,           "Codigo Razon Remoto
          CODRZI(3) TYPE C,           "Codigo Razon Interno
          PROCTR TYPE C,              "Procesador Transaccion
          STATS(2) TYPE C,            "Status Transaccion
          FILLER(52),                 "En blanco
    END OF E_TRAN.
    DATA: IT_TRAN TYPE  E_TRAN.
    DATA: I_TRAN TYPE STANDARD TABLE OF E_TRAN WITH HEADER LINE,
          I_TRAN2 TYPE STANDARD TABLE OF E_TRAN WITH HEADER LINE.
    if anyone can help me I'll appreciated.
    thanks in advanced,
    Gregorio.

    Hi Gergorio,
    1. I think that the way you have used COLLECT
       is incorrect.
       (There is no need to use AT NEW for collect)
       (only Loop, Collect will do the work)
    2. U have said that :
       tran is a collect internal table and i_tran2 is  
       another internal table.
    3. Meaning, that,
       i_trans2 has many records
       tran  is the SUMMARY table (to gather totals)
    4. Now, on what base,
       do u want to do summary ?
       ie. What will be the key/main/criteria fields?
       (all char fields of your internal table,
        or some of them)
       (If only some are required, then your logic won't work)
    5. Moreover, we should have numeric/integer
       fields in our internal table so that 
       summation is done automatically.
    6. The simple logic is like this.
       LOOP AT DETAILITAB.
       COLLECT DETAILTAB INTO SUMMARYTAB.
       ENDLOOP.
    7. The above will take care of
       all summations
       (with respect to DISTINCT COMBAINATION
        of ALL CHAR FIELDS)
    8. If your criteria for summation is
        less fields then some little more work
        is required. If this is so, let me know.
    I hope it helps.
    Regards,
    Amit M.

  • Problem with READ Statement in the field routine of the Transformation

    Hi,
    I have problem with read statement with binary search in the field routine of the transformation.
    read statement is working well when i was checked in the debugging mode, it's not working properly for the bulk load in the background. below are the steps i have implemented in my requirement.
    1. I selected the record from the lookuo DSO into one internal table for all entried in source_packeage.
    2.i have read same internal table in the field routine for each source_package entry and i am setting the flag for that field .
    Code in the start routine
    select source accno end_dt acctp from zcam_o11
    into table it_zcam
    for all entries in source_package
    where source = source_package-source
         and accno = source_package-accno.
    if sy-subrc = 0.
    delete it_zcam where acctp <> 3.
    delete it_zcam where end_dt initial.
    sort it_zcam by surce accno.
    endif.
    field routine code:
    read table it_zcam with key source = source_package-source
                                                 accno  = source_package-accno
                                                 binary search
                                                 transportin no fields.
    if sy-subrc = 0.
    RESULT  = 'Y'.
    else.
    RESULT = 'N'.
    endif.
    this piece of code exist in the other model there its working fine.when comes to my code it's not working properly, but when i debug the transformation it's working fine for those accno.
    the problem is when i do full load the code is not working properly and populating the wrong value in the RESULT field.
    this field i am using in the report filter.
    please let me know if anybody has the soluton or reason for this strage behaviour.
    thanks,
    Rahim.

    i suppose the below is not the actual code. active table of dso would be /bic/azcam_o1100...
    1. is the key of zcam_o11 source and accno ?
    2. you need to get the sortout of if endif (see code below)
    select source accno end_dt acctp from zcam_o11
    into table it_zcam
    for all entries in source_package
    where source = source_package-source
    and accno = source_package-accno.
    if sy-subrc = 0.
    delete it_zcam where acctp 3.
    delete it_zcam where end_dt initial.
    endif.
    sort it_zcam by surce accno.
    field routine code:
    read table it_zcam with key source = source_package-source
    accno = source_package-accno
    binary search
    transportin no fields.
    if sy-subrc = 0.
    RESULT = 'Y'.
    else.
    RESULT = 'N'.
    endif.

  • How to use collect statement properly

    In PBID table , i will get 4 rows for a material . I will get the corresponding values of bdzei from the same table . Now i will pass this bdzei into pbhi table. then i will get some 200 rows of data. I have to sum up the field plnmg , by grouping the laeda field of pbhi. In short, i need to know the sum of pbhi-plnmg for a particular pbhi-laeda . I know a way to do it. But i want to know how to use the COLLECT statement for this purpose. My output should contain oly 1 line for 1 material ..
    PBID table                      
    Matnr   BDZEI
    p4471   457
            1002
            2309
            2493
    PBHI table
    BDZEI     LAEDA         PLNMG
    1002     06.08.2004     0.000          
    1002     06.08.2004     83.000
    457      07.08.2004     12.000          
    457     07.08.2004     24.000
    Reqd O/p
    MATNR   LAEDA        PLNMG
    p4471  06.08.2004    83
    p4471  07.08.2004    36
    Hope u understood my situation .please help me out ...
    Thanking you in advance ..
    Shankar

    REPORT zppr_zpipr NO STANDARD PAGE HEADING LINE-SIZE 150 LINE-COUNT 63.
    TABLES: pbid,
            pbhi,
            makt,
            mseg,
            mkpf.
    DATA: BEGIN OF it_pbid OCCURS 0,
          matnr LIKE pbid-matnr,        " Material
          status TYPE c LENGTH 4,       " For distinguishing materials from pbid and pbim .. will contain space for PBID and 'PBIM' for PBIM
          bdzei LIKE pbid-bdzei,
          laeda LIKE pbhi-laeda,
    end of it_pbid.
    DATA: BEGIN OF it_pbim OCCURS 0,
          matnr LIKE pbid-matnr,        " Material
          status TYPE c LENGTH 4,       " For distinguishing materials from pbid and pbim .. will contain space for PBID and 'PBIM' for PBIM
          bdzei LIKE pbim-bdzei,
          laeda LIKE pbhi-laeda,
    end of it_pbim.
    DATA: BEGIN OF it_pbid_pbim OCCURS 0,
          matnr LIKE pbid-matnr,        " Material
          laeda LIKE pbhi-laeda,        " Reduction Date
          dbmng LIKE pbhi-dbmng,        " Planned quantity in the data base
          plnmg LIKE pbhi-plnmg,        " Planned quantity
          status TYPE c LENGTH 4,       " For distinguishing materials from pbid and pbim .. will contain space for PBID and 'PBIM' for PBIM
          mblnr LIKE mseg-mblnr,        " Material Doc Number
          pbfnr LIKE pbid-pbdnr,        " Plan Number
          maktx LIKE makt-maktx,         " Matl Desc
          aenam LIKE pbhi-aenam,        " User Changed
          erfmg LIKE mseg-erfmg,        " Qty Invoiced
          budat LIKE mkpf-budat,        " Invoice date
          bdzei LIKE pbid-bdzei,        " Independent requirements pointer
          werks LIKE pbid-werks,        " plant
          pirrednqty TYPE i,            " PIR Reduction Quantity        = pbih-plnmg - pbih-dbmng
          diff TYPE i,                  " Difference
          slno TYPE i,                  " Sl No
    END OF it_pbid_pbim.
    DATA: BEGIN OF it_allrows OCCURS 0.
            INCLUDE STRUCTURE it_pbid_pbim.
    DATA: END OF it_allrows.
    *DATA: BEGIN OF it_final OCCURS 0.
           INCLUDE STRUCTURE it_pbid_pbim.
    *DATA: END OF it_final.
    DATA: BEGIN OF line,
          matnr LIKE pbid-matnr,        " Material
          laeda LIKE pbhi-laeda,        " Reduction Date
          plnmg LIKE pbhi-plnmg,        " Planned quantity
          maktx LIKE makt-maktx,        " Matl Desc
          dbmng LIKE pbhi-dbmng,        " Planned quantity in the data base
          mblnr LIKE mseg-mblnr,        " Material Doc Number
          pbfnr LIKE pbid-pbdnr,        " Plan Number
          aenam LIKE pbhi-aenam,        " User Changed
          erfmg LIKE mseg-erfmg,        " Qty Invoiced
          budat LIKE mkpf-budat,        " Invoice date
          bdzei LIKE pbid-bdzei,        " Independent requirements pointer
          werks LIKE pbid-werks,        " plant
          pirrednqty TYPE i,            " PIR Reduction Quantity        = pbih-plnmg - pbih-dbmng
          diff TYPE i,                  " Difference
          slno TYPE i,                  " Sl No
          status TYPE c LENGTH 4,       " For distinguishing materials from pbid and pbim .. will contain space for PBID and 'PBIM' for PBIM
    END OF line.
    DATA Itfinal1 LIKE STANDARD TABLE
                OF LINE
              WITH DEFAULT KEY.
    DATA ITfinal LIKE ITfinal1.
    DATA: BEGIN OF it_dates OCCURS 0,
          date TYPE sy-datum,
    END OF it_dates.
    DATA: l_slno TYPE i.
    DATA: l_zebra TYPE c.
    SELECT-OPTIONS:
          s_werks FOR pbid-werks obligatory.
    SELECT-OPTIONS:
          s_matnr FOR pbid-matnr.
    SELECT-OPTIONS:
          s_pbdnr FOR pbid-pbdnr.
    SELECT-OPTIONS:
          s_laeda FOR pbhi-laeda obligatory.
    parameter:
          c_print type checkbox.
    SELECT matnr bdzei FROM pbid INTO (it_pbid-matnr, it_pbid-bdzei) WHERE werks IN s_werks AND matnr IN s_matnr AND pbdnr IN s_pbdnr.
      it_pbid-status = 'PBID'.
      APPEND it_pbid.
    move-corresponding it_pbid to it_pbid_pbim.
    Append it_pbid_pbim.
    ENDSELECT.
    SELECT matnr bdzei FROM pbim INTO  (it_pbim-matnr,it_pbim-bdzei) WHERE werks IN s_werks AND matnr IN s_matnr AND pbdnr IN s_pbdnr.
      APPEND it_pbim.
    Append it_pbid_pbim.
    ENDSELECT.
    *break-point.
    START-OF-SELECTION.
      LOOP AT s_laeda.
        it_dates-date = s_laeda-low.
        APPEND it_dates.
      ENDLOOP.
      DATA: l_startdate LIKE sy-datum.
      IF s_laeda-high EQ space.
      ELSE.
        l_startdate = s_laeda-low + 1.
        DO.
          IF l_startdate <= s_laeda-high.
            it_dates-date = l_startdate.
            APPEND it_dates.
          ELSE.
            it_dates-date = sy-datum.
            EXIT.
          ENDIF.
          l_startdate = l_startdate + 1.
        ENDDO.
      ENDIF.
    *break-point.
      LOOP AT it_pbim.
        LOOP AT it_dates.
          it_pbim-laeda = it_dates-date.
          it_pbim-status = 'PBIM'.
          MODIFY it_pbim TRANSPORTING laeda status.
          MOVE-CORRESPONDING it_pbim TO it_pbid_pbim.
          APPEND it_pbid_pbim.
        ENDLOOP.
      ENDLOOP.
    break-point.
      l_zebra = 'X'.
      DATA: l_toterfmg LIKE mseg-erfmg.
      DATA: l_erfmg LIKE mseg-erfmg.
      data: l_totpir type i.
    **************************************PBID*************************************
      LOOP AT it_pbid.
        move-corresponding it_pbid to it_pbid_pbim.
           append it_pbid_pbim.
        SELECT SINGLE maktx FROM makt INTO (it_pbid_pbim-maktx) WHERE matnr = it_pbid-matnr.
        MODIFY table it_pbid_pbim TRANSPORTING maktx.
        SELECT aenam laeda FROM pbhi INTO (it_pbid_pbim-aenam,it_pbid_pbim-laeda) WHERE bdzei = it_pbid-bdzei AND aenam = 'Abbau-'.
           MODIFY TABLE it_pbid_pbim TRANSPORTING aenam laeda. " debug here
        select single sum( dbmng )  sum( plnmg ) FROM pbhi INTO (it_pbid_pbim-dbmng,it_pbid_pbim-plnmg) WHERE bdzei = it_pbid-bdzei AND aenam = 'Abbau-' and laeda = it_pbid_pbim-laeda..
           MODIFY TABLE it_pbid_pbim TRANSPORTING dbmng plnmg. " debug here
       endselect.
        it_pbid_pbim-pirrednqty = it_pbid_pbim-dbmng - it_pbid_pbim-plnmg.
           MODIFY table it_pbid_pbim TRANSPORTING pirrednqty.
        IF ( it_pbid_pbim-laeda IN s_laeda AND it_pbid_pbim-aenam EQ 'Abbau-' ).
          MOVE-CORRESPONDING it_pbid_pbim TO it_allrows.
          append it_allrows.
        ELSEIF NOT it_pbid_pbim-laeda IN s_laeda.
              delete it_pbid_pbim index sy-tabix.           " debug here
        ENDIF.
        ENDSELECT.
      ENDLOOP.
    **************************************PBIM*************************************
      LOOP AT it_pbim.
        move-corresponding it_pbim to it_pbid_pbim.
           append it_pbid_pbim.
        SELECT SINGLE maktx FROM makt INTO (it_pbid_pbim-maktx) WHERE matnr = it_pbim-matnr.
           MODIFY table it_pbid_pbim TRANSPORTING maktx.
        SELECT aenam laeda FROM pbhi INTO (it_pbid_pbim-aenam,it_pbid_pbim-laeda) WHERE bdzei = it_pbim-bdzei AND aenam = 'Abbau-'.
           MODIFY TABLE it_pbid_pbim TRANSPORTING aenam laeda. " debug here
        select single sum( dbmng )  sum( plnmg ) FROM pbhi INTO (it_pbid_pbim-dbmng,it_pbid_pbim-plnmg) WHERE bdzei = it_pbim-bdzei AND aenam = 'Abbau-' and laeda = it_pbid_pbim-laeda..
           MODIFY TABLE it_pbid_pbim TRANSPORTING dbmng plnmg. " debug here
        it_pbid_pbim-pirrednqty = it_pbid_pbim-dbmng - it_pbid_pbim-plnmg.
           MODIFY table it_pbid_pbim TRANSPORTING pirrednqty.
        IF ( it_pbid_pbim-laeda IN s_laeda AND it_pbid_pbim-aenam EQ 'Abbau-' ).
          MOVE-CORRESPONDING it_pbid_pbim TO it_allrows.
          append it_allrows.
        ELSEIF NOT it_pbid_pbim-laeda IN s_laeda.
              delete it_pbid_pbim index sy-tabix.           " debug here
        ENDIF.
        ENDSELECT.
      ENDLOOP.
    sort it_allrows by matnr laeda status.
    **********************************ALL ROWS************************
    loop at it_allrows.
      line-matnr = it_allrows-matnr.
      line-laeda = it_allrows-laeda.
      line-plnmg = it_allrows-plnmg.
      line-dbmng = it_allrows-dbmng.
    line-mblnr = it_allrows-mblnr.
    line-pbfnr = it_allrows-pbfnr.
      line-maktx = it_allrows-maktx.
    line-aenam = it_allrows-aenam.
    line-erfmg = it_allrows-erfmg.
    line-budat = it_allrows-budat.
      line-bdzei = it_allrows-bdzei.
    line-werks = it_allrows-werks.
      line-pirrednqty = it_allrows-pirrednqty.
      line-diff = it_allrows-diff.
      line-slno = it_allrows-slno.
      line-status = it_allrows-status.
      collect line into itfinal1.
    endloop.
    loop at itfinal1 into line.
      collect line into itfinal.
        write: / line-matnr, line-plnmg, line-dbmng,line-laeda,line-status..
    endloop.
    skip 4.
    loop at itfinal into line.
      write: / line-matnr, line-plnmg, line-dbmng,line-laeda,line-status..
    endloop.
    break-point.

  • Issue while using Collect statement in program

    Hi friend's,
    i have some issue regarding Collect statement..
    Issue is somthing like this,i have created a structure and internal table and work area with same type,
    u can look in below code..i wann to collect 'enmng' f'ield value whose matnr,charg,mvt type ,aufnr,rsnum are same but rspos and lgort are differnt for this i need to collect 'ENMNG' field value can any one tel me what to do...it not collectng value instead of this it append entire row...
    types: begin of ty_resb,
            rsnum   type resb-rsnum,                "Resrvation Number
            rspos   type resb-rspos,                "item position
            xloek   type resb-xloek,                "Item Deleted  if = 'X'
            matnr   type resb-matnr,                "Material Number
            lgort   type resb-lgort,                "Storage location  'REJT'
            charg   type resb-charg,                "Batch No
            enmng   type resb-enmng,                "Quantity withdrawn should be greater then '0'
            enwrt   type resb-enwrt,                "Value Withdrawn
            aufnr   type resb-aufnr,                "Order
            bwart   type resb-bwart,                "Movement type
       end of ty_resb.
    data:tt_resb  type table of  ty_resb ,
          tt_resb1 type table of ty_resb ,
          tt_resb2 type standard table of ty_resb ,
    **workarea.
          ts_resb type ty_resb,
          ts_resb2 type ty_resb,
          ts_resb1 type ty_resb.
    **move data to another internal table
    tt_resb1[] = tt_resb[].
    sort tt_resb  by rsnum rspos matnr charg bwart lgort aufnr .
    sort tt_resb1 by rsnum rspos matnr charg bwart lgort aufnr.
    DELETE adjacent duplicates from tt_resb  comparing rsnum rspos matnr charg bwart lgort aufnr .
    DELETE adjacent duplicates from tt_resb1 comparing rsnum rspos matnr charg bwart lgort aufnr.
    loop at tt_resb into ts_resb .
    clear:ts_resb1,ts_resb2.
    read table tt_resb1 into ts_resb1 with key rsnum = ts_resb-rsnum rspos = ts_resb-rspos matnr = ts_resb-matnr
                                                charg = ts_resb-charg aufnr = ts_resb-aufnr binary search.
    if ts_resb1-bwart = '261' .
        move ts_resb1-aufnr to ts_resb2-aufnr.
        move ts_resb1-matnr to ts_resb2-matnr.
        move ts_resb1-charg to ts_resb2-charg.
        move ts_resb1-bwart to ts_resb2-bwart.
        move ts_resb1-enwrt to ts_resb2-enwrt.
        move ts_resb1-lgort to ts_resb2-lgort.
        move ts_resb1-enmng to ts_resb2-enmng.
        collect ts_resb2 into tt_resb2.
    endif.
    clear ts_resb.
    endloop.
    Regard's,
    shaikh khalid.

    Hi Shaikh,
    I have added new declarations as highlighted below and new lines within your loop:
    Execute your program in debug mode and see what happens to the internal tt_collect I added. The collect will sum the fields enmng for all entries that  have same value on the fields matnr,charg,mvt type ,aufnr,rsnum.
    Question from me: what do you want to do with the collected/Summed up entries?
    types: begin of ty_resb,
            rsnum   type resb-rsnum,                "Resrvation Number
            rspos   type resb-rspos,                "item position
            xloek   type resb-xloek,                "Item Deleted  if = 'X'
            matnr   type resb-matnr,                "Material Number
            lgort   type resb-lgort,                "Storage location  'REJT'
            charg   type resb-charg,                "Batch No
            enmng   type resb-enmng,                "Quantity withdrawn should be greater then '0'
            enwrt   type resb-enwrt,                "Value Withdrawn
            aufnr   type resb-aufnr,                "Order
            bwart   type resb-bwart,                "Movement type
       end of ty_resb.
    data:tt_resb  type table of  ty_resb ,
          tt_resb1 type table of ty_resb ,
          tt_resb2 type standard table of ty_resb ,
    types: begin of ty_collect,
      rsnum   type resb-rsnum,
      matnr   type resb-matnr,
      charg   type resb-charg,
      bwart   type resb-bwart,
      aufnr   type resb-aufnr, 
      enmng   type resb-enmng,
           end of ty_collect.
    data: tt_collect type table of ty_collect,
          ts_collect type ty_collect.
    **workarea.
          ts_resb type ty_resb,
          ts_resb2 type ty_resb,
          ts_resb1 type ty_resb.
    **move data to another internal table
    tt_resb1[] = tt_resb[].
    sort tt_resb  by rsnum rspos matnr charg bwart lgort aufnr .
    sort tt_resb1 by rsnum rspos matnr charg bwart lgort aufnr.
    DELETE adjacent duplicates from tt_resb  comparing rsnum rspos matnr charg bwart lgort aufnr .
    DELETE adjacent duplicates from tt_resb1 comparing rsnum rspos matnr charg bwart lgort aufnr.
    loop at tt_resb into ts_resb .
    clear:ts_resb1,ts_resb2.
    read table tt_resb1 into ts_resb1 with key rsnum = ts_resb-rsnum rspos = ts_resb-rspos matnr = ts_resb-matnr
                                                charg = ts_resb-charg aufnr = ts_resb-aufnr binary search.
    if ts_resb1-bwart = '261' .
        move ts_resb1-aufnr to ts_resb2-aufnr.
        move ts_resb1-matnr to ts_resb2-matnr.
        move ts_resb1-charg to ts_resb2-charg.
        move ts_resb1-bwart to ts_resb2-bwart.
        move ts_resb1-enwrt to ts_resb2-enwrt.
        move ts_resb1-lgort to ts_resb2-lgort.
        move ts_resb1-enmng to ts_resb2-enmng.
        collect ts_resb2 into tt_resb2.
         move-corresponding ts_resb1 to ts_collect.
         collect ts_collect into tt_collect
    endif.
    clear ts_resb.
    clear ts_collect.
    endloop.

  • Problem in Update Statement

    I got some problem in update statement.Can anybody discuss with me regarding my problem? Below is the occured problem.
    //all the declaration like Connection, ResultSet are declared, setting the ODBC path and so on steps have been set up before this method. When compile it, no error, when I start to run my program, the program�s interface is shown, but the following error was appearred and data cannot be updated, can anybody tell me where is my mistake?
    //ERROR:SQL Error in update statement:java.sql.SQLException [Microsoft][ODBC][ODBC Microsoft Access Driver] Syntax Error in UPDATE statement.
    //emp_overview is the table name
    // last_name, first_name, office_phone�.is the attributes of the table
    //this method had declare in the interface class already
    public String updateData (String idd, String ln, String fn, String op,
                   String oe, String hp, String ps, String ss)
                   throws java.rmi.RemoteException
         {//begin of this method
              String result ="";
              try
              Statement statement = connection.createStatement();
              String sql = "UPDATE emp_overview SET" +
              "last_name=' "+ln+
              " ', first_name=' "+fn+
              " ', office_phone=' "+op+
              " ', office_ext=' "+oe+
              " ', home_phone=' "+hp+
              " ', primary_skill=' "+ps+
              " ', secondary_skill=' "+ss+
              " ' WHERE id="+idd;
              statement.executeUpdate(sql);
              statement.close();
              catch (java.sql.SQLException e)
         System.out.println("SQL Error in update statement: "+e);
              //throw a RemoteException with the exception
              //embedded for the client to receive
         throw new java.rmi.RemoteException("Error in Updating exist row into DB", e);
              return result;
         }//end of this method

    Hi Kevin,
    According to the code you have posted, it looks like you are missing a space between "SET" and "last_name". I suggest you add the following line of code:
    System.out.println(sql);
    before the invocation of "executeUpdate()".
    I also suggest you add the following line of code:
    e.printStackTrace();in your "catch" block.
    Hope this helps.
    Good Luck,
    Avi.

  • Reg: Collect statement in internal table

    Hi,
       Can any one tell me wether we can use the collect statement in an internal table which has no header line
    if it can be used can anyone please send me a sample snippet
    Thanks In ADVANCE
    Guhapriyan Subrahmanyam

    Hi Guhapriyan,
    I have used the collect statement in the way as shown..
    DATA : BEGIN of I_ALLOCATIONS OCCURS 0,
            PSPNR LIKE PRPS-PSPNR,
            PSPID LIKE PROJ-PSPID,
            PSPHI LIKE PRPS-PSPHI,
            POST1 LIKE PROJ-POST1,
            ZZLOB LIKE PROJ-ZZLOB,
            WERKS LIKE PROJ-WERKS,
            SOBID LIKE HRP1001-SOBID,
            OBJID LIKE HRP1001-OBJID,
            BEGDA LIKE HRP1001-BEGDA,
            ENDDA LIKE HRP1001-ENDDA,
            PROZT LIKE HRP1001-PROZT,
            LOB   LIKE HRP1000-STEXT,
            TEMP  TYPE P decimals 2,
            TYPE(3),
            ZROLE LIKE PA0001-ZROLE,
            HOLID TYPE P decimals 2,
            LEAVE TYPE P decimals 2,
            DAYS  TYPE P decimals 2,
           END of I_ALLOCATIONS.
    DATA:  I_ALLOCATION LIKE I_ALLOCATIONS OCCURS 0 WITH HEADER LINE.
    ************Populate I_ALLOCATIONS **************
    LOOP AT I_ALLOCATIONS.
        COLLECT I_ALLOCATIONS INTO I_ALLOCATION.
    ENDLOOP.
    Actually i had requirement like u, but this one is rather simple...
    Get the required data in an I_Table which dont require Header line..
    Later on collect this particular I_Table in other I_Table1 with the Header Line...
    Regards,
    Abhishek

  • Two collect statement from internal table

    Dear Experts,
    I want populate values to two internal tables from a internal table.
    can i use two collect statement for different internal table from a single internal table.
    advise please.
    Thanks in advance.
    R.Rajendran

    hi there....
    well u can very well use this thing.....
    use the two colect statements inside the loop which u will use  to read the records of the input table.
    hope it helps.
    do reward if it does.

  • Problem in Update statement using Execute Immediate

    Hi All,
    I am facing problem in update statement.
    I am creating dynamic sql and use "execute immediate" statement to execute a update statement.
    But it is not updating any thing there in the table.
    I have created a query like :
    update_query='Update '|| Table_Name ||' t set t.process_status =''Y'' where t.tid=:A';
    Execute immediate update_query using V_Id;
    commit;
    But it is not updating the table.
    I have a question , is execute immediate only does insert and delete?
    Thanks
    Ashok

    SQL> select * from t;
                     TID P
                     101 N
    SQL> declare
      2     V_Id          number := 101;
      3     Table_Name    varchar2(30) := 'T';
      4     update_query  varchar2(1000);
      5  begin
      6     update_query := 'Update '|| Table_Name ||' t set t.process_status =''Y'' where t.tid=:A';
      7     Execute immediate update_query using V_Id;
      8     commit;
      9  end;
    10  /
    PL/SQL procedure successfully completed.
    SQL> select * from t;
                     TID P
                     101 Y                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

  • Problem in UPDATE statement In Multiple Record Block

    Hi Friends,
    I have problem in update Statement for updating the record in multiple record data Block.
    I have two data Block the master block is single Record block and the 2nd data block is Multiple Record data Block.
    I am inserting the fields like category,and post_no for partiular job in single data block
    Now in second Multiple Record Data Block,i am inserting the multiple record for above fileds like no. of employees work in the position
    There is no problem in INSERT Statement as it is inerting all record But whenever i want to update particular Record (in Multiple Block) of employee for that category and Post_no
    then its updating all the record.
    my code is Bellow,
    IF v_count 0 THEN
    LOOP
    IF :SYSTEM.last_record 'TRUE' THEN
    UPDATE post_history
    SET idcode = :POST_HISTORY_MULTIPLE.idcode,
    joining_post_dt = :POST_HISTORY_MULTIPLE.joining_post_dt,
    leaving_post_dt = :POST_HISTORY_MULTIPLE.leaving_post_dt,
    entry_gp_stage = :POST_HISTORY_MULTIPLE.entry_gp_stage
    WHERE post_no = :POST_HISTORY_SINGLE.post_no
    AND category = :POST_HISTORY_SINGLE.category
    AND roster_no = :POST_HISTORY_SINGLE.roster_no;
    AND idcode = :POST_HISTORY_MULTIPLE.idcode;
    IF SQL%NOTFOUND THEN
    INSERT INTO post_history(post_no,roster_no,category,idcode,joining_post_dt,leaving_post_dt,entry_gp_stage)
    VALUES(g_post_no, g_roster_no, g_category, :POST_HISTORY_MULTIPLE.idcode, :POST_HISTORY_MULTIPLE.joining_post_dt,
    :POST_HISTORY_MULTIPLE.leaving_post_dt,:POST_HISTORY_MULTIPLE.entry_gp_stage);
    END IF;
    next_record;
    ELSIF :SYSTEM.last_record = 'TRUE' THEN
    UPDATE post_history
    SET idcode = :POST_HISTORY_MULTIPLE.idcode,
    joining_post_dt = :POST_HISTORY_MULTIPLE.joining_post_dt,
    leaving_post_dt = :POST_HISTORY_MULTIPLE.leaving_post_dt,
    entry_gp_stage = :POST_HISTORY_MULTIPLE.entry_gp_stage
    WHERE post_no = :POST_HISTORY_SINGLE.post_no
    AND category = :POST_HISTORY_SINGLE.category
    AND roster_no = :POST_HISTORY_SINGLE.roster_no;
    AND idcode = :POST_HISTORY_MULTIPLE.idcode;
    IF SQL%NOTFOUND THEN
    INSERT INTO post_history(post_no,roster_no,category,idcode,joining_post_dt,leaving_post_dt,entry_gp_stage)
    VALUES (g_post_no,g_roster_no,g_category,:POST_HISTORY_MULTIPLE.idcode,
    :POST_HISTORY_MULTIPLE.joining_post_dt,:POST_HISTORY_MULTIPLE.leaving_post_dt,:POST_HISTORY_MULTIPLE.entry_gp_stage);
    END IF;
    EXIT;
    END IF;
    END LOOP;
    SET_ALERT_PROPERTY('user_alert',ALERT_MESSAGE_TEXT, 'Record Updated successfuly' );
    v_button_no := SHOW_ALERT('user_alert');
    FORMS_DDL('COMMIT');
    CLEAR_FORM(no_validate);
    Please Guide me
    Thanks in advence

    As you do a loop over all the records in the block, of course every record is updated.
    Also, what you do is not the way is intended to be used. In general, you base a block on a table,then there is no need at all for writing INSERT's or UPDATE's. Forms also know's then, which records to be updated and which not.

  • Problem In Update Statement In Multiple Record Data Block

    Hi Friends,
    I have problem in update Statement for updating the record in multiple record data Block.
    I have two data Block the master block is single Record block and the 2nd data block is Multiple Record data Block.
    I am inserting the fields like category,and post_no for partiular job in single data block
    Now in second Multiple Record Data Block,i am inserting the multiple record for above fileds like no. of employees work in the position
    There is no problem in INSERT Statement as it is inerting all record But whenever i want to update particular Record (in Multiple Block) of employee for that category and Post_no
    then its updating all the record.
    my code is Bellow,
    IF v_count <> 0 THEN
    LOOP
    IF :SYSTEM.last_record <> 'TRUE' THEN
    UPDATE post_history
    SET idcode = :POST_HISTORY_MULTIPLE.idcode,
    joining_post_dt = :POST_HISTORY_MULTIPLE.joining_post_dt,
    leaving_post_dt = :POST_HISTORY_MULTIPLE.leaving_post_dt,
    entry_gp_stage = :POST_HISTORY_MULTIPLE.entry_gp_stage
    WHERE post_no = :POST_HISTORY_SINGLE.post_no
    AND category = :POST_HISTORY_SINGLE.category
    AND roster_no = :POST_HISTORY_SINGLE.roster_no;
    AND idcode = :POST_HISTORY_MULTIPLE.idcode;
    IF SQL%NOTFOUND THEN
    INSERT INTO post_history(post_no,roster_no,category,idcode,joining_post_dt,leaving_post_dt,entry_gp_stage)
    VALUES(g_post_no, g_roster_no, g_category, :POST_HISTORY_MULTIPLE.idcode, :POST_HISTORY_MULTIPLE.joining_post_dt,
    :POST_HISTORY_MULTIPLE.leaving_post_dt,:POST_HISTORY_MULTIPLE.entry_gp_stage);
    END IF;
    next_record;
    ELSIF :SYSTEM.last_record = 'TRUE' THEN
    UPDATE post_history
    SET idcode = :POST_HISTORY_MULTIPLE.idcode,
    joining_post_dt = :POST_HISTORY_MULTIPLE.joining_post_dt,
    leaving_post_dt = :POST_HISTORY_MULTIPLE.leaving_post_dt,
    entry_gp_stage = :POST_HISTORY_MULTIPLE.entry_gp_stage
    WHERE post_no = :POST_HISTORY_SINGLE.post_no
    AND category = :POST_HISTORY_SINGLE.category
    AND roster_no = :POST_HISTORY_SINGLE.roster_no;
    AND idcode = :POST_HISTORY_MULTIPLE.idcode;
    IF SQL%NOTFOUND THEN
    INSERT INTO post_history(post_no,roster_no,category,idcode,joining_post_dt,leaving_post_dt,entry_gp_stage)
         VALUES (g_post_no,g_roster_no,g_category,:POST_HISTORY_MULTIPLE.idcode,
              :POST_HISTORY_MULTIPLE.joining_post_dt,:POST_HISTORY_MULTIPLE.leaving_post_dt,:POST_HISTORY_MULTIPLE.entry_gp_stage);
    END IF;
    EXIT;
    END IF;
    END LOOP;
    SET_ALERT_PROPERTY('user_alert',ALERT_MESSAGE_TEXT, 'Record Updated successfuly' );
    v_button_no := SHOW_ALERT('user_alert');
    FORMS_DDL('COMMIT');
    CLEAR_FORM(no_validate);
    Please Guide me
    Thanks in advence

    UPDATE post_history
    SET idcode = :POST_HISTORY_MULTIPLE.idcode,
    joining_post_dt = :POST_HISTORY_MULTIPLE.joining_post_dt,
    leaving_post_dt = :POST_HISTORY_MULTIPLE.leaving_post_dt,
    entry_gp_stage = :POST_HISTORY_MULTIPLE.entry_gp_stage
    WHERE post_no = :POST_HISTORY_SINGLE.post_no
    AND category = :POST_HISTORY_SINGLE.category
    AND roster_no = :POST_HISTORY_SINGLE.roster_no;
    AND idcode = :POST_HISTORY_MULTIPLE.idcode;
    UPDATE post_history
    SET idcode = :POST_HISTORY_MULTIPLE.idcode,
    joining_post_dt = :POST_HISTORY_MULTIPLE.joining_post_dt,
    leaving_post_dt = :POST_HISTORY_MULTIPLE.leaving_post_dt,
    entry_gp_stage = :POST_HISTORY_MULTIPLE.entry_gp_stage
    WHERE post_no = :POST_HISTORY_SINGLE.post_no
    AND category = :POST_HISTORY_SINGLE.category
    AND roster_no = :POST_HISTORY_SINGLE.roster_no;
    AND idcode = :POST_HISTORY_MULTIPLE.idcode;These update statements are without where clause, so it will update all records.
    If it is specific to oracle forms then u may get better help at Forms section.

Maybe you are looking for