Calcular varios valores en una función y llamar a algunos de ellos desde formulario

En mi base de datos tengo varios formularios que recopilan información de otro programa externo, siempre de la misma manera.
El proceso es idéntico independientemente del formulario en el que se haga, simplemente en función del formulario solo necesito usar una parte de esos datos que recoge.

Hasta ahora escribía una Sub en cada formulario donde me recogía unicamente los datos necesarios en el mismo, pero por reducir código repetido me pregunto si es posible crear una función en un modulo que me recoja todos los datos posibles que puedo necesitar.

La idea seria llamar a la función desde el formulario, la cual me copiaría todos los datos del programa externo y después copiar tan solo los valores que necesite en el formulario

La función seria algo así

Function Nueva_Muestra(CodigoBarras)
        Set SapGuiAuto = GetObject("SAPGUI")  'Get the SAP GUI Scripting object
        Set SAPApp = SapGuiAuto.GetScriptingEngine 'Get the currently running SAP GUI
        Set SAPCon = SAPApp.Children(0) 'Get the first system that is currently connected
        Set session = SAPCon.Children(0) 'Get the first session (window) on that connection
        session.StartTransaction "QA03" 'Esta es la transacción que utiliza para sacar los datos. Quedará siempre una ventana abierta con ella.
        session.findById("wnd[0]/usr/ctxtQALS-PRUEFLOS").Text = CodigoBarras
        session.findById("wnd[0]").sendVKey 0
        'Estos son los datos que copiamos
        fnIDH = session.findById("wnd[0]/usr/subLOT_HEADER:SAPLQPL1:1102/ctxtQALS-MATNR").Text
        fnLote_Inspeccion = session.findById("wnd[0]/usr/subLOT_HEADER:SAPLQPL1:1102/ctxtQALS-PRUEFLOS").Text
        fnLote = session.findById("wnd[0]/usr/subLOT_HEADER:SAPLQPL1:1102/ctxtQALS-CHARG").Text
        fnNombre_Material = session.findById("wnd[0]/usr/subLOT_HEADER:SAPLQPL1:1102/txtQALS-KTEXTMAT").Text
        'fnCantidad = etc...
End Function

Y despues crear una Sub en el formulario del estilo a esto:

Private Sub Codigo_Barras_AfterUpdate()
vCodigoBarras = Nz(Me.Codigo_Barras, "")
If vCogidoBarras = "" Then Exit Sub
    Nueva_Muestra (vCodigoBarras)
Me.IDH = Nueva_Muestra.fnIDH
Me.Nombre_Material = Nueva_Muestra.fnNombre_Material
Me.Lote = Nueva_Muestra.fnLote
Me.Lote_Inspeccion = Nueva_Muestra.fnLote_Inspeccion
End Sub

De esta manera simplemente copio en los campos del formulario los valores que me interesan sin tener que copiar el codigo del script que paso por el programa externo cada vez.

De la forma en que presento el código en el formulario no funciona, pero desconozco si es porque no lo estoy escribiendo correctamente o si mi planteamiento es erróneo de base.

Cualquier ayuda es enormemente agradecida.

Respuesta
2

Miguel: De acuerdo a como yo lo veo, has declarar cada una de las Variables en cabecera del Módulo Estándar para luego llenarlas, que supongo están bi´en y te sube los valores correctos.

Para la Variables:

Public FnIDH As String

Public FnLote As String 'Les pongo String por lo que veo (Text). Otras pueden ser Integer o....

Luego en el Procedimiento del Formulario, simplemente capturas su valor>>

Me.IDH = FnIDH

Me. ' Así con las que intervengan en ese Formulario.

Lo que no sé ahora es la idoneidad de capturarlas en el AfterUpdate o un Botón aparte, porque en ese evento veo que es donde haces el proceso de subida. Eso ya lo afinas tú que sabes el proceso. Un saludo >> Jacinto

¡Gracias Jacinto!

