Access - llamada a un valor en una funcion

 
Vista:
sin imagen de perfil

llamada a un valor en una funcion

Publicado por jose maria (89 intervenciones) el 16/07/2013 11:04:19
hola, tengo una funcion dentro del codigo, cuando hago la llamada, esta funcion hace unos calculos, y el resultado de estos calculos lo llamo valorfinal y termino la funcion,
la cosa es que luego no se llamar a este valor en la parte del codigo donde llamo la funcion, abr si me explico mejor..... llamo a la funcion (esta hace su tarea) quiero utilizar su resultado
¿como lo hago?
dentro de la funcion dimensione a valorfinal de esta manera

Dim valorfinal As Long

pero en el resto del codigo solo la llamo de esta otra

MsgBox "Valor final es =" & valorfinal

se que la funcion funciona bien

gracias
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
Imágen de perfil de Enrique Ramírez
Val: 37
Ha aumentado su posición en 2 puestos en Access (en relación al último mes)
Gráfica de Access

llamada a un valor en una funcion

Publicado por Enrique Ramírez (629 intervenciones) el 17/07/2013 02:25:45
no entiendo bien lo que quieres pero te dejo este ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Sub Comando0_Click()
Texto1 = DameMes(Month(Now))
end sub
 
Public Function DameMes(NumeroMes)
Dim LetraMes As String
Select Case NumeroMes
Case 1
LetraMes = "ENERO"
Case 2
.
.
Case 12
LetraMes = "DICIEMBRE"
End Select
 
DameMes = LetraMes
 
End Function


checa que el valor final(LetraMes) lo igualo al nombre de las funcion y de esta forma puedo hacer uso del valor obtenido en el formulario.
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

llamada a un valor en una funcion

Publicado por jose maria (89 intervenciones) el 17/07/2013 21:28:10
si eso lo hago, dentro de la parte de private sub.... pero no me coje el valor......
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

llamada a un valor en una funcion

Publicado por jose maria (89 intervenciones) el 18/07/2013 09:05:37
aqui te dejo el codigo con las cosas que intente, esta funcionando y le puse mensages para comprobar que hacia todo lo del cif, espero que no sea mucho lio
recuerda, el dato lo tomo a traves de un cuadro de texto con la mascara de entrada >L0000000A

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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
Option Compare Database
'Dim DC2 As String
'DC2 = 0
_________________________________________________________
 
Private Sub cif_BeforeUpdate(Cancel As Integer)
 
End Sub
 
__________________________________________________________
 
Private Sub cif_KeyPress(KeyAscii As Integer)
    Const CarnoValidos = "0123456789IÑOTUXYZ"
    Const letrafinal = "KQS"
    Const numerofinal = "ABEH"
    Const otrasletras = "CDFGJLMNPRVW"
    Const letras = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"
    Dim DC As String * 1
 
 
    'Dim valorfinal As String
    Dim numero As String
    Dim final As String
 
    'Si estamos en la primera posición y se pulsa una tecla de carácter
    If Me.cif.SelStart = 0 And KeyAscii > 31 Then
        'Si es uno de los caracteres NO válidos
        If Not InStr(1, CarnoValidos, Chr(KeyAscii)) = 0 Then
            'Anulamos la pulsación
            KeyAscii = 0
             MsgBox "Caracter no Valido"
     End If
 
'analizamos que tipo de digito control DC tendra el cif
If Not InStr(1, letrafinal, Chr(KeyAscii)) = 0 Then MsgBox " CIF terminara en letra": final = 1
If Not InStr(1, numerofinal, Chr(KeyAscii)) = 0 Then MsgBox " CIF terminara en numero": final = 0
If Not InStr(1, otrasletras, Chr(KeyAscii)) = 0 Then MsgBox " no sabemos como acabara el CIF": final = 2
MsgBox final
End If
 
 
'si es el ultimo caracter, llamamos a la funcion para que nos diga que valor tendra el DC
'If Me.cif.SelStart = 8 And KeyAscii > 48 Or KeyAscii < 90 Then
If Me.cif.SelStart = 8 And KeyAscii > 31 Then
'analizamos el ultimo digito
    'If final = 0 And Me.cif.SelStart = 8 And KeyAscii > 48 Or KeyAscii < 57 Then
    'Calculamos el digito control por medio de una función
      DC = CalculoDigitoControl(Left(Me.cif.Text, 8))
      'DC2 = valorfinal
      'MsgBox "se mostrara el DC= " & DC2
      'DC2 = valorfinal
      'MsgBox "mostrare el Digito Control"
      'MsgBox DC2
      'If DC = Me.cif.SelStart = 8 Then Me.cif.SelStart = 8
      End If
      'If final = 1 And Me.cif.SelStart = 8 And KeyAscii > 65 Or KeyAscii < 90 Then
      'comprobamos si la letra es correcta
 
      'DC = CalculoDigitoControl
      'MsgBox "vemos el DC" & DC
        'Si la letra no coincide con la que hemos pulsado
       ' If DC <> UCase(Chr(KeyAscii)) Then
            'Anulamos la pulsación
 
        '     MsgBox "Letra no valida, deberia ser la " & Letra, vbInformation
         '   KeyAscii = 0
 
       '    End If
       ' End If
   'If Me.cif.SelStart = 0 And KeyAscii = 75 Or KeyAscii = 81 Or KeyAscii = 83 Then
   'If final = 0 Then
    'If final = 1 Then
     'If final = 2 Then
     'End If
 
End Sub
_________________________________________________________________________
 
Private Function CalculoDigitoControl(cif As String) As String
    MsgBox "empieza la funcion"
    'Dim DC2 As String
 
    Dim nCIF As Long
 
    Dim nCIFParA As Long
    Dim nCIFParB As Long
    Dim nCIFParC As Long
 
    Dim nCIFImparA As Long
    Dim nCIFImparB As Long
    Dim nCIFImparC As Long
    Dim nCIFImparD As Long
 
    Dim sumapar As Long
    Dim sumaimpar As Long
    Dim sumaparcial As Long
    Dim valorsumaparcial As Long
    Dim valorfinal As Long
 
    Dim mulA As Long
    Dim mulB As Long
    Dim mulC As Long
    Dim mulD As Long
 
    Dim valorA As Long
    Dim valorB As Long
    Dim sumamulA As Long
 
    Dim valorC As Long
    Dim valorD As Long
    Dim sumamulB As Long
 
    Dim valorE As Long
    Dim valorF As Long
    Dim sumamulC As Long
 
    Dim valorG As Long
    Dim valorH As Long
    Dim sumamulD As Long
 
    'Estas son las letras que corresponden a los 23 restos
    Const letras = "ABCDEFGHJKLMNPQRSVW"
 
    'tomamos ejemplo de cif A58818501
    'cogemos los digitos desde el 2 hasta el 8
  'MsgBox "cogemos los digitos desde el 2 hasta el 8"
   ' MsgBox Mid(cif, 2, 1)
   ' MsgBox Mid(cif, 3, 1)
   ' MsgBox Mid(cif, 4, 1)
   ' MsgBox Mid(cif, 5, 1)
   ' MsgBox Mid(cif, 6, 1)
   ' MsgBox Mid(cif, 7, 1)
   ' MsgBox Mid(cif, 8, 1)
 
    'Asignamos el valor numérico a los dígitos pares que son segun ejemplo A = 8 B= 1  C= 5
    '   MsgBox "Asignamos el valor numérico a los dígitos pares"
        nCIFParA = Val(Mid(cif, 3, 1))
        nCIFParB = Val(Mid(cif, 5, 1))
        nCIFParC = Val(Mid(cif, 7, 1))
    'MsgBox "numero par 1:" & nCIFParA
    'MsgBox "numero par 2:" & nCIFParB
    'MsgBox "numero par 3:" & nCIFParC
    'sumamos estos valores
     'MsgBox "sumamos estos valores"
        sumapar = nCIFParA + nCIFParB + nCIFParC
      '  MsgBox "la suma de los tres numeros pares=" & sumapar
 
    'Asignamos el valor numérico a los dígitos impares que son segun ejemplo A = 5 B= 8  C= 8 D= 0
       'MsgBox "Asignamos el valor numérico a los dígitos impares"
        nCIFImparA = Val(Mid(cif, 2, 1))
        nCIFImparB = Val(Mid(cif, 4, 1))
        nCIFImparC = Val(Mid(cif, 6, 1))
        nCIFImparD = Val(Mid(cif, 8, 1))
    'MsgBox "numero impar 1:" & nCIFImparA
    'MsgBox "numero impar 2:" & nCIFImparB
    'MsgBox "numero impar 3:" & nCIFImparC
    'MsgBox "numero impar 4:" & nCIFImparD
 
    'multiplicamos cada uno de ellos por dos
    'MsgBox "multiplicamos cada uno de ellos por dos"
    mulA = nCIFImparA * 2
    mulB = nCIFImparB * 2
    mulC = nCIFImparC * 2
    mulD = nCIFImparD * 2
    'MsgBox "numero impar 1:" & mulA
    'MsgBox "numero impar 2:" & mulB
    'MsgBox "numero impar 3:" & mulC
    'MsgBox "numero impar 4:" & mulD
 
    'de cada uno de estos resultados de la multiplicacion,extraemos y sumamos sus digitos. supongamos que esto es=11, entonces la suma seria 1+1=2
    'MsgBox "de cada uno de estos resultados de la multiplicacion,extraemos y sumamos sus digitos"
    valorA = Val(Mid(mulA, 1, 1))
    valorB = Val(Mid(mulA, 2, 1))
    sumamulA = valorA + valorB
 
 
    valorB = Val(Mid(mulB, 1, 1))
    valorC = Val(Mid(mulB, 2, 1))
    sumamulB = valorB + valorC
 
 
    valorD = Val(Mid(mulC, 1, 1))
    valorE = Val(Mid(mulC, 2, 1))
    sumamulC = valorD + valorE
 
    valorF = Val(Mid(mulD, 1, 1))
    valorG = Val(Mid(mulD, 2, 1))
    sumamulD = valorF + valorG
    'MsgBox "suma total 1:" & sumamulA & " total 2:" & sumamulB & " total 3:" & sumamulC & " total 4:" & sumamulD
 
    'ahora sumamos la suma de estos digitos....
    sumaimpar = sumamulA + sumamulB + sumamulC + sumamulD
    'MsgBox "ahora sumamos la suma de estos digitos....que es =" & sumaimpar
 
    'sumamos las dos partes, sumapar y sumaimpar
    sumaparcial = sumapar + sumaimpar
    'MsgBox "sumamos las dos partes, sumapar y sumaimpar=" & sumaparcial
 
    'ahora cojemos el segundo digito de esta suma
    valorsumaparcial = Val(Mid(sumaparcial, 2, 1))
    'MsgBox "ahora cojemos el segundo digito de esta suma=" & valorsumaparcial
 
    'ahora esto se lo restamos a 10
    valorfinal = 10 - valorsumaparcial
    'MsgBox "ahora esto se lo restamos a 10,=" & valorfinal
    MsgBox "Valor de la Funcion= " & valorfinal
    MsgBox "se acabo la funcion"
    'DC2 = valorfinal
    'MsgBox "se mostrara el DC= " & DC2
    End Function


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 Enrique Ramírez
Val: 37
Ha aumentado su posición en 2 puestos en Access (en relación al último mes)
Gráfica de Access

