Como agregar el numero de linea en sub formulario

Quería pedirles si me pueden ayudar con un subformulario (detalle factura de compras) que esta en el formulario (factura de compras) en el cual necesito que me registre el numero de línea al principio de cada articulo que voy ingresadondo. Ahora los estoy ingresando de forma manual, pero me gustaría que fuera de forma automática. Y de paso saber como hacer que no me arroje ese 0 (cero) al final de cada línea. De antemano gracias

2 Respuestas

Respuesta
1

Puedes hacerlo de muchas formas. Por ejemplo, suponiendo que el cuadro de texto donde quieres que te aparezca esa serie es el de Linea, y suponiendo que el campo que relaciona formulario con subformulario es IdCompra, en el evento Después de actualizar del cuadro de texto Codigo de Articulo puedes poner

If Me.NewRecord Then
Linea = Nz(DCount("*", "nombredelsubform", "idcompra=" & Me.Parent!IdCompra & "")) + 1
End If

Es decir, que si es un nuevo registro en el subformulario, al cuadro de texto Linea le asigne un valor que es la suma de la cuenta de los registros que van hasta ese momento con el idcompra que figura en el formulario más uno, para compensar que el primer registro sería nulo y te quedaría

En mi caso se lo he puesto en el evento Después de actualizar del cuadro combinado Categoría.

Excelente, pero al ingresar 4 registros, y si me toca eliminar el segundo, como lo hago para que el numero 2 del correlativo no se pierda y siga su secuencia?

Perdón por insistir, pero quería saber si se puede hacer lo que menciono anteriormente, por tu comprensión gracias

Esta página se ha vuelto una mierda. Ya no avisan cuando amplían la pregunta. Sería muy interesante saber como eliminas los registros, ya que el código se puede poner en un sitio u otro. Por ejemplo, supongamos que, en mi caso, la tabla DetalleCompra tiene un campo autonumérico IdDetalle y tengo el formulario Compras como

Donde voy a eliminar el registro 3 del subformulario. Si pulso la tecla Suprimir efectivamente me quedaría como

Pero si pulso el botón R, a la izquierda de la etiqueta Categoría (ahí viene lo de saber como los eliminas, si pulsando la tecla Supr o tienes algún botón a la derecha del registro) me lo deja como

En este caso, en el código del botón R le tengo puesto

Private Sub Comando30_Click()
Dim i As Byte
DoCmd.GoToRecord , , acFirst
For i = 1 To Me.Recordset.RecordCount
Linea = Nz(DCount("*", "detallecompra", "idcompra=" & Me.Parent!IdCompra & " and iddetalle<=" & Me.IdDetalle & ""))
DoCmd.GoToRecord , , acNext
Next
End Sub

Es decir, que me renumera los registros.

Pero si, por ejemplo, usaras la tecla Supr para eliminarlos se podrá poner, por ejemplo, en el evento Al subir una tecla del subformulario

If keycode=46 ( que es el valor de la tecla Supr) then

...

Que primero eliminara el registro y después los renumerara.

Respuesta
1

Cuando se numera automáticamente además se debe considerar cuando se retira un registro, no debe quedar la numeración alterada. Le explico con este formulario:

Consta de 2 tablas 1 formulario y un subformulario.

TABLAS

La numeración automática la hago mediante una función a nivel del subformulario y le doy la propiedad en el campo "Línea", valor predeterminado =nlinea(), que corresponde al nombre de la función, como muestra la siguiente imagen:

CÓDIGO DE LA FUNCIÓN

Function nlinea()
  Dim Intcuenta As Integer
    If Me.NewRecord Then
      Intcuenta = Me.RecordsetClone.RecordCount
      If Intcuenta = 0 Then
       Me.Linea = 1
      Else
      Me.Linea = Intcuenta + 1
     End If
    End If
End Function

Para adicionar un producto hago clic sobre el cuadro combinado "PRODUCTO" y obtengo.

Observe que automáticamente asigna el número 8 en el campo Línea, faltaría ingresar la cantidad.

Ahora voy a retirar la línea 3 producto CONCENTRADO, hago clic sobre el botón eliminar y obtengo:

