Descobrindo o ano de uma data DISP YEAR(TODAY). Descobrindo o mes de uma data DISP MONTH(TODAY). Descobrindo o dia de uma data DISP DAY(TODAY).
/* -------------------------------------------------------------------------- File : Include que incrementa no programa aS funcoes: UltDiaUtil PrimDiaUtil Author(s) : Reinaldo Data : 18/07/2001 ------------------------------------------------------------------------ */ /**************************************************************************/ FUNCTION UltDia RETURNS DATE ( vpfdta as date ) : /*------------------------------------------------------------------------------ Purpose: Recebe uma data retorna ultima data do mes. exemplo: v-data = UltDia( v-dtaref ) ------------------------------------------------------------------------------*/ def var vf-dta as date no-undo. def var vf-mes as integer no-undo. def var vf-ano as integer no-undo. /* ultimo dia do mes */ assign vf-mes = if month(vpfdta) = 12 then 1 else month(vpfdta) + 1 vf-ano = if month(vpfdta) = 12 then year(vpfdta) + 1 else year(vpfdta) vf-dta = date( vf-mes , 01 , vf-ano ) - 1. RETURN vf-dta. /* Function return value. */ END FUNCTION. /**************************************************************************/ FUNCTION UltDiaUtil RETURNS DATE ( vpfdta as date , vpf-numagencia as integer , vpf-feriadoNacional as logical) : /*------------------------------------------------------------------------------ Purpose: Recebe uma data e calcula a ultima data util do mes. exemplo: v-data = UltDiaUtil( v-dtaref , 27, yes ) -> ultimo dia util do mes, local 27, feriado nacional ------------------------------------------------------------------------------*/ def var vf-dta as date no-undo. run prg/p-feri03.p(input UltDia(vpfdta) , input vpf-numagencia, input vpf-feriadoNacional, input "-", output vf-dta ). RETURN vf-dta. /* Function return value. */ END FUNCTION. /**************************************************************************/ FUNCTION PrimDia RETURNS DATE ( vpfdta as date ) : /*------------------------------------------------------------------------------ Purpose: Recebe uma data e calcula a ultima data util do mes. exemplo: v-data = PrimDia( v-dtaref ) ------------------------------------------------------------------------------*/ def var vf-dta as date no-undo. assign vf-dta = date( month(vpfdta) , 01 , year(vpfdta)). RETURN vf-dta. /* Function return value. */ END FUNCTION. /**************************************************************************/ FUNCTION PrimDiaUtil RETURNS DATE ( vpfdta as date , vpf-numagencia as integer , vpf-feriadoNacional as logical) : /*------------------------------------------------------------------------------ Purpose: Recebe uma data e calcula a ultima data util do mes. exemplo: v-data = PrimDiaUtil( v-dtaref , 27, yes ) -> primeiro dia util do mes, local 27, feriado nacional ------------------------------------------------------------------------------*/ def var vf-dta as date no-undo. run prg/p-feri03.p(input PrimDia(vpfdta) , input vpf-numagencia, input vpf-feriadoNacional, input "+", output vf-dta ). RETURN vf-dta. /* Function return value. */ END FUNCTION. /**************************************************************************/ /**************************************************************************/
Tomei a liberdade de publicar as funções com datas que eu criei, estão não dependem de programas compilados da datasul e incluem um algoritmo para calculo do Dia da Pascoa, data base para o calculo dos outros feriados moveis. Código: /* File : Include que incrementa no programa as funcoes com dadas: ultimo-dia primeiro-dia inc-meses pascoa corpus-crist sexta-santa dia-util pri-dia-util ult-dia-util Author: Roberto Baselio Lopes Data : 03/01/2011 */ /****************FUNÇÕES COM DATAS**********************/ /*função para encontrar o ultimo dia do mês*/ FUNCTION ultimo-dia RETURNS DATE (INPUT dt AS DATE ): IF dt = ? THEN RETURN (?). RETURN (DATE(MONTH(dt),28,YEAR(dt)) + 4 - DAY(DATE(MONTH(dt),28,YEAR(dt)) + 4) ). END FUNCTION. FUNCTION primeiro-dia RETURNS DATE (INPUT dt AS DATE): IF dt = ? THEN RETURN ( ? ). RETURN (DATE(month(dt),01,YEAR(dt))). END FUNCTION. /*função para somar meses em uma data*/ /*se inteiro passado for negativo ele subtrai*/ FUNCTION inc-meses RETURNS DATE (INPUT data AS DATE, INPUT meses AS INT): IF meses = 0 THEN RETURN data. DEFINE VARIABLE aux AS INTEGER NO-UNDO. DEFINE VARIABLE aux-data AS DATE NO-UNDO. aux = (YEAR(data) * 12) + MONTH(data) + meses . aux-data = date((int(aux MOD 12)), day(data), int(TRUNCATE( aux / 12 , 0))) NO-ERROR. IF aux-data = ? THEN RETURN ultimo-dia(date((int(aux MOD 12)), 1, int(TRUNCATE( aux / 12 , 0)))). RETURN aux-data. END FUNCTION. /*calcula a pascoa de um determinado ano*/ FUNCTION pascoa RETURNS DATE (INPUT data AS DATE): DEFINE VARIABLE a AS INTEGER NO-UNDO. DEFINE VARIABLE b AS INTEGER NO-UNDO. DEFINE VARIABLE c AS INTEGER NO-UNDO. DEFINE VARIABLE d AS INTEGER NO-UNDO. DEFINE VARIABLE e AS INTEGER NO-UNDO. DEFINE VARIABLE f AS INTEGER NO-UNDO. DEFINE VARIABLE g AS INTEGER NO-UNDO. DEFINE VARIABLE h AS INTEGER NO-UNDO. DEFINE VARIABLE i AS INTEGER NO-UNDO. DEFINE VARIABLE k AS INTEGER NO-UNDO. DEFINE VARIABLE L AS INTEGER NO-UNDO. DEFINE VARIABLE m AS INTEGER NO-UNDO. DEFINE VARIABLE ano AS INTEGER NO-UNDO. DEFINE VARIABLE mes AS INTEGER NO-UNDO. DEFINE VARIABLE dia AS INTEGER NO-UNDO. ASSIGN ano = year(data) a = ano mod 19 b = truncate(ano / 100, 0) c = ano mod 100 d = truncate(b / 4, 0) e = b mod 4 f = TRUNCATE((b + 8 ) / 25, 0) g = TRUNCATE((b - f + 1) / 3, 0) h = (19 * a + b - d - g + 15) MOD 30 i = truncate(c / 4, 0) k = c mod 4 L = (32 + 2 * e + 2 * i - h - k) MOD 7 m = truncate((a + 11 * h + 22 * L) / 451, 0) mes = (TRUNCATE((h + l - 7 * m + 114) / 31, 0)) dia = (( h + l - 7 * m + 114) MOD 31) + 1. RETURN DATE(mes, dia, ano). END FUNCTION. /*calcula o feriado de corpus-crist*/ FUNCTION corpus-crist RETURNS DATE (INPUT data AS DATE): RETURN pascoa(data) + 60. END FUNCTION. /*calcula o feriado de sexta-feira santa*/ FUNCTION sexta-santa RETURNS DATE (INPUT data AS DATE): RETURN pascoa(data) - 2. END FUNCTION. /*verifica se o dia é util ou não*/ /*esta função considera feriados estaduais (São Paulo) e municipais */ FUNCTION dia-util RETURNS logical (INPUT data AS DATE): DEFINE VARIABLE dia AS integer EXTENT 10 NO-UNDO INITIAL [1, 21, 1, 9, 26, 7, 2, 15, 20, 25]. DEFINE VARIABLE mes AS INTEGER EXTENT 10 NO-UNDO INITIAL [1, 4, 5, 7, 7, 9, 11, 11, 11, 12]. DEFINE VARIABLE i AS INTEGER INIT 1 NO-UNDO. IF WEEKDAY(data) = 1 OR WEEKDAY(data) = 7 THEN RETURN FALSE. ELSE IF data = corpus-crist(data) OR data = sexta-santa(data) THEN RETURN false. ELSE DO WHILE i < 11: IF DAY(data) = dia[i] AND MONTH(data) = mes[i] THEN RETURN false. i = i + 1. END. RETURN true. END FUNCTION. /*retorna o primeiro dia util*/ FUNCTION pri-dia-util RETURNS DATE (INPUT data AS DATE): data = primeiro-dia(data). DO WHILE dia-util(data) = FALSE: data = data + 1. END. RETURN data. END FUNCTION. /*retorna o ultimo dia util*/ FUNCTION ult-dia-util RETURNS DATE (INPUT data AS DATE): data = ultimo-dia(data). DO WHILE dia-util(data) = FALSE: data = data - 1. END. RETURN data. END FUNCTION. Roberto Baselio Lopes