Numeración automática en subformulario, dependiendo de lo que escoja en un cuadro combinado

Tengo un formulario principal llamado Periodo y un subformulario llamado Comprobante, en Comprobante tengo un Cuadro Combinado con tres opciones: Ingreso, Egreso y Devolución y un campo Numero para llevar el correlativo ascendente anual (Es decir que el 1 de enero la numeración comience nuevamente desde el número 1).

Quisiera lograr que "Ingreso" lleve su correlativo independiente de los que de “Egreso” o “Devolución” (estos últimos comparten indistintamente la misma numeración correlativa). Es decir, si emito el primer comprobante de egreso, este sería el N° 1 y luego emito un comprobante de devolución, este sería el correlativo 2 y si nuevamente emito otro egreso este sería el correlativo 3.

Respuesta
1

Si tengo las tablas Periodo y Comprobante y construyo un formulario con subformulario, cuando cambie la fecha "reinicia" el Orden

En las propiedades del combinado Movimiento, en cuyo Tipo origen de la fila le he puesto Lista de valores y en Origen de la fila Ingreso;Egreso, Depósito, en el evento Después de actualizar

Le pongo

Private Sub Movimiento_AfterUpdate()
If Movimiento = "ingreso" Then
Orden = Nz(DMax("orden", "comprobante", "year([fechamov])=year(#" & Me.FechaMov & "#) and movimiento=""Ingreso""")) + 1
ElseIf Movimiento = "Depósito" Or Movimiento = "Egreso" Then
Orden = Nz(DMax("orden", "comprobante", "year([fechamov])=year(#" & Me.FechaMov & "#) and movimiento<>""ingreso""")) + 1
End If
End Sub

Buenas tarde, tengo una duda al seleccionar del combinado una opción me lanza el siguiente mensaje: 

Se refiere el error 3075 en tiempo de ejecución.....

Falta: , ] o un elemento en la expresión de la consulta.... El código es el siguiente:

Que podrá ser, que estoy haciendo mal

Te falta un paréntesis de cierre

=year(#" & me.fecha & "#) and Tipo=....

¡Gracias! Gracias Julián funciona perfecto.....

Hola Julián, tengo la siguiente duda con este código que funciona perfecto con cadenas de texto (Ingreso, Egreso, Devolución), sin embargo si el origen de los datos del cuadro combinado "Tipo" está basado en una tabla que contiene 2 campos: un campo ID auto numérico 1, 2 y 3) y otro campo para la descripción (Ingreso, Egreso, Devolución) al modificar este código:

Private Sub Tipo_AfterUpdate()
If Tipo = "Ingreso" Then
Nro = Nz(DMax("Nro", "Comprobante", "year([Fecha])=year(#" & Me.Fecha & "#) and Tipo=""Ingreso""")) + 1
ElseIf Tipo = "Egreso" Or Tipo = "Devolución" Then
Nro = Nz(DMax("Nro", "Comprobante", "year([Fecha])=year(#" & Me.Fecha & "#) and Tipo<>""Ingreso""")) + 1
End If
End Sub

y lo dejo así (este deja de funcionar):

Private Sub Tipo_AfterUpdate()
If Tipo = "1" Then
Nro = Nz(DMax("Nro", "Comprobante", "year([Fecha])=year(#" & Me.Fecha & "#) and Tipo=""1""")) + 1
ElseIf Tipo = "2" Or Tipo = "3" Then
Nro = Nz(DMax("Nro", "Comprobante", "year([Fecha])=year(#" & Me.Fecha & "#) and Tipo<>""1""")) + 1
End If
End Sub

¿Qué hago mal? Muchas gracias por tu tiempo.....

Antes de nada, permíteme que te diga que los campos autonuméricos están bien para unas cosas, pero para otras no sirven para nada, como los medicamentos. Por varias razones

1º Si sólo vas a tener Ingreso, Egreso, Devolución. ¿Para qué quieres un autonumérico? Basta con dejar la tabla con el campo Tipo y ponerlo como clave y así te aseguras que cuando vayas a poner otro nuevo tipo no repetirás ninguno de los anteriores.

2º Si declaras un campo como autonumérico pierdes el control sobre él. Y en todo, hay que hacer que el programa haga lo que tu quieres y no lo que en su día, acertadamente o no, diseñó alguien.

3º Y último, al ser, como parece, la columna dependiente del combinado la primera, y ESTA ES NUMÉRICA basta con poner

If tipo=1 sin comillas, ya que las comillas se usan si es texto

and Tipo=1

If Tipo = 1 Then
Nro = Nz(DMax("Nro", "Comprobante", "year([Fecha])=year(#" & Me.Fecha & "#) and Tipo=1")) + 1
ElseIf Tipo = 2 Or Tipo = 3 Then
Nro = Nz(DMax("Nro", "Comprobante", "year([Fecha])=year(#" & Me.Fecha & "#) and Tipo<>1"))) + 1
End If
End Sub

En aquellas líneas en las que veas 1" es porque esas comillas cierran los criterio o cierran la instrucción.

¡Gracias mil....!, tú consejo es muy valioso para mí, sobre todo cuando se trata de romper reglas mal aprendidas. Estoy muy agradecido. 

Saludos cordiales....

Waldo....

2 respuestas más de otros expertos

Respuesta
1

Waldo: Supongo que tienes ya un Código para generar ese campo "Numero".

Haz un sondeo de si ese Combo contiene "Ingreso", genere un correlativo y si no que genere otro.

Es posible que si pones aquí el código y Evento de donde generas ahora ese correlativo, de una pista. Personalmente con lo que aportas, poco más puede decirte. Entiendo lo que pretendes hacer, pero no veo como encajar un código que te funcione.

Si otro experto lo interpreta mejor que yo, ambos habremos aprendido algo más. Saludos >> JTJ

Sobre lo anterior he recordado, que en Mediafire tengo un ejemplo de hace años:

https://www.mediafire.com/file/klv1kpn0ygo33o0/DobleAutoString.rar/file 

Saludos >> JTJ

Una pregunta..., del enlace más arriba donde visualizo tú ejemplo.

Estoy intentando resolver la solución con la función DMáx la cual se ejecuta al hacer clic en el cboTipoDato, pero en definitiva es la idea que ha desarrollado Eduardo....

Waldo: El correlativo se genera en el AfterUpdate del Combo TipoDoc. Código comentado

Saludos >> JTJ

Respuesta
1

Aunque desconozco como tiene diseñada la tabla he preparado este ejemplo, con base en una tabla 1 formulario, 1 subformulario y una función:

DISEÑO TABLA DE DATOS

Observe que tengo un campo para registrar el Tipo de operación, así:

1 Para ingreso

2 Para Egreso

3 Para Devolución

Tengo el campo fechaoperacion para registrar la fecha del movimiento, toda vez, que se requiere para hacer la selección, el campo numero es donde se lleva el control de la numeración con base en el campo tipo, el campo concepto para anotar el texto sobre la operación y, por último el campo valor para registrar la cantidad.

Formularios para registras la informacíón

Consta de los formularios periodo y el subformulario Comprobante. Programé los eventos Después de actualizar de los controles fechaoperacion y cboTipo, los cuales utilizan la función numera() para fijar en el campo numero el respectivo consecutivo. Ver código siguiente.

CODIGO DE LA FUNCION NUMERA

Bueno esto es solo una idea para que trate de adaptarlo a sus necesidades, Si quiere el ejemplo puede solicitarlo a [email protected] favor anotar en el asunto la consulta.

Hola Eduardo, has interpretado muy bien lo que quiero lograr. En lo personal me hago un mea culpa pero ocurre lo siguiente: tu ejemplo está basado en una sola tabla, la solución que busco esta basada en dos tabla relacionadas en donde Periodo tiene una clave primaria y  Comprobantes tiene una clave externa ( la relación de las dos tablas es uno a varios que están unidas por IdPeriodo).

La tabla Periodo tiene los siguientes campos: IdPeriodo, Mes, Año y Proyecto. El objetivo de esta tabla es hacer la apertura mensual de cada mes; por otra parte tengo la tabla Comprobante que contiene los siguientes campos: IdComprobante, IdPeriodo, TipoComprobante, NroComprobante y Monto entre otros campos). El objetivo de esta tabla es llevar los comprobantes de Ingreso, Egreso y Devolución con su respectiva numeración ascendente de carácter anual. Un saludo cordial desde Chile....

En esas condiciones cambia totalmente el código, traté de hacer algo con base en la información de las tablas. Consta de 2 tablas 1 Formulario 1 Módulo con dos funciones.

TABLAS PERIODO

Esta tabla se relaciona mediante el campo idPeriodo con la tabla siguiente:

TABLA COMPROBANTES

FORMULARIO REGISTRO DE  COMPROBANTES

Con base en la fecha de registro se llena el campo IDPERIODO con una función y de acuerdo con el TIPO se llena la información del Nro. de Comprobante con otra función.

CÓDIGO DEL MÓDULO

Función para obtener el idperiodo

FUNCIÓN PARA OBTENER EL NÚMERO DE COMPROBANTE

Esta función la hice con DAO y SQL, cambia bastante con relación a lo anterior respuesta, ya no se utiliza DMAX(). Independiente del ejemplo esta función la puede adaptar a sus necesidades y formularios, toda vez, que seguí la estructura que me suministro.

Si le parece confuso puede solicitar el ejemplo a [email protected] favor en el asunto hacer referencia a su consulta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas