Mostrando entradas con la etiqueta SQL Server. Mostrar todas las entradas
Mostrando entradas con la etiqueta SQL Server. Mostrar todas las entradas

Modificar registro con imagen en una base de datos de SQL Server



En esta entrega aprenderás a actualizar o editar una imagen o cualquier tipo de fichero almacenado en una base de datos de SQL Server.

En una publicación anterior, ya hemos aprendido cómo guardar y recuperar ficheros. Sin embargo, hacía falta esa característica muy importante, que es la de poder modificar o actualizar de un fichero existente en un registro determinado.

Ya contamos con las funcionalidades de Guardar y Recuperar... y esta vez, comparto con un ustedes, el procedimiento almacenado que nos permitirá hacer un UPDATE a un registro en la tabla correspondiente.

Te invito a que veas el vídeo en donde te explico paso a paso la implementación antes mencionada.




Descarga el proyecto base desde AQUÍ






Save and Retrieve Files from SQL Server using Excel VBA


Guardar y Recuperar Ficheros desde SQL Server usando Excel VBA























Cuando trabajamos en bases de datos, y dependiendo de la información que manejemos, así tendremos la necesidad de agregarle algún tipo de archivo que le dé una mayor descripción al registro almacenado.
Como por ejemplo si llevamos un control de inventarios, será muy útil tener la fotografía de cada uno de los productos. O si manejamos los datos del personal de la empresa, pues obviamente necesitaremos consultar la fotografía de cada empleado y así conocerlos a cada uno de ellos, no solo como un nombre en la base de datos, sino, poniendo un rostro a dicho nombre.

Pues bien… esta vez he creado una rutina que nos permite almacenar archivos en una tabla… pero no como documento adjunto… sino, como un archivo convertido en formato binario, lo cual nos da la flexibilidad de recuperar esa información, ya sea, en una red local, o desde una red remota.

Es un sencillo UserForm que consta de dos botones, con las rutinas necesarias para lograr nuestro objetivo.
















En el siguiente enlace encontrarás la primera transmisión que realicé en vivo y ahí vimos el funcionamiento de este proyecto, dando recomendaciones específicas de lo que debemos hacer, cuando tendremos que guardar ficheros en un servidor remoto de Microsoft Azure


emitido el 21 de Junio de 2017

En dicha transmisión vimos lo fácil que es recuperar ficheros desde un servidor remoto de Azure, los cuales se encuentran en un campo del tipo varbinary





















El siguiente Query es el que utilicé para crear la base de datos y la tabla correspondiente, haciendo uso de un Procedimiento Almacenado para realizar la inserción de cada registro.
La importación masiva de datos binarios desde un servidor remoto, la hace posible la función OPENROWSET y la instrucción BULK INSERT. Checa el quiery, y puedes ver la forma en que hago la inserción de un fichero en particular.
Copia y pega todo el script en una nueva consulta de tu servidor SQL y ejecútala.

Haz pruebas insertando ficheros de forma local mediante el procedimiento almacenado, pasándole los argumento que te solicita y verás lo simple que es. 

Checa la transmisión en vivo que realizamos según el enlace que te he dejado más arriba, y podrás ver la forma de hacerlo hacia un servidor remoto de Azure.

create database inventario
GO

use inventario
GO

create table archivos
(
id_archivo int identity primary key,
tipo_archivo varchar(4) not null,
descripcion varchar(100) not null,
fichero varbinary(max)
)
GO

