Consulta Access. Dcount dependiente de otro valor

Tengo una bd de Access para archivar documentos en carpetas. El sistema que tenemos es por carpetas (numeradas con números romanos) y dentro de cada carpeta, se archiva el número de documentos (números ordinales) que quepa en la carpeta física, por lo que cada documento será XV/1,XV/2... Pero cada carpeta XV, XVI, XVII... Tendrá un número determinado de documentos.
Explico la estructura de la bd. Tabla principal Documentos, en la que están los campos de IdDocumento (clave principal pero no lo uso lo pongo para evitar conflictos ya que el autonumérico no me deja editarlo) Numerocarpeta campo de texto donde se introducen los números romanos, Numerodocumento campo numérico que guarda el numero con el que se archiva en la carpeta.
Para la entrada de datos tengo unos Formularios. El sistema es así; desde el formulario de Portada, abro el Formulario de Entrada de datos para la tabla Documentos. Antes de Abrirse tengo un imputbox donde introduzco el Valor de la Carpeta(en num. Romanos) que viene predeterminado a la carpeta actual y se abre con el valor que pongo. Ademas en el campo de Numerodocumento, tengo un código dcount que me trae el ultimo valor introcido en ese campo +1.
Más o menos he conseguido lo que quería con esta bd (numeración automática, búsquedas efectivas) pero me falta algo que considero imprescindible para el funcionamiento y es que la numeración de Numerodocumento que se hace automáticamente por un Dcount se ponga a 1 cuando cambie el Numerocarpeta.
A ver si puedo resolver esto pues me esta dando dolor de cabeza ya. No soy muy experto en esto por lo que ruego lenguaje simple.

1 respuesta

Respuesta
1
Hay alguna cosa en tu explicación que no me "cuadra" demasiado. Te rogaría pues que me explicaras lo siguiente:
- El Dcount que mencionas me estás diciendo que lo tienes en el campo [NumeroDocumento], pero si en ese campo tienes una función que te calcula el valor del campo no es posible que te guarde el valor en [NumeroDocumento] (en definitiva, o valor o expresión, pero no ambos).
¿Has comprobado que te guarda el valor correcto en la tabla?
Si yo no he entendido bien el sistema que utilizas te rogaría me lo volvieras a explicar.
Ya me comentarás.
Private Sub Form_Current()
NUMERODOCUMENTO = DCount("[NUMERODOCUMENTO]", "DOCUMENTOS") + 1
End Sub
Private Sub Form_Load()
'Entrada de Datos
NUMEROCARPETA = InputBox("Designe carpeta actual", "CARPETA ACTUAL", "XV")
'Salida de Datos
End Sub
Esta es la codificación que he hecho en el formulario de entrada de datos.
He comprobado que si me guarda los valores del dcount en la tabal.
Así como lo explicas ya me cuadra un poco más la cosa... je, je...
La función DCount admite la inclusión de un tercer argumento como criterio. La solución que te daré pues se basa en la utilización de dicho argumento.
Así pues, tu código al activar registro debería quedarte de la siguiente manera:
---
Private Sub Form_Current()
NUMERODOCUMENTO = DCount("[NUMERODOCUMENTO]", "DOCUMENTOS" _
"[NumeroCarpeta]='" & Me.[NumeroCarpeta].Value & "'") + 1
End Sub
---
Ya me dirás qué tal te ha ido.
Muchísimas gracias.
Funciona perfecto. Es además la idea que yo tenia pero no conseguía hacer bien la compilación del código.
Me gustaría aprovecharme un poco más de ti, jejejeje, si te parece ayudarme un poco más te lo agradecería eternamente.
Este que hemos resuelto era el ppal problema que tenía per hay dos detallitos que me gustaría también pulirlos para dejar yq la base de datos perfecta. Son:
- Que cuando abro el formulario de entrada de datos, ya sabes entra un imputbox donde introduzco el numero de carpeta y después abre el formulario pues me gustaría que cuando le de al botón CANCELAR de IMPUTBOX, cancele la apertura del formulario porque ahora lo que pasa es que se abre el formulario sin valores.
- También me gustaría poder incluir un CAMPO de cualquier tipo por ejemplo en el formulario de portada con el que poder cambiar el número predeterminado del IMPUTBOX que entra el NUMEROCARPETA para poder hacerlo sin tener que entrar en la codificación, para que lo pueda hacer cualquiera.
No se si será complicado resolver esto pero si se puede, me gustaría pulir esto para dejar la bd de la leche.
Gracias.
Entiendo lo que me comentas. Si te parece te voy a "cambiar" un poco la mecánica de funcionamiento porque creo que te será más cómodo. Como vamos a cambiar código que ya tienes si quieres prueba lo que te voy a explicar en una copia de tu BD, a ver si te "convence".
El "problema" en hacer lo que me comentas hace referencia al código del evento Al Cargar del formulario, y más en concreto al InputBox. Así como lo tienes estructurado resulta un poco "engorroso" adaptar una solución. Es por ello por lo que, si te parece bien, pruebas la solución que te propongo en vez de una adaptación de lo que ya tienes.
Los cambios que te voy a proponer son mínimos... Te lo digo para que no te "preocupes" por nada... je, je...
Voy a suponer que tu formulario de trabajo se llama FEntradaDatos.
Vamos allá:
1.- En tu formulario de portada añades un cuadro de texto, que será el que recogerá el número de carpeta. Sacas sus propiedades y te vas a la pestaña Otras->Nombre, y ahí le escribes txtnumcarp
2.- Añades un botón de comando y le ponemos de nombre cmdAltaDocs. Este botón nos abrirá el formulario de entrada de datos preparado ya para la introducción de datos. Ahora, de ese botón, nos vamos a la pestaña Eventos->Al hacer click... y le generas el siguiente código:
...
Private Sub...
Dim vCarp As Variant
vCarp = Me.txtnumcarp.Value
'Controlamos que el usuario haya introducido un valor
If IsNull(vCarp) Then
MsgBox "Debe introducir un número de carpeta",vbInformation,"AVISO"
Me.txtnumcarp.SetFocus
Exit Sub
End If
'Abrimos el formulario de Entrada de Datos listo para añadir un nuevo registro
DoCmd.OpenForm "FEntradaDatos",,,,acFormAdd
'Le situamos el número de carpeta escrito en la portada en el campo correspondiente
Forms![FEntradaDatos].[Numerocarpeta].Value = vCarp
End Sub
...
Ojo: debes cambiar FEntradaDatos por el nombre correcto de tu formulario.
3.- De tu formulario FEntradaDatos tienes que quitarle, del evento Al Cargar, la línea de código que hace referencia al InputBox (ya no utilizaremos ese sistema):
Es decir, la línea <NUMEROCARPETA = InputBox("Designe carpeta actual", "CARPETA ACTUAL", "XV")>
Y eso es todo. Ahora el proceso de usuario sería el siguiente:
- En el formulario de portada introduce la carpeta de trabajo en el textbox (si no introduce valor le salta un mensaje de advertnecia).
- Le da al botón para añadir datos
- Se abre el formulario de trabajo preparado para la introducción de un nuevo registro con el número de carpeta indicado en la portada (el DCount sigue funcionando sin problemas).
----------------------------
De todas maneras, para satisfacer tu curiosidad, te diré que un sistema para detectar si se ha pulsado el botón cancelar de un inputbox podría ser el siguiente
---
Private Sub...
Dim valor as string 'O el tipo de dato que sea
valor = inputbox("Dato a introducir")
If strptr(valor)=0 then
msgbox "Pulsó el botón cancelar"
Exit Sub
End if
'Resto de código
End Sub
---
Ya me dirás qué tal.
No se como pero el Dcount no funciona con esta solución. No lo entiendo si parece independiente.
Yo había probado el código en una miniBD y a mí sí me funcionaba. Debe haber algo por ahí que hace "puf"... je, je...
Vamos a probar otra estrategia. Te digo lo que debes hacer:
1.- El código del botón cmdAltaDocs lo cambias por este (te marco en negrita lo nuevo):
---
Private Sub...
Dim vCarp As Variant
Dim vDoc As Integer
vCarp = Me.txtnumcarp.Value
'Controlamos que el usuario haya introducido un valor
If IsNull(vCarp) Then
MsgBox "Debe introducir un número de carpeta",vbInformation,"AVISO"
Me.txtnumcarp.SetFocus
Exit Sub
End If
'Calculamos el nuevo número de documento
vDoc=DCount("[NUMERODOCUMENTO]", "DOCUMENTOS" _
"[NumeroCarpeta]='" & vCarp & "'") + 1
'Abrimos el formulario de Entrada de Datos listo para añadir un nuevo registro
DoCmd.OpenForm "FEntradaDatos",,,,acFormAdd
'Le situamos el número de carpeta escrito en la portada en el campo correspondiente
Forms![FEntradaDatos].[Numerocarpeta].Value = vCarp
'Le situamos el número de documento obtenido en el campo correspondiente
Forms![FEntradaDatos].[Numerodocumento].Value = vDoc
End Sub
...
2.- Le quitamos el código al evento Al activar registro del formulario FEntradaDatos
A ver si ahora te funciona bien.
Ya me dirás cosas.
Muchas gracias.
Esto ya esta casi listo. Lo que pasa que cada vez que cambio algo surge otro problemilla. Jejejeje.
Yo creo que ya será lo ultimo por resolver, eso espero.
En el Formulario de entrada de datos, tengo un botón de "Nuevo registro" para cuando tengo que archivar más de un documento que es siempre no tener que salir a la portada y darle de nuevo.
Como antes tenia la codificación en al cargar formulario, lo que hacia era en este botón que cerraba y abría el formulario y listo pero ahora no vale.
A ver que se puede hacer para darle a nuevo registro y que haga la función de dejar el número de carpeta del registro actual y sume el dcount.
La verdad es que me estas ayudando de forma inestimable. Te lo agradezco en serio.
A ese botón de nuevo registro colócale el siguiente código:
...
Private Sub...
'Esto es para guardar el registro y que el DCount no te dé errores
Docmd. RunCommand acCmdSaveRecord
'Creamos las variables y asignamos valores
Dim vCarp as String
Dim vDoc as Integer
vCarp=Me.[NumeroCarpeta].Value
vDoc=DCount("[NUMERODOCUMENTO]", "DOCUMENTOS" _
"[NumeroCarpeta]='" & vCarp & "'") + 1
'Nos movemos a un nuevo registro
DoCmd.RunCommand acCmdRecordsGoToNew
'Reasignamos los valores a los campos correspondientes
Me.[NumeroCarpeta].Value=vCarp
Me.[NumeroDocumento].Value=vDoc
End Sub
...
Se puede hacer de manera que te pida si quieres continuar con la misma carpeta o quieres cambiarle el número de carpeta. Personalmente pienso que te tenga que pedir, a cada nuevo registro, lo anterior, no es muy práctico. Pero como no conozco tu BD, si consideras que lo necesitas, me lo comentas y te modifico el código.
Te lo he escrito de cabeza. Si te da algún error me lo comentas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas