Access - RecordSet No Responde

 
Vista:
sin imagen de perfil

RecordSet No Responde

Publicado por Dany (40 intervenciones) el 05/11/2015 23:32:25
Saludos cordiales a todos.

Tengo problemas con este RecordtSet, ya que lo ejecuto y se queda congelado no responde y tengo que cerrar Access.

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
Public Function CALCULATE()
 
Dim rst As DAO.Recordset, Val As Integer, Val2 As Integer, Val3 As Integer
Val = 6
Val2= 9
Val3=15
 
Set rst = CurrentDb.OpenRecordset("SELECT B_Sec.PROCESS, B_Sec.[LNTH TORCIDA], B_Sec.[PROCESS TIME] FROM B_Sec WHERE B_Sec.PROCESS='TORCIDO';")
 
If rst.RecordCount = 0 Then Exit Function
 
With rst
 
.MoveFirst
 
Do While Not .EOF
 
If (![LNTH TORCIDA]) < 501 Then
![PROCESS TIME] = Val
.Edit
.Update
.MoveNext
 
End If
 
Loop
End With
 
rst.Close
Set rst = Nothing
 
End Function

Lo que quiero es comprobar el valor del campo "LNTH TORCIDA", si es menor a 501 ponga un dato en el campo "Process Time" , si es mayor a 501 y menor a 1501 poner otro valor en el campo "Process Time" seria una seria de IF's intente realizarlo con "Between" pero creo no es valido para vba o al menos no me funciono.

Alguien podria ayudarme, primero porque se congela el codigo cuando lo ejecuto, y Segundo comentarme si seria la manera correcta lo que intento hacer con el RecordSet.

Saludos

DS
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
sin imagen de perfil

RecordSet No Responde

Publicado por Enrique Heliodoro (1664 intervenciones) el 06/11/2015 00:36:03
El primer error esta en el condicional, se avanza de registro solo si se cumple la condición .... se ha de 'sacar del if' el MoveNext.

Otro detalle es que 'formalmente' primero se pone en edición al registro, tras ello se modifica lo que se tenga que modificar y finalmente se guardan las modificaciones.

Si los valores son incrementales, se pueden sumar, asi por ejemplo:

![PROCESS TIME] = 6 + 3 * abs(![LNTH TORCIDA] > 500) + 6 * abs(![LNTH TORCIDA]> 1500)

Para un valor de [LNTH TORCIDA] < 501 ==> 6 + 3 * 0 + 6 * 0 ==> 6
Para un valor de [LNTH TORCIDA] entre 501 y 1500 ==> 6 + 3 * 1 + 0 ==> 9
Para un valor de [LNTH TORCIDA] > 1501 ==> 6 + 3 *1 + 6 *1 ==> 15
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

RecordSet No Responde

Publicado por Dany (40 intervenciones) el 06/11/2015 21:53:17
Gracias Enrique por contestar.

Esta parte:El primer error esta en el condicional, se avanza de registro solo si se cumple la condición .... se ha de 'sacar del if' el MoveNext.

Otro detalle es que 'formalmente' primero se pone en edición al registro, tras ello se modifica lo que se tenga que modificar y finalmente se guardan las modificaciones.

Ya la corregi.

En la segunda parte que me comentas, entiendo una parte de lo que me indicas, pero tengo dudas con esto:

![PROCESS TIME] = 6 + 3 * abs(![LNTH TORCIDA] > 500) + 6 * abs(![LNTH TORCIDA]> 1500)

Para un valor de [LNTH TORCIDA] < 501 ==> 6 + 3 * 0 + 6 * 0 ==> 6
Para un valor de [LNTH TORCIDA] entre 501 y 1500 ==> 6 + 3 * 1 + 0 ==> 9
Para un valor de [LNTH TORCIDA] > 1501 ==> 6 + 3 *1 + 6 *1 ==> 15

Cual es la function de "abs" * que es "abs", pudieras explicarme por favor.

Saludos

DS
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

RecordSet No Responde

Publicado por Enrique Heliodoro (1664 intervenciones) el 06/11/2015 22:27:44
Pertenece al lote de las funciones matemáticas, devuelve el valor absoluto (en cristiano: le quita el signo a los números negativos)

Si lo hubieras buscado en la ayuda (de Access) lo hubieras encontrado, no me invento NADA, utilizo las posibilidades que están a publica disposición.

Para evitar mas preguntas adicionales:

True = -1
False = 0
tenemos:
[LNTH TORCIDA] > 1501
Puede ser verdadero o falso, en cualquier caso devolverá (mediante ABS) un cero (false) o un uno (true), el resto es simple matemática fundamental
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

RecordSet No Responde

Publicado por Dany (40 intervenciones) el 09/11/2015 23:29:32
Gracias Enrique por esclarecer la duda.

Bueno solo comentar que no pude hacer uso del Between, he solucionado el problema con If y => y <= de esta forma:

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
Dim rst As DAO.Recordset
Dim V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14 As Integer
 
Set rst = CurrentDb.OpenRecordset("SELECT B_Sec.PROCESS, B_Sec.[LNTH TORCIDA], B_Sec.[PROCESS TIME] FROM B_Sec WHERE B_Sec.PROCESS='TWIST' ORDER BY B_Sec.[LNTH TORCIDA];")
 
If rst.RecordCount = 0 Then Exit Function
 
With rst
 
.MoveFirst
 
Do Until .EOF
 
.Edit
 
V1 = 6
V2 = 8
V3 = 9
V4 = 10
V5 = 11
V6 = 12
V7 = 13
V8 = 15
V9 = 16
V10 = 18
V11 = 19
V12 = 20
V13 = 21
V14 = 23
 
If ![LNTH TORCIDA] >= 100 And ![LNTH TORCIDA] <= 500 Then
![PROCESS TIME] = V1
.Update
 
Else
 
If ![LNTH TORCIDA] >= 501 And ![LNTH TORCIDA] <= 600 Then
![PROCESS TIME] = V2
.Update
 
Else
 
If ![LNTH TORCIDA] >= 601 And ![LNTH TORCIDA] <= 700 Then
![PROCESS TIME] = V3
.Update
 
Else
 
If ![LNTH TORCIDA] >= 701 And ![LNTH TORCIDA] <= 900 Then
![PROCESS TIME] = V4
.Update
 
Else
 
If ![LNTH TORCIDA] >= 901 And ![LNTH TORCIDA] <= 1000 Then
![PROCESS TIME] = V5
.Update
 
Else
 
If ![LNTH TORCIDA] >= 1001 And ![LNTH TORCIDA] <= 1100 Then
![PROCESS TIME] = V6
.Update
 
Else
 
If ![LNTH TORCIDA] >= 1101 And ![LNTH TORCIDA] <= 1200 Then
![PROCESS TIME] = V7
.Update
 
Else
 
If ![LNTH TORCIDA] >= 1201 And ![LNTH TORCIDA] <= 1400 Then
![PROCESS TIME] = V8
.Update
 
Else
 
If ![LNTH TORCIDA] >= 1401 And ![LNTH TORCIDA] <= 1600 Then
![PROCESS TIME] = V9
.Update
 
Else
 
If ![LNTH TORCIDA] >= 1601 And ![LNTH TORCIDA] <= 1700 Then
![PROCESS TIME] = V10
.Update
 
Else
 
If ![LNTH TORCIDA] >= 1701 And ![LNTH TORCIDA] <= 2400 Then
![PROCESS TIME] = V11
.Update
 
Else
 
If ![LNTH TORCIDA] >= 2401 And ![LNTH TORCIDA] <= 2500 Then
![PROCESS TIME] = V12
.Update
 
Else
 
If ![LNTH TORCIDA] >= 2501 And ![LNTH TORCIDA] <= 4000 Then
![PROCESS TIME] = V13
.Update
 
Else
 
If ![LNTH TORCIDA] >= 4001 And ![LNTH TORCIDA] <= 6000 Then
![PROCESS TIME] = V14
.Update
 
End If
   End If
      End If
         End If
            End If
               End If
                  End If
                  End If
               End If
            End If
         End If
      End If
    End If
End If
 
.MoveNext
 
Loop
End With
 
rst.Close
Set rst = Nothing

Gracias por la ayuda

