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