llamada a un valor en una funcion

Publicado por Enrique Ramírez (629 intervenciones) el 19/07/2013 02:31:28
dentro de la función estas deben ser las dos últimas líneas de tu código

CalculoDigitoControl = valorfinal
End Function

para cuando el código regrese de la función te almacene el valor calculado en la variable DC
DC = CalculoDigitoControl(Left(Me.cif.Text, 8))
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

llamada a un valor en una funcion

Publicado por jose maria (89 intervenciones) el 19/07/2013 08:28:10
gracias, me funciona, ahora vere si no me surgen mas problemas......
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

llamada a un valor en una funcion

Publicado por jose maria (89 intervenciones) el 19/07/2013 09:05:50
bueno, ahora queria segir con el resto del codigo y hay unos if que me crean problemas.......
¿que hay mal?
............

Dim final As String
...........
If Not InStr(1, letrafinal, Chr(KeyAscii)) = 0 Then MsgBox " CIF terminara en letra": final = 1
If Not InStr(1, numerofinal, Chr(KeyAscii)) = 0 Then MsgBox " CIF terminara en numero": final = 0
If Not InStr(1, otrasletras, Chr(KeyAscii)) = 0 Then MsgBox " no sabemos como acabara el CIF": final = 2
MsgBox "Valor de final= " & final
End If
- en este if final solo tiene valor dentro de lo que es el bucle, fuera no vale nada.....¿como hago para que siga teniendo su valor?
..............

If Me.cif.SelStart = 8 And KeyAscii > 31 Then
DC = CalculoDigitoControl(Left(Me.cif.Text, 8))
MsgBox "se mostrara el DC= " & DC

If final = 0 And Me.cif.SelStart = 8 And (Val(Mid(cif, 8, 1)) = DC) Then
-este if tampoco funciona genera error

End If
End If
End Sub

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 Enrique Ramírez
Val: 37
Ha aumentado su posición en 2 puestos en Access (en relación al último mes)
Gráfica de Access

llamada a un valor en una funcion

Publicado por Enrique Ramírez (629 intervenciones) el 19/07/2013 17:04:52
1) Efectivamente una regla de las variables dice que si la defines dentro de una rutina solo la puedes utilizar en esa rutina, lo que debes hacer es definirla al principio del código para la puedas utilizar en todo el programa:

Option Compare Database
Dim final As String

