Access - VBA Access 2013 - Instrucción "Select Case" en un bucle "For ... Next" usando variable numérica

 
Vista:
sin imagen de perfil

VBA Access 2013 - Instrucción "Select Case" en un bucle "For ... Next" usando variable numérica

Publicado por Mercedes (22 intervenciones) el 06/09/2022 22:58:52
Tengo problemas para resolver una instrucción “Select Case" en un procedimiento VBA Access que hace bastante no utilizo, he probado también con la Instrucción “IF” y no logro que seleccione los números de orden guardados en el campo “NroOrdItem” (formato Entero Largo) de forma correlativa.

Declaré una variable numérica (Long) a la cual le asigno al número de cada registro de un mismo Item y la uso para seleccionar el modo en que calcula los campos "CantXFact" y "FaltaJust" según se trate de un registro con “NroOrdItem” = 1 o de un registro con “NroOrdItem” mayor a 1.

Mas abajo copio la tabla y algunos ejemplos que hacen a mi pregunta, pero la base tiene 26000 registros y un ”Coditem” llegó a tener 1142 registros. En el ejemplo del “Coditem” 699ATT0000023 debería haber asignado 48 al campo “CantXFact” y 0 al campo “FaltaJust” del “NroOrdItem” = 2, en lugar de los valores de los “NroOrdItem” ) 10, 11 u 12-

El procedimiento que uso funciona correctamente cuando el mismo “Coditem” tiene hasta 9 registros y cuando supera esa cantidad en lugar de usar el registro Nro 2 usa el registro Nro 10 y así sucesivamente salteando números según con el que comienza.

El campo “NroOrdItem” se rellena usando un “UPDATE” en consulta de actualización; UPDATE FacturasProcesadas SET FacturasProcesadas.NroOrdItem = DCount("*","FacturasProcesadas","Coditem='" & [Coditem] & "' And CDbl(IdFact) >= " & CDbl([IdFact])) WHERE (((FacturasProcesadas.IdFact)<>0));
o sea numera cada grupo de “Coditem” del 1 al último que encuentra.

El procedimiento del bucle utiliza matrices y variables y los valores de los campos calculados "CantXFact" y "FaltaJust" son correctos pero como ya explique se asigna a “NroOrdItem” incorrecto.

