Ayuda - Imagenes en Bases de Datos
Hola, alguien podria ayudarme acerca de como hacer para agregar en una tabla donde ya tengo datos y registros de personas (mas de 1500) imagenes de los certificados de esas personas?
Estoy trabajando con Access y he leido ya algunas consultas de otros usuarios, pero no son muy claros en las explicaciones! Si alguien me puede ayudar, agradeceria muchisimo. Gracias.
Estoy trabajando con Access y he leido ya algunas consultas de otros usuarios, pero no son muy claros en las explicaciones! Si alguien me puede ayudar, agradeceria muchisimo. Gracias.
Respuesta de juanpabl0
1
1
juanpabl0, Microsoft Office
Pues se me ocurre una idea, te la comento a ver qué te parece:
Supongo que no quieres agregarlas de una por una :) y si no mal recuerdo, el único formato de imágenes que acepta Access en un campo de tipo "Objeto OLE" [es decir, los visualiza directamente] es *.BMP, pero igual puede soportar otros y visualizarlos en el "Visor de imágenes y fax de windows".
Vamos al punto, en realidad nunca lo he hecho pero supongo que se puede hacer, puedes crear una macro con una instrucción SQL en la que se involucre un ciclo [por ejemplo desde 1 hasta 1500 que serían todas tus imágenes], pero para poder hacer que funcione correctamente debes tener nombradas tus imágenes y los registros de las personas de forma secuencial, por ejemplo:
Tabla: Personas
IdPersona NombrePersona Imagen
1 Miguel
2 Ana
... ...
Carpeta de imágenes
Img001
Img002
...
Quedando la sentencia SQL algo así:
For i = 1 to 1500
UPDATE Personas SET Imagen = App.Path & "\Imágenes\Img00" & i & "
WHERE IdPersona = "& i
Next i
Te repito que esto es sólo una idea y nunca lo he llevado a la práctica, más al rato pruebo el código y te comento.
Supongo que no quieres agregarlas de una por una :) y si no mal recuerdo, el único formato de imágenes que acepta Access en un campo de tipo "Objeto OLE" [es decir, los visualiza directamente] es *.BMP, pero igual puede soportar otros y visualizarlos en el "Visor de imágenes y fax de windows".
Vamos al punto, en realidad nunca lo he hecho pero supongo que se puede hacer, puedes crear una macro con una instrucción SQL en la que se involucre un ciclo [por ejemplo desde 1 hasta 1500 que serían todas tus imágenes], pero para poder hacer que funcione correctamente debes tener nombradas tus imágenes y los registros de las personas de forma secuencial, por ejemplo:
Tabla: Personas
IdPersona NombrePersona Imagen
1 Miguel
2 Ana
... ...
Carpeta de imágenes
Img001
Img002
...
Quedando la sentencia SQL algo así:
For i = 1 to 1500
UPDATE Personas SET Imagen = App.Path & "\Imágenes\Img00" & i & "
WHERE IdPersona = "& i
Next i
Te repito que esto es sólo una idea y nunca lo he llevado a la práctica, más al rato pruebo el código y te comento.
Juan Pablo, gracias por tu respuesta. Te comento que aun no he podido lograr, porque me he dedicado a otras tareas. De todas maneras me parecio valida tu respuesta, aunque no la he puesto en prueba aun.
Te voy a comentar como esta el panorama por aqui.... porque tambien fui algo confuso a la hora de plantear el problema.
Tengo una lista de 1500 usuarios, muchos de los cuales tienen mas de una imagen asignada, algunos tienen hasta 4, otros no tienen nada. Bien, yo lo que queria que a la hora de navegar por los registros (ya cree una tabla usuarios, otra imagenes) me apunte con el ID de ese usuario a sus imagenes, en el caso que tenga. Y queria saber como salvar la ocasion en el caso que tengan mas de una imagen, para poder mostrarlas comodamente en el formulario, o si existe algun componente especial para el caso.
A las fotos ya las tengo renombradas con los numeros de identificacion de cada usuario (este trabajito me llevo mucho tiempo, pero pense que eso puede facilitar las cosas).
Bueno, si pueden ayudarme, muchas gracias. Y gracias Juan Pablo por tus aportes ;)
Te voy a comentar como esta el panorama por aqui.... porque tambien fui algo confuso a la hora de plantear el problema.
Tengo una lista de 1500 usuarios, muchos de los cuales tienen mas de una imagen asignada, algunos tienen hasta 4, otros no tienen nada. Bien, yo lo que queria que a la hora de navegar por los registros (ya cree una tabla usuarios, otra imagenes) me apunte con el ID de ese usuario a sus imagenes, en el caso que tenga. Y queria saber como salvar la ocasion en el caso que tengan mas de una imagen, para poder mostrarlas comodamente en el formulario, o si existe algun componente especial para el caso.
A las fotos ya las tengo renombradas con los numeros de identificacion de cada usuario (este trabajito me llevo mucho tiempo, pero pense que eso puede facilitar las cosas).
Bueno, si pueden ayudarme, muchas gracias. Y gracias Juan Pablo por tus aportes ;)
Creo que es una cosa totalmente distinta a la que planteaste la vez primera, pero aquí te va mi nueva idea:
Generar en tiempo de ejecución los controles <span style="font-weight: bold;">PictureBox </span>o <span style="font-weight: bold;">Image</span>... cómo?
Primero te sugiero que tengas un control "<span style="font-weight: bold;">base</span>", es decir, créalo en <span style="font-weight: bold;">tiempo de diseño</span> y le asignas <span style="font-weight: bold;">0</span> (cero) en su propiedad <span style="font-weight: bold;">Index</span>, enseguida podrías escribir el siguiente código:
<p style="font-weight: bold;">Dim <span style="font-weight: normal;">cnx </span>As New ADODB.Connection
Dim <span style="font-weight: normal;">Rst </span>As New Recordset
<p style="font-weight: bold;">Private Sub Form_Load()
Dim <span style="font-weight: normal;">BD </span>As String
<span style="font-weight: normal;">BD </span>= App.Path & "\bd.mdb"
cnx.Open "provider=microsoft.jet.oledb.4.0;data source=" & <span style="font-weight: normal;">BD</span>
End Sub
<span style="font-weight: bold;">Private Sub </span>RecuperarImg<span style="font-weight: bold;">()</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> Dim </span>RstPic <span style="font-weight: bold;">As New Recordset
Dim </span>i <span style="font-weight: bold;">As Integer
</span><span style="font-weight: bold;"> </span><br style="font-weight: bold;" /><span style="font-weight: bold;"> </span>RstPic<span style="font-weight: bold;">.Open "SELECT I</span>.Imagen<span style="font-weight: bold;"> FROM Clientes C, </span>Imagenes <span style="font-weight: bold;">I WHERE " & _</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> "C.</span>Id<span style="font-weight: bold;"> = I.</span>IdCliente<span style="font-weight: bold;"> AND I.</span>IdCliente <span style="font-weight: bold;">= " & </span>TxtIdCliente<span style="font-weight: bold;"> & "", cnx, _</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> adOpenStatic, adLockPessimistic</span><br style="font-weight: bold;" />
<span style="font-weight: bold;"> If </span>RstPic<span style="font-weight: bold;">.RecordCount Then</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> For </span>i <span style="font-weight: bold;">= 1 To </span>Picture1<span style="font-weight: bold;">.Count - 1</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> </span><span style="font-style: italic;">'cuenta todos los Picture generados _</span><br style="font-style: italic;" /><span style="font-style: italic;"> y elimina los generados en tiempo de _</span><br style="font-style: italic;" /><span style="font-style: italic;"> ejecución [si los hay]</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> Unload </span>Picture1<span style="font-weight: bold;">(</span>i<span style="font-weight: bold;">)</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> Next </span>i<br style="font-weight: bold;" /><span style="font-weight: bold;"> For </span>i<span style="font-weight: bold;"> = 1 To </span>RstPic<span style="font-weight: bold;">.RecordCount</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> </span><span style="font-style: italic;"> 'crea un nuevo Picture por cada registro _</span><br style="font-style: italic;" /><span style="font-style: italic;"> que encuentre [por ejemplo si la persona _</span><br style="font-style: italic;" /><span style="font-style: italic;"> tiene más de una foto asignada]</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> Load </span>Picture1<span style="font-weight: bold;">(</span>Picture1<span style="font-weight: bold;">.Count)</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> With </span>Picture1<span style="font-weight: bold;">(i)</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> </span><span style="font-style: italic;">'modificar el valor de la propiedad Left _</span><br style="font-style: italic;" /><span style="font-style: italic;"> [para que no aparezca encima del anterior] _</span><br style="font-style: italic;" /><span style="font-style: italic;"> y hacer visible el Picture [por default _</span><br style="font-style: italic;" /><span style="font-style: italic;"> está invisible]</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> .Left = </span>Picture1<span style="font-weight: bold;">(i - 1).Left + 700</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> .Visible = True</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> End With</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> Next </span>i<br style="font-weight: bold;" /><span style="font-weight: bold;"> End If</span><br style="font-weight: bold;" /><span style="font-weight: bold;">End Sub</span><br style="font-weight: bold;" />
Generar en tiempo de ejecución los controles <span style="font-weight: bold;">PictureBox </span>o <span style="font-weight: bold;">Image</span>... cómo?
Primero te sugiero que tengas un control "<span style="font-weight: bold;">base</span>", es decir, créalo en <span style="font-weight: bold;">tiempo de diseño</span> y le asignas <span style="font-weight: bold;">0</span> (cero) en su propiedad <span style="font-weight: bold;">Index</span>, enseguida podrías escribir el siguiente código:
<p style="font-weight: bold;">Dim <span style="font-weight: normal;">cnx </span>As New ADODB.Connection
Dim <span style="font-weight: normal;">Rst </span>As New Recordset
<p style="font-weight: bold;">Private Sub Form_Load()
Dim <span style="font-weight: normal;">BD </span>As String
<span style="font-weight: normal;">BD </span>= App.Path & "\bd.mdb"
cnx.Open "provider=microsoft.jet.oledb.4.0;data source=" & <span style="font-weight: normal;">BD</span>
End Sub
<span style="font-weight: bold;">Private Sub </span>RecuperarImg<span style="font-weight: bold;">()</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> Dim </span>RstPic <span style="font-weight: bold;">As New Recordset
Dim </span>i <span style="font-weight: bold;">As Integer
</span><span style="font-weight: bold;"> </span><br style="font-weight: bold;" /><span style="font-weight: bold;"> </span>RstPic<span style="font-weight: bold;">.Open "SELECT I</span>.Imagen<span style="font-weight: bold;"> FROM Clientes C, </span>Imagenes <span style="font-weight: bold;">I WHERE " & _</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> "C.</span>Id<span style="font-weight: bold;"> = I.</span>IdCliente<span style="font-weight: bold;"> AND I.</span>IdCliente <span style="font-weight: bold;">= " & </span>TxtIdCliente<span style="font-weight: bold;"> & "", cnx, _</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> adOpenStatic, adLockPessimistic</span><br style="font-weight: bold;" />
<span style="font-weight: bold;"> If </span>RstPic<span style="font-weight: bold;">.RecordCount Then</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> For </span>i <span style="font-weight: bold;">= 1 To </span>Picture1<span style="font-weight: bold;">.Count - 1</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> </span><span style="font-style: italic;">'cuenta todos los Picture generados _</span><br style="font-style: italic;" /><span style="font-style: italic;"> y elimina los generados en tiempo de _</span><br style="font-style: italic;" /><span style="font-style: italic;"> ejecución [si los hay]</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> Unload </span>Picture1<span style="font-weight: bold;">(</span>i<span style="font-weight: bold;">)</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> Next </span>i<br style="font-weight: bold;" /><span style="font-weight: bold;"> For </span>i<span style="font-weight: bold;"> = 1 To </span>RstPic<span style="font-weight: bold;">.RecordCount</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> </span><span style="font-style: italic;"> 'crea un nuevo Picture por cada registro _</span><br style="font-style: italic;" /><span style="font-style: italic;"> que encuentre [por ejemplo si la persona _</span><br style="font-style: italic;" /><span style="font-style: italic;"> tiene más de una foto asignada]</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> Load </span>Picture1<span style="font-weight: bold;">(</span>Picture1<span style="font-weight: bold;">.Count)</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> With </span>Picture1<span style="font-weight: bold;">(i)</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> </span><span style="font-style: italic;">'modificar el valor de la propiedad Left _</span><br style="font-style: italic;" /><span style="font-style: italic;"> [para que no aparezca encima del anterior] _</span><br style="font-style: italic;" /><span style="font-style: italic;"> y hacer visible el Picture [por default _</span><br style="font-style: italic;" /><span style="font-style: italic;"> está invisible]</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> .Left = </span>Picture1<span style="font-weight: bold;">(i - 1).Left + 700</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> .Visible = True</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> End With</span><br style="font-weight: bold;" /><span style="font-weight: bold;"> Next </span>i<br style="font-weight: bold;" /><span style="font-weight: bold;"> End If</span><br style="font-weight: bold;" /><span style="font-weight: bold;">End Sub</span><br style="font-weight: bold;" />
- Compartir respuesta
- Anónimo
ahora mismo