Ha funcionado perfectamente.

Era mi primera vez utilizando módulos y no he tenido en cuenta declarar las variables.

Lo de capturarlas desde el AfterUpdate es porque yo le voy a alimentar un código de barras y el modulo se va a ir al programa externo y me va a sacar las mismas 20 variables siempre (en el código de ejemplo no las he puesto todas)

Sin embargo, en función del formulario que esté usando, de esas 20 solo voy a necesitar 15 en algunos, 18 en otros, las 20 en pocos y solo 4 o 5 en los menos usados.

De esta manera me ahorro picar todo el código y afinar los campos que me interesan formulario a formulario. Le pido que me saque todas las variables cada vez y después solo capturo las que me interesa en cada ocasión desde el formulario.

En cualquier caso, que me enrollo como una persiana, muchas gracias por tu pronta respuesta!

1 respuesta más de otro experto

Respuesta
1

Un rodeo en el que no había pensado es crear un formulario temporal que abriría de forma oculta desde la función donde se copiarían los valores de todas las variables.

De esa forma, el sub desde el formulario llama a la función, la cual abre el formulario oculto, copia allí las funciones y termina la función, entonces el sub desde el formulario copia los datos que me interesan en los campos que tengo en el propio formulario, y cierra el temporal antes de terminar la sub.

Tal que asi

Function Nueva_Muestra(CodigoBarras)
DoCmd.OpenForm "Temp", , , , , acHidden
        Set SapGuiAuto = GetObject("SAPGUI")  'Get the SAP GUI Scripting object
        Set SAPApp = SapGuiAuto.GetScriptingEngine 'Get the currently running SAP GUI
        Set SAPCon = SAPApp.Children(0) 'Get the first system that is currently connected
        Set session = SAPCon.Children(0) 'Get the first session (window) on that connection
        session.StartTransaction "QA03" 'Esta es la transacción que utiliza para sacar los datos. Quedará siempre una ventana abierta con ella.
        session.findById("wnd[0]/usr/ctxtQALS-PRUEFLOS").Text = CodigoBarras
        session.findById("wnd[0]").sendVKey 0
        'Estos son los datos que copiamos
        fnIDH = session.findById("wnd[0]/usr/subLOT_HEADER:SAPLQPL1:1102/ctxtQALS-MATNR").Text
            Forms("Temp")!IDH = fnIDH
        fnLote_Inspeccion = session.findById("wnd[0]/usr/subLOT_HEADER:SAPLQPL1:1102/ctxtQALS-PRUEFLOS").Text
            Forms("Temp")!Lote_Inspeccion = fnLote_Inspeccion
        fnLote = session.findById("wnd[0]/usr/subLOT_HEADER:SAPLQPL1:1102/ctxtQALS-CHARG").Text
            Forms("Temp")!Lote = fnLote
        fnNombre_Material = session.findById("wnd[0]/usr/subLOT_HEADER:SAPLQPL1:1102/txtQALS-KTEXTMAT").Text
            Forms("Temp")!Nombre_Material = fnNombre_Material
        'fnCantidad = etc...
End Function
Private Sub CodigoBarras_AfterUpdate()
vCodigoBarras = Nz(Me.CodigoBarras, "")
    If vCodigoBarras = "" Then Exit Sub
NewIDM.Nueva_Muestra (vCodigoBarras)
    Me.IDH = Forms("Temp")!IDH.Value
    Me.Nombre_Material = Forms("Temp")!Nombre_Material.Value
    Me.Lote = Forms("Temp")!Lote.Value
    Me.Lote_Inspeccion = Forms("Temp")!Lote_Inspeccion.Value
DoCmd.Close acForm, "Temp"
End Sub

Si bien esto me soluciona el problema por ahora, en pos de mejorar mi conocimiento sobre ello, me pregunto si hay alguna forma mas elegante de copiar las variables calculadas en la funcion sin necesidad de este paso intermedio de crear el formulario temporal.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas