Cambio de formato en Numero de factura según la selección de Sucursal.
Antes que nada aclaro que soy nuevo en access y autodidacta.
Estoy desarrollando un sistema de RECIBOS para INSCRIPCIONES para mi trabajo (muy similar a un sistema de facturación).
Tengo las tablas CLIENTES, FACTURA, DETALLE FACTURA, PRODUCTOS, EVENTOS.
Mi duda es, como puedo hacer para que según el EVENTO, elegido, el Numero de Factura y su formato cambie.
Ejemplo: EVENTO A, Numero de Factura A001
EVENTO B, Numero de Factura B001
Etc etc
2 respuestas
Supongamos que tengo el formulario Facturas( lo demás da igual) que te lo pongo como formulario continuo porque se vé mejor, pero puede ser perfectamente formulario único, que por lo demás sería lo lógico.
El cuadro de texto Numfactura lo pongo como no punto de tabulación y bloqueado para que nadie lo pueda modificar. Si elijo un evento
Como puedes ver el trabajo es lo último, a medida que voy eligiendo
He supuesto que las "iniciales" de los eventos no se repiten, si no fuera así, donde pongo Left... 1 podrías poner, por ejemplo, Left, 3 ó 4...
El código del evento después de actualizar del combinado evento es
Private Sub Evento_AfterUpdate() NumFactura = Left([Evento], 1) & "-" & Format(Nz(DCount("*", "facturas", "left([numfactura],1)=left('" & Me.Evento & "',1)")) + 1, "000") End Sub
Me da un error " Se ha producido el error -2147352567 (80020009) en tiempo de Ejecución: El valor especificado no es válido para este campo.
Seguramente estoy haciendo algo mal en la tabla eventos. Pero no logro darme cuenta que es.
Solucionado el error anterior, efectivamente tenia mal la configuración de la Tabla FACTURA, en el campo N°Recibo, estaba en numérico y no en texto corto.
Ahora me surge lo siguiente, cuando elijo el evento, me pone numero y no letras. Ejemplo: debería decir M-001 y dice 1-001
Muchas Gracias
Como no sé que valores aparecen en el combinado, tengo que suponer que dicho combinado tiene, al menos, dos columnas y que la columna dependiente debe de ser de un Id, o similar.
En caso de que así sea, y lo que muestre sea la columna 2 y la 1 esté oculta, tendrías que cambiar
'" & me.evento & "'
por
'" & me.evento.column(1) & "'"
Ya que en código VB la primera columna de un combinado es 0 y la segunda 1
O lo mejor de todo, poner una imagen de cómo es ese combinado donde eliges el evento.
Cambie lo que cambie en (column), sigue saliendo con numero, pongo capturas de la tabla y el cuadro combinado en cuestión
TABLA EVENTOS
tt
TABLA FACTURA
F
Consulta del Cuadro Combinado
Cuadro Combinado
Finalmente el Codigo
Private Sub Nombre_Evento_AfterUpdate()
N_Recibo = Left([Nombre_Evento], 1) & "-" & Format(Nz(DCount("*", "FACTURA", "left([N_Recibo],1)=left('" & Me.Nombre_Evento.Column(3) & "',1)")) + 1, "0000")
End Sub
Gracias
.
Es lógico que te salgan un 1 ó un 2. La primera letra por la izquierda que aparece en el combinado son esas.
Si me permites un consejo te digo como lo haría y luego te digo el porqué.
Si tengo la tabla Eventos, donde no he puesto todos los campos
Y tengo el formulario Facturas( a la tabla Facturas le he añadido un campo TipoEvento.
En el formulario transformo el cuadro de texto TipoEvento en un combinado, y en su origen de la fila le pongo
SELECT TipoEvento FROM Eventos GROUP BY TipoEvento;
de forma que lo que me muestra es
En el origen de la fila de Nombreevento no le pongo nada. Su origen se lo doy una vez que hayas elegido el tipo de evento
Private Sub TipoEvento_AfterUpdate() NombreEvento.RowSource = "select nombreevento from eventos where tipoevento='" & Me.TipoEvento & "'" NRecibo = Left([TipoEvento], 1) & "-" & Format(Nz(DCount("*", "facturas", "left([nrecibo],1)=left('" & Me.TipoEvento & "',1)")) + 1, "000") End Sub
Do forma que cuando elijo un nombre de evento, sólo me muestra aquellos nombres de evento que tienen como tipo de evento el que hayas elegido antes. Y además ya le asigna el número
La ventaja de darle el origen por código es que puedes decirle que no te muestre aquellos cuya fecha ya ha vencido, aquellos que se realizarán en dos semanas, aquellos que ya hayas cobrado y todo el etc que quieras.
¡Gracias! Excelente respuesta, funciono perfecto, solamente cambie
Left([TipoEvento], 3) para que me sume más letras para que quede más especifico.
Ahora me gusto lo de filtrar por eventos vencidos.
Si todavía tienes paciencia para mi, agradezco tu ayuda para esta función. :)
Gracias
Julián, estoy colocando este código:
DoCmd.GoToRecord , , acNext
Me.TipoEvento = DLast("TipoEvento", "FACTURA", "TipoEvento is not null")
Para que mientras el formulario este abierto se mantengan seleccionados los datos de EVENTO, si bien lo logro, no genera un numero de recibo hasta que no cambio el Combo de TipoEvento. El código lo coloque para probar en el BOTÓN Nuevo Registro.
No entiendo la pregunta.
1º ¿hablamos de Evento o de NombreEvento? En tu tabla Factura el campo aparecía como NombreEvento y es el que he puesto en el código.
2º Entiendo que has puesto un botón para que te lleve al siguiente registro. Lo que no me queda claro es si quieres que vaya al siguiente registro o a un registro nuevo. Es que si fuera a un registro nuevo la instrucción sería
Docmd. Gotorecord,, acnewrec
3º No es necesario que le vuelvas a dar origen de la fila al combinado TipoEvento ya que se lo habíamos dado en sus propiedades-datos-origen de la fila. Pero si lo que quieres es que al ir a un registro nuevo el tipo de evento sea igual al que hayas elegido en el registro anterior basta con que en sus propiedades-eventos-al recibir el enfoque crees un procedimiento de evento y entre Private Sub... y End sub pongas
Tipoevento.value=dlast("tipoevento","factura")
o, sino quieres usar código, basta con que pongas el cursor en él y manteniendo la tecla Ctrl pulsada pulses la tecla apóstrofe. Te repite el valor de ese control del registro anterior.
O también puedes poner en el evento Al activar el registro
If me.newrec then
Tipoevento.value=dlast("tipoevento","factura")
end if
Es decir, que sólo si es un registro nuevo, el valor de TipoEvento sea igual al del registro anterior. Esto se hace así, para evitar que si te desplazaras por los registros te fuera cambiando los valores.
¡Gracias!
No logro que funcione, porque si bien, recuerda los datos del registro anterior, no genera un nuevo numero de recibo, hasta que no actualizo el desplegable TipoEvento.
Asi se ve cuando voy a un registro nuevo.
Y ahí cuando despliego el Cuadro Combinado y vuelvo a elegir el tipoevento
Gracias
Ahora ya lo tengo claro, al menos eso creoEn las propiedades del combinado TipoEvento. Lo que quieres en que en un registro nuevo, en el combinado TipoEvento te ponga el mismo valor que en el registro anterior y que en Nrecibo te, digamos, aumente uno. Como en la imagen
Si ahora pongo el cursor en el combinado Tipoevento del registro nuevo
En las propiedades del combinado tipoevento, en Eventos-Al recibir el enfoque crea un procedimiento de evento y déjalo como
Private Sub TipoEvento_GotFocus() If Me.NewRecord Then TipoEvento.Value = DLast("tipoevento", "Facturas") Call TipoEvento_AfterUpdate End If End Sub
es decir, si estás en un registro nuevo, cuando pongas el cursor en él, su valor será el del anterior y llamas al procedimiento Después de actualizar, que por un lado le da origen al combinado NombreEvento y por otro lado te "aumenta" el NRecibo.
¡Gracias!
Excelente!!!!!!!
Agregue el siguiente código para que me cargue ambos campos según el anterior y quedo perfecto
Private Sub TipoEvento_GotFocus()
If Me.NewRecord Then
TipoEvento.Value = DLast("tipoevento", "Factura")
NombreEvento.Value = DLast("NombreEvento", "Factura")
Call TipoEvento_AfterUpdate
End If
End Sub
Solamente me esta quedando que se filtre según la fecha los eventos y listo,
Solo debe mostrar los eventos que son posteriores a la fecha del recibo.
Gracias miles!!!!!
La ventaja de la programación en código es que puedes ponerle los criterios que quieras( hasta 99 condiciones AND ó OR). Por ejemplo
Nombreevento.rowsource="select nombreevento from eventos where fecha=Date()+10 and nombreevento=""Boda"" or nombreevento=""Bautizo"" and cliente=""Antonio"" or cliente='" & me.paganini & "' and colordeojos=""Azul"" or....
o, por ejemplo
Nombreevento=Dlast("nombreevento","factura","fecha between [Escriba una fecha inicial] and [escriba una fecha final] and estatura between 1.6 and 1.8.... así, hasta 99 criterios. Mira si puedes filtrar.
¡Gracias! Excelente!
Modifique el código para que me realice el siguiente filtro, a ver que opinas.
Private Sub TipoEvento_AfterUpdate()
TipoEvento.RowSource = "select TipoEvento from Eventos where FechaEvento>Date()"
NombreEvento.RowSource = "select NombreEvento from Eventos where FechaEvento>Date() and TipoEvento='" & Me.TipoEvento & "'"
N_Recibo = Left([TipoEvento], 3) & "-" & Format(Nz(DCount("*", "factura", "left([n_recibo],1)=left('" & Me.TipoEvento & "',1)")) + 1, "000")
End Sub
Desde ya mil gracias
Quedo perfecto
100 Puntos!
Gracias por compartir tu conocimiento y gracias por tu buena onda
- Compartir respuesta
Puntualmente podrías hacer un update al campo factura con el valor que requieras, según lo que ejecutes. Ejemplo:
UPDATE Numero_Factura='A001' where Numero_Factura=001 and Evento='A';
te lo digo desde la perspectiva de BD, no tanto desde access
Excelente respuesta, muchas gracias David, ahora te vuelvo a molestar, como hago eso desde el formulario que genera dicho recibo/factura.
Mi formulario contiene datos de la Tabla "FACTURA", relacionado a Clientes, Evento y Productos, entro al formulario, elijo el EVENTO, y ahí debería el Campo N°Recibo, tomar su formato, y su Numero correspondiente
- Compartir respuesta