Duvida Ultimo dia do mês

Discussão em 'Progress 4GL' iniciado por ueluis, Junho 16, 2016.

  1. ueluis

    ueluis Membro Participativo

    Pessoal bom dia,

    alguém poderia me dar uma ideia para resolver essa dúvida:
    preciso criar um loop de data que incremente o mês, e armazenar o primeiro e ultimo dia de cada mes para executar a busca dos dados dentro do periodo separado :
    Código:
     
    dt-inicio = 01/11/2015
    dt-termino = 31/03/2016
    
    enquanto dt-inicio <= dt-termino:
               dt-busca-ini = dt-inicio. /*01/11/2015*/
               dt-busca-ter =  (ultimo dia do mês em questão)  /*30/11/2015*/
    
    FOR EACH movto-mat FIELDS(dt-trans it-codigo esp-docto nr-ord-produ tipo-trans quantidade) NO-LOCK WHERE  movto-mat.dt-trans  >= dt-busca-ini and
                       movto-mat.dt-trans  >= dt-busca-ter:
    export dados.
    end.         
    fim enquanto.
    
    no período acima determinado eu teria que armazenar os seguintes datas dinâmicas para busca:
    01/11/2015 a 30/11/2015
    01/12/2015 a 31/12/2015
    01/01/2016 a 31/01/2016
    01/02/2016 a 29/02/2016
    01/03/2016 a 31/03/2016.

    o problema é quando o mes é maior ou menor 29, 30 e 31.

    alguém ja fez algo parecido ?
  2. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    Pelo que eu entedi é isso que vc precisa, ou vc precisa gerar um arquivo para cada periodo ????? dai é um poquinho diferente ....
    Código:
    /* primeiro jeito */
    
    for each movto-estoq no-lock
        where movto-estoq.dt-trans >= dt-inicio
          and movto-estoq.dt-trans <= dt-termino:
        .....
    end.
    
    /* segundo jeito */
    
    repeat data = dt-inicio to dt-termino:
        for each movto-estoq no-lock
            where movto-estoq.dt-trans = data:
            ......
        end.
    end.
    
    
  3. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    MESSAGE DATE(1,1,2016) - 1 VIEW-AS ALERT-BOX.
  4. ueluis

    ueluis Membro Participativo

    Pessoal,

    obrigado pela dica,

    consegui dessa maneira:
    Código:
    DEF VAR vdt-inicio          AS DATE NO-UNDO.
    DEF VAR vdt-termino         AS DATE NO-UNDO.
    DEF VAR vmes-termino        AS DATE NO-UNDO.
    DEF VAR mes-atual             AS INT NO-UNDO.
    DEF VAR ano-atual             AS INT NO-UNDO.
    
        ASSIGN
             vdt-inicio = 11/01/2015 
             vdt-termino = 03/31/2016 .
    
    
        ASSIGN
            mes-atual  = month(vdt-inicio)
            ano-atual =  YEAR(vdt-inicio)
            vmes-termino = vdt-inicio.
           
    
        DO WHILE vmes-termino < vdt-termino:
    
                assign
                    vdt-inicio = DATE("01" + "/" + string(mes-atual) + "/" + STRING(ano-atual))
                    vmes-termino = ADD-INTERVAL (vdt-inicio, 1, "month") - 1.
                 DISP
                    vdt-inicio vmes-termino vdt-termino.
                 for each movto-estoq no-lock
                    where movto-estoq.dt-trans >= vdt-inicio
                      and movto-estoq.dt-trans <= vmes-termino:
                    .....
                end.
    
                 PAUSE.
                IF (mes-atual + 1) > 12 THEN
                    ASSIGN
                        mes-atual =   1
                        ano-atual = ano-atual + 1.
                ELSE
                    mes-atual = mes-atual + 1.
        END.
    
  5. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    meu caro, tudo bem que vc conseguiu resolver o seu caso, mas eu acho que vc está escrevendo demais, pode explicar melhor o que vc precisa fazer ?????
    Porque me parece que vc está duplicando dados nessa historia.
  6. ueluis

    ueluis Membro Participativo

    então @bootstrapmaster ,
    esse laço de data é parte de uma rotina pra gerar indicadores por período fechado, comparativo de eficiência mês a mês.
    o loop sem o for each me dá os períodos que são necessários gerar.
    dai eu chamo a procedure e passo a data de inicio e termino do período para ela gera os dados para o gráfico.
    de acordo com a rotina acima ela vai rodar 5 vezes trazer dados dos seguintes períodos :
    01/11/2015 a 30/11/2015 (procedure gerou txt com dados deste período)
    01/12/2015 a 31/12/2015(procedure gerou txt com dados deste período)
    01/01/2016 a 31/01/2016(procedure gerou txt com dados deste período)
    01/02/2016 a 29/02/2016(procedure gerou txt com dados deste período)
    01/03/2016 a 31/03/2016.(procedure gerou txt com dados deste período).

    é isso

Compartilhe esta Página