Observe que el producto 8 (VERDURAS) pasó a ocupar el número 7,

CÓDIGO DEL BOTÓN  

Private Sub btnEliminar_Click()
  Dim x As Integer
  Dim miRS As Recordset
  CurrentDb.Execute "DELETE FROM tblproductos_factura WHERE iditem=" & Me.iditem
  Me.Requery
  x = 1
  Set miRS = Me.RecordsetClone
  miRS.MoveFirst
  Do Until miRS.EOF
    miRS.Edit
    miRS!Linea = x
    miRS.Update
    x = x + 1
    miRS.MoveNext
  Loop
  Set miRS = Nothing
  Me.Requery
End Sub

Excelente idea, ¿pero cómo agrego el botón en cada línea para ejecutar el segundo código?

Solo lo puede hacer si el subformulario esta configurado como formulario continuo, se va a diseño y selecciona Botón, ubica el botón al lado derecho del último campo. Se lo explico gráficamente.

Dibuja con el mouse el tamaño que dese para el botón, lo lleva a:

Haga clic en Cancelar. Ahora vaya a Propiedades y seleccione la pestaña Formato, algo como:

En Título asígnele el nombre Eliminar (el & es para que se active el botón al presionar las teclas ALT + E).

Ahora haga clic en la pestaña Eventos, seleccione Al hacer clic, haga clic sobre los puntos ... como indica la flecha de la figura:

Entre btnEliminar_Click() y En Sub ingrese este código:

  Dim x As Integer
  Dim miRS As Recordset
  CurrentDb.Execute "DELETE FROM tblproductos_factura WHERE iditem=" & Me.iditem
  Me.Requery
  x = 1
  Set miRS = Me.RecordsetClone
  miRS.MoveFirst
  Do Until miRS.EOF
    miRS.Edit
    miRS!Linea = x
    miRS.Update
    x = x + 1
    miRS.MoveNext
  Loop
  Set miRS = Nothing
  Me. Requery

El código para autonumerar esta fantástico, pero eso del formulario continuo me complica, ya que tendría que modificar todo el subformulario. Perdón por molestar, pero existe alguna otra forma para que pueda mantener el subformulario como hoja de datos, si no es mucha la molestia. De antemano gracias.

Si pero cambia un poco el código, por ejemplo, programo para eliminar haciendo doble clic sobre el campo línea, algo como:

Hago doble clic sobre el campo línea 4 y procedo a eliminar, pero antes pido se confirme.

Hago clic en Sí y obtengo:

No obstante, le recomiendo utilizar formularios continuos.

Código del evento al hacer doble clic en el campo linea del subformulario

Private Sub Linea_DblClick(Cancel As Integer)
  Dim x As Integer
  Dim miRS As Recordset
  If MsgBox("¿Está seguro que elimina la línea " & Me.Linea & " ?", vbQuestion + vbYesNo + vbDefaultButton2, "Retirando linea") = vbNo Then
    Exit Sub
  End If
  CurrentDb.Execute "DELETE FROM tblproductos_factura WHERE iditem=" & Me.iditem
   Me.Requery
  x = 1
  Set miRS = Me.RecordsetClone
  miRS.MoveFirst
  Do Until miRS.EOF
    miRS.Edit
    miRS!Linea = x
    miRS.Update
    x = x + 1
    miRS.MoveNext
  Loop
  Set miRS = Nothing
   Me.Requery
End Sub

ya ingrese el código, pero al hacer doble click en la segunda linea me elimina todos las líneas y me envía a un error mencionado en vba. Envío fotos de pantalla

Envío lo que falta 

Los retira todos porque no está filtrando por el campo único, sino tiene un campo autonumérico, cambie en Currrentdb.Excute ...

WHERE Linea=" & Me.Linea

Y además el evento Doble click va en es el campo LINEA, no a nivel del formulario. Debe pasar el código para este evento.

Gracias don Eduardo, se pasó. El código funciona a la perfección. Una Vez más, muchas gracias por esta vocación que tiene de enseñar. Un abrazo acá de Chile

Me alegro le haya servido mi ejemplo porque lo que le proponía el torpe es una brutalidad.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas