Seleccionar e imprimir informe según valor de campo combinado

Tengo una tabla y formulario llamado CERTIFICADOS que esta relacionado con una tabla y formulario llamado REPORTE DE SERVICIO. En REPORTE DE SERVICIO tengo un campo combinado llamado "lugar de inspección" con dos opciones ESTACIÓN PUERTO MADRYN y ESTACIÓN PUNTA ALTA. A su vez, la tabla CERTIFICADOS tiene un campo llamando "Certificado No", que es un numero que se le asigna según el campo combinado de la tabla/formulario REPORTE DE SERVICIO "lugar de inspección": si el campo combinado tiene como valor ESTACIÓN PUERTO MADRYN, la numeración comienza con 9200, por el contrario si el campo combinado tiene como valor ESTACIÓN PUNTA ALTA la numeración comienza con 2100. El campo "Certificado No" es un autonumérico distinto al ID, creado mediante el siguiente código y con una consulta de anexar:

Private Sub Form_Load()
If Me.NewRecord = True Then
Me.CertificadoNo = Nz(DMax("CertificadoNo", "Certificado Balsas Salvavidas"), 0) + 1
End If
End Sub

A su vez, tengo 2 informes que se mandan a imprimir: un diseño para ESTACIÓN PUERTO MADRYN y un diseño distinto para ESTACIÓN PUNTA ALTA.

Mi primer consulta es: como hago para que el campo "Certificado No" me cambie el numero según lo explicado en el párrafo anterior, y según valor de campo combinado "lugar de inspección"

Mi segunda consulta es: como hago para que al hacer clic en botón imprimir, ¿me elija el diseño acorde al campo combinado que nombre anteriormente?

2 respuestas

Respuesta

Si el numero correlativo depende de de un dato desconocido (la estación que lo emite), mientras no se seleccione la estación, no se podrá calcular el siguiente (el evento tendrá que ser otro, no vale el LOAD) y solo a titulo curioso ¿para qué el 'newrecord'?.

Si esta en el evento LOAD se esta abriendo el formulario y (con la excepción de que no se puedan crear registros) siempre iniciara un nuevo registro (la condición se cumple por defecto: es innecesaria), si fuera el evento CURRENT si tendría sentido.

En el evento de selección de estación, seria el adecuado para el calculo del siguiente.

No hay una muestra de un dato real, no es lo mismo 9200nnnnn que 92nn (siendo n un digito del siguiente numero).

Supongamos que una estación comienza por 92 y la otra por 21 y que los dos dígitos siguientes permiten un numero entre 00 y 99 (pocos me parecen pero faltan datos y esto es un ejemplo)

Aun utilizando solo dígitos el código es alfanumérico (no se utiliza para cálculos matemáticos) por lo que se le puede dividir en dos partes, una la constante que indica la estación y otra la serie consecutiva que tendrá que ser 'convertida' a numero para poder incrementarla.

La formula: si el combo 'estación' (Cbo_Estacion) devuelve el código 92 o el código 21, en función de el:

Me.CertificadoNo = Cbo_Estacion & Format(Nz(DMax("val(mid(CertificadoNo,3,2))", "Certificados", "Left(CertificadoNo,2) ='" & Cbo_Estacion & "'"), 0) + 1, "00")

Este código devolvería el 9201, 9202 .... 9266 ...

Para un numero mayor de registros (cbo_estacion devuelve 9200) y se añaden cuatro dígitos

Me.CertificadoNo = Cbo_Estacion & Format(Nz(DMax("val(mid(CertificadoNo,5,4))", "Certificados", "Left(CertificadoNo,4) ='" & Cbo_Estacion & "'"), 0) + 1, "0000")

Su resultado: 92000001, 92000002 .... 92000066 ... 92007891 .... 

A la hora de imprimir si no se puede reutilizar el informe, se crea uno para cada estación y si el certificado comienza por 92 [ Left(CertificadoNo, 2)= "92" ] .... uno de los informes y si no se cumple, el otro.

Hola Enrique! Muchas gracias por tu tiempo y disculpa si no fui clara.

El campo "Certificado No" es un autonumérico distinto al ID. El mismo es creado debido a que debo respetar la numeración que usan actualmente (estoy creando una base de datos desde cero para automatizar documentos que actualmente se están haciendo en microsoft word). Cuando dije que "Certificado No" comienza diferente dependiendo de la elección entre ESTACIÓN PUNTA ALTA y ESTACIÓN PUERTO MADRYN, quise decir que son autonuméricos diferentes entre ambas estaciones. En ESTACIÓN PUNTA ALTA en este momento esta por el Certificado No 2132 y en ESTACIÓN PUERTO MADRYN en este momento esta por el Certificado No 9253. O sea, cada vez que se abre el formulario CERTIFICADOS, se creo el código siguiente para chequear el numero que sigue y asignárselo al campo Certificado No

Private Sub Form_Load()
If Me.NewRecord = True Then
Me.CertificadoNo = Nz(DMax("CertificadoNo", "Certificado Balsas Salvavidas"), 0) + 1
End If
End Sub

Aclaro: el formulario "Certificado Balsas Salvavidas" cambio de nombre a CERTIFICADOS.

Aparte de ésto, al campo "Certificado No" le asigne un comienzo de numeración con una consulta de anexar:

Aclarando un poco la cuestión, ahora necesito hacer que: si el campo combinado de formulario CERTIFICADOS "lugar de inspección" dice ESTACIÓN PUERTO MADRYN, el autonumérico "Certificado No" comience su conteo a partir del numero 9253, por el contrario si el campo combinado de formulario CERTIFICADOS "lugar de inspección" dice ESTACIÓN PUNTA ALTA, el autonumérico "Certificado No" comience su conteo a partir del numero 2132.

Esperando poder resolver este problema, lo próximo que seria es la elección de un informe u otro dependiendo del mismo campo de formulario

Si en la misma tabla han de mantenerse diferentes (e independientes) numeraciones, tiene que existir un dato (otro campo del registro) que permita diferenciarlas y llegado el caso poder 'recrear' la numeración conservando su independencia.

En mi ejemplo: un único campo en la tabla, en el se concatenan dos secciones:

.- Una constante que diferencia el emisor (92 <> 21) que genera el certificado
.- La otra (que se rellenara con ceros para mantener su longitud y así poder ordenarlas) seria el numero del certificado emitido.

La otra opción es utilizar dos campos del registro, uno con la numeración correlativa ascendente, otro para el emisor del certificado.

Mi opción preferida es un solo campo que identifique como único al certificado en cualquier entorno.

Utilizar dos campos exige (en sus relaciones con otras tablas) que el resto de tablas a relacionar tienen que disponer de ambos campos (para poder diferenciar los certificados).

Otra alternativa es que cada tipo de certificado tenga su tabla (para algunos entornos diferenciar así las series tiene alguna ventaja).

Decide que método se adapta mejor a la aplicación que estas actualizando y recuerda que si se ha de decidir cual de las series numéricas hay que incrementar, esta duda tiene que aclararse 'antes' de incrementarla.
Para ello el combo que selecciona al emisor no puede estar en el formulario que se abre o de estarlo no se puede utilizar su evento LOAD
(El combo en ese evento aun no tiene valor seleccionado).

Notas:
En una serie alfanumérica (nos permite varias subseries en el mismo campo de la tabla) como acostumbran a tener un 'formato fijo' es sencillo manejar sus secciones mediante las funciones Derecha <> RIght, Izquierda <> Left y Medio <> MId.

Con ellas podemos tomar cualquier parte del texto y (si es un numero) incrementarlo para generar el siguiente elemento

Un ejemplo 92 o Puerto, 21 o Punta_ mas cinco cifras (del 1 al 99999) quedarían asi en el mismo campo de la tabla:

9200001, 9200002,..., 9209253 (o también 9200053)
2100001, 2100002,..., 2102132 (o también 2100032)
Que como es alfanumérica también pueden ser:
Puerto00001, Puerto00002,..., Puerto09253 (o también Puerto00053)
Punta_00001, Punta_00002,...., Punta_02132 (o también Punta_00032)

Certificado = "9200053"
Left([Certificado], 2) ===> '92'
Right([certificado],5) ===> '00053'
Val(Right([Certificado], 5)) ===> 53

Para Certificado = "Puerto00053"
Left([Certificado], 6) ===> 'Puerto'
Right([Certificado], 5) ===> '00053'
Val(Right([Certificado], 5)) ===> 53

Respuesta

Silvia para no confundirla con literatura barata puede enviarme la base de datos a [email protected] y trato de colaborarle.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas