[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. eriutoncharles

    eriutoncharles Membro Participativo

    Bom dia meu caro!

    Então, quando você faz um FOR EACH e ordena por tabela.codigo por exemplo, virá várias linhas ordenadas da forma que você organizou.

    Por Exemplo:
    FOR EACH tt-teste BREAK BY codigo BY data.
    END.

    Imaginando uma tabela teste qualquer com campos codigo, data e qtd, poderiam vir várias linhas +ou- assim:
    Codigo Data qtd
    0001 01/01/13 10
    0001 02/01/13 10
    0001 03/01/13 10
    --------------------------------------- aqui se vc ordenou no break by o progress reconhece como o last-of(tabela.codigo)
    0002 01/01/13 10
    0002 02/01/13 10

    0003 03/01/13 10

    Então você faz o Acumulo de acordo com o seu BREAK BY.
    ACCUM tt-teste.qtd ( TOTAL BY tt-teste.codigo).

    Provavelmente seu formulário se for nativo do Progress terá o DISP e as colunas.

    Então teria DISPLAY tt-teste.codigo tt-teste.data tt-teste.qtd.

    Caso queria mostrar algo em alguns destes campos, terá que usar o @.

    DISP "testando" @ tt-teste.codigo, por exemplo... ele vai mostrar isso na mesma coluna que está mostrando os códigos, fora isso, mostrará em uma nova coluna(sem o @).


    Então quando usei o @ é pra após ele ter mostraado (DISP isso, aquilo) ele verificar se é o último registro daquela data ou último registro da pesquisa e pular uma linha DOWN 1, pontilhar a linha (UNDERLINE), e após isso mostrar na mesma formatação existente ( DISP ACCUM TOTAL BY tabela.campo tabela.campoAcumulado @ tabela.campodeqtdes), para manter a formatação original do relatório.

    Caso não esteja usando comandos nativos do Progress, e esteja usando excel e/ou qualquer outro tipo de saída pra seu relatório, estes comandos não lhe são úteis!

    Um Abraço!
  2. knovaes

    knovaes Sem Pontuação

    Bom dia eriutoncharles, mais uma vez agradeço pela excelente explicação e pelo help.

    Abraço.
  3. knovaes

    knovaes Sem Pontuação

    Olá galera,

    Bom, estou com uma dúvida, gostaria de saber como faço para jogar os valores do código abaixo em uma temp-table:

    Código:
    DISP ACCUM TOTAL BY MONTH(nota-fiscal.dt-emis-nota) 
                                       it-nota-fisc.peso-liq @ it-nota-fisc.peso-liq 
                                       nota-fiscal.cod-estabel 
                                       vMes[MONTH(nota-fiscal.dt-emis-nota)]
                                       ITEM.cod-auxiliar  WITH 1 COLUMN WIDTH 333.
    
    estou tentando fazer dessa forma:

    Código:
    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.
    
    CREATE tt-result.
            ASSIGN 
                tt-result.vTotal        = ACCUM TOTAL BY MONTH (nota-fiscal.dt-emis-nota)it-nota-fisc.peso-liq
                tt-result.nf-peso-liq = it-nota-fisc.peso-liq
                tt-result.it-desc       = ITEM.cod-auxiliar
                tt-result.estab         = nota-fiscal.cod-estabel.
    
    mas sem sucesso, não funciona.

    Ocorre o erro **FIND FIRST/LAST falharam para a tabela.

    Grato novamente pela ajuda galera.
  4. eriutoncharles

    eriutoncharles Membro Participativo

    Boa Tarde!

    Tente assim:

    Código:
    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.
    
    CREATE tt-result.
            ASSIGN 
                tt-result.vTotal        = (ACCUM TOTAL BY MONTH (nota-fiscal.dt-emis-nota) it-nota-fisc.peso-liq )
                tt-result.nf-peso-liq = it-nota-fisc.peso-liq
                tt-result.it-desc       = ITEM.cod-auxiliar
                tt-result.estab         = nota-fiscal.cod-estabel.
    Mas ainda aconselharia criar um FIELD para Ano e outro para Mes e preenchar a tt com ano = year(data) mes = month(data), e daria o for each tt pelo ano e mes, porém tente da forma que postei, com os () antes que vai funcionar!
  5. knovaes

    knovaes Sem Pontuação

    Bom dia eriutoncharles,

    Realmente quando vou verificar o código, exibe a mensagem que está tudo ok.

    Mas quando vou executar, aparece FIND FIRST/LAST falharam para a tabela de tab-venda.

    Meu for each está sim:

    Código:
    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.
        
        ACCUM it-nota-fisc.peso-liq (TOTAL BY MONTH(nota-fiscal.
    
    Quando eu removo esta parte ele executa:

    Código:
    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.
    Creio que ele está se perdendo em algum ponto neste for each, porém com esse mesmo for each e com esse código roda normalmente:

    Código:
    DISP ACCUM TOTAL BY MONTH(nota-fiscal.dt-emis-nota)                     
                                       it-nota-fisc.peso-liq @ it-nota-fisc.peso-liq 
                                       nota-fiscal.cod-estabel                       
                                       vMes[MONTH(nota-fiscal.dt-emis-nota)]         
                                       ITEM.cod-auxiliar  WITH 1 COLUMN WIDTH 333. 
    Estou quebrando a cabeça aqui mas está difícil.

    Valeu galera.
  6. eriutoncharles

    eriutoncharles Membro Participativo

    Bom dia !!
    Existe uma explicação aqui no fórum sobre isso. Toda Vez que você for usar o FIND é bom Sempre no Final Usar o NO-ERROR. SEm falar que deves sempre checar se existe este registro, pois o FIND retorna apenas uma linha de resultado, então digamos que por alguma falha na lógica você esteja fazendo um FIND em algo que esteja vindo mais de uma linha de registro ou nenhuma, dará este erro.

    Então é sempre bom verificar.

    Código:
    FIND tabelax WHERE isso.. aquilo... NO-LOCK NO-ERROR.
    
    IF AVAIL tabelax THEN DO:
       DISP isso.. aquilo...
    END.
    OU

    Código:
    FOR EACH Tabelax No-LOCK.
    
        FIND TabelaY WHERE tabelay.codigo = TAbelaX.Codigo NO-LOCK NO-ERROR.
    
       DISP Tabelax.Codigo 
              Tabelax.Descricao
              IF AVAIL TabelaY THEN TabelaY.Descricao ELSE "".
    END.
    
    Veja qual o caso, se não está achando registro ou é a falta do NO-ERROR.
    Se não estiver achando registro e/ou estiver achando mais de um. também dará este erro!

    Um Abraço!
Status do Tópico:
Não esta aberto para novas mensagens.

Compartilhe esta Página