--------------------------------------------------
Mensaje enviado desde http://grupos.buscadoc.org
--------------------------------------------------
Fernando Arroyo
MS MVP - Excel
" pep " <p...@capdevila.com> escribió en el mensaje
news:b2bbn7$f90$1...@nazgul.local...
Bade Datos: gestion.dbf
ruta: C:\programas\gestion.dbf
tabla: ARTICULO
campo con código: IdArticulo (Tipo:texto;tamaño:13)
campo descripción: DetalleArt (Tipo:texto;tamaño:35)
Me imagino que puede serle útil a mucha gente.
"Fernando Arroyo" <ferarr...@ESTOwanadoo.es> escribió en el mensaje
news:e6MCf$f0CHA.1768@TK2MSFTNGP12...
--- Código de Modulo
Dim Cnn as ADODB.Connection
Dim rs as ADODB.Recordset
Public Sub CloseDB()
Cnn.Close
Set Cnn = Nothing
End Sub
Public Sub OpenDB()
Set Cnn = New ADODB.Connection
Cnn.CursorLocation = adUseServer
Cnn.Open "Provider=Microsoft.Jet.OLEDB.3.51;" & _
"Data Source=C:\programas\gestion.mdb;" & _
"User Id=admin;" & _
"Password="
End Sub
Public Function BuscaProducto (IdProducto As String) As String
BuscaProducto = "Not Found"
Call OpenDB 'Abre la conexion
Set rs = New ADODB.Recordset
rs.CursorType = adOpenKeyset
rs.LockType = adLockOptimistic
rs.Open "Select * from Articulo where IdArticulo='" & IdProducto & "'",
Cnn
If rs.RecordCount > 0 Then
BuscaMilla = rs!DetalleArt
End If
rs.Close
Set rs = Nothing
Call CloseDB
End Function
"Cheeky" <Big...@terra.es> escribió en el mensaje
news:eqzhOkg0CHA.2288@TK2MSFTNGP09...
En general, con MS Query se ahorra código, pero es más lento que ADO o DAO,
y además hay que crear la consulta en la hoja y a menudo es necesario crear
también un nombre de origen de datos (DSN) en el equipo. A mí me parece
interesante para aquellos que no quieren complicarse la vida con ADO/DAO,
pero mi primera elección es ADO (aunque, sinceramente, prefiero DAO; pero
como ya no lo actualizan, nos están obligando a cambiarnos a ADO o a
ADO.NET).
Si estás interesado en MS Query, hace pocos días se produjo un "hilo"
iniciado por Balterra en el que estuvimos discutiendo el código necesario
para actualizar una consulta. El asunto era "Consulta de una base de datos".
Respecto al código que pones en tu mensaje, me parece correcto pero me temo
que no vaya a servirle a Cheeky porque está hablando de DBFs.
Un saludo.
Fernando Arroyo
MS MVP - Excel
"Raul Padilla" <volad...@aerocontinente.com.pe> escribió en el mensaje
news:udGUtKh0CHA.2232@TK2MSFTNGP11...
> Hola amigos yo uso este codigo como una formula personalizada y me va bien
> (Access97). Fernando a ver si puedes enviarnos el código de como se haría
> con el MS Query.
> Gracias y saludos
> Raul Padilla
>
>
> --- Código de Modulo
[...]
No sé si en tu caso funcionará porque sospecho que estamos hablando de
tablas de FoxPro o quizás de dBase V ¿?, mientras que el código estaba
pensado para tablas de dBase IV. Dado que nunca he trabajado con dBase V ni
con FoxPro no puedo garantizar que vaya a funcionar (tal vez habría que
modificar el Driver).
El código es:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$A$1" Then Exit Sub
If Target.Cells.Count <> 1 Then Exit Sub
On Error GoTo ManejoErrores
Dim Cnxn As ADODB.Connection
Dim rstArtículos As ADODB.Recordset
Dim strCnxn As String
Dim strSQLArtículos As String
strCnxn = "Driver={Microsoft dBASE Driver (*.dbf)};" & _
"DriverID=277;" & _
"Dbq=c:\Programas\Gestion"
Set Cnxn = New ADODB.Connection
Cnxn.Open strCnxn
' Abrir C:\articulo.dbf
Set rstArtículos = New ADODB.Recordset
strSQLArtículos = "ARTICULO.DBF"
rstArtículos.Open strSQLArtículos, Cnxn, adOpenKeyset, _
adLockOptimistic, adCmdTable
'Buscar en el campo IDARTICULO el contenido de la celda C1
rstArtículos.Find "IDARTICULO='" & Target.Value & "'"
'Si encuentra el código, poner la descripción en A2
If Not rstArtículos.EOF Then
Application.EnableEvents = False
ActiveSheet.Range("A2").Value = rstArtículos!DETALLEART
Application.EnableEvents = True
End If
'Cerrar objetos
rstArtículos.Close
Cnxn.Close
'Liberar objetos
Set rstArtículos = Nothing
Set Cnxn = Nothing
Exit Sub
ManejoErrores:
If Not rstArtículos Is Nothing Then
If rstArtículos.State = adStateOpen Then rstArtículos.Close
End If
Set rstArtículos = Nothing
If Not Cnxn Is Nothing Then
If Cnxn.State = adStateOpen Then Cnxn.Close
End If
Set Cnxn = Nothing
If Err <> 0 Then
MsgBox Err.Source & "-->" & Err.Description, , "Error"
End If
End Sub
Deberás pegarlo en el módulo de la hoja (click derecho sobre su
etiqueta->Ver código). Para que funcione es necesario establecer una
referencia a la librería "Microsoft ActiveX Data Objects 2.X Library" desde
Herramientas->Referencias, estando en el editor de VBA. Lo de la X es porque
la versión puede cambiar dependiendo de la versión de Office y del sistema
operativo. Yo tengo la 2.7, pero tú deberás marcar la más moderna que
tengas.
Espero que te funcione, pero la verdad es que no estoy muy seguro de ello...
Un saludo.
Fernando Arroyo
MS MVP - Excel
"Cheeky" <Big...@terra.es> escribió en el mensaje
news:eqzhOkg0CHA.2288@TK2MSFTNGP09...
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$A$1" Then Exit Sub
If Target.Cells.Count <> 1 Then Exit Sub
Dim cnn1 As New ADODB.Connection
Dim rsProductos As New ADODB.Recordset
Dim strSentenciaSQL As String
'Crear una conexión a la base de datos.
cnn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Mis documentos\BasesdeDatos\Articulos.mdb;" & _
"User Id=admin;" & _
"Password="
'Establecer la propiedad Source del Recordset
strSentenciaSQL = "SELECT * FROM Tbl_Newartic WHERE " & _
"Id_Producto = '" & Target.Value & "';"
'Crear el recordset
rsProductos.Open Source:=strSentenciaSQL, _
ActiveConnection:=cnn1, _
CursorType:=adOpenKeyset, _
LockType:=adLockOptimistic
Application.EnableEvents = False
If rsProductos.RecordCount = 0 Then
ActiveSheet.Range("A2").Value = "Código de producto no encontrado."
Else
ActiveSheet.Range("A2").Value = rsProductos!Descripcion
End If
Application.EnableEvents = True
'Cerrar y liberar objetos
cnn1.Close
Set cnn1 = Nothing
Set rsProductos = Nothing
End Sub
Notas:
- Para que funcione tienes que tener establecida una referencia a la
librería "Microsoft ActiveX Data Object 2.X Library", donde la X significa
la versión más moderna que tengas. Puedes hacerlo desde
Herramientas->Referencias, estando en el editor de VBA.
- La versión del proveedor OLE DB (la línea
Provider=Microsoft.Jet.OLEDB.4.0;
en el código) puede variar. Si tienes Access 2000 debería ser ésta (la 4.0),
pero en Access 97 creo que era la 3.51
- Si el campo Id_Producto no fuera alfanumérico sino numérico, habría que
modificar la línea
strSentenciaSQL = "SELECT * FROM Tbl_Newartic WHERE " & _
"Id_Producto = '" & Target.Value & "';"
por
strSentenciaSQL = "SELECT * FROM Tbl_Newartic WHERE " & _
"Id_Producto = " & Target.Value & ";"
Un saludo.
Fernando Arroyo
MS MVP - Excel
"flixitus" <rober...@yahoo.es> escribió en el mensaje
news:b2cvpu$f8e$1...@nsnmpen2-gest.nuria.telefonica-data.net...
¿Puede obeder a que el Id_Producto sea numerico?
salu2
Sí, casi seguro que es debido a eso. Prueba cambiando la instrucción:
strSentenciaSQL = "SELECT * FROM Tbl_Newartic WHERE " & _
"Id_Producto = '" & Target.Value & "';"
por
strSentenciaSQL = "SELECT * FROM Tbl_Newartic WHERE " & _
"Id_Producto = " & Target.Value & ";"
Parecen iguales, pero no lo son. La primera lleva una comilla simple o
apóstrofo ' detrás del segundo signo igual y otra delante del punto y coma,
mientras que la segunda no las lleva.