Numerador de Pedidos Ventas por ejercicios

Necesito numerar la Referencia de los Pedidos Ventas por cada uno de los Ejercicios de esta Forma:

Referencia = Numero -> Entero largo

Referencia = 202100059  -> Año: 2021 NºPedido: 00059

estoy dando esta Rutina para la Numeración:

Me.Referencia = Year(Date) & Format(Nz(DMax("Val( Mid(CodigoPedido, 5))", "PEDIDOSCABECERA", "Val( Left(CodigoPedido,4)) = " & Year(Date)), 0) + 1, "0000")

y me da este error:

Por cada uno de los Ejercicios existentes ha de comenzar por el Numero 1 la Referencia.

3 Respuestas

Respuesta
1

El campo Referencia no puede ser numérico, es texto. Supongo que en algún sitio tendrás algo como FechaPedido. Si tengo la tabla Tabla1, más o menos, como

En el formulario, da igual si es único o contínuo, pero así se vé mejor

En el evento Después de actualizar del cuadro de texto Numpedido le he puesto(aunque no lo entiendo, luego te digo porqué)

Private Sub NumPedido_AfterUpdate()
DoCmd.RunCommand acCmdSaveRecord
If IsNull([Referencia]) Then
Referencia = Year([FechaPedido]) & Format(Val(DMax("nz([numpedido])", "tabla1", "year([fechapedido])=year(date())")), "00000")
End If
End Sub

Aquí está mi duda. Si la referencia se va a referir solamente al año y el numpedido, bastaría con poner

Referencia=year([fechapedido])&numpedido

Si pudieras poner una imagen de la tabla sería mejor

Se trata de dos procesos los que tengo que realizar:

1º De los Pedidos Existentes los he de renumerar por años. De la siguiente Forma: 201800254, 201800255 ... 2019 ... 2020...

2º Después por cada nuevo Pedido he de obtener el CodigoPedido. 202100001, 202100002.....

He adaptado esta forma que me has enviado para recodificar todos los Pedidos por cada uno de los años:

On Error GoTo Sol_Err
Dim bucle As Integer
Dim i As Integer
DoCmd.GoToRecord , , acFirst
For i = 1 To Me.Recordset.RecordCount

Me.CodigoPedido = Year([FechaPedido]) & Format(Val(DMax("nz([CodigoPedido])", "PEDIDOSCABECERA", "year([Fechapedido])=year([FechaPedido])")), "00000")

DoCmd.GoToRecord , , acNext
Next

'* Fin Lectura Lineas
DoCmd.SetWarnings True
Exit Sub
'*
Sol_Err:
If Err.Number = 2105 Then
Resume Next
Else
MsgBox "Se ha producido el Error: " & Err.Number & ": " & Err.Descripcion
DoCmd.SetWarnings True
End If

Y no me esta Codificado ningún registro, ni me da ningún error.

En el Formulario se ve como esta revisando cada unos de los Pedidos

El Campo: CodigoPedido esta a 0

No se donde puede estar el error para no codificar los Pedidos

Voy a aprovechar una tabla que tenía a la que le añado los campos NumPedido y Referencia

Le he cambiado la fecha al ordenador y le he puesto que estamos en el odioso y jodido 2020. A medida que voy actualizando las fechas de los pedidos

Le va poniendo el orden correlativo de pedido y en Referencia lo mismo. Le cambio la fecha al sistema y volvemos al ¿esperanzador? 2021, y a medida que fuera introduciendo registros

Me iria repitiendo el proceso. En este caso ya los tenía, por no tener que ir escribiendo uno a uno, pero sería exactamente igual. Si me voy a un registro nuevo

Puedes ver que el cursor aún está en el control Fechapedido. Una vez que pulso Enter

Y el código del evento Después de actualizar es

Private Sub FechaPedido_AfterUpdate()
If Me.NewRecord Then
NumPedido = Format(Nz(DMax("numpedido", "otra", "year([fechapedido])=year(date())")) + 1, "0000")
Referencia = Year([FechaPedido]) & NumPedido
End If
End Sub
Respuesta
1

Realmente desconozco la estructura de su tabla, no obstante le preparé el siguiente ejemplo, que consta de 1 tabla 1 formulario y 1 módulo de vba.

TABLA tblpedidos

El campo CodigoPedido es TEXTO de 5 y la Referencia es numérica LONG. Observe que tengo pedidos del año 2020 y alteré la numeración para iniciar la numeración desde el CodigoPedido "00059" para el año 2021, no obstante la función detecta con base en la fecha del sistema el año que está en proceso.

FORMULARIO PEDIDOS

Al hacer clic sobre el botón macro nuevo registro automáticamente me coloca la referencia y el código de pedido. Esto hace se ejecute el código del evento Al activar registro.

Código evento al activar registro

CÓDIGO DE LA FUNCIÓN RESULTADO()

La función devuelve texto por lo cual cuando se llame para obtener la referencia se debe hace así Val(Resultado(1) debido a que el campo es entero largo.

El ejemplo esta elaborado con un formulario dependiente pero también sirve par un formulario independiente, se haría la inserción con SQL, utilizando INSERT INTO ...

Observe como la utilización de una función hace el código más legible y, que a pesar de que el campo Referencia es numérico lo trata la función como texto, solo cambia en la llamada, es decir, si fuera texto se llamaría la función como Resultado(1).

Se dirá pero tanto trabajo, la recompensa la claridad y facilidad de probar el código

Si le interesa el ejemplo lo puede solicitar a [email protected] y con gusto se lo hago llegar, favor anotar en el asunto la consulta.

Ya le envíe el archivo con sus datos como quería elaboré la re numeración del campo CodigoPedido, como puede comprobar NO servía absolutamente de nada la solución que le estaban proponiendo. Con esto queda claro que sino hacemos uso extensivo de las funciones definidas por el usuario, nunca lograremos reducir el tiempo de mantenimiento del código. Es claro que si definimos módulos de clases tendremos más código, pero a esto hay que agregarle el beneficio en la medida que utilicemos sus métodos y propiedades. Pueda que esto suene raro para usted pero pude consultarlo en la web. De paso me alegro haya solucionado su consulta.

Respuesta
1

Jobe: Para contribuir con otro punto de vista y programando el FormCurrent.

Private Sub Form_Current()
'Necesitamos declarar 3 Variables
Dim vAutonum As Variant, vUltimo As Variant
Dim vAño As Long
'Le damos valor a la variable >> vAño el valor del año actual
vAño = Right(Year(Date), 4)
'Capturamos el valor del campo AutoaaGxxxxx
vAutonum = Me.AutoaaGxxxxx.Value
'Si vAutonum no es nulo, es porque ya hay valor en él, entonces salimos del procedimiento
If Not IsNull(vAutonum) Then Exit Sub
'vUltimo es igual al máximo de los 5 últimos caracteres de la derecha del campo AutoaaGxxxxx y cuyo año sea igual al actual
vUltimo = Right(DMax("AutoaaGxxxxx", "TblAutoaa-xxxxx", "Left(AutoaaGxxxxx, 4)=" & vAño), 5)
'Si vUltimo es nulo, es porque no hay ningún AutoaaGxxxxx, entonces le damos valor 0
If IsNull(vUltimo) Then
        vUltimo = 0
End If
'Sumamos 1 al valor anterior
vUltimo = vUltimo + 1
Me.Correlativo = vUltimo
Me.AutoaaGxxxxx = vAño & "-" & Format(vUltimo, "00000")
End Sub

Este código requiere:

1.- En la Tabla TblAutoaa-xxxxx, el Campo AutoaaGxxxxx sea Equivalente a lo que tu llamas Referencia.

2.- Si no lo veo mal debes sustituir:

AutoaaGxxxxx por >> Refrencia

TblAutoaa-xxxxx por >> PEDIDOSCABECERA

El código que te cito es el que he usado en algunas Aplicaciones mias.

Un saludo y un 2021 confortable>> JTJ

Jobe: Se me ha pasado decirte que ese Código introduce un guión entre el año y el Pedido.

Si quieres quitárselo, basta con que sustituyas la línea:

Me.AutoaaGxxxxx = vAño & "-" & Format(vUltimo, "00000") por ésta otra

Me.AutoaaGxxxxx = vAño & Format(vUltimo, "00000")

El "Correlativo" es un campo de la Tabla de tipo Long, que deberías introducir si no tienes otro equivalente. Saludos >> JTJ

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas