Professional Documents
Culture Documents
CAPTULO 81
ndice de contenido
TRABAJEMOS CON FECHAS, FORMATOS Y CONVERSIONES DE DATOS............................3
COGER LA FECHA DEL SISTEMA (Date)..................................................................................3
APLICAR FORMATOS A LA FECHA..........................................................................................3
Formato Short Date.................................................................................................................3
Formato Long Date..................................................................................................................4
Formato personalizado ...............................................................................................................4
APLICAR FORMATOS A LA HORA (Time)................................................................................5
Obtener la hora del sistema.........................................................................................................5
Manipular la hora........................................................................................................................5
FECHA Y HORA A LA VEZ (Now)...............................................................................................6
FORMATO A CADENAS DE CARACTERES..............................................................................6
Valores a maysculas (UCase)....................................................................................................6
Propiedad InputMask..................................................................................................................6
Valores a minsculas (LCase).....................................................................................................7
La funcin StrConv.....................................................................................................................7
Inicio de palabras en maysculas (vbProperCase)......................................................................8
Eliminacin de espacios en blanco (Trim, LTrim, RTrim)..........................................................8
CONVERSIONES DE DATOS.......................................................................................................9
Funciones conversoras................................................................................................................9
Deteccin tipo de dato.................................................................................................................9
Unos cuantos ejemplos prcticos sobre funciones conversoras y tipos de datos........................9
Supuesto 1: aprendemos las funciones LEFT y RIGHT........................................................9
Supuesto 2: aprendemos la funcin MID.............................................................................10
Supuesto 3: aprendemos la funcin INSTR y la funcin LEN............................................11
Supuesto 4: aprendemos la funcin REPLACE...................................................................13
Supuesto 5: practicamos con IsNumeric()............................................................................14
SEGUIMOS MANIPULANDO FECHAS....................................................................................14
Analizar el da de una fecha: funcin Weekday().....................................................................14
Obtener los elementos de una fecha: funciones Day(), Month(), Year()...................................16
Ver el nombre del mes de una fecha: funcin MonthName()...................................................16
La funcin DatePart()................................................................................................................17
La funcin DateDiff()...............................................................................................................18
Sumar das a una fecha..............................................................................................................18
Pequeo ejercicio prctico........................................................................................................19
1
Vistame en http://siliconproject.com.ar/neckkito/
UN EJEMPLO FICTICIO... REAL COMO LA VIDA MISMA...................................................19
PARA ACABAR.................................................................................................................................22
2
Vistame en http://siliconproject.com.ar/neckkito/
TRABAJEMOS CON FECHAS, FORMATOS
Y CONVERSIONES DE DATOS
Una de las mayores dificultades de trabajar con fechas es,
precisamente, el formato regional, y las diferentes
versiones de Access (que si versin espaola, que si versin
inglesa, que si no-se-sabe-bien-qu-versin-porque-lo
mezcla-todo...)
Para desarrollar este captulo vamos a crearnos una BD en blanco. Creamos asimismo un
formulario en blanco, al que llamaremos FFechas. En ese formulario aadimos un cuadro de
texto, al que llamaremos txtFResultado (hagmoslo bien largo, pues lo vamos a necesitar).
3
Vistame en http://siliconproject.com.ar/neckkito/
End Sub
Formato personalizado
Podemos convertir el formato de fecha de un tipo de fecha espaol a un ingls, o viceversa.
Las abreviaturas que utilizaremos para cada uno de los elementos de la fecha sern:
d para da
m para mes
y para ao
Vamos a convertir nuestra fecha espaola a una fecha inglesa. No podemos asignar el
resultado al textbox directamente como dato tipo Date porque Access detecta que nuestra
configuracin es espaola y lo muestra en formato espaol. Para poder ver el efecto debemos
tratar la fecha como si fuera un String, y el cdigo que deberamos utilizar es:
Ni que decir tiene que si queremos el formato en sistema espaol la expresin sera:
Nota: es importante recordar este punto porque, en ocasiones, buscamos filtrar una fecha
en una tabla y, a pesar de que constatamos que la fecha buscada existe, nuestro filtro no nos
muestra ningn registro. En este caso deberemos probar el filtro por fecha dndole el formato
ingls, por si Access entendiera que, aunque vemos las fechas en espaol, el dato est
guardado en formato ingls (un lo, ya s, pero pasa).
4
Vistame en http://siliconproject.com.ar/neckkito/
APLICAR FORMATOS A LA HORA (Time)
De la misma manera que hemos visto el manejo de la fecha podemos obtener la hora. Vamos
a ver cmo
Private Sub cmdHoraStma_Click()
Me.txtFResultado.Value = Time
End Sub
Manipular la hora
Los componentes de la hora son:
hh para la hora
mm para los minutos
ss para los segundos
El resultado sera el mismo que hemos conseguido en el punto anterior. Es decir, que
podramos programar un botn de la siguiente manera:
Como otra posibilidad podramos indicar la hora en formato 12 horas. La expresin que
deberamos utilizar sera:
Es decir:
5
Vistame en http://siliconproject.com.ar/neckkito/
Una primera solucin a lo anterior sera aplicar mscaras de entrada cuando confeccionamos la
tabla. Pero, como siempre pasa, en ese campo X en concreto se nos pas. Vamos a ver cmo
podemos enmendar un poco el asunto.
Para ello, vamos a insertar un cuadro de texto, que llamaremos txtCadena, y todos los cdigos
que aprendamos en este apartado sern asignados al evento Despus de actualizar (yo har
los supuestos sobre diferentes TextBox, en un nuevo formulario llamado FCaracteres).
Propiedad InputMask
Tenemos un segundo sistema, que es a travs de la funcin INPUTMASK. En realidad, lo que
6
Vistame en http://siliconproject.com.ar/neckkito/
hace esta funcin es aplicar una mscara2 al TextBox. Slo explicar el ejemplo aplicado a
conseguir la conversin de minsculas a maysculas y no en los siguientes, dado que la
mecnica es siempre la misma (slo tenemos que definir la mscara que queramos).
Private Sub txtCadena2_AfterUpdate()
Me.txtCadena2.InputMask = ">????????????????????"
End Sub
La funcin StrConv
Los dos ejemplos anteriores hubiramos podido aplicarlos a travs de la funcin StrConv. Esta
funcin consta de dos elementos:
Hay diversos tipos de conversin, que no se explicarn aqu (podis abrir, en VBE, buscar
StrConv en la ayuda). El tipo de conversin viene determinado por una constante de VB. De
esta manera, tendramos que:
La aplicacin de esta funcin, si seguimos nuestro ejemplo, sobre la variable vText sera:
2 Os remito a la ayuda de Access sobre el tema de mscaras de entrada. Tambin podis consultar el anexo al
captulo 2 del Manual de Access, en el apartado correspondiente a mscaras de entrada.
7
Vistame en http://siliconproject.com.ar/neckkito/
Inicio de palabras en maysculas (vbProperCase)
Supongamos que tenemos un formulario donde se dan de alta los datos de un cliente, o de un
alumno. El usuario que introduce los datos, para darse prisa, nos escribe lo
siguiente:
Como habris intuido, lo que hace vbProperCase es poner en maysculas la primera letra de
cada palabra individual.
Para solventar esta dificultad podemos utilizar la funcin TRIM. Esta funcin elimina estos
espacios en blanco.
El cdigo sera:
Comentar tambin que si slo queremos quitar los espacios iniciales (los de la izquierda),
podemos utilizar la funcin LTRIM; si queremos quitar los espacios finales (los de la derecha),
podemos utilizar la funcin RTRIM.
8
Vistame en http://siliconproject.com.ar/neckkito/
CONVERSIONES DE DATOS
Funciones conversoras
En ocasiones tenemos un tipo de dato y necesitamos
cambiarlo de tipo. Para ello existen funciones que realizan
ese trabajo. Vamos a ver las que considero ms
interesantes:
Finalmente, los supuestos estn desarrollados paso a paso. Hay pasos que se pueden
simplificar o resumir, pero en aras a la pedagoga el ejemplo se desarrolla a lo largo.
9
Vistame en http://siliconproject.com.ar/neckkito/
a travs de un InputBox.
Cmo lo hacemos?
Private Sub cmdNum2Fecha_Click()
Dim grupo1 As Integer, grupo2 As Integer
Dim grupo3 As String, grupo4 As String
Dim vFinal As String
grupo1 = 24
grupo2 = 1012
'Convertimos el primer grupo a texto
grupo1 = CStr(grupo1)
'Convertimos el segundo grupo a texto
grupo2 = CStr(grupo2)
'Extraemos, del grupo2, los dos nmeros de la izquierda, y los asignamos a la variable
grupo3
grupo3 = Left(grupo2, 2)
'Extraemos, del grupo2, los dos nmeros de la derecha, y los asignamos a la variable
grupo4
grupo4 = Right(grupo2, 2)
'Componemos lo que sera la fecha
vFinal = grupo1 & "/" & grupo3 & "/" & grupo4
'Convertimos nuestra fecha (que es de tipo String) a tipo fecha
vFinal = CDate(vFinal)
'Mostramos el resultado
Me.txtResultado.Value = vFinal
End Sub
Como vemos, si queremos extraer caracteres de una cadena de caracteres, empezando por la
izquierda utilizamos la funcin Left. Su estructura es
10
Vistame en http://siliconproject.com.ar/neckkito/
Pues para extraer esos cuatro nmeros de la cadena, para convertirlos posteriormente a tipo
nmero, podemos utilizar la funcin Mid()
Su estructura es
Len(texto)
Su estructura es:
InStr(posicin de inicio, expresin que contiene la cadena a buscar, cadena a buscar, mtodo
de comparacin)
11
Vistame en http://siliconproject.com.ar/neckkito/
diferentes tipos de mtodos de comparacin os remito a la ayuda de Access.
Pues bien... todo lo anterior es muy bonito a nivel de terico pero... alguien se ha enterado
de algo?
Es decir, que, por ejemplo, un artculo tiene este cdigo: 3410ZNDE5A6J, y podemos tener
otro artculo con el siguiente cdigo 874532SNSP3R6H8K.
Entonces se acerca nuestro jefe con una sonrisa en la boca y nos dice: tendramos que
actualizar la informacin en la base de datos. Los 5.000 artculos y poco que tenemos con
referencia interna SP han cambiado, y ahora su referencia debera ser ST. Los cambiars para
maana? Por cierto, no podemos pagarte las horas extras...
Primer problema: no podemos utilizar la funcin Left() porque el cdigo del artculo es
variable: de 4 a 6 caracteres.
Un sudor fro recorre nuestro cuerpo... Ser verdad que tendremos que quedarnos toda la
noche cambiando cdigos... o no?
Vamos a hacer el razonamiento en trminos humanos, para despus aplicarlo a cdigo, a ver
cmo podemos solventar nuestro problema.
Ya tenemos pues los elementos necesarios para destruir nuestro cdigo y volverlo a construir.
12
Vistame en http://siliconproject.com.ar/neckkito/
El cdigo que podramos aplicar sera, entonces:
Private Sub cmdFuncInStrg_Click()
Const codAntiguo As String = "3410ZNSP5A6J"
' Const codAntiguo As String = "874532SNSP3R6H8K"
Const refNueva As String = "ST"
Dim longCodigo As Integer, posicionSP As Integer
Dim antesSP As String, despuesSP As String
Dim codNuevo As String
'Cogemos la longitud del cdigo
longCodigo = Len(codAntiguo)
'Cogemos la posicin de "SP"
posicionSP = InStr(4, codAntiguo, "SP")
'Cogemos la cadena anterior a "SP"
antesSP = Left(codAntiguo, posicionSP - 1)
'Cogemos la cadena posterior a "SP"
despuesSP = Right(codAntiguo, longCodigo - (posicionSP - 1) - 2)
'Construimos el nuevo cdigo
codNuevo = antesSP & "ST" & despuesSP
'Mostramos el resultado
Me.txtResultado.Value = codNuevo
End Sub
Veris que, al inicio del cdigo, os he dejado una constante como comentario, por si queris
probar el cdigo con un segundo artculo con diferentes dgitos. Para probarlo slo tenis que
convertir en comentario la primera constante codAntiguo y eliminar el comentario de la
segunda (codAntiguo).
Por suerte para nosotros, el cdigo de proveedor no coincide nunca con el cdigo interno!!!
Podramos haber utilizado otra funcin para conseguir el mismo efecto, y que vemos en el
supuesto siguiente:
Los tres ltimos argumentos son opcionales. Si no se indica nada los valores que cogen son:
<posicin inicio de bsqueda> = 1 (es decir, desde el principio)
<nmero de reemplazos a realizar> = -1 (es decir, todos los posibles)
<clase de comparacin> Os remito a la ayuda de la funcin para ms informacin
sobre este argumento.
Es decir, que nuestro sper-cdigo del apartado anterior nos podra haber quedado as:
13
Vistame en http://siliconproject.com.ar/neckkito/
Private Sub cmdReplace_Click()
Const codAntiguo As String = "3410ZNSP5A6J"
Me.txtResultado.Value = Replace(codAntiguo, "SP", "ST")
End Sub
Je, je...
Vamos a imaginar que queremos realizar una operacin tan simple como pedir un valor a un
usuario y multiplicarlo por 5. Para pedir el valor al usuario utilizamos un InputBox. Lo que
queremos es asegurarnos de que el valor que introduce el usuario es, precisamente, numrico,
y no escribe, por ejemplo, una cadena de texto (lo cual, evidentemente, nos causar un error
de cdigo).
14
Vistame en http://siliconproject.com.ar/neckkito/
queremos que el primer da de la semana sea el lunes deberamos especificar un 2.
Podemos obviar este argumento si nos auxiliamos con unas constantes de VB. Dichas
constantes son:
vbMonday
vbTuesday
vbWednesday
vbThursday
vbFriday
vbSaturday
vbSunday
Si sabemos un poco de ingls veremos que no hace falta explicar qu significan cada una de
las anteriores constantes de VB.
Veamos pues cmo podra ser el cdigo para saber el nombre del da de una fecha:
Simplemente haceros notar que para controlar la introduccin del valor por parte del usuario, y
que realmente introduzca una fecha, hemos aadido la lnea:
Otra manera de aplicar la funcin anterior, por ejemplo, sera para realizar una accin en
funcin del da que se seleccione. Por ejemplo, supongamos que nos proponen un da para ir a
realizar un trabajo. Lo introducimos en nuestra BD para podernos planificar y... vaya! El
cdigo sera el siguiente:
15
Vistame en http://siliconproject.com.ar/neckkito/
'El da seleccionado es domingo
vDia = "29/01/12"
'Analizamos el da
If Weekday(vDia) = vbSunday Then
MsgBox "El da propuesto es domingo. No trabajamos
en domingo!", vbExclamation, "NO HBIL"
Else
MsgBox "A trabajar!", vbExclamation, "HBIL"
End If
End Sub
Lo anterior nos permite una manipulacin prcticamente completa sobre la fecha introducida.
Vamos a ver un cdigo que nos desglosa una fecha y nos indica qu es cada elemento.
Podemos conseguir el nombre de mes entero o podemos mostrar el nombre de mes abreviado.
Eso lo conseguimos a travs del argumento <abreviatura>. Si no indicamos nada es como si
ese argumento tomara el valor FALSE, lo cual nos devuelve el nombre entero; si podemos
TRUE obtendremos el nombre del mes abreviado.
16
Vistame en http://siliconproject.com.ar/neckkito/
Dim vFecha As Variant
Dim nomMes As String
vFecha = InputBox("Introduzca una fecha -Formato dd/mm/aa-", "FECHA")
If Not IsDate(vFecha) Then Exit Sub
nomMes = MonthName(Month(vFecha))
Me.txtFResultado.Value = nomMes
End Sub
La funcin DatePart()
La funcin DatePart() nos permite obtener una serie de informaciones sobre elementos
relacionados con la fecha. Para ser ms claros, por ejemplo, nos indica el nmero de trimestre,
el nmero de semana del ao, adems de permitirnos obtener, con otro sistema, datos que
acabamos de explicar en apartados anteriores.
Los dos ltimos argumentos son opcionales, y os remito a la ayuda de VB para ver su utilidad.
Como podemos ver, la utilizacin de esta funcin es muy sencilla. No olvidemos que la
podemos utilizar tambin, por ejemplo, para filtrar datos, cuando utilicemos un recordset.
17
Vistame en http://siliconproject.com.ar/neckkito/
La funcin DateDiff()
Si queremos calcular un periodo que hay entre dos fechas tenemos la funcin DateDiff(). Su
estructura es:
Por ejemplo, si queremos calcular el nmero de semanas que hay entre una fecha introducida
por el usuario y la fecha actual utilizaramos el siguiente cdigo:
18
Vistame en http://siliconproject.com.ar/neckkito/
Pequeo ejercicio prctico
Debemos comprobar que el usuario introduzca un valor que sea una fecha
Debemos comprobar que el mes introducido corresponda a julio
Debemos saltarnos todos los das de agosto. Esto es un bucle, y os recuerdo que en
un captulo anterior vimos estructuras de bucle.
Debemos acordarnos de convertir los valores de las diferentes variables para evitar
errores de cdigo.
En el formulario FEjercicios encontraris dos botones con cdigos con la solucin. Ambos
cdigos son muy similares, pero la mecnica del bucle es distinta.
Suerte!
Enunciado:
En Espaa (no s en otros pases), cuando Hacienda enva una notificacin, te da un plazo
mximo para responder a la notificacin. Los periodos son los siguientes:
19
Vistame en http://siliconproject.com.ar/neckkito/
Anlisis del supuesto y casos posibles:
Hasta aqu todo correcto. Sin embargo, hemos analizado slo dos de los tres elementos de la
fecha (da y mes), pero nos hemos dejado el tercer elemento: el ao.
Qu pasa en diciembre? Que tambin nos afecta a dos elementos: mes y ao.
Respecto del ao, en cualquier caso se deber aadir una unidad al ao de la notificacin.
Respecto del mes, no podemos aplicar la frmula general de adicionar +1 +2 al mes, puesto
que nos dara los meses 13 y 14, que no existen. Luego nos obliga a establecer valores fijos
para el mes, que sern 1 2, dependiendo de la quincena en que recibamos la notificacin.
Con todos estos elementos y anlisis en mente ya podemos programar un cdigo que nos
automatice el proceso.
20
Vistame en http://siliconproject.com.ar/neckkito/
vFNot = Nz(Me.txtFNotificacion.Value, "")
'CONTROL -> Si no hay valor en el textbox salimos del proceso
If vFNot = "" Then Exit Sub
'CONTROL -> Verificamos que se haya introducido una fecha
If Not IsDate(vFNot) Then Exit Sub
'Convertimos el string vFNot en Date
vFNot = CDate(vFNot)
'Obtenemos el da, el mes y el ao de la notificacion
vDia = Day(vFNot)
vMes = Month(vFNot)
vAno = Year(vFNot)
'Como el elemento que nos determina si aplicamos la frmula
general
'es el mes, analizamos el mes de la fecha. Lo estudiamos a travs del
'bloque SELECT CASE
Select Case vMes
'El mes va de enero a octubre. Fijaos que no tocamos el ao
Case Is <= 10
'Ahora podemos analizar el da
If vDia <= 15 Then
'Aprovechamos la misma variable vDia para fijar el da de vencimiento
vDia = 20
'Le aadimos una unidad al mes (y aprovechamos la misma variable)
vMes = vMes + 1
Else
'En caso contrario es que se ha recibido en la segunda quincena
vDia = 5
vMes = vMes + 2
End If
'El mes es noviembre
Case Is = 11
'Analizamos el da
'Primera quincena
If vDia <= 15 Then
'Como en el caso anterior, aplicamos la formulacin general
vDia = 20
vMes = vMes + 1
Else
'Segunda quincena. Ya no podemos aplicar la formulacin general. Debemos
'fijar el mes y adicionar una unidad al ao
vDia = 5
vMes = 1
vAno = vAno + 1
End If
'El mes es diciembre
Case Is = 12
'Analizamos el da
'Primera quincena
If vDia <= 15 Then
vDia = 20
'Debemos fijar el mes
vMes = 1
'Adicionamos un ao
vAno = vAno + 1
Else
'Segunda quincena. Seguimos la operativa
21
Vistame en http://siliconproject.com.ar/neckkito/
vDia = 5
vMes = 2
vAno = vAno + 1
End If
End Select
'Creamos la fecha de vencimiento como un String
vFVto = vDia & "/" & vMes & "/" & vAno
'Convertimos la fecha de vencimiento a Date
vFVto = CDate(vFVto)
'Mostramos su valor en el textbox
Me.txtFVto.Value = vFVto
End Sub
Fcil, no? ;)
PARA ACABAR...
Creo que, tras el estudio de este captulo, ya podremos decir que somos unos profesionales
en el manejo de fechas y de cadenas de caracteres... je, je...
Como siempre, espero que alguna cosa de las aqu explicadas os pueda ser til para vuestras
aplicaciones (ntese que ya no hablo de BD's... ;)
Suerte!
22
Vistame en http://siliconproject.com.ar/neckkito/