[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

    Valeu pela dica eriutoncharles, assim que possível eu verifico essa rotina.

    Mas estou com uma dificuldade.

    Esse é meu código:

    Código:
    DEF VAR i-ano AS INT.
    DEF VAR i-mes AS INT.
    DEF VAR vmes AS CHARACTER EXTENT 12 INITIAL ["01-JAN","02-FEV","03-MAR","04-ABR","05-MAI","06-JUN","07-JUL","08-AGO","09-SET","10-OUT","11-NOV","12-DEZ"] .
    DEF VAR vestab AS CHARACTER EXTENT 1 INITIAL ["01-LIMER"] .
    DEFINE TEMP-TABLE tt-result
        FIELD nf-peso-liq  LIKE it-nota-fisc.peso-liq
        FIELD it-desc      LIKE ITEM.cod-auxiliar
        FIELD estab        LIKE nota-fiscal.cod-estabel
        FIELD vTotal       AS DECIMAL.
    
    ASSIGN i-ano = YEAR(TODAY)
           i-mes = MONTH(TODAY).
    
    EMPTY TEMP-TABLE tt-result.
    
    FOR EACH nota-fiscal NO-LOCK
      WHERE YEAR(nota-fiscal.dt-emis-nota)  = 2012
        AND nota-fiscal.dt-cancela          = ?
        AND nota-fiscal.cod-estabel         = "1"
        ,
        FIRST natur-oper OF nota-fiscal NO-LOCK
        WHERE natur-oper.emite-dup = YES
        ,
        EACH it-nota-fisc OF nota-fiscal NO-LOCK
        ,
        FIRST ITEM OF it-nota-fisc NO-LOCK
        WHERE item.tipo-contr <= 2
        BREAK BY (nota-fiscal.dt-emis-nota)
                  BY (MONTH(nota-fiscal.dt-emis-nota))
                      BY (YEAR(nota-fiscal.dt-emis-nota))
                          BY ITEM.cod-auxiliar
        :
        FIND FIRST tab-venda
             WHERE tab-venda.descricao              = ITEM.cod-auxiliar
              AND substring(tab-venda.char-1,1,2)   = ITEM.cod-lista-destino NO-LOCK NO-ERROR.
        
        ACCUM it-nota-fisc.peso-liq (TOTAL BY MONTH(nota-fiscal.dt-emis-nota)).
    
    
        IF LAST-OF(ITEM.cod-auxiliar) THEN DO :
    
            UNDERLINE ITEM.cod-auxiliar.
            DISP ITEM.cod-auxiliar
                 ACCUM TOTAL BY MONTH(nota-fiscal.dt-emis-nota)it-nota-fisc.peso-liq @ it-nota-fisc.peso-liq
                 vestab[int(nota-fiscal.cod-estabel)]
                 vMes[MONTH(nota-fiscal.dt-emis-nota)]
                 nota-fiscal.dt-emis-nota
                 natur-oper.denominacao
                 nota-fiscal.nat-operacao WITH 1 COLUMN WIDTH 333.
    
        END.
    
    END.
    
    FOR EACH tt-result:
        DISP tt-result WITH 1 COLUMN WIDTH 333.
    END.
    
    O resultado +- isso:

    Item: Areia
    Peso Liquido: 79 KG
    Data: 01/01/2012

    Item: Areia
    Peso Liquido: 158 KG
    Data: 05/01/2012

    Ou seja, o peso varia conforme o dia do mês, pois o mesmo item é vendido diariamente para vários clientes e está exibindo individualmente o peso conforme o dia e preciso que exiba o peso total por mês de cada item.

    Ex:

    Item: Areia
    Peso Liquido: 259KG (Peso total do item no mês)

    Item: Cimento
    Peso Liquido: 1520 KG (Peso total do item no mês)

    Estou quebrando a cabeça para fazer isso....

    Iniciar em uma nova programação é um pouco complicado kkkkk

    Desculpa a amolação novamente mas quem puder me ajudar eu agradeço.

    Grato
  2. eriutoncharles

    eriutoncharles Membro Participativo

    Meu caro, não entendi direito seu código. Primeiramente, se está Ordenando por MONTH... YEAR.. tens que dá o IF LAST-OF(MONTH(data)), e não LAST-OF(item).
    Outra coisa, a temp-table ta servindo pra que? não está sendo criada em momento nenhum e no final vc dá um for each na tt-result. Não entendi direito.

    Em vez de mostrar direto, sendo eu, criaria a temp-table e preencheria com estes valores ai, porém já criaria um FIELD Mes e outro ANo e tb preencheria ASSIGN tt-result.mes = MONTH(data)... e após isso, daria o FOR EACH Na tt-Resulto Ordenando POR MEs, Ano... Acumulando ACCUM tt-result.qtd (TOTAL BY tt-resul.Mes) e verificaria IF LAST-OF(tt-resul.Mes) ... e aqui sim mostraria o acumulo.

    Pra você entender, a TT vc pode criar quantos campos quiser, preencher como quiser, vc já traz ela com todos os dados que vc quer, depois só ordena, só que vc tem que CRIAR(CREATE tt-Result) pra cada registro, cada linha e preencher (ASSIGN tt-Result).
  3. knovaes

    knovaes Sem Pontuação

    Foi mal, kkkkk

    Pode desconsiderar a temp-table por enquanto, a temp-table vou inserir posteriormente, quando conseguir trazer os resultados conforme preciso.
    Na verdade estou ordenando por:

    Código:
    BREAK BY (nota-fiscal.dt-emis-nota)
                  BY (MONTH(nota-fiscal.dt-emis-nota))
                      BY (YEAR(nota-fiscal.dt-emis-nota))
                          BY ITEM.cod-auxiliar
    se eu der um IF LAST-OF(MONTH(data)), o resultado sai assim:

    Item:Areia
    Peso Liquido: 13.584,05 (não estou conseguindo enxergar onde ele está trazendo essa qtd de peso por dia)
    Data: 05/01/2012

    Item:Areia
    Peso Liquido: 7.754,05 (não estou conseguindo enxergar onde ele está trazendo essa qtd de peso por dia)
    Data: 15/01/2012

    Porém não está correto esse cálculo, pois busquei um item apenas e somei manualmente e o resultado foi totalmente diferente.

    Ex: Item:Areia
    Peso Liquido: 7.754,05 (Esse é o valor total de kg desse item no mês de Janeiro).

    Preciso trazer o peso total de cada item em cada mês, por isso LAST-OF(item) e depois acumulo por Mês.

    Acho que é isso.

    Grato
  4. eriutoncharles

    eriutoncharles Membro Participativo

    Boa Tarde!

    Meu caro, não entendi lá muita coisa, mas lhe recomendo a trabalhar com temp-table. Você poderia criar uma tt qualquer e começar a entender como funciona o ACCUM, LAST-OF e LAST. Depois disso é só aplicar a lógíca e montar seu relatório.

    Mas repito, pra você puder usar o ACCUM, LAST... precisa está trabalhando de acordo com o BREAK BY. Não dará certo Ordenar por uma coluna e Acumular por outra.

    Um Abraço,

    Se tiver aprimorado mais a dúvida, posta ai!
  5. eduardo.leite

    eduardo.leite Equipe de Suporte Moderador Equipe de Suporte

    Kelvin,

    Aconselhor a tomar cuidado ao colocar na clausula do WHERE string de campos, pois desta maneira você estará deixando de usar o indice da tabela e a leitura poderá ser mais demorada na execução da rotina.

    Aconselho a usar a lógica conforme demonstrado abaixo:

    Código:
    
    def var dt-ini          as date     no-undo.
    def var dt-fin          as date     no-undo.
    
    def var de-valor-prod   as decimal  no-undo.
    
    assign  dt-ini = today - day(today) + 1
            dt-fin = (dt-ini + 35) - day((dt-ini + 35)).
    
    message dt-ini  skip
            dt-fin  view-as alert-box.
            
    for each ped-venda
       where ped-venda.dt-implant >= dt-ini
         and ped-venda.dt-implant <= dt-fin no-lock,
        each ped-item of ped-venda no-lock
       break by ped-item.it-codigo
             by  year(ped-venda.dt-implant)
             by month(ped-venda.dt-implant):
    
        assign de-valor-prod = de-valor-prod + ped-item.vl-liq-it.
    
        if last-of(month(ped-venda.dt-implant)) then do:
    
            disp ped-item.it-codigo             column-label "Produto"      format "x(16)"
                 year(ped-venda.dt-implant)     column-label "Ano"          format "9999"
                 month(ped-venda.dt-implant)    column-label "Mês"          format "99"
                 de-valor-prod                  column-label "Valor Total"  format "-zzz,zzz,zz9.99"
                 with stream-io width 400.
    
            assign  de-valor-prod = 0.
    
        end.
    
    end.
    
    
  6. knovaes

    knovaes Sem Pontuação

    Valeu eduardo.leite pela dica.

    abraço.

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

Compartilhe esta Página