Consulta sobre el resultado de otra consulta en formulario

Me encuentro creando un formulario para registrar muestras en un laboratorio.

El formulario debe de leer el código de barras de la muestra ("Me.Lote_Inspeccion"), a través de un script lee los datos del programa donde están almacenados y los carga en los controles ("Me.Nombre_Material", "Me.Lote" y "Me.IDH") del formulario.

Este formulario debe de crear y asociar a esa muestra un valor alfanumérico ("Me.Orden") el cual depende del tipo de muestra que sea. Este dato lo saca de la tabla "Matriz" la cual recoge todos los productos ordenados por su "IDH" y asociados a su "Tipo", de manera que me devuelve un autonumérico con reinicio anual al que añade un prefijo en función del "Tipo"

Dado que soy nuevo tanto en Access como en VBA, el código del autonumérico lo hice paso a paso en un formulario aparte donde directamente metía a mano el "IDH" y este me generaba el numero de "Orden" correctamente.

Sin embargo no tuve en cuenta que en el formulario final al que tiene que ir, no introduzco el "IDH" de forma manual, sino que lo lee de otro programa y lo coloca en el control. Y ahora el código no funciona. Estoy seguro que se trata de algún error de sintaxis en la función DLookUp, pero por más que busco no consigo encontrar como hacerlo correctamente.

Este es el código que me funciona en el formulario donde introduzco el IDH de forma manual:

Private Sub IDH_AfterUpdate()
Dim Ano As String
Dim LastNumeral As String
Dim NewNumeral As String
Dim Tipo As String
Dim Orden As String
Dim AnoCheck As String
Dim Reinicio As String 'No consigo que haga lo que quiero como numero, asi que lo incluyo como cadena
Reinicio = "00001" 'De esta forma mas adelante en lugar de leer un numero directamente viene a leer el valor definido aqui
Ano = DMax("Mid(Orden, 3, 2)", "Registro") 'Lee los digitos correspondientes al año del ultimo registro
AnoCheck = Mid(Year(Date), 3, 2) 'Lee los dos ultimos digitos del año actual
LastNumeral = DMax("Val(Mid(Orden, 3, 7))", "Registro") 'Lee la parte numeral completa del ultimo registro
If Ano = AnoCheck Then 'Si los digitos del año del ultimo registro son iguales a los digitos del año real...
NewNumeral = LastNumeral + 1 'Coge el ultimo valor numeral y le suma uno
Else 'De lo contrario
NewNumeral = [AnoCheck] & [Reinicio] 'El nuevo numeral se compone de los digitos del año real y el valor de reinicio (00001)
End If
Tipo = DLookup("Tipo", "Matriz", "IDH = '" & IDH & "'") 'Lee el prefijo de cada IDH
Orden = [Tipo] & [NewNumeral] 'Genera la orden añadiendo el prefijo al nuevo numeral
Me.Orden = Orden 'Nos da el valor en el campo de control del formulario
End Sub

Y este es el codigo que me lee los datos del otro programa cuando introduzco el "Lote_Inspeccion":

Private Sub Lote_inspeccion_AfterUpdate()
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 = Mid([Lote_inspeccion], 1, 12)
session.findById("wnd[0]").sendVKey 0
'Estos son los campos que rellena
Me.IDH = session.findById("wnd[0]/usr/subLOT_HEADER:SAPLQPL1:1102/ctxtQALS-MATNR").Text
On Error Resume Next
Me.Lote = session.findById("wnd[0]/usr/subLOT_HEADER:SAPLQPL1:1102/ctxtQALS-CHARG").Text
On Error Resume Next
Me.Nombre_material = session.findById("wnd[0]/usr/subLOT_HEADER:SAPLQPL1:1102/txtQALS-KTEXTMAT").Text
On Error Resume Next
Me.Fecha_Aviso = Now
On Error Resume Next
End Sub.

Si pego el código superior directamente bajo este, no funciona. Desconozco si debido a que no lee el IDH del control, si es que debo de escribir la función DLookUp de otra forma o si me estoy dejando alguna orden de por medio... Como ya he dicho, hace algo más de un mes ni siquiera había escuchado las letras VBA, y puede que esté cometiendo un error de base garrafal. Entiendo que el programa va ejecutando los comandos en orden y que por tanto el código para definir la "Orden" debe de ir después que me cargue los datos necesarios para generarla, pero igual tengo que plantearlo de otra forma...

1 respuesta

Respuesta
1

Primero, un par de cosas sobre tu segundo código:

1./ Con poner un On Error Resume Next es suficiente, ese control de errores se aplica hasta el final del procedieminto, salvo que le pongas otro distinto, que no es el caso.

2./ Con On Error Resume Next ignoras cualquier error que pueda ocurrir, lo que no siempre es lo más adecuado. Por ejemplo, si se produce algún error en la línea que te rellena el IDH no te enteras, y quizás por eso no te funciona el otro código al pegarlo a continuación... También si se produce algún error en esas "nuevas" líneas, te lo ignora y no te enteras de que "algo pasa".

Sobre el primer código: si dices que te funciona cuando el IDH lo escribes a mano, entiendo que el DLookup lo tienes bien hecho.

Por último, comentarte que no necesitas pegar todo el primer código, basta con que pongas el nombre del procedimiento para que éste se ejecute, es decir, antes del End Sub del segundo código, pon: IDH_AfterUpdate

Insisto, quita ese control de errores y mira a ver qué falla y dónde, para saber por dónde debes empezar a buscar soluciones.

Un saludo


¡Gracias! Muchas gracias.

El segundo código está copiado tal cual de la base de datos original que crearon en otro laboratorio de mi empresa, que es lo que quieren adaptar al nuestro. Se que no es lo mas ortodoxo del mundo, pero estoy aprendiendo a trompicones y marchas forzadas.

Ahora ya he salido del trabajo que es donde la estoy haciendo, así que hasta el lunes no podré probar lo que comentas. Pero en cualquier caso, muchas gracias!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas