{"id":2345,"date":"2021-01-06T20:58:44","date_gmt":"2021-01-06T19:58:44","guid":{"rendered":"https:\/\/www.sinetiqueta.com\/blog\/?p=2345"},"modified":"2021-01-06T20:58:44","modified_gmt":"2021-01-06T19:58:44","slug":"libreoffice-base-abrir-archivo-con-boton-programando-en-basic","status":"publish","type":"post","link":"https:\/\/www.sinetiqueta.com\/?p=2345","title":{"rendered":"LibreOffice BASE- Abrir Archivo con Bot\u00f3n (programando en BASIC)"},"content":{"rendered":"<p>En Febrero de 2018, publiqu\u00e9 un v\u00eddeo d\u00f3nde explicaba c\u00f3mo abrir un archivo desde un Bot\u00f3n con <a href=\"https:\/\/stfly.xyz\/5ZW8M\" target=\"_blank\" rel=\"noopener\">Visual Basic<\/a> (VBA) en Microsoft Access:<\/p>\n<p><iframe loading=\"lazy\" title=\"Access -  Abrir Archivos con Bot\u00f3n (C\u00f3digo)\" width=\"800\" height=\"600\" src=\"https:\/\/www.youtube.com\/embed\/RQNKP2hovXM?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen><\/iframe><\/p>\n<p>Esa funci\u00f3n, la he ido puliendo a\u00f1adiendo puntos de agregar el archivo, copiarlo, renombrarlo&#8230;<\/p>\n<p>Y gracias a ese v\u00eddeo, me plante\u00f3 un usuario el hacer lo mismo para LibreOffice, que aunque est\u00e1 tambi\u00e9n para Linux, en este ejemplo ser\u00e1 para un LibreOffice instalado en Windows.<\/p>\n<p>LibreOffice nos permite crear macros en <a href=\"https:\/\/stfly.xyz\/5ZW8P\" target=\"_blank\" rel=\"noopener\">BASIC<\/a>, sin conocer este lenguaje, la suerte es que VBA es un \u00abdialecto\u00bb de BASIC y la l\u00f3gica de las \u00f3rdenes puede ser bastante clara, no sabr\u00e9 programar, pero viendo ejemplos y buscando por foros se pueden conseguir muchas cosas.<\/p>\n<p>La opci\u00f3n de crear Macros en LibreOffice, es muy curiosa, puedes crear una Macro en la propia base de datos, o dentro del propio BASE (s\u00edmil de Access), para entrar en la edici\u00f3n de Macros podremos entrar cuando estemos en el formulario en modo Edici\u00f3n y en el men\u00fa superior en la siguiente ruta: Herramientas&gt;Macros&gt;Organizar Macros&gt;Basic, en este momento, seleccionamos nuestra Base datos y damos al bot\u00f3n de Nuevo y nos abrir\u00e1 el entorno de BASIC para programar nuestra nueva macro \u00abMacro1\u00bb, en este ejemplo, la macro se la he renombrado a Explorer.<\/p>\n<p>Damos por hecho, que ya tienes las tablas y el formulario creados, y \u00fanicamente hay que agregar un nuevo campo a la tabla llamado \u00abAdjuntos\u00bb, el campo en el formulario y la subcarpeta en la carpeta donde tendremos alojada la base de datos.<\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: dotted; border-color: #ff0000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 100%;\"><em>SPOILER: Si pruebas el c\u00f3digo sin ver el v\u00eddeo que est\u00e1 al final de este art\u00edculo, es posible que te salga el siguiente error:<\/em><\/p>\n<p><code>Error de Ejecuci\u00f3n de BASIC.<br \/>\nSe ha producido una excepci\u00f3n<br \/>\nTpye.com.sun.star.container.NoSuchElementException<\/code><br \/>\n<code>Message: .<\/code><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2365\" src=\"https:\/\/www.sinetiqueta.com\/blog\/wp-content\/uploads\/2021\/01\/Error2.png\" alt=\"\" width=\"347\" height=\"170\" srcset=\"https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2021\/01\/Error2.png 347w, https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2021\/01\/Error2-300x147.png 300w\" sizes=\"auto, (max-width: 347px) 100vw, 347px\" \/><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Aqu\u00ed el c\u00f3digo, las l\u00edneas que tengan el ap\u00f3strofe delante, son comentarios que no se ejecutan o l\u00edneas que he usado para pruebas pero que luego no hace falta que se ejecuten:<\/p>\n<table style=\"border-collapse: collapse; width: 100%;\">\n<tbody>\n<tr>\n<td style=\"width: 100%;\"><span style=\"color: #0000ff;\">Sub<\/span> <span style=\"color: #339966;\">Explorer <\/span><span style=\"color: #0000ff;\">(<\/span><span style=\"color: #339966;\">oEvent<\/span> <span style=\"color: #0000ff;\">as object)<\/span><\/p>\n<p><span style=\"color: #999999;\">&#8216;1ro Declaramos las variables<\/span><br \/>\n<span style=\"color: #999999;\">&#8216;RutaLink: En esta variable capturamos la ruta de nuestra base de datos en formato \u00abURL\u00bb,<\/span><br \/>\n<span style=\"color: #999999;\">&#8216;que luego la tendremos que cambiar a un formato entendible para Windows, y esa ruta <\/span><br \/>\n<span style=\"color: #999999;\">&#8216;modificada la guardaremos en RutaOS.<\/span><\/p>\n<p><span style=\"color: #0000ff;\">Dim<\/span> <span style=\"color: #339966;\">oRoutaLink<\/span> <span style=\"color: #0000ff;\">as String<\/span><br \/>\n<span style=\"color: #0000ff;\">Dim<\/span> <span style=\"color: #339966;\">oRutaOS<\/span> <span style=\"color: #0000ff;\">as String<\/span><\/p>\n<p><span style=\"color: #999999;\">&#8216;oFrom, oField y oTfield son variables para conseguir leer la casilla de Texto llamada Adjuntos,<\/span><br \/>\n<span style=\"color: #999999;\">&#8216;d\u00f3nde tenemos guardado el nombre del archivo, con su extensi\u00f3n, que queremos abrir,<\/span><br \/>\n<span style=\"color: #999999;\">&#8216;finalmente guardaremos esa \u00abdirecci\u00f3n\u00bb en oRutaFinal.<\/span><\/p>\n<p><span style=\"color: #0000ff;\">Dim<\/span> <span style=\"color: #339966;\">oForm<\/span> <span style=\"color: #0000ff;\">as Object<\/span><br \/>\n<span style=\"color: #0000ff;\">Dim<\/span> <span style=\"color: #339966;\">oBoton<\/span> <span style=\"color: #0000ff;\">as Object<\/span><br \/>\n<span style=\"color: #0000ff;\">Dim<\/span> <span style=\"color: #339966;\">oField<\/span> <span style=\"color: #0000ff;\">as Object<\/span><br \/>\n<span style=\"color: #0000ff;\">Dim<\/span> <span style=\"color: #339966;\">oRutaFinal<\/span> <span style=\"color: #0000ff;\">as String<\/span><\/p>\n<p>&#8216;A\u00f1adimos una librer\u00eda que nos har\u00e1 falta para conseguir la Ruta<\/p>\n<p><span style=\"color: #339966;\">GlobalScope.BasicLibraries.LoadLibrary( \u00abTools\u00bb )<\/span><\/p>\n<p><span style=\"color: #999999;\">&#8216;Conseguimos la Ruta de la Base Datos, de esta manera, nos da igual que est\u00e9 alojada en una carpeta local<\/span><br \/>\n<span style=\"color: #999999;\">&#8216;o en una unidad de red, ya que siempre nos guardar\u00e1 en la ruta que est\u00e9, eso s\u00ed, en esa ruta es d\u00f3nde <\/span><br \/>\n<span style=\"color: #999999;\">&#8216;tendremos creada nuestra subcarpeta llamada \u00abAdjuntos\u00bb<\/span><br \/>\n<span style=\"color: #339966;\">oRutaLink =<\/span> <span style=\"color: #0000ff;\">(<\/span><span style=\"color: #339966;\">DirectoryNameoutofPath<\/span><span style=\"color: #0000ff;\">(<\/span><span style=\"color: #339966;\">ThisComponent.Parent.getURL<\/span><span style=\"color: #0000ff;\">(),<\/span> <span style=\"color: #ff0000;\">\u00ab\/\u00bb<\/span><span style=\"color: #0000ff;\">) &amp;<\/span> <span style=\"color: #ff0000;\">\u00ab\/\u00bb<\/span><span style=\"color: #0000ff;\">)<\/span><\/p>\n<p>\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb&#8217;<br \/>\n<span style=\"color: #999999;\">&#8216;Este MSGBOX es s\u00f3lo informativo durante las primeras pruebas, cuando todo funcione podemos eliminarlo.<\/span><br \/>\n<span style=\"color: #008000;\">msgbox<\/span> <span style=\"color: #0000ff;\">(<span style=\"color: #339966;\">o<\/span><\/span><span style=\"color: #339966;\">RutaLink<\/span>,<span style=\"color: #ff0000;\">1<\/span>, <span style=\"color: #ff0000;\">\u00abNombre de la Ruta tipo LINK\u00bb<\/span><span style=\"color: #0000ff;\">)<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2350\" src=\"https:\/\/www.sinetiqueta.com\/blog\/wp-content\/uploads\/2021\/01\/RutaLink.png\" alt=\"\" width=\"235\" height=\"122\" \/><\/p>\n<p>\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb&#8217;<br \/>\n<span style=\"color: #999999;\">&#8216;La Ruta la pasmos a un formato entendible para Windows.<\/span><br \/>\n<span style=\"color: #339966;\">oRutaOS<\/span> = <span style=\"color: #339966;\">ConvertFromURL<\/span><span style=\"color: #0000ff;\">(<span style=\"color: #339966;\">o<\/span><\/span><span style=\"color: #339966;\">RutaLink<\/span><span style=\"color: #0000ff;\">)<\/span><\/p>\n<p>\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb&#8217;<br \/>\n<span style=\"color: #999999;\">&#8216;Este MSGBOX es s\u00f3lo informativo durante las primeras pruebas, cuando todo funcione podemos eliminarlo.<\/span><br \/>\n<span style=\"color: #999999;\"><span style=\"color: #008000;\">msgbox<\/span> <span style=\"color: #0000ff;\">(<span style=\"color: #339966;\">o<\/span><\/span><span style=\"color: #339966;\">RutaOS<\/span> ,<span style=\"color: #ff0000;\">1<\/span>, <span style=\"color: #ff0000;\">\u00abNombre de la Ruta tipo OS\u00bb<\/span><span style=\"color: #0000ff;\">)<\/span><\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2351\" src=\"https:\/\/www.sinetiqueta.com\/blog\/wp-content\/uploads\/2021\/01\/RutaOs.png\" alt=\"\" width=\"223\" height=\"122\" \/><\/p>\n<p>\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb\u00bb&#8217;<\/p>\n<p><span style=\"color: #999999;\">&#8216;Obtenemos que evento tiene el bot\u00f3n<\/span><br \/>\n<span style=\"color: #339966;\">oBoton<\/span> = <span style=\"color: #339966;\">oEvent.Source.Model<\/span><br \/>\n<span style=\"color: #999999;\">&#8216;Obtenemos en qu\u00e9 formulario est\u00e1 el bot\u00f3n<\/span><br \/>\n<span style=\"color: #339966;\">oForm<\/span> = <span style=\"color: #339966;\">oBoton.Parent<\/span><br \/>\n<span style=\"color: #999999;\">&#8216;Obtenemos el contenido campo de texto \u00abAdjuntos\u00bb que est\u00e1 en el formulario que hemos capturado antes.<\/span><br \/>\n<span style=\"color: #339966;\">oField<\/span> = <span style=\"color: #339966;\">oForm.getByName<\/span><span style=\"color: #0000ff;\">(<\/span><span style=\"color: #ff0000;\">\u00abAdjuntos\u00bb<\/span><span style=\"color: #0000ff;\">)<\/span><br \/>\n<span style=\"color: #999999;\">&#8216;Ruta final del archivo a abrir con el nombre de la carpeta donde est\u00e1 el archivo y el nombre de \u00e9ste.<\/span><br \/>\n<span style=\"color: #999999;\">&#8216;Tenemos la Ruta en formato Windows, a la subcarpeta \u00abAdjuntos\\\u00bb y con el texto que hay en el campo \u00abAdjuntos\u00bb<\/span><br \/>\n<span style=\"color: #339966;\">oRutaFinal<\/span>=<span style=\"color: #339966;\"> oRutaOS<\/span> &amp; <span style=\"color: #ff0000;\">\u00abAdjuntos\\\u00bb<\/span> &amp; <span style=\"color: #339966;\">oField.getCurrentValue<\/span><br \/>\n<span style=\"color: #999999;\">&#8216;Mostramos un mensaje de texto que informa qu\u00e9 archivo vamos a abrir, incluyendo la ruta completa.<\/span><br \/>\n<span style=\"color: #999999;\">&#8216;Con este mensaje, podemos aceptar o cancelar.<\/span><br \/>\n<span style=\"color: #999999;\">&#8216;Si aceptamos, se abrir\u00e1 el archivo, si cancelamos nos saldr\u00e1 otro mensaje indicando que hemos cancelado la acci\u00f3n de abrir.<\/span><br \/>\n<span style=\"color: #339966;\">Archivo<\/span> = <span style=\"color: #008000;\">msgbox<\/span> <span style=\"color: #0000ff;\">(<\/span>\u00ab<span style=\"color: #ff0000;\">Vamos a abrir el siguiente archivo\u00bb<\/span> + <span style=\"color: #339966;\">Chr<\/span><span style=\"color: #0000ff;\">(<\/span><span style=\"color: #ff0000;\">13<\/span><span style=\"color: #0000ff;\">)<\/span> + <span style=\"color: #339966;\">Chr<\/span><span style=\"color: #0000ff;\">(<\/span><span style=\"color: #ff0000;\">13<\/span><span style=\"color: #0000ff;\">)<\/span> &amp; <span style=\"color: #339966;\">oRutaFinal<\/span>,<span style=\"color: #339966;\">MB_YESNO<\/span>, <span style=\"color: #ff0000;\">\u00abINFORMACI\u00d3N\u00bb<\/span><span style=\"color: #0000ff;\">)<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2348\" src=\"https:\/\/www.sinetiqueta.com\/blog\/wp-content\/uploads\/2021\/01\/Aviso.png\" alt=\"\" width=\"292\" height=\"154\" \/><\/p>\n<p><span style=\"color: #0000ff;\">If<\/span> Archivo = IDYES <span style=\"color: #0000ff;\">then<\/span><br \/>\n<span style=\"color: #339966;\">Shell(<\/span><span style=\"color: #ff0000;\">\u00abexplorer\u00bb<\/span>,<span style=\"color: #ff0000;\">1<\/span>, <span style=\"color: #339966;\">oRutaFinal<\/span><span style=\"color: #0000ff;\">)<\/span><br \/>\n<span style=\"color: #0000ff;\">Else<\/span><br \/>\n<span style=\"color: #008000;\">msgbox<span style=\"color: #0000ff;\">(<\/span><\/span><span style=\"color: #ff0000;\">\u00abCANCELADA\u00bb<\/span>, <span style=\"color: #ff0000;\">0+64<\/span>, <span style=\"color: #ff0000;\">\u00abAcci\u00f3n\u00bb<\/span><span style=\"color: #0000ff;\">)<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2349\" src=\"https:\/\/www.sinetiqueta.com\/blog\/wp-content\/uploads\/2021\/01\/Cancelada.png\" alt=\"\" width=\"124\" height=\"138\" \/><br \/>\n<span style=\"color: #0000ff;\">End if<\/span><\/p>\n<p><span style=\"color: #0000ff;\">End sub<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>NOTA: Cuidado al \u00abcopiar \/ pegar\u00bb, si hay alg\u00fan espacio en blanco que no debe estar, va a dar fallo y, por supuesto, no se pueden pegar las im\u00e1genes.<\/p>\n<p>Si entrais a editar la macro, os saldr\u00e1 \u00e9ste mensaje de error en la l\u00ednea:<\/p>\n<table style=\"border-collapse: collapse; width: 100%;\">\n<tbody>\n<tr>\n<td style=\"width: 100%;\"><span style=\"color: #339966;\">RutaLink =<\/span> <span style=\"color: #0000ff;\">(<\/span><span style=\"color: #339966;\">DirectoryNameoutofPath<\/span><span style=\"color: #0000ff;\">(<\/span><span style=\"color: #339966;\">ThisComponent.Parent.getURL<\/span><span style=\"color: #0000ff;\">(),<\/span> <span style=\"color: #ff0000;\">\u00ab\/\u00bb<\/span><span style=\"color: #0000ff;\">) &amp;<\/span> <span style=\"color: #ff0000;\">\u00ab\/\u00bb<\/span><span style=\"color: #0000ff;\">)<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2353\" src=\"https:\/\/www.sinetiqueta.com\/blog\/wp-content\/uploads\/2021\/01\/Error.png\" alt=\"\" width=\"315\" height=\"138\" srcset=\"https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2021\/01\/Error.png 315w, https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2021\/01\/Error-300x131.png 300w\" sizes=\"auto, (max-width: 315px) 100vw, 315px\" \/><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>pero sin problemas, que al ejecutar, funciona.<\/p>\n<p>Cualquier duda, vais planteando, y no os olvid\u00e9is en pasar por el canal de Youtube, dar al \u00abme gusta\u00bb y suscribirse! a ver si para el 2021, llegamos a ser 1000 suscriptores!<\/p>\n<p><iframe loading=\"lazy\" title=\"Libreoffice - Macro para abrir archivos desde un bot\u00f3n (2021)\" width=\"800\" height=\"600\" src=\"https:\/\/www.youtube.com\/embed\/UR6OFaxi8NU?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En Febrero de 2018, publiqu\u00e9 un v\u00eddeo d\u00f3nde explicaba c\u00f3mo abrir un archivo desde un Bot\u00f3n con Visual Basic (VBA) en Microsoft Access: Esa funci\u00f3n, la he ido puliendo a\u00f1adiendo puntos de agregar el archivo, copiarlo, renombrarlo&#8230; Y gracias a&#8230; <a href=\"https:\/\/www.sinetiqueta.com\/?p=2345\" class=\"readmore\">Leer m\u00e1s<span class=\"screen-reader-text\">LibreOffice BASE- Abrir Archivo con Bot\u00f3n (programando en BASIC)<\/span><span class=\"fa fa-angle-double-right\" aria-hidden=\"true\"><\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":2355,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[384,385],"tags":[382,383,386],"class_list":["post-2345","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-basic","category-libreoffice-base","tag-abrir-archivo","tag-basic","tag-macro","content-layout-excerpt-thumb"],"jetpack_featured_media_url":"https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2021\/01\/libreofficebase_103108.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/posts\/2345","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2345"}],"version-history":[{"count":0,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/posts\/2345\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/media\/2355"}],"wp:attachment":[{"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2345"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2345"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2345"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}