Saludos

DS
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

RecordSet No Responde

Publicado por Enrique Heliodoro (1664 intervenciones) el 10/11/2015 00:53:22
Sinceramente: esa programación es una programación sucia

Las razones:

.- Las variables se comportan como constantes (por lo que sobrarían)
.- Se les asigna el mismo valor en cada vuelta del bucle (repetición absurda)
.- Toda esa serie de condicionales se resuelven con un Select Case (que permitiría utilizar intervalos)
.- No aprecio razón alguna para que Between no funcione con números (pero esa variacion no ha sido publicada)
.- Bastaria un único 'Update' al final de los IF que adjudican el valor (no uno por cada if)
.- En lugar de bucles IF encadenados, se puede utilizar la opción 'ElseIf' que permite una nueva evaluacion

Utilizar la metodología que publique .... se puede hacer con una única línea o con tantos IF de una línea como casos diferentes

Lo malo de dispersar recursos de la maquina de esa forma tan poco elegante solo lleva a tener que multiplicar la potencia de la maquina de forma exponencial por cada 'dispersion'.
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

RecordSet No Responde

Publicado por Dany (40 intervenciones) el 10/11/2015 00:58:23
Pudieras mostrame de ser possible como usar el Between lo comento porque no lo pude usar es decir Acces me dice que no es valido.

Lo estoy usando asi:
If ![LNTH TORCIDA] Between 100 And Between ![LNTH TORCIDA] 500 Then

DS
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

RecordSet No Responde

Publicado por Enrique Heliodoro (1664 intervenciones) el 11/11/2015 19:52:04
La ayuda de Access tiene ejemplos que son fáciles de interpretar, pero como simple demostración de lo sencillo que es el VBA, fíjate como lo hace el traductor de Google:


Imagen2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

RecordSet No Responde

Publicado por Dany (40 intervenciones) el 11/11/2015 21:58:54
Enrique.

La tecla F1 pienso me funciona bien mas desconozoco si me falte algo en la ayuda de Access, ya que al ingresar la palabra Between en la ayuda me despliga mas de 100 resultados pero ningun resultado esta relaciondo con Between, como prueba ingrese Msgbox y vuala me da resultados me encunetra las ayudas que hay relacionadas al Msgbox, no se se me falte algi en mi ayuda de Access ya que como comento he buscado sin encontrar lo que busco en Google tambien hice busquedas y si encontre información pero casi todo esta relacionado en consultas y controles en formularios, ya he usado Betwwen en consultas pero jamas lo he usado en vba. Anexo imagines de lo que te comente, con esto no quiero que me resuelvas el problema solo informar que he buscado información sin exito.

2druotv

Este es el error que me da y al presionar ayuda me manda a otra pantalla pero no me explica cual es el error al usar Between:

nbtbbs


Espero sea entendible que quiero solucionar el problema y estoy buscando información.

Saludos

DS
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

RecordSet No Responde

Publicado por Enrique Heliodoro (1664 intervenciones) el 12/11/2015 04:23:44
Access tiene sus limitaciones al evaluar y permitir expresiones (sobre todo si son complejas como Between que utiliza DOS parámetros y no un rango delimitado por DOS expresiones simples), sobre todo cuando existen alternativas conceptualmente mas idóneas para hacer 'mas de lo mismo' (intervalos)


El codigo original, pero corregido:

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
57
58
59
60
61
62
63
64
Dim rst As DAO.Recordset
Dim V1 As Integer, V2 As Integer, V3 As Integer, V4 As Integer, _
    V5 As Integer, V6 As Integer, V7 As Integer, V8 As Integer, _
    V9 As Integer, V10 As Integer, V11 As Integer, V12 As Integer, _
    V13 As Integer, V14 As Integer, DTemp As Integer
Set rst = CurrentDb.OpenRecordset("SELECT PROCESS, [LNTH TORCIDA], [PROCESS TIME] FROM B_Sec WHERE PROCESS='TWIST' ORDER BY [LNTH TORCIDA]")
If rst.RecordCount = 0 Then Exit Function
V1 = 6
V2 = 8
V3 = 9
V4 = 10
V5 = 11
V6 = 12
V7 = 13
V8 = 15
V9 = 16
V10 = 18
V11 = 19
V12 = 20
V13 = 21
V14 = 23
With rst
.MoveLast
.MoveFirst
Do Until .EOF
Select Case ![LNTH TORCIDA]
    Case 100 To 500
        DTemp = V1
    Case 501 To 600
        DTemp = V2
    Case 601 To 700
        DTemp = V3
    Case 701 To 900
        DTemp = V4
    Case 901 To 1000
        DTemp = V5
    Case 1001 To 1100
        DTemp = V6
    Case 1101 To 1200
        DTemp = V7
    Case 1201 To 1400
        DTemp = V8
    Case 1401 To 1600
        DTemp = V9
    Case 1601 To 1700
        DTemp = V10
    Case 1701 To 2400
        DTemp = V11
    Case 2401 To 2500
        DTemp = V12
    Case 2501 To 4000
        DTemp = V13
    Case 4001 To 6000
        DTemp = V14
End Select
.Edit
![PROCESS TIME] = DTemp
.Update
.MoveNext
Loop
.Close
End With
Set rst = Nothing
End Function

Lo mismo, pero simplificado:

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
Dim rst As DAO.Recordset
Dim DTemp As Integer
Set rst = CurrentDb.OpenRecordset("SELECT PROCESS, [LNTH TORCIDA], [PROCESS TIME] FROM B_Sec WHERE PROCESS='TWIST' ORDER BY [LNTH TORCIDA]")
If rst.RecordCount = 0 Then Exit Function
With rst
.MoveLast
.MoveFirst
Do Until .EOF
Select Case ![LNTH TORCIDA]
    Case 100 To 500
        DTemp = 6
    Case 501 To 600
        DTemp = 8
    Case 601 To 700
        DTemp = 9
    Case 701 To 900
        DTemp = 10
    Case 901 To 1000
        DTemp = 11
    Case 1001 To 1100
        DTemp = 12
    Case 1101 To 1200
        DTemp = 13
    Case 1201 To 1400
        DTemp = 15
    Case 1401 To 1600
        DTemp = 16
    Case 1601 To 1700
        DTemp = 18
    Case 1701 To 2400
        DTemp = 19
    Case 2401 To 2500
        DTemp = 20
    Case 2501 To 4000
        DTemp = 21
    Case 4001 To 6000
        DTemp = 23
End Select
.Edit
![PROCESS TIME] = DTemp
.Update
.MoveNext
Loop
.Close
End With
Set rst = Nothing

Y finalmente lo mismo pero de otra forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("SELECT PROCESS, [LNTH TORCIDA], [PROCESS TIME] FROM B_Sec WHERE PROCESS='TWIST' ORDER BY [LNTH TORCIDA]")
If rst.RecordCount = 0 Then Exit Function
With rst
.MoveLast
.MoveFirst
Do Until .EOF
    .Edit
    ![PROCESS TIME] = Abs(6 * (![LNTH TORCIDA] > 99) + 2 * (![LNTH TORCIDA] > 500) _
    + 1 * (![LNTH TORCIDA] > 600) + 1 * (![LNTH TORCIDA] > 700) + 1 * (![LNTH TORCIDA] > 900) _
    + 1 * (![LNTH TORCIDA] > 1000) + 1 * (![LNTH TORCIDA] > 1100) _
    + 2 * (![LNTH TORCIDA] > 1200) + 1 * (![LNTH TORCIDA] > 1400) + 2 * (![LNTH TORCIDA] > 1600) _
    + 1 * (![LNTH TORCIDA] > 1700) + 1 * (![LNTH TORCIDA] > 2400) _
    + 1 * (![LNTH TORCIDA] > 2500) + 2 * (![LNTH TORCIDA] > 4000))
    .Update
    .MoveNext
    Loop
.Close
End With
Set rst = Nothing
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

RecordSet No Responde

Publicado por Dany (40 intervenciones) el 17/11/2015 18:52:52
Gracias por tu ayuda Enrique.

Finalmente opte por la segunda opción: Lo mismo, pero simplificado

Las tres opciones son validas gracias por la ayuda.

Saludos

DS
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