Campo Correlativo según campo secundario
¿Cómo crear un campo correlativo de una tabla en un Formulario según otro campo de la misma tabla?
Ej:
Campos de la Tabla
Correlativo Personas
1 FRANCISCO
1 JAIME
2 FRANCISCO
2 JAIME
1 ANTONIO
3 FRANCISCO
2 ANTONIO
Ej:
Campos de la Tabla
Correlativo Personas
1 FRANCISCO
1 JAIME
2 FRANCISCO
2 JAIME
1 ANTONIO
3 FRANCISCO
2 ANTONIO
1 Respuesta
Respuesta de xavi -ae soft-
1
1
xavi -ae soft-, 20años de experiencia en programacion Access a razon de 10 horas...
Imaginate por un momento que no sabes absolutamente nada de tu base de datos: no conoces los datos, no sabes las funcionalidades, no sabes el objetivo ni para que sirve cada campo.
¿Lo estas imaginando? Bien... entonces lee ahora tu pregunta y dime que has entendido.
¿Lo estas imaginando? Bien... entonces lee ahora tu pregunta y dime que has entendido.
Lo siento. Tienes toda la razón. Te comento como es la base de datos.
La Tabla llamada "INCIDENCIAS" que se esta hecha en SQL tiene los siguientes campos:
IdExpediente | Numero | Tecnico | Descripcion
Pues bien, en esta tabla a través de un formulario los técnicos electricistas tienen que cargar las incidencias de cada expediente, pero con condiciones. (El campo "Numero" tiene que ser correlativo según el campo "Tecnico"), es decir, dentro de cada Expediente pueden escribir incidencias varios técnicos y necesito que el Campo "Numero" vaya siendo correlativo según el técnico que escriba la incidencia.
Lo tengo que hacer a través de formulario de access. Lo intentare explicar un poco mejor con el siguiente ejemplo.
Ej: Tabla Incidencias
Expediente Numero Técnico Descrpcion
123 1 Francisco Incidencia1
123 1 Jaime Incidencia2
123 2 Francisco Incidencia3
123 2 Jaime Incidencia4
123 1 Antonio Incidencia5
Espero que se entienda un poco mejor, sino pregúnteme lo que necesite.
1 millón de Gracias.
La Tabla llamada "INCIDENCIAS" que se esta hecha en SQL tiene los siguientes campos:
IdExpediente | Numero | Tecnico | Descripcion
Pues bien, en esta tabla a través de un formulario los técnicos electricistas tienen que cargar las incidencias de cada expediente, pero con condiciones. (El campo "Numero" tiene que ser correlativo según el campo "Tecnico"), es decir, dentro de cada Expediente pueden escribir incidencias varios técnicos y necesito que el Campo "Numero" vaya siendo correlativo según el técnico que escriba la incidencia.
Lo tengo que hacer a través de formulario de access. Lo intentare explicar un poco mejor con el siguiente ejemplo.
Ej: Tabla Incidencias
Expediente Numero Técnico Descrpcion
123 1 Francisco Incidencia1
123 1 Jaime Incidencia2
123 2 Francisco Incidencia3
123 2 Jaime Incidencia4
123 1 Antonio Incidencia5
Espero que se entienda un poco mejor, sino pregúnteme lo que necesite.
1 millón de Gracias.
Ahora si!
Puedes utilizar la propiedad Valor predeterminado del control Numero para asignar el numero adecuado.
Los datos que necesitas para eso son: el técnico y el expediente. Para hacerlo dispones de algo llamado funciones agregadas de dominio: DMáx en tu caso parece la adecuada.
DMáx nos pide 2 argumentos obligatorios y uno opcional. Que queremos recuperar y de dónde serian los obligatorios. La condiciona a cumplir seria el opcional
En el fondo, DMáx es como una consulta de totales pero simplificada.
Así pues:
=DMáx("Numero"; "INCIDENCIAS") nos devolveria el número de incidencia más alto --> no nos sirve
=DMáx("Numero"; "INCIDENCIAS"; "Expediente = " & [txtExpediente]) nos devolveria el número más alto de las incidencias con el expediente actualmente seleccionado --> tampoco nos sirve
=DMáx("Numero"; "INCIDENCIAS"; "Expediente = " & [txtExpediente] & " AND [Tecnico] = '" & [txtTecnico] & "'") nos devolveria el numero más alto del expediente actualmente seleccionado --> esto ya nos sirve de algo... pero tiene un problema (facil): queremos el siguiente. Bien, le sumamos 1.
=DMáx("Numero"; "INCIDENCIAS"; "Expediente = " & [txtExpediente] & " AND [Tecnico] = '" & [txtTecnico] & "'") + 1
Parecería que ya tenemos la solución... pero no es así: ¿Qué pasa cuando no existe ningún registro para el expediente? O si, ¿teniendo registros para el expediente no hay ninguno para el técnico? Pues que la función no encuentra nada y devuelve un Nulo. Y a un nulo no le puedo sumar nada, porque también da nulo. ¿Cómo lo solucionamos? Pues con la función Nz, que nos permite decidir que hacemos cuando encontramos un nulo:
=Nz(DMáx("Numero"; "INCIDENCIAS"; "Expediente = " & [txtExpediente] & " AND [Tecnico] = '" & [txtTecnico] & "'"; 0) + 1
Espero te sirva
Puedes utilizar la propiedad Valor predeterminado del control Numero para asignar el numero adecuado.
Los datos que necesitas para eso son: el técnico y el expediente. Para hacerlo dispones de algo llamado funciones agregadas de dominio: DMáx en tu caso parece la adecuada.
DMáx nos pide 2 argumentos obligatorios y uno opcional. Que queremos recuperar y de dónde serian los obligatorios. La condiciona a cumplir seria el opcional
En el fondo, DMáx es como una consulta de totales pero simplificada.
Así pues:
=DMáx("Numero"; "INCIDENCIAS") nos devolveria el número de incidencia más alto --> no nos sirve
=DMáx("Numero"; "INCIDENCIAS"; "Expediente = " & [txtExpediente]) nos devolveria el número más alto de las incidencias con el expediente actualmente seleccionado --> tampoco nos sirve
=DMáx("Numero"; "INCIDENCIAS"; "Expediente = " & [txtExpediente] & " AND [Tecnico] = '" & [txtTecnico] & "'") nos devolveria el numero más alto del expediente actualmente seleccionado --> esto ya nos sirve de algo... pero tiene un problema (facil): queremos el siguiente. Bien, le sumamos 1.
=DMáx("Numero"; "INCIDENCIAS"; "Expediente = " & [txtExpediente] & " AND [Tecnico] = '" & [txtTecnico] & "'") + 1
Parecería que ya tenemos la solución... pero no es así: ¿Qué pasa cuando no existe ningún registro para el expediente? O si, ¿teniendo registros para el expediente no hay ninguno para el técnico? Pues que la función no encuentra nada y devuelve un Nulo. Y a un nulo no le puedo sumar nada, porque también da nulo. ¿Cómo lo solucionamos? Pues con la función Nz, que nos permite decidir que hacemos cuando encontramos un nulo:
=Nz(DMáx("Numero"; "INCIDENCIAS"; "Expediente = " & [txtExpediente] & " AND [Tecnico] = '" & [txtTecnico] & "'"; 0) + 1
Espero te sirva
Estimado Xavi:
He seguido al pie de la letra sus instrucciones y al pegar la frase que Usted me indica:
=Nz(DMáx("Numero"; "INCIDENCIAS"; "Expediente = " & [txtExpediente] & " AND [Tecnico] = '" & [txtTecnico] & "'"; 0) + 1
En Valor predeterminado del Control Numero me muestra un mensaje que dice:
"La expresión que introdujo contiene una función con un número incorrecto de argumentos."
He estado mirando detenidamente la fórmula y creo que la faltaba cerrar un paréntesis. Lo he colocado justamente después de las ultimas comillas, quedando así:
=Nz(DMáx("Numero"; "INCIDENCIAS"; "Expediente = " & [txtExpediente] & " AND [Tecnico] = '" & [txtTecnico] & "'") ; 0) + 1
Así ya no me muestra ningún mensaje y me deja insertar la linea, pero después al hacer una prueba real en el formulario me sale constantemente en el campo "Numero" la frase "#Error", y ya me he vuelto a quedar de nuevo bloqueado.
Espero ansioso su respuesta.
Muchísimas Gracias por su ayuda.
He seguido al pie de la letra sus instrucciones y al pegar la frase que Usted me indica:
=Nz(DMáx("Numero"; "INCIDENCIAS"; "Expediente = " & [txtExpediente] & " AND [Tecnico] = '" & [txtTecnico] & "'"; 0) + 1
En Valor predeterminado del Control Numero me muestra un mensaje que dice:
"La expresión que introdujo contiene una función con un número incorrecto de argumentos."
He estado mirando detenidamente la fórmula y creo que la faltaba cerrar un paréntesis. Lo he colocado justamente después de las ultimas comillas, quedando así:
=Nz(DMáx("Numero"; "INCIDENCIAS"; "Expediente = " & [txtExpediente] & " AND [Tecnico] = '" & [txtTecnico] & "'") ; 0) + 1
Así ya no me muestra ningún mensaje y me deja insertar la linea, pero después al hacer una prueba real en el formulario me sale constantemente en el campo "Numero" la frase "#Error", y ya me he vuelto a quedar de nuevo bloqueado.
Espero ansioso su respuesta.
Muchísimas Gracias por su ayuda.
Efectivamente me salte un paréntesis... pero como excusa utilizare que todo el código lo escribo al vuelo.
En cuanto al error... pues es posible que alguno de los controles no se llame como se indica en la fórmula (txtExpediente y/o txtTecnico) o alguno de los campos/tablas tenga ligeras diferencias con lo que yo puse. ¿Lo has verificado?
Xavi
En cuanto al error... pues es posible que alguno de los controles no se llame como se indica en la fórmula (txtExpediente y/o txtTecnico) o alguno de los campos/tablas tenga ligeras diferencias con lo que yo puse. ¿Lo has verificado?
Xavi
Xavi:
He estado Verificando los nombres de cada campo y no sigo encontrar algo que me de la pista de donde puede estar el error. Pero... ¿que d¡ferencia hay entre "txtExpediente" y "Expediente"? Puedo intuir que es el "Nombre" y "Origen del registro" respectivamente ¿no?.
En algunos campos tengo en "Nombre" y "Origen del Registro" lo mismo.
¿Le cambio a todos los Campos el nombre por "txt..."?
Gracias por tu ayuda
He estado Verificando los nombres de cada campo y no sigo encontrar algo que me de la pista de donde puede estar el error. Pero... ¿que d¡ferencia hay entre "txtExpediente" y "Expediente"? Puedo intuir que es el "Nombre" y "Origen del registro" respectivamente ¿no?.
En algunos campos tengo en "Nombre" y "Origen del Registro" lo mismo.
¿Le cambio a todos los Campos el nombre por "txt..."?
Gracias por tu ayuda
Cuando yo utilizo txtExpediente en el ejemplo me estoy refiriendo a un control (un textbox en este caso) dónde existirá un número de expediente. Ese TextBox puede ser independiente o dependiente del campo Expediente. En tu caso supongo que es dependiente y, parece, se llama Expediente. Pues nada, no es un problema.
Te cuento como lo hago yo. Un control basado en un campo del origen del registro tiene el mismo nombre que el campo. Así, un campo Expediente aparecerá en un control Expediente. Si el control fuera independiente (un control dónde el usuario introduce un valor para, por ejemplo, filtrar unos registros) en ese caso, el control se llamaría distinto: txtExpediente o cboExpediente.
Lo que ocurre que esa es la forma en que yo lo hago, pero cuando escribo en los foros me gusta indicar que se trata de un control, de ahí la utilización de txt o cbo antes del nombre en si.
Simplemente
Xavi
Te cuento como lo hago yo. Un control basado en un campo del origen del registro tiene el mismo nombre que el campo. Así, un campo Expediente aparecerá en un control Expediente. Si el control fuera independiente (un control dónde el usuario introduce un valor para, por ejemplo, filtrar unos registros) en ese caso, el control se llamaría distinto: txtExpediente o cboExpediente.
Lo que ocurre que esa es la forma en que yo lo hago, pero cuando escribo en los foros me gusta indicar que se trata de un control, de ahí la utilización de txt o cbo antes del nombre en si.
Simplemente
Xavi
He estado probando por orden todas las funciones que me pusiste, para ver a donde me empieza a dar el error, pero solo la primera es la que me muestra un numero y no da error.
A partir de la segunda función da error.
1. =DMáx("Numero"; "INCIDENCIAS")
2. =DMáx("Numero"; "INCIDENCIAS"; "Expediente = " & [Expediente])
3. =DMáx("Numero"; "INCIDENCIAS"; "Expediente = " & [Expediente] & " AND [Tecnico] = '" & [Tecnico] & "'")
4. =DMáx("Numero"; "INCIDENCIAS"; "Expediente = " & [Expediente] & " AND [Tecnico] = '" & [Tecnico] & "'") + 1
5. =Nz(DMáx("Numero"; "INCIDENCIAS"; "Expediente = " & [Expediente] & " AND [Tecnico] = '" & [Tecnico] & "'"; 0) + 1
Es más, he creado en access una nueva tabla con los mismos registros que en la tabla SQL, para ver si no me da los mismos errores por ser tabla de access, pero sigue igual. También da error a partir de la segunda función aquí descrita. ¿Qué le puede pasar? ¿A dónde puede estar el error? Siento tanta molestia.
Mil Gracias
A partir de la segunda función da error.
1. =DMáx("Numero"; "INCIDENCIAS")
2. =DMáx("Numero"; "INCIDENCIAS"; "Expediente = " & [Expediente])
3. =DMáx("Numero"; "INCIDENCIAS"; "Expediente = " & [Expediente] & " AND [Tecnico] = '" & [Tecnico] & "'")
4. =DMáx("Numero"; "INCIDENCIAS"; "Expediente = " & [Expediente] & " AND [Tecnico] = '" & [Tecnico] & "'") + 1
5. =Nz(DMáx("Numero"; "INCIDENCIAS"; "Expediente = " & [Expediente] & " AND [Tecnico] = '" & [Tecnico] & "'"; 0) + 1
Es más, he creado en access una nueva tabla con los mismos registros que en la tabla SQL, para ver si no me da los mismos errores por ser tabla de access, pero sigue igual. También da error a partir de la segunda función aquí descrita. ¿Qué le puede pasar? ¿A dónde puede estar el error? Siento tanta molestia.
Mil Gracias
- Compartir respuesta
- Anónimo
ahora mismo