sábado, 10 de octubre de 2015

¿Cómo cambiar la cadena de conexión en tablas vinculadas de MS Access?

Function displayLinks()
    Dim tdf As TableDef
    Dim db As Database
        Set db = CurrentDb
        For Each tdf In CurrentDb.TableDefs
            If tdf.Connect <> vbNullString Then
               Debug.Print tdf.Name; " -- "; tdf.SourceTableName; " -- "; tdf.Connect
            End If
        Next
End Function

Function cambiarLinks()
    Dim tdf As TableDef
    Set db = CurrentDb
        For Each tdf In CurrentDb.TableDefs
            If tdf.Connect <> vbNullString Then
                tdf.Connect = "ODBC;DSN=xx;APP=Microsoft Office 2010;DATABASE=xx;TABLE=" & tdf.Name
                tdf.RefreshLink
            End If
        Next
End Function

martes, 8 de septiembre de 2015

¿Cómo ocultar una columna en una vista de hoja de datos programaticamente en MS Access?

En el evento load, ocultamos el control:

Private Sub Form_Load()
    If Internal.opcionActiva("Fecha Pedido Auditoria") Then
        Me.Controls("FechaPedido").ColumnHidden = False
    Else
        Me.Controls("FechaPedido").ColumnHidden = True
    End If
    DoCmd.SetWarnings False
End Sub

Es muy importante desconectar los warnings y volverlos a conectar en el cierre para evitar la fastidiosa pregunta que les muestro en esta imagen:



Private Sub Form_Close()
    DoCmd.SetWarnings True
End Sub


viernes, 14 de agosto de 2015

¿Cómo obtener la desripción de una vista en SQL Server?

Ejemplo

use msdb
GO
select OBJECT_DEFINITION(OBJECT_id('sysmail_event_log')) 
AS [processing-instruction(x)] FOR XML PATH('')
GO

Resultado

<?x 
CREATE VIEW sysmail_event_log
AS
SELECT log_id,
       CASE event_type 
          WHEN 0 THEN 'success' 
          WHEN 1 THEN 'information' 
          WHEN 2 THEN 'warning' 
          ELSE 'error' 
       END as event_type,
       log_date,
       description,
       process_id,
       sl.mailitem_id,
       account_id,
       sl.last_mod_date,
       sl.last_mod_user
FROM [dbo].[sysmail_log]  sl
WHERE (ISNULL(IS_SRVROLEMEMBER(N'sysadmin'), 0) = 1) OR 
      (EXISTS ( SELECT mailitem_id FROM [dbo].[sysmail_allitems] ai WHERE sl.mailitem_id = ai.mailitem_id ))

?>

jueves, 16 de julio de 2015

Borrar una restricción DEFAULT si conocer el nombre - SQL SERVER

DECLARE @ObjectName NVARCHAR(100)
SELECT @ObjectName = OBJECT_NAME([default_object_id]) 
FROM SYS.COLUMNS
WHERE [object_id] = OBJECT_ID('[dbo].[Certificados]') AND [name] = 'Print_QR';
EXEC('ALTER TABLE [dbo].[Certificados] DROP CONSTRAINT ' + @ObjectName)
GO

miércoles, 8 de julio de 2015

Sencillo método para abrir un archivo desde un campo hipervínculo en MS ACCESS.

Sencillo método para abrir un archivo desde un campo hipervínculo en MS ACCESS.

Private Sub FileList_Click()
    On Error GoTo NoSePuedoAbrir
    Application.FollowHyperlink FileList.Value
    Exit Sub
NoSePuedoAbrir:
    MsgBox "No se puede abrir el archivo porque no existe una aplicación asociada a esa extensión."
    Exit Sub
End Sub

miércoles, 12 de noviembre de 2014

Detectar QR en documento PDF con C# para enviar a MS Access con SQL Server

Escenario
  • Existen documentos en formato PDF que tienen códigos QR
  • Necesitamos detectar el código QR en esos documentos
  • Mover los archivos PDF a otras carpetas
  • Actualizar datos en un SQL Server que luego será consultado vía MS Access


Enfoque de la solución

Crearemos un programa en .Net que efectúe dos tareas principales:
  • Convertir el PDF a PNG
  • Detectar el QR dentro del PNG
Para ello trabajamos con dos librerías

Ejemplo de Código

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ZXing;
using GhostscriptSharp;
using GhostscriptSharp.Settings;

namespace PRUEBA
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            button1.Enabled = false;

            // Obtener la imagen de la primera página del PDF

            GhostscriptWrapper.GenerateOutput("documento.pdf", "documento.png",
               new GhostscriptSettings
               {
                   Device = GhostscriptDevices.pngalpha,
                   Page = new GhostscriptPages
                   {
                       Start = 1,
                       End = 1,
                       AllPages = false
                   },
                   Resolution = new Size
                   {
                       Height = 72,
                       Width = 72
                   },
                   Size = new GhostscriptPageSize
                   {
                       Native = GhostscriptPageSizes.letter
                   }
               }
           );

            // Detectar el QR en el PDF

            IBarcodeReader reader = new BarcodeReader();
            var barcodeBitmap = (Bitmap)Bitmap.FromFile("documento.png");
            var result = reader.Decode(barcodeBitmap);
            if (result != null)
            {
                //label1.Text = result.BarcodeFormat.ToString();
                label1.Text = result.Text;
            }

            button1.Enabled = true;

        
        }
    }
}

Nota: si tienen problemas para capturar los códigos, pueden variar la resolución, por ejemplo:

 Resolution = new Size
                   {
                       Height = 300,
                       Width = 300
                   },


El resultado

Creamos un documento de ejemplo en PDF como este:


Ejecutamos la aplicación


Y obtenemos el resultado


En el camino, el programa debió  haber generado un "documento.png"


Links de interés