
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
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


0