Access - Formulario continuo con casilla de verificación

 
Vista:

Formulario continuo con casilla de verificación

Publicado por Mercedes (22 intervenciones) el 30/01/2023 19:08:36
Hola, por favor ayuda para poder resolver mi problema con un formulario continuo y el uso de una casilla de verificación para marcar registros que deben darse de baja.

El formulario en origen del registro tiene asociada una tabla que tiene el campo “Baja” con formato Si/No y Valor Predeterminado No. Los registros marcados son dos registros consecutivos y uno no es consecutivo.

La idea en general es marcar la casilla de verificación de aquellos registros que quiero dar de baja, para ello codifique el evento Clic del botón “Baja” del formulario y la función “ProcesarBaja”:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Private Sub cmdbaja_Click()
 
respuesta = MsgBox("Esta seguro de elimiar este registro", vbYesNo + vbCritical, "Aviso")
 
If respuesta = vbYes Then
 
    ProcesarBaja
 
    Else
        respuesta = MsgBox("Canceló la operacion", vbOKOnly + vbInformation, "Aviso")
 
End If
 
End Sub
 
Private Function ProcesarBaja()
Dim rst As DAO.Recordset
Dim MiSql As String
Dim rs As DAO.Recordset
Dim MiSql2 As String
Dim MiSql3 As String
Dim numero As Integer
Dim a As Byte
 
MiSql = "SELECT * FROM LogBaseFacturas WHERE Baja = True"
 
Set rst = CurrentDb.OpenRecordset(MiSql, dbOpenDynaset)
 
''''Esta línea la puse para que cuente la cantidad de registros que hay en MiSql'''''
a = DCount("*", "LogBaseFacturas", "Baja=True")
 
'''''Antes de proceder a dar de baja los registros copio los mismos a otra tabla que en otro proceso voy a dar de baja pero la preciso de control''''''
MiSql2 = "INSERT INTO [LogBaseFacturas-Bajas] SELECT * FROM (" & MiSql & ")"
 
CurrentDb.Execute (MiSql2)
 
If rst.BOF() And rst.EOF Then
   Exit Function
End If
 
rst.MoveFirst
 
‘Recorre el recordset y elimina los registros marcados
 
While Not rst.EOF
 
        rst.Delete
        rst.MoveNext
 
Wend
 
rst.Close
 
Set rst = Nothing
 
End Function


El problema es que marco 3 casillas de verificación (tres registros), dos de ellas registros continuos y otra no, y en la tabla asociada al formulario existen tres registros marcados, pero en el recordset solo hay 2 registros verificado cuando agregue la variable “a” y la función DCount para saber cuantos registros tenia “MiSql”

Desde ya agradeceré la ayuda que puedan brindarme porque a pesar que he tratado de modificar el procedimiento no logro encontrar donde puede estar el error.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Formulario continuo con casilla de verificación

Publicado por Anonimo (3316 intervenciones) el 30/01/2023 20:20:14
Es posible que no 'traduzca' True como un valor booleano, si en lugar de ello (Baja = True) se utiliza (Baja <> 0) es probable que funcione sin problemas.

Por otra parte la función del dominio no es la forma correcta de obtener ese dato, para obtener el numero de registros que devuelve el recorset que se crea en base a esa SQL cambiaria esta línea:

1
a = DCount("*", "LogBaseFacturas", "Baja=True")

Por esta:

1
a = rst.RecordCount


Y en lugar de recorrer el Recordset borrando registros, utilizaría una SQL que en lugar de insertar borrase.

De hecho lo resolvería con dos SQLs: una de inserción y otra de borrado y (en este caso concreto) me olvidaría del Recordset
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Formulario continuo con casilla de verificación

Publicado por mercedes (22 intervenciones) el 31/01/2023 16:51:19
Gracias por tu respuesta. Ya funcionó el procedimiento.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Formulario continuo con casilla de verificación

Publicado por Anonimo (3316 intervenciones) el 01/02/2023 00:41:41
Revisando el codigo publicado, me llama la atencion esto:

Una SQL:
1
2
3
MiSql = "SELECT * FROM LogBaseFacturas WHERE Baja = True"
'Se corrige la condicion:
MiSql = "SELECT * FROM LogBaseFacturas WHERE Baja <> 0"

Otra SQL:
1
MiSql2 = "INSERT INTO [LogBaseFacturas-Bajas] SELECT * FROM (" & MiSql & ")"

Si hacemos la sustitución se obtiene esto:
1
MiSql2 = "INSERT INTO [LogBaseFacturas-Bajas] SELECT * FROM (SELECT * FROM LogBaseFacturas WHERE Baja <> 0)"

Lo que se esperaba :
1
MiSql2 = "INSERT INTO [LogBaseFacturas-Bajas] Select * FROM LogBaseFacturas WHERE Baja <> 0"


Lo que se recomendó:
1
2
3
MiSql = " FROM LogBaseFacturas WHERE Baja <> 0"
CurrentDb.Execute "INSERT INTO [LogBaseFacturas-Bajas] Select * " & MiSql
CurrentDb.Execute "Delete * " & MiSql

En la ventana de VBA:

1
2
3
4
5
6
7
8
9
MiSql = " FROM LogBaseFacturas WHERE Baja <> 0"
?MiSql
 FROM LogBaseFacturas WHERE Baja <> 0
 
?"INSERT INTO [LogBaseFacturas-Bajas] Select * " & MiSql
INSERT INTO [LogBaseFacturas-Bajas] Select *  FROM LogBaseFacturas WHERE Baja <> 0
 
?"Delete * " & MiSql
Delete *  FROM LogBaseFacturas WHERE Baja <> 0
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Eduardo

Formulario continuo con casilla de verificación

Publicado por Eduardo (317 intervenciones) el 31/01/2023 17:40:29
Pruebe con este código

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Private Function ProcesarBaja()
    Dim rst As DAO.Recordset
    Dim MiSql As String
    Dim rs As DAO.Recordset
    Dim MiSql2 As String
    Dim MiSql3 As String
    Dim numero As Integer
    Dim a As Byte
 
    MiSql = "SELECT * FROM LogBaseFacturas WHERE Baja = -1"
 
    Set rst = CurrentDb.OpenRecordset(MiSql, dbOpenDynaset)
 
    ''''Esta línea la puse para que cuente la cantidad de registros que hay en MiSql'''''
    If rst.RecordCount = 0 Then
      MsgBox "No hay registros para dar de baja", vbInformation, "Le informo"
      Exit Function
    Else
 
'''''Antes de proceder a dar de baja los registros copio los mismos a otra tabla que en otro proceso voy a dar de baja pero la preciso de control''''''
      MiSql2 = "INSERT INTO [LogBaseFacturas-Bajas] SELECT * FROM (" & MiSql & ")"
 
      CurrentDb.Execute (MiSql2)
      rst.Close
      Set rst = Nothing
 
    End If
 
     'Elimina registros marcada baja=True
 
     CurrentDb.Execute "DELETE FROM LogBaseFacturas WHERE baja=-1"
 