Probé en lugar de "Case Else", "Case 2 to 1142", tampoco funciono, verifique el tipo de datos del campo de la tabla (es número y tipo Long, la variable y la matriz la declaré tipo Long

Dim MiNro as Long
ReDim DelControl2(0 To rstAct2.RecordCount) As Long

For i = 0 To rstAct.RecordCount - 1
DelControl2(i) = rstAct!NroOrdItem
MiNro = DelControl2(i)
Select Case MiNro

Case 1

Case Else

End Select

Next i

1 IdFactProc 2 Coditem 3 StkActF 4 Cantid 5 IdFact 6 NroOrdItem
7 Stock 8 CantXFact 9 FaltaJust

1 2 3 4 5 6 7 8 9
42 699ATT0000023 203 155 27248 1 203 155 48
43 699ATT0000023 203 159 27076 2 0 0 0
44 699ATT0000023 203 311 23672 3 0 0 0
45 699ATT0000023 203 200 23098 4 0 0 0
46 699ATT0000023 203 11 23097 5 0 0 0
47 699ATT0000023 203 207 22700 6 0 0 0
48 699ATT0000023 203 200 21629 7 0 0 0
49 699ATT0000023 203 100 18704 8 0 0 0
50 699ATT0000023 203 100 18703 9 0 0 0
51 699ATT0000023 203 21 18702 10 0 21 27
52 699ATT0000023 203 11 18701 11 0 11 16
53 699ATT0000023 203 289 16569 12 0 16 0
54 699ATT0000023 203 300 12375 13 0 0 0
55 699ATT0000023 203 174 10354 14 0 0 0
56 699ATT0000023 203 166 3646 15 0 0 0
26 799AMP0000912 45,64 100 20977 1 45,64 45,64 0
1 799LMP0000661 2343 700 34096 1 2343 700 1643
2 799LMP0000661 2343 328 33706 2 0 328 1315
3 799LMP0000661 2343 400 33666 3 0 400 915
4 799LMP0000661 2343 600 33586 4 0 600 315
6 799LMP0000661 2343 563 33342 5 0 315 0
5 799LMP0000661 2343 700 33341 6 0 0 0
7 799LMP0000661 2343 594 33330 7 0 0 0
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

VBA Access 2013 - Instrucción "Select Case" en un bucle "For ... Next" usando variable numérica

Publicado por Anonimo (3316 intervenciones) el 07/09/2022 03:35:51
Según este comentario:

..........................
El procedimiento que uso funciona correctamente cuando el mismo “Coditem” tiene hasta 9 registros y cuando supera esa cantidad en lugar de usar el registro Nro 2 usa el registro Nro 10 y así sucesivamente salteando números según con el que comienza.
.................................


El NroOrdItem no es reconocido como de tipo numérico lo considera un texto y por ello lo ordena comenzando por el primer carácter, después por el segundo, tercero ... y ello en base al valor ASC del carácter (que el carácter sea un digito es indiferente).

Si en el origen de datos del recordset, se le aplica la función Val al campo NroOrdItem debería de funcionar de forma correcta, algo como :

Select xxx, rrrr, Val(NroOrdItem) As N_OrdItem , zzzzz from .....

El inconveniente aparece si se utiliza ese campo, pues se tendrá que cambiar por su alias, si solo se utiliza para ordenar no habrá problema.
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
sin imagen de perfil

VBA Access 2013 - Instrucción "Select Case" en un bucle "For ... Next" usando variable numérica

Publicado por Mercedes (22 intervenciones) el 08/09/2022 17:31:57
Muchas gracias por tu respuesta. Ya hice las modificaciones y funciona correctamente el "Select Case"
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

VBA Access 2013 - Instrucción "Select Case" en un bucle "For ... Next" usando variable numérica

Publicado por Eduardo (317 intervenciones) el 07/09/2022 17:25:06
No haga UPDATE y menos utilice Dcount() para agrupar y numerar, cuando tenga que procesar 200 mil o más registros Access puede colapsar, para evitar esto utilice variables estáticas como lo enseña el maestro JESUS MANSILLA CASTELLS -Mihura. en la siguiente función.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
'---------------------------------------------------------------------------------------------
' Autor : JESUS MANSILLA CASTELLS -Mihura-
'---------------------------------------------------------------------------------------------
Public Function RT_NumerarParcialSQL(nDato) As Long
'variable que no se pierde entre las distintas llamadas
Static nCONTADOR As Long, nANTERIOR As String
     If IsNull(nDato) Then 'si nDato es nulo: Iniciamos valor
         nCONTADOR = 0
         nANTERIOR = ""
         Exit Function
     End If
 
     '- si nDato es igual al valor memorizado sumamos 1 al contador
     If nDato = nANTERIOR Then
         nCONTADOR = nCONTADOR + 1
 
       Else '- iniciamos valor y memorizamos el anterior
         nCONTADOR = 1
         nANTERIOR = nDato
     End If
     RT_NumerarParcialSQL = nCONTADOR
 
End Function

FORMULARIO

factura_case_000

CÓDIGO DEL BOTON PROCESAR

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
Private Sub btnProcesar_Click()
 
  Dim strSQl As String
  Dim rs As DAO.Recordset
  Dim dbAntFalta As Double
 
  strSQl = "SELECT tblFacturas.Coditem" & vbCrLf
  strSQl = strSQl & "           , tblFacturas.IdFactPro" & vbCrLf
  strSQl = strSQl & "           , tblFacturas.StkActF" & vbCrLf
  strSQl = strSQl & "           , tblFacturas.Cantidad" & vbCrLf
  strSQl = strSQl & "           , tblFacturas.IdFact" & vbCrLf
  strSQl = strSQl & "           , RT_NumerarParcialSQL([Coditem]) AS Nrotem" & vbCrLf
  strSQl = strSQl & "           , tblFacturas.NroOrdItem" & vbCrLf
  strSQl = strSQl & "           , tblFacturas.Stock" & vbCrLf
  strSQl = strSQl & "           , tblFacturas.CantXFact" & vbCrLf
  strSQl = strSQl & "           , tblFacturas.FaltaJust" & vbCrLf
  strSQl = strSQl & "        FROM tblFacturas" & vbCrLf
  strSQl = strSQl & "    ORDER BY tblFacturas.Coditem" & vbCrLf
  strSQl = strSQl & "           , tblFacturas.IdFactPro;"
 
  Set rs = CurrentDb.OpenRecordset(strSQl)
  rs.MoveFirst
 
  Do Until rs.EOF
 
   rs.Edit
   rs!NroOrdItem = rs.Fields("Nrotem").Value
 
   rs.Update
   If rs!NroOrdItem = 1 Then
     rs.Edit
     rs!Stock = rs!StkActF
     rs!CantXFact = rs!Cantidad
     rs!FaltaJust = rs!StkActF - rs!Cantidad
     rs.Update
     dbAntFalta = rs!FaltaJust
   Else
     rs.Edit
     rs!Stock = 0
     rs!CantXFact = rs!Cantidad
     rs!FaltaJust = dbAntFalta - rs!CantXFact
     rs.Update
     dbAntFalta = rs!FaltaJust
   End If
 
   rs.MoveNext
  Loop
 
  rs.Close
  Set rs = Nothing
 
 
End Sub

Observe como utilizo la función para obtener la columna "Nrotem" . Le aclaro hay cosas que no entiendo con los cálculos, pero ya usted podrá hacer los ajustes y me cuenta, esto es una idea. El resultado final es el siguiente


factura_case_00

Debe copiar la función del maestro Mansilla en un módulo.
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
sin imagen de perfil

VBA Access 2013 - Instrucción "Select Case" en un bucle "For ... Next" usando variable numérica

Publicado por Mercedes (22 intervenciones) el 08/09/2022 17:34:34
Muchas gracias por tu respuesta Eduardo. Voy a poner en práctica tu sugerencia ya que como me indicaste al usar DCount con tanta cantidad de registros, el proceso se hace muy largo.
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
sin imagen de perfil

VBA Access 2013 - Instrucción "Select Case" en un bucle "For ... Next" usando variable numérica

Publicado por Mercedes (22 intervenciones) el 11/09/2022 22:47:08
Excelente. Después de ajustar los cálculos funciona muy bien, otra vez muchas gracias.
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

VBA Access 2013 - Instrucción "Select Case" en un bucle "For ... Next" usando variable numérica

Publicado por Eduardo (317 intervenciones) el 12/09/2022 01:46:43
Me alegro excelente
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