Solo se me ocurre ponerte dos ejemplos del tema: Sub UpdateX() Dim dbs As Database Dim qdf As QueryDef Set dbs = CurrentDb ' Cambia el valor del campo ReportsTo a 5 de todos ' aquellos registros de empleados que actualmente ' tienen el valor 2 en ReportsTo. dbs.Execute "UPDATE Empleados " _ & "SET Cargo = peon " _ & "WHERE Cargo = administrador;" dbs.Close End Sub Function inventario() Dim db As Database Dim Q As QueryDef Set db = CurrentDb() Set Q = db.QueryDefs("Inventario") Q!ParamIdProducto = Forms!Pedidos![Subformulario Pedidos].Form![IdProducto] Q!ParamQtyShipped = Forms!Pedidos![Subformulario Pedidos].Form![Cantidad] Q.Execute Q.Close End Function NOTA: esta ultima función la uso para descontar productos del stock de existencias.
Varias dudas: Los tipos Database y QueryDef no me los reconoce. Y otra cosa mi pregunta se refería más a: Por ejemplo definir una consulta: SQL="SELECT * FROM STOCK" Y ejecutarla y asignar a una variable los resultados de esa consulta. Resultado <- ejecuta(SQL) Gracias
Los ejemplos descritos anteriormente son de la versión 7.0 y es posible que necesites marcar una Referencia a Microsoft DAO 2.5/3.5 Compatibility Library. Bien, como entre ejecutar y abrir una consulta no veo la diferencia, te paso otro ejemplo de código, se usa la tabla Productos aunque es válido para una consulta: Sub FindFirstX() 'se necesita la función EncontrarCualquiera Dim dbsNeptuno As Database Dim rstClientes As Recordset Dim strPaís As String Dim varMarcador As Variant Dim strMensaje As String Dim intComando As Integer Set dbsNeptuno = CurrentDb Set rstClientes = dbsNeptuno.OpenRecordset( _ "SELECT IdProducto, UnidadesEnExistencia, NivelNuevoPedido ,NombreProducto " & _ "FROM Productos ORDER BY NombreProducto", _ dbOpenSnapshot) Do While True ' Obtiene una entrada del usuario y construye la cadena de búsqueda. strPaís = Forms!Pedidos![Subformulario Pedidos].Form![NombreProducto] strPaís = "NombreProducto = '" & strPaís & "'" With rstClientes ' Llena el Recordset. .MoveLast ' Encuentra el primer registro que coincide ' Con la cadena de búsqueda. Sale del bucle si no existe ningún registro. .FindFirst strPaís If rstClientes!UnidadesEnExistencia >= rstClientes!NivelNuevoPedido Then 'Criterio para advertir stock bajo. Usar form Productos Exit Do End If Do While True ' Almacena el marcador de posición del registro actual. varMarcador = .Bookmark ' Obtiene la elección del usuario del método a utilizar. strMensaje = "Id: " & !IdProducto & _ vbCr & "Nivel de Unidades en almacén bajo: " & !UnidadesEnExistencia & _ vbCr & _ strPaís intComando = Val(Left(MsgBox(strMensaje), 1)) If intComando = 1 Then Exit Do 'es = 1 porque va a encontrar el 1º por la 'variable strPaís ' Utiliza el método Find seleccionado. Si ' falla Find, vuelve al último registro actual. If EncontrarCualquiera(intComando, rstClientes, _ strPaís) = False Then .Bookmark = varMarcador MsgBox "No hay coincidencias -volviendo al " & _ "registro actual." End If Loop End With Exit Do Loop rstClientes.Close End Sub Function EncontrarCualquiera(intChoice As Integer, _ rstTemp As Recordset, _ strEncontrar As String) As Boolean ' Utiliza el método Find basado en la entrada del usuario. ' Se deja el resto de Case aunque solo se utiliza el primero. Estoy seguro ' que si encontrara un rstTemp. Select Case intChoice Case 1 rstTemp.FindFirst strEncontrar Case 2 rstTemp.FindLast strEncontrar Case 3 rstTemp.FindNext strEncontrar Case 4 rstTemp.FindPrevious strEncontrar End Select ' Establece el valor devuleto basado en la propiedad NoMatch. EncontrarCualquiera = IIf(rstTemp.NoMatch, False, True) End Function