Você está na página 1de 4

public function odfidade(dmyhns as string, date1 as date, date2 as date, optional

showzero as boolean = false) as variant


'exemplo: odfidade ("dmyhns",#26/09/1979#,now())
' autor: �copyright 2001 pacific database pty limited
' graham r seach mcp mvp gseach@pacificdb.com.au
' phone: +61 2 9872 9594 fax: +61 2 9872 9593
' (*) altera��es sugeridas por douglas j. steele mvp
'
' este c�digo pode ser usado e distribu�do com qualquer aplicativo
desenvolvido usando-o com a condi��o
' de que este aviso de copyright permane�a sem modifica��es e intacto como parte
do c�digo. este c�digo
' n�o pode ser vendido ou publicado sem autoriza��o expressa do dono do
copyright.
'
'descri��o: esta fun��o calcula o n�mero de anos, meses, dias, horas, minutos e
segundos entre duas datas,
' como tempo decorrido.
'
'entradas: interval: intervalos a serem mostrados (uma string)
' date1: a data menor (veja abaixo)
' data2: a data maior (veja abaixo)
' showzero: booleano para selecionar se mostra os elementos com valor zero
'
'sa�das: on error: null
' sem erros: variant contendo o n�mero de anos, meses, dias, horas, minutos
e segundos
' entre as datas, dependendo do intervalo selecionado
' se date1 for maior que date2, o resultado ser� um n�mero negativo
' a fun��o compensa pela falta de qualquer intervalo n�o listado. por
exemplo, se o intervalo
' lista "m", mas n�o "y", a fun��o adiciona o valor do componente ano ao
componente mes.
' se showzero for true e um elemento de sa�da for zero, ele ser� mostrado;
se showzero � False ou
' omitido, os elementos zerados n�o s�o mostrados.
'
' por exemplo, com showzero = false, intervalo="ym". elementos = 0 e 1
respectivamente, a
' string de sa�da ser� "1 m�s" e n�o "0 anos 1 m�s"
'
' altera��es adicionais
' formatos associados com segmentos de datas
' altera��o na ordem dos argumentos
' additional changes:

dim vartemp as variant, basedate as date


dim diffy as long, diffm as long, diffd as long
dim diffh as long, diffn as long, diffs as long
dim y as boolean, m as boolean, d as boolean
dim h as boolean, n as boolean, s as boolean
dim ctr as integer, tmpdate as date, swapped as boolean

on error goto handleerr

'***********************************************
'change the following constants according to the
'desired output language
const yvar = " ano": const yvars = " anos"
const mvar = " m�s": const mvars = " meses"
const dvar = " dia": const dvars = " dias"
const hvar = " hora": const hvars = " horas"
const nvar = " minuto": const nvars = " minutos"
const svar = " segundo": const svars = " segundos"

const intervals as string = "dmyhns"


'verifica se interval cont�m caracteres v�lidos
for ctr = 1 to len(dmyhns)
if instr(1, intervals, mid(dmyhns, ctr, 1)) = 0 then
exit function
end if
next ctr

'verifica se as datas s�o v�lidas


if not (isdate(date1)) then exit function
if not (isdate(date2)) then exit function

'se necess�rio, troca as datas para assegurar que a data1 � menor que a data2
if date1 > date2 then
tmpdate = date1
date1 = date2
date2 = tmpdate
swapped = true
end if

odfidade = null
vartemp = null

'quais os intervalos fornecidos


y = (instr(1, dmyhns, "y") > 0)
m = (instr(1, dmyhns, "m") > 0)
d = (instr(1, dmyhns, "d") > 0)
h = (instr(1, dmyhns, "h") > 0)
n = (instr(1, dmyhns, "n") > 0)
s = (instr(1, dmyhns, "s") > 0)

'debug.print "date1: " & date1


'debug.print "date2: " & date2

'obt�m as diferen�as acumuladas


if y then
diffy = abs(datediff("yyyy", date1, date2)) - _
iif(format(date1, "mmddhhnnss") <= format(date2, "mmddhhnnss"), 0,
1) '**
date1 = dateadd("yyyy", diffy, date1)
end if
if m then
diffm = abs(datediff("m", date1, date2)) - _
iif(format(date1, "ddhhnnss") <= format(date2, "ddhhnnss"), 0, 1)
'**
date1 = dateadd("m", diffm, date1)
end if
if d then
diffd = abs(datediff("d", date1, date2)) - _
iif(format(date1, "hhnnss") <= format(date2, "hhnnss"), 0, 1) '**
date1 = dateadd("d", diffd, date1)
end if
if h then
diffh = abs(datediff("h", date1, date2)) - _
iif(format(date1, "nnss") <= format(date2, "nnss"), 0, 1) '**
date1 = dateadd("h", diffh, date1)
end if
if n then
diffn = abs(datediff("n", date1, date2)) - _
iif(format(date1, "ss") <= format(date2, "ss"), 0, 1) '**
date1 = dateadd("n", diffn, date1)
end if
if s then
diffs = abs(datediff("s", date1, date2))
date1 = dateadd("s", diffs, date1)
end if
'prepara a saida
if y and (diffy > 0 or showzero) then
vartemp = iif(swapped, iif(diffy > 0, -diffy, diffy), diffy) & _
iif(diffy <> 1, yvars, yvar)
end if
if m and (diffm > 0 or showzero) then
if m then
vartemp = vartemp & iif(isnull(vartemp), null, " ") & _
diffm & iif(diffm <> 1, mvars, mvar)
end if
end if
if d and (diffd > 0 or showzero) then
if d then
vartemp = vartemp & iif(isnull(vartemp), null, " ") & _
diffd & iif(diffd <> 1, dvars, dvar)
end if
end if
if h and (diffh > 0 or showzero) then
if h then
vartemp = vartemp & iif(isnull(vartemp), null, " ") & _
diffh & iif(diffh <> 1, hvars, hvar)
end if
end if
if n and (diffn > 0 or showzero) then
if n then
vartemp = vartemp & iif(isnull(vartemp), null, " ") & _
diffn & iif(diffn <> 1, nvars, nvar)
end if
end if
if s and (diffs > 0 or showzero) then
if s then
vartemp = vartemp & iif(isnull(vartemp), null, " ") & _
diffs & iif(diffs <> 1, svars, svar)
end if
end if

odfidade = trim(vartemp)
exit function

exithere:
exit function
' error handling block added by vba code commenter and error handler add-in. do
not edit this block of code.
handleerr:
select case err.number
case 0 'n�o existe erro
resume next
case else
if odftrataerro(err.number, err.description, "mdldatas.odfidade") =
vbretry then
resume
else
resume next
end if
end select
resume exithere
' end error handling block.

end function