somatorio de dados

Discussão em 'Progress 4GL' iniciado por mdefarias, Junho 16, 2011.

  1. mdefarias

    mdefarias Sem Pontuação

    Como fazer para efetuar a soma de dados semelhantes e gravar en uma temp table. A TempTable eu sei definila.
    Porem preciso percorrer a tabela chamada Lancto e somar todos os registro cujo o Codigo (CR) forem iguais e salvar um unico registro na minha temp table:
    EX.
    CR Valor
    1 10,00
    1 15,00
    2 20,00
    2 10,00

    tenho que gravar na Temp Table
    CR Valor
    1 25,00
    2 30,00

    se alguem poder me ajudar ficarei muito grato, pois sou novato neste mundo progress.
  2. jdchaves

    jdchaves Membro Participativo

    cara tbm sou novo + pensei que era isso + não é :?


    Código:
    
    DEFINE VARIABLE i-cr AS INTEGER    NO-UNDO.
    DEFINE VARIABLE d-soma AS DECIMAL    NO-UNDO.
    
    FOR EACH Lancto NO-LOCK:
        ASSIGN i-cr = Lancto.cr.
        FOR EACH Lancto WHERE Lancto.cr = i-cr NO-LOCK:
            ASSIGN d-soma = d-soma + Lancto.cr-valor.
        END.
        CREATE tt-Lancto.
        ASSIGN tt-Lancto.cr = Lancto.cr
               tt-Lancto.cr-valor = d-soma.
    END.
    
  3. LeandroSantos

    LeandroSantos Membro Participativo

    Voce pode fazer assim:
    Código:
    DEF TEMP-TABLE tt-lancto LIKE lancto.
    DEF VAR soma AS DEC.
    
    FOR EACH lancto NO-LOCK
        BREAK BY lancto.cr:
    
        IF FIRST-OF(lancto.cr) THEN
            soma = 0.
    
        ASSIGN
            soma = soma + lancto.valor.
    
        IF LAST-OF(lancto.cr) THEN
        DO:
            CREATE tt-lancto.
            ASSIGN
                tt-lancto.cr = lancto.cr
                tt-lancto.valor = soma.
        END.
    
    END.
    
  4. LFBuozi

    LFBuozi Membro Participativo

    Apenas algumas observações aqui: você não vai conseguir um for each dentro de outro se os 2 forem da mesma tabela, então você apenas define um buffer e trabalha normalmente, outra é só zerar este d-soma para não ir acumulando todos os códigos e a última é impedir que faça esta soma para cada registro do lancto, então fica assim:


    Código:
    
    define buffer bf-lancto for lancto. /* buffer para a tabela */
    
    /* DEFINE VARIABLE i-cr AS INTEGER    NO-UNDO. --- não precisa */
    DEFINE VARIABLE d-soma AS DECIMAL    NO-UNDO.
    
    FOR EACH Lancto NO-LOCK break by cr:
        /* ASSIGN i-cr = Lancto.cr. --- não precisa */
        if first-of(lancto.cr) then do: /* faz a soma apenas no primeiro registro impedindo a criação de vários registros desnecessários */
            FOR EACH bf-Lancto WHERE bf-Lancto.cr = lanco.cr NO-LOCK:
                ASSIGN d-soma = d-soma + bf-Lancto.cr-valor.
            END.
            CREATE tt-Lancto.
            ASSIGN tt-Lancto.cr = Lancto.cr
                   tt-Lancto.cr-valor = d-soma
                   d-soma = 0. /* zerando após utilizar o valor */
        end.
    END.
    
    Isto foi mais para tirar futuras dúvidas.
  5. jdchaves

    jdchaves Membro Participativo

    R: LFBuozi



    bá velho nem sabia :(

    obrigado pelas dicas ;)
  6. jalegria

    jalegria Membro Participativo

    Saudações...
    Tenta assim, não precisa de variavel nem buffer. Acho que fica mais simples.

    Código:
    for each Lancto no-lock break by Lancto.cr:
    
      accumulate Lancto.cr-valor (sub-total by Lancto.cr).
    
      if last-of(Lancto.cr)
      then do:
        create tt-Lancto.
        assign tt-Lancto.cr = Lancto.cr
               tt-Lancto.cr-valor = accum sub-total by Lancto.cr Lancto.cr-valor.
      end.
    end.
    
    boa sorte...

Compartilhe esta Página