[RESOLVIDO] Pegar somente mês e ano de um campo data For Each

Discussão em 'EMS , HCM e Totvs 11' iniciado por knovaes, Janeiro 14, 2013.

Status do Tópico:
Não esta aberto para novas mensagens.
  1. knovaes

    knovaes Sem Pontuação

    Olá pessoal, sou novo no mundo 4each, e estou precisando da ajuda de vocês.

    Preciso gerar um 4each com os volumes de venda de cada material mensal e por ano corrente.

    Pergunta: como faço para pegar somente o mês e o ano (corrente) de um campo data de uma tabela no for each?

    Grato

    Kelvin
  2. LFBuozi

    LFBuozi Membro Participativo

    Seria isso:
    Código:
    def var i-ano as int.
    def var i-mes as int.
    assign i-ano = year(today)
           i-mes = month(today).
    for each ped-venda no-lock where year(dt-implant) i-ano and month(dt-implant) = i-mes:
        disp nr-pedcli.
    end.
  3. knovaes

    knovaes Sem Pontuação

    Valeu LFBuozi, deu certo.

    Agora surgiu mais uma dúvida, preciso que seja feita um break by a cada mês e a cada item,ou seja, no mês tenho várias vendas de vários produtos, gostaria de saber como faço para obter o volume de vendas de cada produto em cada mês.

    Não sei de outra forma de fazer, se alguém me pude ajudar eu agradeço.

    Grato
  4. eriutoncharles

    eriutoncharles Membro Participativo

    Bom dia !!

    Faz uma temp-table daí você pode manipular os dados do seu jeito, sem mecher com o banco.

    eu faria algo +- assim, usando o exemplo do amigo.

    Código:
    def var i-ano as int.
    def var i-mes as int.
    def temp-table tt-teste like ped-venda
    field ano as int
    field mes as int.
    
    assign i-ano = year(today)
           i-mes = month(today).
    for each ped-venda no-lock where year(dt-implant) i-ano and month(dt-implant) = i-mes:
        create tt-teste.
       BUFFER-COPY ped-venda TO tt-teste.
       ASSIGN tt-teste.ano = YEAR(ped-venda.dt-implant)
                 tt-teste.mes = MONTH(ped-venda.dt-implant).
     
    end.
    Após ter agora uma tabela temporária preenchida com os campos que você precisa, é só da o FOR EACH com o BREAK BY e Usar no LAST-OF e LAST.

    Código:
    FOR EACH tt-teste BREAK BY tt-teste.dt-implant BY tt-teste.mes BY tt-Teste.Ano.
    
    ACCUM tt-teste.Valorx ( TOTAL BY tt-teste.mes).
    
    DISP ...... 
    
    
    IF LAST-OF(tt-Teste.Mes) THEN DO:
        DOWN 1.
        UNDERLINE tt-teste.valorx.
        DISP ACCUM TOTAL by tt-teste.Mes tt-Teste.Valorx @ tt-teste.Valor.
        
    END.
    
    IF LAST(tt-Teste.Mes) THEN DO:
        DOWN 1.
        UNDERLINE tt-teste.valorx.
        DISP ACCUM TOTAL tt-Teste.Valorx @ tt-teste.Valor.
        
    END.
    
     
    Espero ter ajudado. Qualquer dúvida posta ai !!
  5. knovaes

    knovaes Sem Pontuação

    Muito obrigado eriutoncharles.

    Estou testando aqui e aparentemente está funcionando.

    Mais uma dúvida, por estar começando agora é um pouco complicado, mas qual a diferenca entre:

    LAST-OF

    Código:
    IF LAST-OF(tt-Teste.Mes) THEN DO:
        DOWN 1.
        UNDERLINE tt-teste.valorx.
        DISP ACCUM TOTAL by tt-teste.Mes tt-Teste.Valorx @ tt-teste.Valor.
       
    END.
    e LAST

    Código:
    IF LAST(tt-Teste.Mes) THEN DO:
        DOWN 1.
        UNDERLINE tt-teste.valorx.
        DISP ACCUM TOTAL tt-Teste.Valorx @ tt-teste.Valor.
       
    END.
    e também o que significa o @ neste código
    Código:
    tt-Teste.Valorx @ tt-teste.Valor
    .

    Muito obrigado pela força galera...
  6. knovaes

    knovaes Sem Pontuação

    kkkkk galera já entendi a diferença entre o LAST-OF e o LAST.

    Agora falta eu entender o @.

    Valeu pessoal.
Status do Tópico:
Não esta aberto para novas mensagens.

Compartilhe esta Página