Restar fechas en Access..

Quiero restar dos fechas y que el resultado me salga en día, mes año. Es decir 15-05-07 menos 20-05-07 que de resultado 5 días
15-05-07 menos 16-06-07 que de resultado 1 mes y 1 día
¿Cómo se hace esto?
1

1 respuesta

Respuesta
1
Lo siento, pero no tengo ni idea, una opción seria utilizar las propiedades de fecha day, month y year para que te las separe y luego montar una rutina en vb para que vaya contando la separación entre las dos fechas.
 dim fecha as date
dim dia as integer
dim mes as integer
dim año as integer
fecha = #15/02/2008#
dia = day(fecha)   daria 15
mes=month(fecha)   daria 02
año=year(fecha)  daria 2008
Si haces esto con las dos fechas, luego puedes montar algo que cuente cuanto le falta a la primera fecha para llegar a la segunda, teniendo en cuenta los días de los meses y si son o no bisiestos
Siento no poder ayudarte más.
Muchas gracias por tu atención. A ver si me pudieras ayudar con otra duda que tengo.
QUiero poner un macro en el que al escribir un dato en un formulario me salga un mensaje de error si el dato ya existe y no se como poner la expresio, ¿sabrías cómo?
Gracias
Desde una macro, no se como hacerlo, pero desde vb, una opción seria algo así:
Ponte en el campo donde quieres escribir datos no coincidentes, le das a propiedades, eventos, Al salir, ... Generador de código, allí escribes esto:
Private Sub Campo1_Exit()
Dim Db As Database
Dim RsTabla As Recordset
Dim StrCampo As String
Dim CampoRs As String
Set Db = CurrentDb
'DOY VALOR A LA VARIABLE StrCampo, LE PONGO EL VALOR DEL CAMPO DONDE ESCRIBO EL VALOR QUE
'PUEDE EXISTIR
StrCampo = Me.CAMPO1.Value
'PONGO COMO VALOR A LA VARIABLE Sql LA CONSULTA QUE BUSQUE UN CAMPO IGUAL A LA TABLA
Sql = "SELECT Tabla3.campo" _
+ " FROM Tabla3" _
+ " WHERE Tabla3.campo=""" + StrCampo + """;"
'PONGO EL RESULTADO DE LA CONSULTA DENTRO DEL RECORDSET
Set RsTabla = Db.OpenRecordset(Sql)
'SI LA CONSULTA TIENE RESULTADOS, O SEA, QUE EL CAMPO EXISTE ENTONCES
If Not RsTabla.EOF Then
'DOY MENSAJE DE ERROR
MsgBox (StrCampo + " Ya existe")
Exit Sub
'SI NO HAY RESLUTADOS, NO EXISTE EL CAMPO, SALGO DE LA SUBRUTINA
Else
Exit Sub
End sub
Y listo, el comprueba en la tabla si el valor existe ya y si es así, te avisa, con un poco de imaginación, podrias hacer que el valor que hay escrito se borre automaticamente, por ejemplo debajo de msgbox (), puedes poner me.campo1.value = "", por lo que así tambien evitas que se guarde el campo porque se pase del mensaje de error. Otra opción que tienes para evitar que se pongan campos duplicados, es desde la vista diseño de la tabla, poner el campo como clave principal o en opciones de indexado, poner si sin duplicados, no dara mensaje de error, o si lo dá sera al intentar salir i guardar cambios.
no controlo mucho de access... ¿habría un método más simple?
Bien la forma más sencilla, es poner el campo de la tabla como campo principal (llave) o como indexado (si, sin duplicados) te dará error al intentar guardar los cambios si el valor ya existe en la tabla.
Hola de nuevo, muchas por gracias por tu atención, he probado a hacer lo que tu me comentas donde:
TABLA=Proveedor
Campo de la tabla=proveedor_cif
campo formulario=fproveedor_cif
y la expresión que he puesto es la siguiente
Private Sub fproveedor_cif_Exit()
Dim Db As Database
Dim RsTabla As Recordset
Dim StrCampo As String
Dim CampoRs As String
Set Db = CurrentDb
'DOY VALOR A LA VARIABLE StrCampo, LE PONGO EL VALOR DEL CAMPO DONDEESCRIBO EL VALOR QUE PUEDE EXISTIR
StrCampo = Me.fproveedor_cif.Value
'PONGO COMO VALOR A LA VARIABLE Sql LA CONSULTA QUE BUSQUE UN CAMPOIGUAL A LA TABLA
Sql = "SELECT Proveedor.proveedor_cif" _
+ " FROM Proveedor" _
+ " WHERE Proveedor.proveedor_cif=""" + StrCampo + """;"
'PONGO EL RESULTADO DE LA CONSULTA DENTRO DEL RECORDSET
Set RsTabla = Db.OpenRecordset(Sql)
'SI LA CONSULTA TIENE RESULTADOS, O SEA, QUE EL CAMPO EXISTE ENTONCES
If Not RsTabla.EOF Then
'DOY MENSAJE DE ERROR
MsgBox (StrCampo + " ya existe.")
Exit Sub
'SI NO HAY RESLUTADOS, NO EXISTE EL CAMPO, SALGO DE LA SUBRUTINA
Else
Exit Sub
End Sub
Pero me sale una ventana de error:
"La expresión'Al Salir' que ha especificado como valor de la propiedad de evento produjo el error La declaración del procedimiento no coincide con la descripción del evento o el procedimiento que tiene el mismo nombre.
*La expresión no da como resultado el nombre de una macro, de una función definida por el usuario o [Procedimiento de evento].
* Hubo un error al evaluar la función, evento o macro."
Esto es lo que me aparece en el error y no se que está mal
Yo, el único error que veo es:
Pon un espacio después del=
+ " WHERE Proveedor.proveedor_cif=""" + StrCampo + """;"
+ " WHERE Proveedor.proveedor_cif= """ + StrCampo + """;"
De todas formas seguiré investigando a ver si a mi me funciona y te doy el código que utilizo.
De todas formas, no entiendo como es que el campo de la tabla y el del formulario, tienen nombres distintos. Puede que el formulario, dependa de una consulta donde has cambiado el nombre del campo, sino no lo acabo de ver claro. Donde pones el nombre del campo me refiero a lo que pone dentro del campo del formulario, no a la etiqueta, repasa también este valor.
Ok, perfecto a ver si me puedes dar una solución que no soy capaz
Has cambiado lo del espacio y comprobado lo que te he comentado sobre el nombre del campo, ¿qué realmente pongas lo que hay dentro del campo y no lo que pone en la etiqueta?
A ver, yo lo que veo más raro es lo del nombre del campo del formulario que no coincida con el nombre del campo de la tabla. Repasa los nombres de los campos y dime algo, yo crearé una tabla y un formulario con los datos que me has pasado y haré pruebas para pasarte el código con tus nombres, pero si el error está en tú formulario, a mí me saldrá pero en el tuyo dará errores.
Mira esto y me dices algo
Si, he hecho lo que me decías, el nombre del campo de la tabla y del formulario se llaman igual (lo que aparecede dentro del formulario) proveedor_cif. Lo que ocurre es que meto un cif ya existente y no pasa nada, no salta el mensaje de error.
Bien, elimina el código del evento al salir y pon este tal i como está en Antes de Actualizar, este lo he probado y funciona bien, o sea da error cuando lo tiene que dar. El problema es que te deja seguir i guardarlo, por lo que ya depende del usuario el que le haga caso o no al mensaje de error.
Private Sub Proveedor_cif_BeforeUpdate(Cancel As Integer)
Dim Db As Database
Dim RsTabla As Recordset
Dim StrCampo As String
Dim CampoRs As String
Set Db = CurrentDb
StrCampo = Me.Proveedor_cif.Value
SQL = "SELECT Proveedor.proveedor_cif" _
+ " FROM Proveedor" _
+ " WHERE Proveedor.proveedor_cif= """ + StrCampo + """;"
Set RsTabla = Db.OpenRecordset(SQL)
If RsTabla.RecordCount = 1 Then
MsgBox (StrCampo + " ya existe.")
Exit Sub
Else
End If
Exit Sub
End Sub
Ya buscaré la manera de que si sale el mensaje de error, no te deje salir si no modificas el valor del campo
Vale, solucionado, pon debajo de MsgBox (StrCampo+ "ya existe.") lo siguiente
Me. Undo
Entonces cuando el campo existe, deshace la escritura del nif y tienes que volverlo a introducir (eso si distinto y que no excita, que sino volvemos a lo mismo) :-)
Ha costado pero creo que ahora si funcionará bien
Nada chico que he hecho lo que tu me dices y nada de nada, ahora no aparece ni error ni nada. He puesto esto:
Private Sub Proveedor_cif_BeforeUpdate(Cancel As Integer)
Dim Db As Database
Dim RsTabla As Recordset
Dim StrCampo As String
Dim CampoRs As String
Set Db = CurrentDb
StrCampo = Me.proveedor_cif.Value
SQL = "SELECT Proveedor.proveedor_cif" _
+ " FROM Proveedor" _
+ " WHERE Proveedor.proveedor_cif= """ + StrCampo + """;"
Set RsTabla = Db.OpenRecordset(SQL)
If RsTabla.RecordCount = 1 Then
MsgBox (StrCampo + " ya existe.")
Me.Undo
Exit Sub
Else
End If
Exit Sub
End Sub
Bien, te digo como lo tengo yo y lo repasamos, a mi me funciona bien.
El código, es el mismo (coincide del todo)
Tengo una tabla Proveedor con dos campos IdProveedor (Autonumérico y clavePrincipal) y otro campo Proveedor_cif (Texto)
Luego he creado un formulario con el asistente desde la tabla Proveedor con los dos campos, en el campo Proveedor_cif (Propiedades, Eventos, Antes de Actualizar) he puesto el código que te he mandado. Cuando pones un Cif no repetido, el cambia al siguiente registro y cuando pones un Cif repetido, da el mensaje de error y al aceptar, elimina el registro.
Otra cosa, yo trabajo con Access 2003, ¿con cuál trabajas tú? No sea que tengas otra versión y de problemas por esto.
Si todo lo tenemos igual y a ti no te funciona, la única opción que le veo es darte mi mail y me mandas la base para que pueda trabajar directamente con la tuya y a ver si así lo solucionamos.
¿Yo tengo el access 2007 será por ese motivo?
Puede, si lo demás lo tenemos todo igual, creo que este puede ser el motivo de que a ti no te funcione y a mi si. Ya se sabe que los chicos de microsoft, les gusta hacer modificaciones chorras a sus programitas para tocar lo que no suena a los usuarios.
Puedes preguntar a alguien que trabaje con 2007 a ver si sabe que cosita han cambiado en esta versión para que el código de VBA no sea igual.
Lo siento, pero en esto no puedo ayudarte.
Saludos.
De todas formas, si quieres convertirla a 2003 y mandármela por mail a ver si veo algún fallo, dímelo y te paso mi mail.
Ok, pásame tu email, y t la envío
Perfecto, te la acabo de enviar
Muchas gracias
Un saludo
Vale, ya va de vuelta, en el mail te explico lo que he hecho.
Nada, sigue sin ir
Tal y como hablamos por mail, si en la versión 2003 de access funciona y en la 2007 no, entonces estoy perdido. Mira de investigar que ha cambiado en el código de la versión 2007 desde la 2003 y yo por mi parte, haré lo mismo.
No sé lo que han hecho los de microsoft en la versión 2007 de office, ya que han cambiado muchas cosas, entre ellas las extensiones de algunos programas com el excel que toda la vida ha sido xls y ahora no se como le llaman, yo creo que son ganas de tocar lo que no suena. Bien como puedes ver, no le tengo mucho cariño al office 2007, quizá dentro de de unos años, cambio de opinión (el tiempo lo dirá).
De momento, si te parece podrías mirar a ver si hay algún experto en access 2007 por la web y le pasas el código que en 2003 funciona perfectamente y a ver si el sabe decirte que habría que cambiar para la nueva versión.
Si descubro algo, te lo digo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas