Função retorna semana do ano

Discussão em 'Progress 4GL' iniciado por asartori, Fevereiro 20, 2014.

  1. asartori

    asartori Membro Participativo

    Bom dia.
    Alguém já fez uma função que ao inserir uma data qualquer, retorne qual a semana do ano cai a data inserida?
    Podem ajudar-me?
    Grata.
  2. edu_felix

    edu_felix Sem Pontuação

    Bom dia.

    este código retorna a semana para a data desejada.

    define variable i as integer.
    define variable j as decimal.
    define variable k as integer.
    define variable data as date.

    define variable n_out_dat as date.

    n_out_dat = today.

    data = date(01,01,year(n_out_dat)).

    if weekday(data) <> 1 then
    data = data - (weekday(data) - 1).

    i = n_out_dat - data.


    if n_out_dat = 12/31/01 then
    i = n_out_dat - data + 1.


    j = i / 7.

    k = i modulo 7.

    if k > 0 then
    j = j + 1.

    i = truncate(j,0).

    espero ter ajudado
  3. asartori

    asartori Membro Participativo

    Ola, resolveu sim. Muito obrigada!!!
  4. eduardo.leite

    eduardo.leite Equipe de Suporte Moderador Equipe de Suporte

    Segue um exemplo que tenho:

    Código:
    def var iSemana        as integer      no-undo.
    def var dtSemanaIni    as date        no-undo.
    def var dtSemanaFin    as date        no-undo.
     
    run piCalculaSemana (input  today,
                        output iSemana,
                        output dtSemanaIni,
                        output dtSemanaFin).
     
    message "Data Hoje" chr(09) ":" today      skip
            "Semana"    chr(09) ":" iSemana    skip
            "Data Ini"  chr(09) ":" dtSemanaIni skip
            "Data Fim"  chr(09) ":" dtSemanaFin view-as alert-box.
     
    procedure picalculasemana.
       
        def input  parameter ip-data      as date    format "99/99/9999"  no-undo.
        def output parameter op-semana    as int      format "99"          no-undo.
        def output parameter op-data-ini  as date    format "99/99/9999"  no-undo.
        def output parameter op-data-fin  as date    format "99/99/9999"  no-undo.
     
        def var d-data-ini  as date                format "99/99/9999".
        def var d-data-fin  as date                format "99/99/9999".
        def var d-data      as date                format "99/99/9999".
       
        def var d-dia-sem-i as date                format "99/99/9999".
        def var d-dia-sem-f as date                format "99/99/9999".
       
        def var i-ano      as integer              format "9999".
        def var i-ano-ini  as integer              format "9999".
        def var i-ano-fin  as integer              format "9999".
       
        def var i-semana    as integer.
       
        assign d-data-ini = ip-data - 720
              d-data-fin = ip-data + 720
              d-data-ini = date(01,01,year(d-data-ini))
              d-data-fin = date(12,31,year(d-data-fin))
              i-ano-ini  = year(d-data-ini)
              i-ano-fin  = year(d-data-fin).
       
        assign d-dia-sem-i = d-data-ini - weekday(d-data-ini) + 1
              d-dia-sem-f = d-dia-sem-i + 6
              i-semana  = if day(d-dia-sem-f) > 3 then 01 else 99.
       
        busca_semana:
        do i-ano = i-ano-ini to i-ano-fin:
       
            process events.
       
            assign i-semana = 01.
       
            assign d-data-ini  = date(01,01,i-ano)
                  d-data-fin  = date(12,31,i-ano)
                  d-data-ini  = d-data-ini - weekday(d-data-ini) + 1
                  d-dia-sem-i = date(01,01,i-ano) - weekday(date(01,01,i-ano)) + 1
                  d-dia-sem-f = d-dia-sem-i + 6.
       
            if weekday(date(01,01,i-ano)) > 4 then
                assign d-data-ini = d-data-ini + 7.
               
            if weekday(date(12,31,i-ano)) < 4 then
                assign d-data-fin = d-data-fin - weekday(date(12,31,i-ano)).
            else
                assign d-data-fin = (7 - weekday(date(12,31,i-ano))) + d-data-fin.
       
            do d-data = d-data-ini to d-data-fin:
       
                if d-data = ip-data then do:
                    assign op-semana  = i-semana
                          op-data-ini = d-dia-sem-i
                          op-data-fin = d-dia-sem-f.
                    leave busca_semana.
                end.
     
                if weekday(d-data) = 7 then do:
       
                    assign i-semana    = i-semana    + 1
                          d-dia-sem-i = d-dia-sem-i + 7
                          d-dia-sem-f = d-dia-sem-f + 7.
       
                end.
       
            end.
       
        end.
     
    end procedure.
    
  5. asartori

    asartori Membro Participativo

    VAleu tb funcionou...obrigada!
  6. DsCruz

    DsCruz Sem Pontuação

    Retorna a semana em uma variável.

    ASSIGN v_NumSemana = INT(TRUNC(((DAY(TODAY) + (WEEKDAY(DATE(MONTH(TODAY),01,YEAR(TODAY)))) - 2) / 7),0) + 1).

    Troque o TODAY pela data que quiser.

Compartilhe esta Página