End Function
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Formulario continuo con casilla de verificación

Publicado por Mercedes (22 intervenciones) el 31/01/2023 20:17:08
Eduardo muchas gracias. En realidad había funcionado parcialmente porque la sentencia SQL solo filtraba dos registros a pesar de los cambios y tenía que volver a procesar para dar de baja el otro registro.
Volvi a pensar el diseño y en lugar de un formulario continuo use un formulario y un subformulario.
En el subformulario se muestran todos los registros de la tabla y con un boton "Buscar" filtro los registros por otro concepto (CodItem) que es el codigo que relaciona el formulario con el subformulario.
Una vez aplicado el filtro marco los registros que quiero dar de baja.
En el boton "Baja" uso el mismo procedimiento y asi funciona:
*Inserta los 3 registros en la tabla
*Da de baja los 3 registros
Voy a probar el codigo que me enviaste porque no elimine el otro formulario y después te comento.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Formulario continuo con casilla de verificación

Publicado por Mercedes (22 intervenciones) el 31/01/2023 21:51:42
Eduardo, probé el último código que me enviaste y continúo con el mismo problema de tres registro que marco para dar de baja solo procesa dos registros.
El registro que no elimina queda marcado en la tabla y tengo que volver a procesar para darlo de baja.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Formulario continuo con casilla de verificación

Publicado por Mercedes (22 intervenciones) el 01/02/2023 20:11:02
Gracias Eduardo. Yo use el código con las modificaciones que sugeriste pero cambiando el diseño del formulario, en lugar de un formulario continuo use un formulario y un subformulario. Asi funciona.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Eduardo

Formulario continuo con casilla de verificación

Publicado por Eduardo (317 intervenciones) el 01/02/2023 21:04:53
Me alegro lo haya solucionado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar