¿Cómo recorro los datos de un formulario y emito un msgbox si no se cumplen las condiciones?

En un formulario tengo campos correlativos identificados con IdFactura. Me gustaría crear un botón que me recorriera los campos entre el valor max y min de una tabla y en caso de que me falte un nº correlativo me indicara un msgbox indicandome el nº que me falta. Si faltan varios nºs me llegaría con que me indicara el primero que me falta para así poder corregirlos.

Un ejemplo sería que por ejemplo en esta lista me dijera que me falta la factura 202200004

IdFactura

202200005

202200003

202200002

202200001

202100003

202100002

202100001

¿Alguien sabe cómo hacerlo?

2 Respuestas

Respuesta
1

Tengo esta tabla de numeración

Pruebe con esta función

Public Function falta(mperiodo As Integer) As String
 Dim lnPrimero As Long
 Dim lnUltimo As Long
 Dim strSQl As String
 Dim x As Long
 Dim aux As Long
 Dim strWhere As String
 strWhere = "Mid([idfactura],1,4)=" & mperiodo
 lnPrimero = Nz(DMin("[idfactura]", "tblconsecutivos", strWhere))
 lnUltimo = Nz(DMax("[idfactura]", "tblconsecutivos", strWhere))
 If lnPrimero = 0 And lnUltimo = 0 Then 'inicio periodo
   falta = mperiodo & "00001"
   Exit Function
 End If
   For x = lnPrimero To lnUltimo
     aux = x + 1
     If x - lnPrimero > 1 Then
       falta = aux
       Exit For
     End If
  Next x
End Function

Asumo que numera con la fecha del sistema o toma el año. Ahora, llamo la función como:

¿

? Falta(2022) y obtengo
202200004

Si fuera 2023 :

¿

? Falta(2023) y obtengo
202300001

¿cómo llamo a la función desde el botón? Gracias.

Primero que todo disculpe la función que le envíe NO sirve está mal, en consecuencia la cambie totalmente y a la vez le cuento la respuesta que le dan no se ajusta a su pregunta porque su caso es de consecutivos por grupo y le respondieron es para seguimiento de una serie de números enteros.

FORMULARIO

Observe el formulario hago clic en "Adicionar" y obtengo la pregunta donde me solicitan ingresar el prefijo (Se podría obviar si tomara el año de la fecha actual). Ingreso el prefijo "2021"

Hago clic en Aceptar y obtengo

Me informa que falta o sigue el número de factura "202100004", efectivamente la que aparece resaltada en la primera imágen. Hago clic en Aceptar y me pregunta:

Hago clic en y obtengo:

Observe que me aparece el número que faltaba para este prefijo (2021). Ahora si vuelo hacer clic en el botón Adicionar e ingreso nuevamente el prefijo "2021" obtengo:

Es la siguiente factura.

CÓDIGO DEL BOTON ADICIONAR

Private Sub btnFalta_Click()
  Dim x As String
  Dim strFalta As String
  x = InputBox("Entre el valor del prefijo  " & vbCrLf & vbCrLf & "Por ejemplo, 2022 ", "Prefijo")
  If Len(x) > 0 Then
    If Len(x) = 4 Then
       strFalta = faltante(Val(x))
       MsgBox "Falta o sigue el número de factura " & strFalta, vbInformation, "Le informo"
       If MsgBox("¿Toma el número " & strFalta & " ?", vbQuestion + vbYesNo + vbDefaultButton2, "Adicionando número") = vbYes Then
          DoCmd.RunSQL "INSERT INTO tblconsecutivos(idfactura) VALUES('" & strFalta & "')"
          Me.Requery
       Else
         Exit Sub
       End If
    Else
       MsgBox "Faltan dígitos al prefijo", vbCritical, "Cuidado..."
    End If
  End If
End Sub

CÓDIGO DE LA FUNCION FALTANTE()

Public Function faltante(mperiodo As Integer) As String
 Dim strSQl As String
 Dim rs As DAO.Recordset
 Dim aux As String
 Dim ant As Long
 Dim sgte As Long
  strSQl = "SELECT tblconsecutivos.idfactura" & vbCrLf
  strSQl = strSQl & "        FROM tblconsecutivos" & vbCrLf
  strSQl = strSQl & "       WHERE  Mid([idfactura],1,4) =" & mperiodo & vbCrLf
  strSQl = strSQl & "    ORDER BY tblconsecutivos.idfactura;"
  Set rs = CurrentDb.OpenRecordset(strSQl)
  If rs.BOF And rs.EOF Then ' No hay registros
    faltante = mperiodo & "00001"
    Set rs = Nothing
    Exit Function
  End If
  rs.MoveFirst
  ant = rs!idfactura
 Do Until rs.EOF
     sgte = Val(rs!idfactura)
     If sgte - ant > 1 Then
       aux = ant + 1
       Exit Do
     End If
     ant = Val(rs!idfactura)
     rs.MoveNext
 Loop
 If Len(aux) > 0 Then
   faltante = aux
 Else
   faltante = sgte + 1
 End If
 rs.Close
 Set rs = Nothing
End Function

Debe cambiar el nombre de la tabla por el que corresponda en su base de datos. Si quiere el ejemplo lo puede solicitar a [email protected] favor anotar en el asunto la consulta.

Si no quiere complicarse con código y el campo idfactura es numérico lo puede hacer con esta consulta.

TABLA

DISEÑO DE LA CONSULTA

RESULTADO DE LA CONSULTA

Observe la columna "desde" me indica que número sigue o falta, en el "2021" me dice que sigue el "202100007" y del prefijo 2022 faltan así:

202200004,20220007,20220008,202200010,202200011

Ya sería cambiar el evento del botón, algo como:

DoCmd. Openquery "qryFaltantesRangos"

La diferencia de la función que le suministré es que no importa si idfactura es texto o número.

Le envíe la base de datos a su correo.

Me alegro que le haya servido

Respuesta
1

Por si te puede dar una idea. Si tengo el formulario

Puedes ver que faltan Idnumero. Si pulso el botón, me dice los que faltan

En este caso particular el cuadro de texto se llama Faltan y el código del evento Al hacer clic del botón( repito que en este caso en particular)

Private Sub Comando5_Click()
Dim i As Integer, d As Byte, c As Byte
DoCmd.GoToRecord , , acFirst
For i = 1 To Me.Recordset.RecordCount
d = IdNumero - (Nz(DMax("idnumero", "numeros", "idnumero<" & Me.IdNumero & "")) + 1)
If d = 1 Then
Faltan = Nz([Faltan], "") & "," & (Nz(DMax("idnumero", "numeros", "idnumero<" & Me.IdNumero & "")) + 1)
ElseIf d > 1 Then
For c = 1 To d
Faltan = Nz([Faltan], "") & "," & (Nz(DMax("idnumero", "numeros", "idnumero<" & Me.IdNumero & "")) + c)
Next c
End If
DoCmd.GoToRecord , , acNext
Next
Faltan = Mid([Faltan], 2, Len([Faltan]) - 1)
End Sub

Hola lo he probado pero me da error por desbordamiento. Gracias de todas formas.

En el código prueba a cambiar Byte por Integer o por Long

De todas formas, si quieres, repito, si quieres mándame una copia con dos o tres registros inventados a [email protected] que le echo un vistazo y te digo algo.

Si lo haces, en el asunto del mensaje pon tu alias EloyC, ya que si no sé quien me escribe ni los abro.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas