Visual Basic - Call y .Show

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil

Call y .Show

Publicado por Antonio Belando (11 intervenciones) el 14/07/2012 19:05:46
Hola a todos, buenas tardes.

Tengo una Form (Gestión de Materiales) en la que desde dos de los "..._LostFocus()" que hay en dicha Form y correspondientes a dos TextBox, llamo con Call en cada "Sub" a una función pública del Módulo.

Desde cada una de estas dos funciones públicas, si no encuentra un dato, se habre una Form diferente en cada caso (Gestión de IVA y Gestión de Proveedores).

El problema está que en la primera llamada que hago para verificar el porcentaje de IVA que he introducido en el TextBox, al no encontrar el dato que busca en la función pública, se activa la Form de Gestión del Iva, pero también la del siguiente TextBox, osea que se abre también la Form de Gestión de Proveedores. Es como si se activaran al mismo tiempo los dos TextBox y al no encontrar los datos se activan las Form de gestión del IVA y de Proveedores.

Os agreadecría vuestra ayuda al respecto.

Saludos cordiales.
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

Call y .Show

Publicado por Antonio Belando (11 intervenciones) el 14/07/2012 20:03:05
Os pongo el código de los dos _LostFocus y las corespondientes funciones a las que llaman:

1º _LostFocus y su función correspondiente:

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
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
Private Sub nIVA_LostFocus()
   On Local Error Resume Next
   nDecimales = 2
   Me.nIva = Formatea(Me.nIva, nDecimales)
 
   Set FormSiguiente = ComDirMat
   Set TBnCoste = nCoste
   Set TBnIVA = nIva
   Set TBnPtsUni = nPtsUni
 
   Call F_nIVA(nCoste, nIva, nPtsUni)
End Sub
 
...................
 
Public Function F_nIVA(nCoste, nIva, nPtsUni)
   On Error GoTo VerError
   'Cogemos los datos de una tabla creando un Recordset
   Set rsModulo = New ADODB.Recordset
   strSQL = "SELECT * FROM IVA WHERE IVA = '" & Val(TBnIVA) & "'"
   Set rsModulo = g_db.Execute(strSQL)
 
   'Comprobamos que exista
   If Not rsModulo.EOF Then
      TBnIVA = Format(rsModulo("IVA"), "#0.00")
      nPtsUni.Text = Format(nCoste * (1 + (nIva / 100)), "#,###,##0.0000")
   Else
      bOtraForm = True
      AltaIVA.Show
   End If
 
   'Obliga a cerrar el RecordSet caso de estar abierto
   If rsModulo.State Then rsModulo.Close
   Set rsModulo = Nothing
   Exit Function
 
VerError:
   MsgBox Err.Description
End Function
 
 
2ª _LostFocus y su función correspondiente:
 
Código:
Private Sub cCodPro_LostFocus()
   Set FormSiguiente = ComDirMat
   Set TBcCodPro = cCodPro
   Set TBcNomPro = cNomRazSoc
   Call F_cCodPro(ComDirMat)
End Sub
 
.............
 
Public Function F_cCodPro(ByVal nForm As Variant)
   On Error GoTo VerError
   'Cogemos los datos de una tabla creando un Recordset
   Set rsModulo = New ADODB.Recordset
   strSQL = "SELECT * FROM Proveedo WHERE Codigo = '" & TBcCodPro & "'"
   Set rsModulo = g_db.Execute(strSQL)
 
   'Comprobamos que exista
   If Not rsModulo.EOF Then
      TBcNomPro = rsModulo("NomRazSoc")
   Else
      bOtraForm = True
      AltaPro.Show
   End If
   'Obliga a cerrar el RecordSet caso de estar abierto
   If rsModulo.State Then rsModulo.Close
   Set rsModulo = Nothing
   Exit Function
 
VerError:
   MsgBox Err.Description
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

Call y .Show

Publicado por jcmg (518 intervenciones) el 15/07/2012 23:57:40
Hola Antonio
si pones exit Function despues de estas lineas que pasara

AltaIVA.Show
exit Funcion

AltaPro.Show
exit Funcion

pienso que en esta linea esta el problema porque de esta linea sigue lo contrario
intenta poniendole exit Funcion abajo o algo si

cerrar:
'Obliga a cerrar el RecordSet caso de estar abierto
If rsModulo.State Then
rsModulo.Close
Set rsModulo = Nothing
Exit Function

nPtsUni.Text = Format(nCoste * (1 + (nIva / 100)), "#,###,##0.0000")
exit Funcion
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

Call y .Show

Publicado por Antonio (11 intervenciones) el 19/07/2012 17:15:39
Gracias jcmg.

Lo que me dices no puedo hacerlo poque tiene que retornar para seguir con mas datos.

Lo he solucionado así:

En los dos TextBox correlativos que a continuación se reflejan, se hacen llamadas a dos Forms distintas si no encuentran los datos que buscan, para evitar que se abran las dos Forms simultanemente insertamos el siguiente código:

Option Explicit
Dim Flag As Boolean
….
Private Sub Form_Load()
Flag = False
…..

Private Sub nIVA_LostFocus()
If Flag = False Then
On Local Error Resume Next
nDecimales = 2
Me.nIva = Formatea(Me.nIva, nDecimales)

Set FormSiguiente = ConModMat
Set TBnCoste = nCoste
Set TBnIVA = nIva
Set TBnPtsUni = nPtsUni

Flag = True
Call F_nIVA(nCoste, nIva, nPtsUni)
Flag = False
End If
End Sub

Private Sub cCodPro_LostFocus()
If Flag = False Then
On Local Error Resume Next

Set FormSiguiente = ComDirMat
Set TBcCodPro = cCodPro
Set TBcNomPro = cNomRazSoc

Flag = True
Call F_cCodPro(ComDirMat)
Flag = False
End If
End Sub


Muy importante es que los formularios se carguen en modo VBMODAL para impedir que el código que se ha escrito no siga ejecutándose hasta que el formulario se cierre, de lo contrario sucederá lo mismo.
Por lo tanto, en las funciones que se llaman, se incluye:
….
AltaIVA.Show vbModal
….

….
AltaPro.Show vbModal
….


Saludos cordiales.
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