CREATE PROCEDURE SP_AlmacenarArchivo
@TipoArchivo varchar(4),
@Descripcion varchar(100),
@Fichero varchar(max)
as
exec ( 'insert into archivos values(''' + @TipoArchivo + ''','''+ @Descripcion +''', 
(SELECT * FROM OPENROWSET(BULK N''' + @Fichero + ''', SINGLE_BLOB) as x));' );
GO

--Con esta línea hago una prueba de inserción de un registro mediante el procedimiento almacenado
exec SP_AlmacenarArchivo 'PDF','LISTADO DE PRODUCTOS POR COMPRAR', 'C:\img\inventario.pdf'



En la siguiente entrega en YouTube, realicé otra transmisión en vivo, en donde les entregué a los asistentes en primicia, el proyecto de Excel completo, el cual contiene las rutinas que gestionan los datos mediante código de programación VBA

emitido el 26 de Junio de 2017

El siguiente es el código de programación contenido en el UserForm que te mostré al inicio de este Post.

Cada rutina está insertada en su respectivo botón del Formulario.


Option Explicit

Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
                            (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
                            ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Dim RutaFichero As String
Dim TipoArchivo As String

Private Sub btnGuardaFichero_Click()
Dim FdBox As FileDialog
Dim Selection As Boolean
Dim sDescription As String


On Error GoTo Salir

If Me.btnGuardaFichero.Caption = "Seleccionar fichero" Then
        Set FdBox = Application.FileDialog(msoFileDialogFilePicker)

        FdBox.Filters.Clear
        FdBox.Filters.Add "Imágenes jpg", "*.jpg"
        FdBox.Filters.Add "Imágenes png", "*.png"
        FdBox.Filters.Add "Imágenes pdf", "*.pdf"
        FdBox.Filters.Add "Libro de Excel xlsx", "*.xlsx"
        FdBox.Filters.Add "Libro de Excel habilitado para macros xlsm", "*.xlsm"

        FdBox.FilterIndex = 1
        
        FdBox.AllowMultiSelect = False
        
        
        Selection = FdBox.Show

                If Not Selection Then
                    Exit Sub
                End If

        RutaFichero = FdBox.SelectedItems(1)
        TipoArchivo = RutaFichero
        TipoArchivo = Mid(TipoArchivo, InStrRev(TipoArchivo, ".") + 1, 4)
 
        Me.btnGuardaFichero.Caption = "Guardar fichero"
        Me.btnRecuperarFichero.Caption = "Cancelar"
        Me.lbl_Msg.Visible = True
        Me.lbl_Msg.Caption = "Fichero seleccionado: " & RutaFichero
        
        Exit Sub
End If


If Me.btnGuardaFichero.Caption = "Guardar fichero" Then
    sDescription = InputBox("Escriba una descripción para el fichero:")
    
    If sDescription = Empty Then
        MsgBox "Debe escribir una descripción para del fichero"
        Exit Sub
    End If
  
    If MsgBox("Seguro que desea guardar este fichero en la base de datos", vbYesNo + vbQuestion) = vbYes Then
        
        Conn.Execute "exec SP_AlmacenarArchivo '" & TipoArchivo & "','" & sDescription & "','" & RutaFichero & "'"
        
        MsgBox "Fichero almacenado en la tabla Archivos"
        Me.btnGuardaFichero.Caption = "Seleccionar fichero"
        Me.btnRecuperarFichero.Caption = "Recuperar fichero"
        
        Me.lbl_Msg.Visible = False
        Else
            Me.btnGuardaFichero.Caption = "Seleccionar fichero"
            Me.btnRecuperarFichero.Caption = "Recuperar fichero"
            
            sDescription = Empty
            Me.lbl_Msg.Visible = False
            Exit Sub
    End If
End If


Salir:
    If Err <> 0 Then
        MsgBox Err.Description, vbCritical
    End If

End Sub

Private Sub btnRecuperarFichero_Click()
Dim sql As String
Dim idArchivo As String
Dim x As Long

On Error GoTo Salir

If Me.btnRecuperarFichero.Caption = "Cancelar" Then
    Me.btnGuardaFichero.Caption = "Seleccionar fichero"
    Me.lbl_Msg.Visible = False
    Me.btnRecuperarFichero.Caption = "Recuperar fichero"
    Exit Sub
End If


Set Rst = New ADODB.Recordset
Set stm = New ADODB.Stream

    idArchivo = InputBox("Escriba el ID del fichero a recuperar:")
    If idArchivo = Empty Then Exit Sub

sql = "SELECT * FROM archivos WHERE id_archivo=" & idArchivo

Rst.Open sql, Conn

stm.Type = adTypeBinary
stm.Open
stm.Write Rst("fichero").Value
TipoArchivo = Rst("tipo_archivo").Value

stm.SaveToFile "C:\Temp\Temp." & TipoArchivo, adSaveCreateOverWrite
    If TipoArchivo = "xlsx" Or TipoArchivo = "xlsm" Then
        Workbooks.Open Filename:="C:\Temp\Temp." & TipoArchivo
    Else
        x = ShellExecute(0, "Open", "C:\Temp\Temp." & TipoArchivo, vbNullString, vbNullString, 1)
    End If
    

Salir:
    If Err <> 0 Then
        MsgBox Err.Description, vbCritical
    End If

End Sub

Private Sub UserForm_Initialize()
    Me.lbl_Msg.Visible = False
    Me.btnGuardaFichero.Caption = "Seleccionar fichero"
End Sub

En la segunda parte de esta emisión te doy explicación de cada una de las líneas que involucran el guardar y recuperar ficheros desde SQL Server.

Ya para finalizar este breve sondeo, te dejo los enlaces de descarga del Query y el proyecto de Excel completo. Y te invito a ver el contenido en YouTube para que tengas una mejor percepción de cómo trabaja el cliente de conexión de Excel.


Enlaces de descarga:



Si esta publicación te gustó, compártela con tus amigos... y te invito a que te suscribas a youtube.excelymas.com en donde encontrarás contenido audivisual totalmente gratuito.

Nos vemos en la próxima entrega.

¡Saludos!








Excel + SQL Server + Azure | Azure SQL Database


Esta vez veremos una alternativa más de cómo podemos gestionar nuestros datos, y es creando una base de datos con Azure SQL Database.
Estas bases de datos no se gestionan dentro de una máquina virtual en particular, sino que son administradas directamente en el portal de Azure, y podremos acceder remotamente a ella desde nuestro proyecto cliente de Excel, mediante un servidor SQL que crearemos en el proceso.

Para este ejercicio, seguiremos utilizando los procedimientos almacenados que hemos visto en los capítulos anteriores, y además, he creado otros procedimientos almacenados que nos pueden servir de base para construir un sistema de facturación.

Aquí les dejo el query que contiene el Script completo que nos permitirá manejar los registros en el Servidor SQL de Azure.

create table productos
(
id_Cod int identity primary key,
cod_prod varchar(4) not null,
descripcion varchar(50)not null,
existencia int not null,
)
GO
insert into productos values('A001','MEMORIA USB 32GB',175);
insert into productos values('A002','DISCO DURO 2TB',15);
insert into productos values('A003','AIRE COMPRIMIDO',250);
insert into productos values('A004','ESPUMA LIMPIADORA',300);
insert into productos values('A005','FUNDA MONITOR',500);
insert into productos values('A006','FUNDA TECLADO',700);
insert into productos values('A007','SILLA ERGONÓMICA',11);
insert into productos values('A008','ALFOMBRILLA PARA SILLA',25);
insert into productos values('A009','LÁMPARA ESCRITORIO',7);
insert into productos values('A010','MONITOR LED 18 PULGADAS',45);
insert into productos values('A011','LIBRERO',20);
GO

CREATE PROCEDURE SP_RegistrarProducto
@CodProd varchar(4),
@Descripcion varchar(50),
@Existencia int
AS
begin
insert into productos  values(@CodProd, @Descripcion, @Existencia)
end
GO

CREATE PROCEDURE SP_ModificarProducto
@CodProd varchar(4), 
@Descripcion varchar(50), 
@Existencia int
AS
update productos  set cod_prod =@CodProd, descripcion=@Descripcion, existencia=@Existencia
where
cod_prod=@CodProd
GO

CREATE PROC SP_EliminarProducto
@CodProd as varchar(4)
AS
delete from productos WHERE cod_prod=@CodProd 
GO

CREATE PROC SP_RestarExistencia
@CodProd as varchar(4),
@Cantidad as int
AS
UPDATE productos SET existencia=existencia-@Cantidad 
WHERE cod_prod=@CodProd 
GO

CREATE PROC SP_SumarExistencia
@CodProd as varchar(4),
@Cantidad as int
AS
UPDATE productos SET existencia=existencia+@Cantidad 
WHERE cod_prod=@CodProd 
GO

CREATE PROCEDURE SP_MostrarDatos
AS
SELECT * FROM productos



Por otra parte, el proyecto de Excel que nos sirve de cliente de conexión, lo he modificado de tal forma que podamos realizar consultas SQL y recuperar los datos directamente en una hoja de cálculo.
El siguiente código hace posible llamar los datos al servidor, desde Excel...


Sub ConsultaSQL()
Dim Fila As Long
Dim i As Long
Dim sql As String

On Error GoTo ErrorHandler

Hoja1.Range("A:D").Clear

    sql = [miConsulta].Text
    
ErrorHandler:
    If Err < 0 Then
        MsgBox Err.Description, vbCritical
        Exit Sub
    End If

     If Err = 3704 Then
         sql = "select * from productos order by cod_prod"
     End If
 
    Set Rst = New ADODB.Recordset
    Rst.Source = sql
    Rst.ActiveConnection = Conn
    Rst.Open sql, Conn

    Fila = 0
        
    For i = 0 To Rst.Fields.Count - 1
        Hoja1.Cells(Fila + 1, i + 1).Value = Rst.Fields(i).Name
    Next i

    Fila = 1
    
    Do While Not Rst.EOF
        For i = 0 To Rst.Fields.Count - 1
            Hoja1.Cells(Fila + 1, i + 1).Value = Rst.Fields(i)
        Next i
        Fila = Fila + 1
        Rst.MoveNext
    Loop
   
End Sub

Te invito a ver el vídeo en YouTube y descubrirás lo simple que es hacer este tipo de implementaciones.


Ver vídeo

Descarga el Proyecto

Excel + SQL Server + Azure | Managing Data in SQL Server on Ubuntu Serve

Lista de Reproducción en YouTube

En este capítulo he modificado los proyectos de Excel que vimos anteriormente, agregándole un ListBox para dar seguimiento a los datos que enviemos al servidor Linux. Además, he estoy reciclando los botones de comando agregados al UserForm, dándole la funcionalidad de varios botones y de esa forma ahorrar espacio en el formulario.



Seguimos usando los Procedimientos Almacenados que vimos en los capítulos anteriores, y ahora con el ListBox, le doy un plus a este proyecto, lo cual nos permitirá ver los registros actualizados en tiempo real.


El siguiente código de programación es la rutina que permite hacer la consulta SQL hacia el servidor, lo cual nos devuelve los datos que se mostrarán en el ListBox.


Private Sub MostrarDatos()
Dim Fila As Integer
Dim SQL As String

ListBox1.Clear
    ' Consulta en SQL
    SQL = "select cod_prod, descripcion, existencia from productos order by cod_prod"
   
    Set Rst = New ADODB.Recordset
    Rst.Source = SQL
    Rst.ActiveConnection = Conn
    Rst.Open SQL, Conn

    Fila = 0

    Do While Not Rst.EOF
            ListBox1.AddItem Rst.Fields("cod_prod")
            ListBox1.List(Fila, 1) = Rst.Fields("descripcion")
            ListBox1.List(Fila, 2) = Rst.Fields("existencia")

        Fila = Fila + 1
        Rst.MoveNext
    Loop
End Sub

Te invito a ver el capítulo completo en YouTube y descubre lo simple que es obtener estos resultados.


Ver vídeo

Descarga el Proyecto

How to Install SQL Server on Ubuntu Server VM

Lista de Reproducción en YouTube.excelymas.com

En esta ocasión crearé un servidor Linux desde una imagen disponible en el Marketplace de Microsoft Azure.
Este ejercicio lo realizaré instalando un Ubuntu Server y al cual posteriormente le instalaré SQL Server para poder acceder desde un proyecto de Excel que servirá de cliente de conexión.









La instalación paso a paso del sistema operativo y SQL Server, la pueden ver en mi canal de YouTube en el siguiente enlace...


Ver vídeo en YouTube





Sin embargo en la instalación, opté por autenticarnos en el servidor, mediante una contraseña, y la forma recomendada y tener una mejor seguridad en nuestro servidor, es hacerlo mediante una clave pública SSH (Secure Shell)


Aquí les muestro paso a paso cómo generar claves públicas SSH y acceder de esa forma a nuestro servidor linux.


Paso 1

La conexión la realizaré desde Windows hacia Linux, y lo haré con el cliente de conexión llamado PuTTY, claro esto solo servirá para conectarnos, ya que antes debemos generar las claves públicas con las siguientes herramientas: git para Wndows y PuTTYgen para Windows

Esto es lo que necesitas descargar




Paso 2


una vez hayas instalado Git, procede a ejecutar Git Bash como administrador y escribe el siguiente comando: openssl.exe req -x509 -nodes -days 365 -newkey rsa:2048 -keyout myPrivateKey.key -out myCert.pem



Le das Enter y vas proporcionando los datos que te vaya solicitando.

Ejecuta el siguiente comando para convertir el Archivo myPrivate.Key en una clave privada RSA

openssl rsa -in ./myPrivateKey.key -out myPrivateKey_rsa





Paso 3


Ejecuta puttygen.exe y das click en File >  Load a Private Key







y busca la clave privada a la que denominamos anteriormente myPrivateKey_rsa





Lo abres y te aparecerá un mensaje parecido al siguiente...


Click en Ok y te aparecerá la ventana de la siguiente manera...




En esta ventana das click en el botón Save private key y posteriormente en Save public key



y te pedirá que guardes un archivo txt que contiene la clave pública que te solicitará Azure en el momento que estés creando tu máquina virtual.







Paso 4

Una vez hayas instalado la máquina virtual, puedes proceder a ingresar al servidor, ejecutando el cliente de conexión PuTTY.exe e ingresas la IP Públcia o el nombre DNS del servidor...





Luego haz clic en la pestaña Connection > SSH > Auth para elegir la clave privada, como se muestra en la siguiente imagen...





Le das click en Open, para conectar con la máquina virtual...



Te aparecerá la advertencia de seguridad, das click en sí, y ya estarás conectado con tu máquina virtual...



Partiendo de aquí, ya puedes instalar SQL Server, según los pasos que sigues en el video publicado en YouTube.

Pues esta es la forma de como poner seguridad a nuestro servidor Linux, mediante claves públicas SSH.

El proyecto de Excel que les mencioné al principio, lo veremos en la próxima entrega, en donde analizaremos su código de programación.

Si el contenido te gustó, compártelo con tus amigos en las diferentes redes sociales, y además te invito a que te suscribas a mi canal en Youtube.excelymas.com







Excel + SQL Server + Azure | Execute Stored Procedures from Excel VBA

Click en la imagen para ver la Lista de Reproducción en YouTube

En este capítulo veremos cómo ejecutar Procedimientos Almacenados desde Excel, mediante código de programación VBA.  Nuestra base de datos la tenemos alojada en una máquina virtual creada en Microsoft Azure, en la cual tenemos instalado SQL Server. Por lo que nuestro proyecto de Excel, viene siendo un cliente de conexión para gestionar los registros almacenados en la nube.

Estos son los Procedimientos Almacenados los cuales utilizaremos para gestionar los registros en la nube.


CREATE PROCEDURE SP_RegistrarProducto
@CodProd varchar(4),
@Descripcion varchar(50),
@Existencia int
AS
begin
insert into productos  values(@CodProd, @Descripcion, @Existencia)
end
GO

CREATE PROCEDURE SP_ModificarProducto
@CodProd varchar(4), 
@Descripcion varchar(50), 
@Existencia int
AS
update productos  set cod_prod =@CodProd, descripcion=@Descripcion, existencia=@Existencia
where
cod_prod=@CodProd
GO

CREATE PROC SP_EliminarProducto
@CodProd as varchar(4)
AS
delete from productos WHERE cod_prod=@CodProd 


Si no tienes conocimientos sobre SQL Server, te invito a ver el curso completo AQUÍ



E proyecto que he diseñado como cliente de conexión, cuenta con los siguientes UserForms...






Cada uno de estos formularios, disparan los Procedimientos Almacenados, arriba mencionados.
Cabe mencionar que dichos procedimientos se encuentran en SQL Server almacenados en Microsoft Azure. Desde estos formularios únicamente se hace la llamada para dispararlos.

Te invito a ver el capítulo completo, para que tengas una mejor comprensión de cómo trabaja este proyecto.



Ver vídeo

Descarga el Proyecto Base


Excel + SQL Server + Azure | Sending Data from Excel to SQL Server on Azure VM



En esta entrega veremos cómo conectar a la máquina virtual que creamos en Azure en el capítulo anterior.

He diseñado un UserForm, que nos permitirá realizar la conexión al servidor y hacer el registro de los datos con una sentencia SQL desde Excel, haciendo uso de código de programación VBA.

Aquí pueden ver la apariencia que tiene dicho formulario, y lo práctico que resulta conectar a una máquina virtual en la nube y gestionar la base de datos alojada en SQL Server.



Una vez conectemos al servidor, podremos enviar registros fácilmente al gestor de base de datos.

Observa lo sencillo que es crear un procedimiento para conectar a SQL Server.



Sub Conectar_SQLserver(servidor As String, usuario As String, pass As String, base As String)
On Error GoTo Salir
    
    Set Conn = New ADODB.Connection
                     
        Conn.ConnectionString = "Data Source=" & servidor & ";" & _
                                "Initial Catalog=" & base & ";" & _
                                "Persist Security Info=True;" & _
                                "User ID=" & usuario & ";" & _
                                "Password=" & pass & ";" & _
                                "provider=SqlOLEDB.1"
    

    Conn.Open
    
    MsgBox "Conexión establecida satisfactoriamente", vbInformation
    Conectado = True
    
Salir:
    If Err <> 0 Then
        MsgBox Err.Description, vbCritical
        Conectado = False
    End If
End Sub


Te invito a que veas el vídeo para que tengas la explicación completa...
Y si ya lo viste, y vienes desde el canal de YouTube, abajo encontrarás el proyecto para que lo puedas descargar y hacer las pruebas correspondientes.



Ver vídeo


Descarga el Proyecto

Excel + SQL Server + Azure

Desde hace algún tiempo quise realizar de alguna manera, integración de Excel con Microsoft Azure.  Yo sé que es un servicio de paga... pero, para que ustedes puedan realizar los ejemplos que veamos, pueden tomar una suscripción gratuita por un mes y así podrán ponerlos en práctica


Además, si no desean crear una cuenta con Azure, pues fácilmente podrán desarrollar todos los ejemplos mediante computadoras físicas de forma local o remota.

El tema que abordaré en mi canal de YouTube, es la forma de cómo podemos montar un Servidor Virtual creado en Microsoft Azure, y lo interesante, es que la imagen que vamos a instalar, ya tiene integrado SQL Server. 



Para los que han seguido el Curos de SQL Server en mi canal, creo que esto les será de muchísima utilidad, y para los que aún no saben lo básico de SQL Server, pues los invito a ver dicho curso dando click AQUÍ.



Los temas que abordaré serán:  La creación de una Máquina Virtual con SQL Server, crearé rutinas VBA para enviar registros a una base de datos en el Servidor en la nube y, además, aprenderemos a llamar los Procedimientos Almacenados de SQL Server, desde el entorno VBA en Excel, 

Desde Excel podremos ingresar nuestras credenciales como usuarios registrados en nuestra máquina virtual en la nube, y podremos gestionar los datos, guardando, editando y eliminando información, de la base de datos en la cual estemos dados de alta.

En conclusión, crearemos Libros de Excel, que serán clientes de conexión al servidor de forma simultánea.




Con Excel tenemos un abanico de posibilidades para gestionar nuestros datos.

Imagina a tu equipo de trabajo gestionando registros con un Libros de Excel (Cliente de Conexión) de forma simultánea. Y luego tomar esos datos y generar unos reportes increíbles con todas las herramientas de negocios que solo Excel nos puede ofrecer.

El día martes 2 de mayo inició esta serie... puedes ingresar AQUÍ a la lista de reproducción en desarrollo

Suscríbete a mi canal en youtube.excelymas.com es totalmente gratis.

Saludos cordiales


Otto Javier González
El Autor