DEVOLVER AÑO, MES Y DIA

Discussão em 'Progress 4GL' iniciado por carlos, Outubro 23, 2009.

  1. carlos

    carlos Membro Participativo

    Hola amigos como estan.

    Me podrian ayudar pasandome un programa donde devuelva el año, mes y el dia de un rango de fechas, ose de una fecha inicio y fecha final.

    Por ejemplo:
    F1 = 01/06/2009
    F2 = 31/10/2009

    Deberia devolver CERO años con 5 meses y cero dias.

    Carlos.
  2. jonas

    jonas Membro Participativo

    Veja se isso ajuda:

    Código:
    def var dt-data-ini as date no-undo.
    def var dt-data-fim as date no-undo.
    def var i-Ano as int no-undo.
    def var i-Mes as int no-undo.
    def var i-Dia as int no-undo.
    def var i-qt-Dias as int no-undo.
    
    assign dt-data-ini = date('01/06/2009')
           dt-data-fim = date('31/10/2009')
           i-Ano       = 0
           i-Mes       = 0
           i-Dia       = 0.
    
    if dt-data-fim < dt-data-ini then do:
        message "Data inicial maior do que a data final. Verifique" VIEW-AS ALERT-BOX warning BUTTONS ok title "Erro".
        return no-apply.
    end.
    
    assign i-Qt-Dias = dt-data-fim - dt-data-ini.
    
    /* Contar quantidade de anos */
    repeat:
    
        if i-Qt-Dias >= 365 then
            assign i-Ano     = i-Ano + 1
                   i-Qt-Dias = i-Qt-Dias - 365.
        else
            leave.
    
    end.
    
    /* Contar a quantidade de meses */
    repeat:
    
        if i-Qt-Dias >= 30 then
            assign i-Mes = i-Mes + 1
                   i-Qt-Dias = i-Qt-Dias - 30.
        else
            leave.
    
    end.
    
    /* Contar a quantidade de dias */
    repeat:
    
        if i-Qt-Dias > 0 then
            assign i-Dia     = i-Dia + 1
                   i-Qt-Dias = i-Qt-Dias - 1.
        else
            leave.
    
    end.
    
    message "Quantidade de ano(s): "  + string(i-Ano) skip
            "Quantidade de mes(es): " + string(i-Mes) skip
            "Quantidade de dia(s): "  + string(i-Dia)
        VIEW-AS ALERT-BOX INFO BUTTONS ok title "Resultado".
    
    
    Só uma observação: O código não está verificando se o ano é bissexto e sempre considera o mês como tendo 30 dias.
  3. Cobra.cne

    Cobra.cne Equipe de Suporte Moderador

    Complementando nosso amigo Jonas, segue abaixo código utilizando funções Progress para manipulação de intervalos de datas:

    Código:
    def var dt-data-ini as date no-undo.
    def var dt-data-fim as date no-undo.
    def var i-Ano as int no-undo.
    def var i-Mes as int no-undo.
    def var i-Dia as int no-undo.
    def var dt-aux as date no-undo.
    
    assign dt-data-ini = date('01/06/2009')
           dt-data-fim = date('01/06/2010')
           i-Ano       = 0
           i-Mes       = 0
           i-Dia       = 0.
    
    if dt-data-fim < dt-data-ini then do:
        message "Data inicial maior do que a data final. Verifique" VIEW-AS ALERT-BOX warning BUTTONS ok title "Erro".
        return no-apply.
    end.
    
    ASSIGN dt-aux = dt-data-ini.
    
    /* Contar a quantidade de anos */
    ASSIGN i-Ano = INTERVAL (dt-data-fim, dt-aux, "years").
    IF i-Ano > 0 THEN
        ASSIGN dt-aux = ADD-INTERVAL (dt-aux, i-Ano, "years").
    
    
    /* Contar a quantidade de meses */
    ASSIGN i-Mes = INTERVAL (dt-data-fim, dt-aux, "months").
    IF i-Mes > 0 THEN
        ASSIGN dt-aux = ADD-INTERVAL (dt-aux, i-Mes, "months").
    
    /* Contar a quantidade de dias */
    ASSIGN i-Dia = INTERVAL (dt-data-fim, dt-aux, "days").
    
    message "Quantidade de ano(s): "  + string(i-Ano) skip
            "Quantidade de mes(es): " + string(i-Mes) skip
            "Quantidade de dia(s): "  + string(i-Dia)
        VIEW-AS ALERT-BOX INFO BUTTONS ok title "Resultado".
    
    Eu também não conhecia e tratava meio de forma genérica como sugerido pelo Jonas, mas pode apresentar algumas falhas como ele mesmo citou. Desta forma são tratados a questão do ano bissexto e os dias que realmente tem cada mês.

    Também funciona para mostrar intervalos em outros formatos de horas também, busque o help das funções INTERVAL e ADD-INTERVAL.

    []'s
  4. jonas

    jonas Membro Participativo

    Valeu pela dica Cleiton.
    Eu não conhecia esses comandos.
  5. carlos

    carlos Membro Participativo

    Jonas muchas gracias por tu ayuda....ahora mismo voy a realizar la prueba.

    Cobra los comandos que colocas (INTERVAL) de que version de progress es???... mi version es 91B.

    Gracias a todos por su tan amable ayuda..... que bueno es poner un post y recibir ayuda.
  6. Cobra.cne

    Cobra.cne Equipe de Suporte Moderador

    Carlos,

    Minha versão do Progress é a 10.1A, desculpe mas não sei confirmar se estes comandos já existiam na versão 9.1B.

    []'s

Compartilhe esta Página