2) es conveniente que cuando te genere algún error lo escribas para darnos una idea de que pueda ser, ¿que error te da el segundo if?
lo único que haría es quitar el primer paréntesis a (Val(Mid(cif, 8, 1)) = DC) lo dejaría Val(Mid(cif, 8, 1)) = DC
prueba pero no creo que sea eso ó convierte a numérico: val(Me.cif.SelStart ) = 8
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

llamada a un valor en una funcion

Publicado por jose maria (89 intervenciones) el 19/07/2013 22:11:55
bueno, lo del dim final as string si que no lo pillo, arriva, cuando puse el codigo para que lo revisarais esta al principio, como tu dices y exactamente como comentas, te vuelvo a poner parte del principio..... para verlo completo suve al 5º comentario de este post......
Private Sub cif_KeyPress(KeyAscii As Integer)
Const CarnoValidos = "0123456789IÑOTUXYZ"
Const letrafinal = "KQS"
Const numerofinal = "ABEH"
Const otrasletras = "CDFGJLMNPRVW"
Const letras = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"
Dim DC As String * 1


'Dim valorfinal As String
Dim numero As String
Dim final As String
............

lo otro ya lo pruebo.....
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 Enrique Ramírez
Val: 37
Ha aumentado su posición en 2 puestos en Access (en relación al último mes)
Gráfica de Access

llamada a un valor en una funcion

Publicado por Enrique Ramírez (629 intervenciones) el 20/07/2013 05:14:29
para que me entiendas mejor, estas dos lineas deben ser la primera y la segunda linea en el código de tu formulario hasta ARRIBA

Option Compare Database
Dim final As String

y el Dim final As String que tu tienes (el que tecleaste primero) y que esta en :
Private Sub cif_KeyPress(KeyAscii As Integer)

BORRALO para que solo este defino una sola ves en todo el código hasta arriba.
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

llamada a un valor en una funcion

Publicado por jose maria (89 intervenciones) el 22/07/2013 08:24:42
entendido y hecho y gracias me 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
sin imagen de perfil

llamada a un valor en una funcion

Publicado por jose maria (89 intervenciones) el 22/07/2013 09:58:34
hola, sigo teniendo problemas al llamar a otros valores....
defino al principio de todo:

Option Compare Database
Dim final As String
Dim valorfinalcif As String

..............

Private Sub cif_KeyPress(KeyAscii As Integer)
valorfinalcif = 0

con lo cual supongo que la variable valorfinalcif tomo el valor de 0, asi que empiezo a utilizarla......
en esta parte, si he pulsado el 9º caracter del cif (pensando que el primero lo toma como 0) lo que quiero hacer es compararlo con el calculo que hice del digito de control DC, entonces:

'si es el ultimo caracter, llamamos a la funcion para que nos diga que valor tendra el DC


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
If Me.cif.SelStart = 8 And KeyAscii > 31 Then
valorfinalcif = Val(Mid(cif, 9, 1))
"esto me coje el valor del ultimo digito pulsado"
MsgBox "valorfinalcif= " & valorfinalcif
"aqui la variable toma un valor nuevo, llamemosle ahora b"
 
    'Calculamos el digito control por medio de una función
      DC = CalculoDigitoControl(Left(Me.cif.Text, 8))
 
      MsgBox "se mostrara el DC= " & DC
     If DC = valorfinalcif Then MsgBox "todo correcto"
 
        If Not DC = valorfinalcif Then KeyAscii = 9: MsgBox "Ultimo caracter no valido, deveria ser " & DC: valorfinalcif = 0
    End If
      End Sub


la cosa es que funciona en parte, ya que si genero un error en el ultimo digito para que valorfinalcif no coincida con DC y me salte esa parte del codigo lo hace, pero valorfinal no coje de nuevo el valor 0 sino que sige con el anteriormente llamado como b
¿me explique?
como hago para que no guarde ese valor y empieze de nuevo con la comparacion del ultimo digito
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 Enrique Ramírez
Val: 37
Ha aumentado su posición en 2 puestos en Access (en relación al último mes)
Gráfica de Access

llamada a un valor en una funcion

Publicado por Enrique Ramírez (629 intervenciones) el 22/07/2013 18:45:47
Una observación:
Si Dim valorfinalcif As String lo lo mas viable es que lo inicializes como valorfinalcif = “”
si Dim valorfinalcif As Integer lo mas viable es que lo inicializes como valorfinalcif = 0


No entiendo a que te refieres con "aqui la variable toma un valor nuevo, llamemosle ahora b"

Prueba de esta forma
If Not DC = valorfinalcif Then KeyAscii = 9: MsgBox "Ultimo caracter no valido, deveria ser " & DC
valorfinalcif = 0
End If
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