Tengo una tabla con una imagen incrustada(OLE) coulmn.

Quiero ser capaz de insertar un nuevo registro a través de un formulario con una opción de exploración.

De todos modos, tengo un nombre de archivo, Y necesito convertirlo en un objeto ole e insertarlo en el formulario. ¿cómo puedo hacer que en VBA?

Para aclarar – he necesidad a su vez de un nombre de archivo, en un objeto ole con ese archivo, y de insertar en la tabla.

Gracias,
Fingerman.

EDICIÓN:

Aceptar, como se ha señalado por @HansUp tengo que explicar.
En mi formulario tengo un atado de objeto OLE que no está enlazado a un campo, pero a una función dbúsq. Puedo obtener el id correcto en un control a través de una consulta y un cuadro combinado – por lo que el controlador está obligado a:

=DLookUp("picture","articles","id=" & [articles])

nota de que los artículos no es una esfera sino un controlador, no sé si eso lo hace cualquier diferencias.

Cada vez que el controlador se cambia yo uso me.recalc para que el OLE dependiente puede actualizar su valor.

De todos modos, pensé que para hacer esto solo por VBA y un usuario introduciendo un archivo de dirección,sin necesidad de utilizar el controlador, pero algún tipo de suplemento o algo, pero las otras opciones serían bienvenidos.

Si no soy claro, ¡PREGUNTE! Voy a aclarar y arreglar yo mismo.

EDIT 2:

Entonces, ¿cómo es el nombre del archivo adquirido o
derivados? Se espera que el uso de la
ArticleID? Es la imagen siempre en un
ubicación esperada con expectativa de
nombre de archivo? ¿Qué es exactamente lo que usted desea
hacer si usted no utiliza el botón Examinar?
Estás buscando algo completamente
automatizados sobre la base de la carpeta y de archivo
nombre o estás buscando algo
como arrastrar y soltar?

el nombre del archivo es adquirida a través de una opción de exploración, tengo implented. por el bien de simplicty – digamos que el usuario tiene que introducir el nombre de archivo a un cuadro de texto.
ahora quiero que en un clic de un botón, puede insertar el nombre de archivo como un objeto ole incrustado – a mi base de datos. Yo no estoy buscando cualquier automatización ni arrastrar y soltar (Pero, Si drag & drop funciona, sería genial). La primera edición es de aproximadamente el controlador ole ya que alguien le preguntó. él pensaba que mi pregunta puede ser resuelta utilizando ese controlador – así que me dio detalles sobre cómo estoy desplaying la imagen. Yo no creo que tenga ninguna importancia, pero Si alguien puede usar eso, sería bien por mí. Estoy esperando para utilizar un articleID para la actualización – pero de nuevo, no veo cómo esto se relaciona con la pregunta.

Estoy empezando a pensar que esto no puede ser posible….. 🙁
Este es unfortunte desde el porblem es bastante stright-adelante. usted tiene un nombre de archivo, usted necesita embeeded como un objeto OLE en su base de datos.

  • ver editar… gracias – fingerman.
  • Supongo que tienes razón, pero el controlador está enlazado en el sentido de su nombre… eso es todo… Gracias por intentar
  • ¿Por qué sientes la necesidad de almacenar los archivos en las tablas de datos? Esto nunca funciona bien, y por lo general es más fácil y más eficiente y más confiable para almacenar los archivos en el sistema de archivos y sólo una ruta de acceso/nombre de archivo en la base de datos.
  • tienes toda la razón. pero al principio me puso esto por qué, porque me muevo alrededor de la base de datos mucho, no me importa acerca de la eficiencia, ya que es sólo un proyecto de la escuela. es tarde para cambiar el diseño de todos modos, fecha de vencimiento es en una semana.
  • Entonces, ¿cómo es el nombre del archivo adquirido o derivados? Se espera que el uso de la ArticleID? Es la imagen siempre en una ubicación esperada con expectativa de nombre de archivo? ¿Qué es exactamente lo que quieres hacer, si usted no utiliza el botón Examinar? Estás buscando algo totalmente automatizado basado en la carpeta y nombre de archivo o está buscando algo como arrastrar y soltar?
  • HK, consulte edición de…
  • no relacionados – ¿PARA detectar @HK1 ?
  • Simplemente no puedo entender cómo esperas para adquirir un archivo o un nombre de archivo sin un botón examinar. No es que no se puede hacer usando un poco de lógica, tales como tener una carpeta configurado para almacenar archivos y tener archivos con el nombre con el ID del registro correspondiente. Pero yo no creo que ningún sentido en cómo desea adquirir archivos sin un botón examinar.
  • Tengo un botón examinar – pero un usuario puede introducir manualmente un archivo de dirección así… ok, me dieron el nombre de archivo con la opción examinar / cuadro de texto/ Whateve – ahora, ¿cómo puedo insertar el archivo en mi base de datos

InformationsquelleAutor fingerman | 2011-06-13

1 Comentario

  1. 5

    Antes de la prestación de mis respuestas, voy a echar un vistazo rápido a reformular su pregunta y requisitos. Me suena como usted quiere ser capaz de cargar un archivo binario de objetos, en este caso, las imágenes, el uso de VBA, un campo Objeto OLE en su mesa, y un Marco de Objeto dependiente.

    Su mejor opción es dejar de intentar usar un marco de objeto dependiente porque tiene demasiadas limitaciones.

    Existen básicamente dos métodos recomendados para lo que estamos tratando de hacer.

    1) Almacenar sólo un enlace al archivo de imagen y, a continuación, utilizar un control de imagen (puede ser enlazado a su campo de imagen) para mostrar la imagen.

    2) guardar la imagen en un campo Objeto OLE con código para leer la imagen en forma de datos binarios. Cuando usted necesita para mostrar la imagen que voy a escribir a un archivo temporal y, a continuación, puede establecer la propiedad Picture en un Control de Imagen en la ruta de acceso completa y el nombre de archivo para el archivo de imagen temporal. Será hasta usted para gestionar el archivo de imagen como un archivo temporal. Usted podría utilizar Windows’ directorio temp, o simplemente puede escribir en el mismo nombre de archivo cada vez que usted necesita para mostrar una imagen.

    Ninguna de estas técnicas son demasiado difíciles. Hay un artículo muy bueno de aquí para ayudarle a comprender mejor de qué estoy hablando: http://www.jamiessoftware.tk/articles/handlingimages.html

    Aquí una función para leer en datos binarios (en este caso el archivo de imagen) y otra función para escribir datos binarios: http://www.ammara.com/access_image_faq/read_write_blob.html Esto funciona bien para escribir su imagen a un «temp» del archivo. Entonces todo lo que tienes que hacer es establecer la propiedad Picture en el control de la imagen a ser la ruta de acceso del archivo y el nombre de su archivo temporal.

    Usted también puede leer y escribir datos binarios mediante un objeto de Secuencia de ADO, junto con un Objeto RecordSet de ADO y ADO Objeto de Conexión. Usted tendrá que establecer una referencia en el Acceso a Microsoft ActiveX Data Objects 2.8 Biblioteca.

    Aquí un poco de código para agregar imágenes a la base de datos usando ADO:

    Private Function LoadPicIntoDatabase(sFilePathAndName As String) As Boolean
    On Error GoTo ErrHandler
    'Test to see if the file exists. Exit if it does not.
    If Dir(sFilePathAndName) = "" Then Exit Function
    LoadPicIntoDatabase = True
    'Create a connection object
    Dim cn As ADODB.Connection
    Set cn = CurrentProject.Connection
    'Create our other variables
    Dim rs As ADODB.Recordset
    Dim mstream As ADODB.Stream
    Set rs = New ADODB.Recordset
    'Configure our recordset variable and open only 1 record (if one exists)
    With rs
    .LockType = adLockOptimistic
    .CursorLocation = adUseClient
    .CursorType = adOpenDynamic
    .Open "SELECT TOP 1 * FROM tblArticles", cn
    End With
    'Open our Binary Stream object and load our file into it
    Set mstream = New ADODB.Stream
    mstream.Open
    mstream.Type = adTypeBinary
    mstream.LoadFromFile sFilePathAndName
    'add a new record and read our binary file into the OLE Field
    rs.AddNew
    rs.Fields("olepicturefield") = mstream.Read
    rs.Update
    'Edit: Removed some cleanup code I had inadvertently left here.
    Cleanup:
    On Error Resume Next
    rs.Close
    mstream.Close
    Set mstream = Nothing
    Set rs = Nothing
    Set cn = Nothing
    Exit Function
    ErrHandler:
    MsgBox "Error: " & Err.Number & " " & Err.Description
    LoadPicIntoDatabase = False
    Resume Cleanup
    End Function
    Private Sub Command0_Click()
    If IsNull(Me.txtFilePathAndName) = False Then
    If Dir(Me.txtFilePathAndName) <> "" Then
    If LoadPicIntoDatabase(Me.txtFilePathAndName) = True Then
    MsgBox Me.txtFilePathAndName & " was successfully loaded into the database."
    End If
    End If
    End If
    End Sub

    Edit1:

    Según su petición, aquí el código de búsqueda/cargar una imagen en un artículo. En aras de la coherencia, también he cambiado mi forma de tabla y de campo por encima de los nombres para reflejar mejor su proyecto y para que coincida con el código de abajo. He probado este código y funcionó correctamente para mí.

    Private Sub Command1_Click()
    If IsNull(Me.txtArticleID) = False Then
    If DCount("articleid", "tblArticles", "articleid = " & Me.txtArticleID) = 1 Then
    Dim rs As DAO.Recordset, sSQL As String, sTempPicture As String
    sSQL = "SELECT * FROM tblArticles WHERE ArticleID = " & Me.txtArticleID
    Set rs = CurrentDb.OpenRecordset(sSQL)
    If Not (rs.EOF And rs.BOF) Then
    sTempPicture = "C:\MyTempPicture.jpg"
    Call BlobToFile(sTempPicture, rs("olepicturefield"))
    If Dir(sTempPicture) <> "" Then
    Me.imagecontrol1.Picture = sTempPicture
    End If
    End If
    rs.Close
    Set rs = Nothing
    Else
    MsgBox "Article Not Found"
    End If
    Else
    MsgBox "Please enter an article id"
    End If
    End Sub
    Private Function BlobToFile(strFile As String, ByRef Field As Object) As Long
    On Error GoTo BlobToFileError
    Dim nFileNum As Integer
    Dim abytData() As Byte
    BlobToFile = 0
    nFileNum = FreeFile
    Open strFile For Binary Access Write As nFileNum
    abytData = Field
    Put #nFileNum, , abytData
    BlobToFile = LOF(nFileNum)
    BlobToFileExit:
    If nFileNum > 0 Then Close nFileNum
    Exit Function
    BlobToFileError:
    MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical, _
    "Error writing file in BlobToFile"
    BlobToFile = 0
    Resume BlobToFileExit
    End Function        
    • su respuesta es impresionante. Todavía tengo que leer y probar todo – pero es claro, comprensible y simplemente genial. Es sólo a través de (si esa es la palabra correcta)…
    • WOW, esto es genial. Acepto tu respuesta, voy a tener más preguntas -, pero creo que puedo manejar en mi propio partir de este punto. Muchas gracias.
    • hola. Quiero darle las gracias de nuevo. sin embargo – como se esperaba, tengo un problema. Necesito escribir la nota a un archivo como dijo u, pero no tiene función en línea funcionado como se esperaba. Quiero ser capaz de hacer esto con una cláusula «where». yo.e where id=x…. Lo necesito en formas que no se relacionan directamente a la tabla donde guardo las fotos, pero la mayoría de las soluciones en línea utilice el campo disponible – que yo no tengo. así, onve de nuevo les pido su ayuda. gracias de antemano

Dejar respuesta

Please enter your comment!
Please enter your name here