Enviar mail con Excel mediante Outlook con mensaje en el cuerpo del correo





Quienes trabajan con Excel en muchas ocasiones seguramente han requerido enviar un mail con un rango de datos de la hoja en la que se trabaja; el ejemplo que se muestra es una macro de Excel que envía mail mediante Outlook, con el mensaje en el cuerpo de mail en vez de enviarlo como archivo adjunto;  anteriormente se ha publicado como enviar un mail con Excel, como crear alertas y enviar mail; macro emite aviso y envía mail a varios destinatarios; pero todas estas macros hacían referencia a configurar directamente el servidor SMTP de Gmail, Yahoo o Hotmail; en este oportunidad voy a mostrar un ejemplo sobre como enviar mail con Excel mediante Outlook con mensaje en el cuerpo del mail.

Antes de seguir recomiendo leer un excelente libro sobre Excel que te ayudará operar las planillas u hojas de cálculo, haz click acá, si quieres aprender sobre Excel, en inglés, entonces debes hacer click here. Si lo que necesitas es aprender o profundizar sobre la programación de macros con VBA este es unos de los mejores cursos on line que he visto en internet.


  

El ejemplo que se presenta es uno de los últimos de la zaga de post relacionados con enviar mail con Excel, ya sea utilizando Gmail, Yahoo, Hotmail u Outlook y denominados, envió de mail utilizando Outlook y adjuntando una sola hojaenvió de mail mediante Outlook adjuntando todo el libro, envió mail con Outlook adjuntando archivo en PDF y envío de mail con Outlook adjuntando archivo en PDF y archivo de Excel.

Pasando al análisis de la codificación, el rango a enviar se determina en forma fija, en este caso el rango A2:B7, ese es el rango que se va a enviar en el cuerpo del mail, no obstante este rango puede ser variar y ponemos mediante macros determinar un rango variable, es decir que la macro sola detecte el rango usado que varía constantemente.

Posterior a ello viene todo el código que permite enviar el mail cuyo cuerpo del mensaje va a ser un rango seleccionado de la hoja, es decir no se va a enviar como archivo adjunto si no que va a formar parte del mensaje, aquí se debe tener presente que se debe configurar el mail del destinatario en el siguiente código:

  .To = "MailDestinatario@yahoo.es"


Sugiero descargar desde el link del final el archivo de ejemplo de este ejemplo denominado como enviar mail desde Excel mediante Outlook con rango seleccionado en el cuerpo del mensaje;  el código se encuentra abierto y sin ningún tipo de restricción, solicito colabores con el mantenimiento de la página; como así también que lo compartas en tus redes sociales y aportes para seguir agregando macros que son de utilidad para muchas personas.

El vídeo da más detalles acerca del funcionamiento de la macro que permite mandar mail con Excel utilizando Outlook  con mensaje en el cuerpo del mail en vez de archivo adjunto; no olvides compartir y suscribir al canal.

El vídeo que sigue muestra una explicación más detallada y gráfica de la macro presentada, recomiendo observar para una más fácil comprensión de la macro; suscribe a nuestra web desde la parte superior derecha de la página ingresando tu mail y a nuestro canal de You Tube para recibir en tu correo vídeos explicativos sobre macros interesantes, como  por ejemplo formulario que crea un listado de todas las hojas para poder luego seleccionarlasbuscar en listbox mientras escribes en textboxordenar hojas libro excel por su nombreconectar Excel con Access y muchos ejemplos más.






Código que se inserta en un userform




Sub EnviarMailCuerpoMensaje()
Dim a As Worksheet
Dim srang As Range
Dim name As String
On Error Resume Next
Application.ScreenUpdating = False
Application.EnableEvents = False
Set a = Worksheets("Ventas")
nom = a.name
Set srang = a.Range("A2:B7")
With srang
    .Parent.Select
    .Select
            ActiveWorkbook.EnvelopeVisible = True
            With .Parent.MailEnvelope
                 .Introduction = "Reportes de " & nom & " mensuales"
                    With .Item
                    .To = "MailDestinatario@yahoo.es"
                    .Subject = "Reportes de " & nom & " mensuales"
                    .Send
                    End With
            End With
End With
a.Select
ActiveWorkbook.EnvelopeVisible = False
Application.ScreenUpdating = False
Application.EnableEvents = False
End Sub


Si te fue de utilidad puedes INVITARME UN CAFÉ y de esta manera ayudar a seguir manteniendo la página, CLICK para descargar en ejemplo en forma gratuita.



If this post was helpful INVITE ME A COFFEE and so help keep up the page, CLICK to download free example.


Si te gustó por favor compártelo con tus amigos
If you liked please share it with your friends      

Integrar Excel con Access usar SQL para insertar datos





En en post anterior mostre como conectar Excel con Access agregando datos a la base mediante un recorset que agregaba los datos de Excel a una tabla de Access, en este post voy a mostrar como insertar datos en una tabla de Access desde Excel, pero usando una sentencia SQL; en conectar Excel con Access sentencias SQL usadas he presentado un tutorial con distintas sentencias SQL que se pueden usar en Access, si requieres más ejemplos tal vez consideres la posibilidad de adquirir mi libro sobre Conectar Excel con Access Principales sentencias SQL usadas en macros de  VBA.

Antes de seguir recomiendo leer un excelente libro sobre Excel que te ayudará operar las planillas u hojas de cálculo, haz click acá, si quieres aprender sobre Excel, en inglés, entonces debes hacer click here. Si lo que necesitas es aprender o profundizar sobre la programación de macros con VBA este es unos de los mejores cursos on line que he visto en internet.


  

El ejemplo de macro tiene como fin poder seleccionar la impresora que deseamos previo a la impresión, existen varios post relacionados con toda esta saga de artículos relacionados con macros para imprimir en Excel como son: imprimir una hoja del libro de Excelcomo configurar una hoja de Excel mediante macro, imprimir en una impresora distinta a la que se encuentra por defecto.

La macro de ejemplo permite imprimir la hojas del libro de Excel, previo a ello da la opción al operador de seleccionar la impresora en la que desea se imprima el trabajo, el ejemplo específicamente primero, solicita se elija la impresor donde se imprimirá el trabajo, luego configura la página para imprimir y por último emite la orden para imprimir.

Al seleccionar la impresora en el cuadro de diálogo se modifica la impresora activa, es por ello que para dejar todo en el orden que estaba, se carga en una variable el nombre de la impresora activa, luego con el siguiente comando se presenta el cuadro de diálogo para elegir la impresora:
Application.Dialogs(xlDialogPrinterSetup).Show

Seleccionada la impresora se procede a configurar página con los margenes necesarios, pie de página, encabezado de página, disposición u orientación de la página, etc.; posterior se imprime la hoja del libro activo con el siguiente código, solicitando en los argumentos se impriman dos hojas, se intercale y no se ignore área de impresión.

ActiveSheet.PrintOut Copies:=2, Collate:=True, IgnorePrintAreas:=False

Por último con este código volvemos a seleccionar la impresora activa que estaba originalmente:
Application.ActivePrinter = def

Desde el link final podrás descargar el ejemplo totalmente GRATUITO denominado Macro selecciona impresora mediante cuadro de diálogo, recordando que si este o alguno de los cientos de ejemplos publicados te fueron de utilidad y puedes, aporta a seguir manteniendo esta página.

El vídeo que sigue muestra una explicación más detallada y gráfica de la macro presentada, recomiendo observar para una más fácil comprensión de la macro; suscribe a nuestra web desde la parte superior derecha de la página ingresando tu mail y a nuestro canal de You Tube para recibir en tu correo vídeos explicativos sobre macros interesantes, como  por ejemplo formulario que crea un listado de todas las hojas para poder luego seleccionarlasbuscar en listbox mientras escribes en textboxordenar hojas libro excel por su nombreconectar Excel con Access y muchos ejemplos más.





Código que se inserta en un módulo




Sub InsertaDatos()
Dim fila As Long, uf As Long, conta As Long
Dim cn As ADODB.Connection, Rs As ADODB.Recordset
On Error Resume Next
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set a = ActiveSheet
Set cn = New ADODB.Connection

cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; " & "data source=" & ThisWorkbook.Path & "\172 Conectar con Access Ingresar Datos con SQL.accdb;"
fila = 2
conta = 0
While a.Cells(fila, "A") <> Empty
SQL = "INSERT INTO Clientes (ID, Nombre, Telefono, Direccion, Mail, Credito) VALUES ('" & a.Cells(fila, 1) & "','" & a.Cells(fila, 2) & "','" & a.Cells(fila, 3) & "','" & _
      a.Cells(fila, 4) & "','" & a.Cells(fila, 5) & "','" & a.Cells(fila, 6) & "')"
cn.Execute SQL
fila = fila + 1
conta = conta + 1
Wend
cn.Close
Set cn = Nothing
MsgBox ("Se procesaron " & conta & " registros con éxito, se omitieron duplicados"), vbInformation, "AVISO"
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub


Si te fue de utilidad puedes INVITARME UN CAFÉ y de esta manera ayudar a seguir manteniendo la página, CLICK para descargar en ejemplo en forma gratuita.


If this post was helpful INVITE ME A COFFEE and so help keep up the page, CLICK to download free example.


Si te gustó por favor compártelo con tus amigos
If you liked please share it with your friends      

Excel y SQL insertar modificar y eliminar registros






En esta última entrega de sentencias SQL que se pueden usar en macros de VBA, voy a exponer sobre como insertar o agregar datos, modificar y eliminar datos, es preciso recordar que anteriormente se trato sobre como filtrar datos trabajando con el comando SELECT; todo lo menciodado acerca de SQL tiene como fin poder recuperar los datos de la base de datos Access una vez lograda la conexión entre los dos aplicativos, en el link siguiente te enseño como conectar Excel con Access.

Cuando se manipula datos se requiere normalmente insertar, modificar o eliminar datos con sentencias SQL es por ello que en esta parte del tutorial se muestro como agregar, modificar o eliminar datos guardados en Access desde Excel mediante una macro de VBA, recuerda que aca tienes el ejemplo sobre como conectar excel con access, suscribe al blog para que lleguen a tu mail las próximas entregas o post que se escriban sobre el tema.

Antes de seguir recomiendo leer un excelente libro sobre Excel que te ayudará operar las planillas u hojas de cálculo, haz click acá, si quieres aprender sobre Excel, en inglés, entonces debes hacer click here. Si lo que necesitas es aprender o profundizar sobre la programación de macros con VBA este es unos de los mejores cursos on line que he visto en internet.


  

Desde el link podrás descargar el ejemplo que conecta Excel con Access y desde el link del final cientos de ejemplos totalmente GRATUITO, recordando que si este o alguno de los ejemplos publicados te fueron de utilidad y puedes, aporta a seguir manteniendo esta página.


CONSULTAS DE ACCIÓN
Las consultas de acción son aquellas que no devuelven valor alguno, sino que se encargan de realizar acciones agregar, modificar o borrar datos; como son las consultas para añadir datos, consultas para modificar de datos y consultas para eliminar datos.

CONSULTAS DE DATOS AÑADIDOS COMANDO INSERT INTO
Esta consulta permite insertar, añadir o agregar un dato a la tabla, se puede agregar un registro único; seleccionar registros y agregarlo en una tabla nueva o agregar todos los registros de una tabla a otra tabla.

Insertar un único registro: se puede usar INSERT INTO para insertar un solo registro, en este caso se debe especificar el nombre del campo y el valor que debe ingresarse, cuando no se especifica el nombre del campo de ingresa el valor predeterminado o nulo; los registros se agregan al final de la tabla o base de datos: la sintaxis es la siguiente:

INSERT INTO Tabla (campo1, campo2, campoN) VALUES (valor1, valor2, valorN)

INSER INTO: Comando que permite insertar o agregar un registro.
Tabla: es la tabla donde se agregará e registro.
Campo1: es el primer campo donde se agregará el registro.
Campo2: es el segundo campo donde se agregará el registro.
CampoN : es el último campo donde se agregará el registro.
VALUES: parte del comando INSERT INTO donde se expresan los valores a agregar.
Valor1: valor a agregar para el campo1.
Valor2: valor a agregar para el campo2.
ValorN: valor a agregar para el campoN.

Se debe tener en cuenta al agregar un registro que los valores literales o cadena de texto se deben agregar entre comillas simples ('texto literal'), si el dato a insertar es una fecha se debe indicar entre almohadillas (#) y en formato mm-dd-yy.

La siguiente sentencia inserta  al campo cliente y cuenta corriente de la tabla ventas el valor "Dayra Tomy" y el valor "SI".

INSERT INTO Ventas (cliente, CuentaCorriente) VALUES ('Dayra Tomy', 'SI')


Insertar un registros de una tabla a otra tabla, se puede usar INSERT INTO para ingresar un conjunto de datos pertenecientes a otra tabla o consulta mediante la cláusula SELECT ...FROM, en este caso se selecciona que datos se deben ingresar en la base de datos; la sintaxis es la siguiente:

INSERT INTO TablaDestino (IN Base Datos Externa) (campo1, campo2, campoN) SELECT TablaOrigen.campo1, TablaOrigen.campo2, TablaOrigen.campoN FROM TablaOrigen WHERE Criterios

INSER INTO: Comando que permite insertar o agregar un registro.
IN: se debe usar si la base de datos es externa.
TablaDestino: es la tabla donde se agregará e registro.
Campo1: es el primer campo donde se agregará el registro.
Campo2: es el segundo campo donde se agregará el registro.
CampoN : es el último campo donde se agregará el registro.
TablaOrigen.campo1: es el campo uno de la tabla origen que se insertará en el campo uno de la tabla destino.
TablaOrigen.campo2: es el campo uno de la tabla origen que se insertará en el campo desde la tabla destino.
TablaOrigen.campoN: es el campo uno de la tabla origen que se insertará en el campo N de la tabla destino.
TablaOrigen; es de donde provienen los datos
Criterios: expresa los diferentes criterios para determinar que datos se deben insertar.

En los campos autocontadores o incrementales, se debe tener presente que se copiará el valor que tenga en la tabla origen, no incrementándose como corresponde; si la base de datos es una base de datos Externa se debe agregar IN.

Si la tabla origen y destino tienen los mismos nombres y tipos de datos, es decir contiene todos los campos con idénticos nombre de campo y tipo de datos; ósea la misma estructura de las tablas, se puede simplificar las sintaxis de la siguiente forma:

INSERT INTO Tabla SELECT TablaOrigen.*
FROM TablaOrigen WHERE criterios

El siguiente ejemplo inserta datos en una base de dato externa ResumenVenta que se encuentra en la dirección  'c:\dbase\padron.mdb', los datos a insertar son todos los campos de la tabla de origen Ventas, solo cuando el campo Venta sea igual a Dayra Col o Tomy Lee :

INSERT INTO ResumenVenta IN 'c:\dbase\padron.mdb' SELECT Ventas * FROM Ventas WHERE Venta = 'Dayra Col' or Venta = 'Tomy Lee'

Es posible averiguar los registros que se insertarán para ello se debe proceder a realizar una consulta de selección para determinar o mostrar que datos se insertarán.

CONSULTAS DE ACTUALIZACIÓN DE DATOS COMANDO UPDATE
El comando UPDATE crea una consulta de actualización de datos, cambiando los registros de una tablas especificada en la cláusula FROM que satisfacen el o los criterios expresados en la cláusula WHERE, UPDATE no genera ningún resultado, para saber que datos se actualizarán se puede determinar creando una consulta de selección con el mismo criterio de actualización de datos; si se omite la cláusula WHERE se actualizarán todos los datos, no es posible deshacer la actualización por ello se debe contar con una copia de seguridad en caso que necesitemos restablecer los datos; la sintaxis es:

UPDATE Tabla SET campo1 = valor1, campo2 = valor2, campoN = valor N WHERE Criterio

El siguiente ejemplo actualiza el campo comisión estableciéndolo en un 10% de las ventas cuando las ventas sean superiores a 2000 o los clientes sean Dayra Col o Tomy Lee.

UPDATE Ventas SET FROM Comision = Venta *0,10 WHERE Venta > 2000 OR Cliente = 'Dayra Sol' OR Cliente = 'Tomy Lee' 

CONSULTAS DE ELIMANCIÓN DE DATOS COMANDO DELETE
El comando DELETE crea una consulta de eliminación de datos, borrando registros de una o más tablas listadas en la cláusula FROM que satisfacen el o los criterios expresados en la cláusula WHERE, con este comando se elimina el registro completo, no siendo posible eliminar el contenido de cierto campos solamente; una vez eliminados los registros no se pueden recuperar salvo desde una copia de seguridad, por eso se recomienda realizar siempre una copia, por lo menos antes de eliminar datos; tal vez sea preciso saber que datos se eliminarán, ello se soluciona creando una consulta de selección con el mismo criterio de eliminación de datos,  la sintaxis es:

DELETE * FROM Tabla WHERE Criterio

El siguiente ejemplo borra los datos cuyas ventas sean menores a 2000 y distintas de los clientes  Dayra Col o Tomy Lee.

DELETE * FROM Ventas WHERE Venta < 2000 AND Cliente <> 'Dayra Sol' OR Cliente <> 'Tomy Lee'  


SUBCONSULTAS
Una subconsulta es una instrucción SELECT anidada dentro de otra instrucción SELECT, se asemeja a cuando se anidan formulas en Excel.

Se puede usar una subconsulta en lugar de una expresión en la lista de campos de una instrucción SELECT o cláusula WHERE O HAVING, en una subconsulta se puede utilizar una instrucción SELECT, con ello se proporciona un conjunto de dato de uno o más valores especificados para evaluar en la expresión de la cláusula WHERE O HAVING. 

Existen tres formas de sintaxis para crear una subconsulta.

·         Comparación ANY ALL SOME (instrucción SQL)

·         Expresión [NOT] IN (instrucción SQL)

·         [NOT] EXISTS (instrucción SQL)

Comparación: es una expresión y un operador de comparación que compara la expresión con el resultado de la subconsulta.
Expresión: expresión por la que se busca el conjunto resultante de la subconsulta.
Instrucción SQL: es una instrucción SELECT que tiene el mismo formato y regla de cualquier instrucción SQL vistas anteriormente, debe ir entre paréntesis.

Los predicados ANY y SOME son sinónimos, sirven para recuperar registros de la consulta principal que coincidan con cualquier registro de la subconsulta.

En el ejemplo se requiere recuperar todos los campos de la tabla Ventas cuando el campo Comisión sea mayor o igual a alguno de los registros devuelto por la subconsulta, requiriendo en la subconsulta seleccionar los registros del campo Comision de la tabla Comisiones cuando Comision sea mayor o igual a 1000.


SELECT  * FROM Ventas WHERE Comision >= ANY (SELECT  Comision FROM Comisiones WHERE Comision >= 1000) 


El predicado ALL se usa para recuperar registros de la consulta principal que coincidan con todos los registros de la subconsulta.

En el ejemplo se requiere recuperar todos los campos de la tabla Ventas cuando el campo Comisión sea mayor o igual a todos los registros devuelto por la subconsulta, requiriendo en la subconsulta seleccionar los registros del campo Comision de la tabla Comisiones cuando Comision sea mayor o igual a 1000.

SELECT  * FROM Ventas WHERE Comision >= ALL (SELECT  Comision FROM Comisiones WHERE Comision >= 1000) 


El predicado IN se usa para recuperar registros de la consulta principal que coinciden exactamente con algún registro de la subconsulta; si se usa NOT IN se recuperan los registros de la consulta principal que no coinciden exactamente con algún registro de la subconsulta, es decir se obtiene los datos inversos que cuando se usa IN solamente.

En el ejemplo se requiere recuperar todos los campos de la tabla Clientes cuando el campo Venta sea igual a los registros devuelto por la subconsulta, requiriendo en la subconsulta seleccionar los registros del campo Venta de la tabla Ventas cuando Comision sea mayor o igual a 500.

SELECT  * FROM Clientes WHERE Venta IN (SELECT  Venta FROM Ventas WHERE Comision >= 500) 


En este caso se utiliza NOT IN, es decir se obtendrán los resultados inversos a los requeridos con la consulta anterior.

SELECT  * FROM Clientes WHERE Venta NOT IN (SELECT  Venta FROM Ventas WHERE Comision >= 500) 


El predicado EXISTS se utiliza en comparaciones verdadero / falso, sirve para determinar si la subconsulta devuelve algún registro, si se una NOT se obtiene el resultado inverso.

En este ejemplo devolverá verdadero si en la subconsulta existe algún registro que cumpla las condiciones, si se una NOT se devolverá lo contrario.

EXISTS (SELECT  Venta FROM Ventas WHERE Comision >= 500) 

NOT EXISTS (SELECT  Venta FROM Ventas WHERE Comision >= 500) 


Se puede usar AS (alias) en la subconsulta para referirse a una tabla listada en la cláusula FROM fuera de la subconsulta.

El ejemplo devuelve el nombre de los clientes cuyas ventas sean mayores o iguales que el promedio de ventas a todos los clientes del mismo país, ordenado por País.

SELECT  NombreCliente, País, Venta FROM Clientes As Vta1 WHERE Venta >= (SELECT AVG (Venta)  FROM Clientes WHERE Vta1.Pais = Clientes.Pais) ORDER BY Pais 


El ejemplo devuelve el nombre y demás datos de los Empleados cuyos salarios superan al salario de Jefe o Director, ordenado por País (nótese que si el comodín % produce error se debe usar *).

SELECT NombreEmpleado, País, Cargo, Salario FROM PadronEmpleaos WHERE Cargo LIKE "Vende%" AND Salario >= ALL (SELECT Salario FROM PadronEmpleaos WHERE Cargo LIKE "%Jefe%" OR Cargo LIKE "%Director%") ORDER BY Pais 


El ejemplo devuelve listado de nombre y demás datos de Productos cuyo precio de venta sea igual al precio del producto Chocolate Blanco.

SELECT DISTINCTROW Producto, PrecioCompra, PrecioVenta, Codigo FROM PadronProductos WHERE PrecioVenta = (SELECT PrecioVenta FROM PadronProductos WHERE Producto "Chocolate Blanco)

El ejemplo devuelve listado de nombre y demás datos de Clientes cuyos Clientes han realizado alguna compra entre el 12/01/2012 y el 12/06/2014.


SELECT DISTINCTROW NombreCliente, Direccion, Telefono, Mail FROM PadronClientes WHERE Cliente IN (SELECT DISTINCTROW  Cliente FROM Ventas WHERE Fecha >= #12/01/2012# AND Fecha <= #12/06/2014#)


El ejemplo devuelve listado de nombre y demás datos de Clientes cuyos Clientes han realizado alguna compra.

SELECT DISTINCTROW NombreCliente, Direccion, Telefono, Mail FROM PadronClientes AS Pd WHERE EXISTS (SELECT * FROM Ventas AS Vtas1 WHERE Pd.NombreCliente = Vtas1.NombreCliente)


El ejemplo devuelve el código del producto, la cantidad pedida y el nombre del producto, nombre que es extraído mediante una subconsulta de la tabla PadronProductos; cuando la cantidad sea superior o igual a 5000 ordenado por código.

SELECT DISTINCTROW PadronPedidos.Codigo, Pedidos.Cantidad, (SELECT DISTINCTROW PadronProductos.Producto FROM PadronProductos WHERE PadronProductos.Codigo = PadronPedidos.Codigo) AS NombreProducto FROM PadronPedidos WHERE PadronPedidos.Cantidad > 5000 ORDER BY Pedidos.Codigo


CONSULTAS DE REFERENCIAS CRUZADAS
Esta consulta permite la visualización de datos como si fuese una tabla u hoja de Excel en filas y columnas, la sintaxis es la siguiente

TRANSFORM función agregada instrucción select PIVOT campo pivot IN valor1, valor 2, valorN WHERE criterios GROUP BY criterio agrupamiento ORDER BY orden de datos

TRANSFORM: cláusula para crear consultas de referencia cruzada.
Función agregada: función agregada SQL que opera sobre los datos.
Instrucción select: es una instrucción SELECT como las vistas anteriormente.
Campo pivot: es el campo o expresión que se requiere usar para crear cabecera de las columnas.
Valor1: es un valor fijo uno usado para crear la cabecera de la columna.
Valor2: es un valor fijo dos  usado para crear la cabecera de la columna.
ValorN: es un valor fijo N usado para crear la cabecera de la columna.
Criterios: criterios de la cláusula WHERE.
Criterio de agrupamiento: criterios para agrupar datos.
Orden de datos: por qué campo se debe ordenar.

El ejemplo  crea una referencia de tablas cruzadas que muestra las ventas de producto por mes para un período determinado.

TRANSFORM SUM (Cantidad) AS Ventas SELECT Empresa FROM Pedidos WHERE Fecha BETWEEN #12/01/2012# AND #12/06/2014# GRUOP BY Empresa ORDER BY Empresa PIVOT "Trimestre" & DATE PART("q",Fecha) IN ('Trimestre1', 'Trimestre2', 'Trimestre3', 'Trimestre4')

TRANSFORM SUM (Cantidad) AS Ventas SELECT Producto, Cantidad FROM Pedidos WHERE Fecha BETWEEN #12/01/2012# AND #12/06/2014# GRUOP BY Producto ORDER BY Producto PIVOT DATE PART("m",Fecha)

CONSULTAS DE UNION INTERNAS
Esta consulta permite la vinculación de tablas, combinando los registros siempre que haya un campo en común y concordancia de datos, la sintaxis es:

SELECT Campos FROM Tabla1 INNER JOIN Tabla2. ON Tabla1.Campo1 Operador Comparación Tabla2.campo2

SELECT: cláusula SELECT.
Campos: campos que se vinculan.
Tabla1: primer tabla a vincular.
Tabla2: segunda tabla a vincular.

Tabla1.Campo1: nombre de los campos que se combinan de la tabla1.
Tabla1.Campo2: nombre de los campos que se combinan de la tabla2.

Operador comparación: es un operador de comparación.

Se puede usar INNER JOIN,  por ejemplo, con tablas de Departamentos y Empleados para seleccionar todos los empleados de cada departamento, por el contrario para seleccionar todos los departamentos, incluso los que no tienen empleados se emplea LEFT JOIN o todos los empleados si alguno no está asignado a departamentos se usa RIGTH JOIN.  

Se pueden enlazar varias cláusulas ON en una instrucción JOIN, la sintaxis sería:

SELECT Campos FROM Tabla1 INNER JOIN Tabla2 ON Tabla1.Campo1 Operador de comparación Tabla2.Campo2 AND ON Tabla1.Campo2 Operador de comparación Tabla2.Campo2 OR ON Tabla1.Campo3 Operador de comparación Tabla2.Campo3


También se puede anidar la instrucción JOIN, la sintaxis es la siguiente:

SELECT Campos
FROM Tabla1 INNER JOIN
(Tabla2 INNER JOIN [( ] Tabla3
[INNER JOIN [(] TablaX [INNER JOIN ...)]
ON Tabla3.Campo3 Operador de comparación TablaX.CampoX)]
ON Tabla2.Campo2 Operador de comparación Tabla3.Campo3)
ON Tabla1.Campo1 Operador de comparación Tabla2.Campo2

LEFT JOIN O RIGTH JOIN  se pueden anidar dentro de INNER JOIN, pero no al revés.


CONSULTAS DE UNION EXTERNAS
Esta consulta permite la vinculación de dos o más tablas o consultas independientes, si no se indica lo contrario no se devuelven registros duplicados, para mostrar todos los registros se debe usar el predicado ALL; en una operación de UNION se debe tener el mismo número de campos sin importar el tamaño del campo y el tipo de datos; la sintaxis es:

TABLE Consulta1 UNION [ALL] TABLE Consulta2 UNION [ALL] TABLE consutaN

TABLE: palabra clave de SQL que permite crear una unión Externa.
UNION: instrucción SQL que permite la combinación de dos o más tablas
Consulta1: es la consulta a la primer tabla, es una consulta SELECT o nombre de una tabla.
Consulta2: es la consulta a la segunda tabla, es una consulta SELECT o nombre de una tabla.
Consulta N: es la consulta a la N tabla, es una consulta SELECT o nombre de una tabla.

El siguiente ejemplo combina una tabla existente con una instrucción SELECT

TABLE ClientesUSA UNION ALL SELECT * FROM Clientes WHERE Venta > 1000

 

CONSULTAS CON PARÁMETROS
Las consultas de parámetros, se denominan a las consultas cuyas criterios de búsqueda son definidos por parámetros que debe ingresar el usuario, al ejecutarse desde la base de datos directamente el usuario debe ingresar cada parámetro solicitado, si se ejecuta desde alguna aplicación se debe asignar mediante el valor de dichos parámetros y luego ejecutarlas, la sintaxis es:

PARAMETERS nombre1 tipo1, nombre2, tipo2, nombreN tipoN Consulta

Nombre1: el nombre 1 del parámetro
Tipo1: es el tipo de datos del parámetro
Nombre2: el nombre 2 del parámetro
Tipo2: es el tipo de datos del parámetro
NombreN: el nombre N del parámetro
TipoN: es el tipo de datos del parámetro
Consulta: Instrucción SELECT

El siguiente ejemplo establece una consulta de parámetros, donde los datos que debe introducir el usuario en un cuadro de diálogo; la Fecha dela venta, si la venta fue realizada en Cuenta Corriente y el importe de Venta mínima, luego de ello se realizará la consulta que devolverá los clientes cuyas fecha de venta sean mayor a la indicada en el parámetro, las ventas se realizaron o no en cuenta corriente y el importe sea mayor al establecido por el usuario.

PARAMETERS [Indique Fecha Desde:] DateTime, [Indique Si es Cuenta Corriente:] String, [Indique Importe Venta Desde:] Currency; SELECT Cliente FROM Ventas WHERE Fecha > [Indique Fecha Desde:] AND CuentaCorriente = [Indique Si es Cuenta Corriente:] AND Venta > [Indique Importe Venta Desde:] 


COMANDOS DLL CREACIÓN DE TABLAS
Si se está usando el motor de base de datos de Microsoft, para conectar con bases de datos Access, solo es posible usar la siguiente instrucción para crear una base de dato propia de Access, la sintaxis es la siguiente:

 

CREATE TABLE Tabla (campo1 tipo tamaño indice1, campo2 tipo tamaño indice2, campoN tipo tamaño indiceN, indice multicampo)

CREATE TABLE: instrucción SQL que permite crear tabla.
Campo1: es el nombre del campo1 a crear.
Campo2: es el nombre del campo2 a crear.
CampoN: es el nombre del campoN a crear.
Tipo: es el tipo de datos del campo.
Tamaño: es el tamaño del campo, se debe ingresar solo en campos tipo texto o string.
Indice1: es una cláusula CONSTRAINT que indica, respecto del campo1, el tipo de indice a crear, es opcional.
Indice2: es una cláusula CONSTRAINT que indica, respecto del campo2, el tipo de indice a crear, es opcional.
Indice3: es una cláusula CONSTRAINT que indica, respecto del campoN, el tipo de indice a crear, es opcional.
Indice multicampo: un indice multicampo es aquel que esta indexado por el contenido de varios campos, es una cláusula CONSTRAINT opcional que define el tipo de indice multicampo.

El siguiente ejemplo crea una tabla cuyo nombre es Ventas con tres campos, Fecha, Cliente, Venta, donde el primero es tipo DateTime, el segundo Text con un largo de 50, estableciéndolo como indice primario y el tercero Currency.

CREATE TABLE Ventas (Fecha DATETIME, Cliente TEXT (50) CONSTRAINT IndicePrimario PRIMARY, Venta CURRENCY)

Este otro ejemplo crea una tabla cuyo nombre es Ventas con tres campos, Fecha, Cliente, Venta, donde el primero es tipo DateTime, el segundo Text con un largo de 50 y el tercero Currency; crea un indice general formado por los tres campos y no acepta valores repetidos.

CREATE TABLE Ventas (Fecha DATETIME, Cliente TEXT (50), Venta CURRENCY) CONSTRAINT IndiceGeneral UNIQUE (Fecha, Cliente, Venta)



CLAUSULA CONSTRAINT
En el tema anterior se mencionó dicha cláusula, se puede decir que CONSTRAINT se utiliza para crear o eliminar índices en las instrucciones ALTER TABLE Y CREATE TABLE, difieren las sintaxis dependiendo si se trata de un índice único o multindice.

Para índices únicos la sintaxis es la que sigue:

CONSTRAINT Nombre  {PRIMARY KEY UNIQUE REFERENCES tabla externa [(Campo externo1), Campo externo2, Campo externoN]}

CONSTRAINT: cláusula que sirve para crear índices.
Nombre: nombre del índice a crear.
Tabla externa: es el nombre de la tabla que contienes el campos referenciado
Campo externo1: es el campo1 de la tabla externa.
Campo externo2: es el campo2 de la tabla externa.
Campo externoN: es el campoN de la tabla externa.


Para índices con campos múltiples la sintaxis es la que sigue:

 

CONSTRAINT Nombre  {PRIMARY KEY (Primario1, Primario2, PrimarioN) UNIQUE (Unico1, Unico2, UnicoN) FOREING KEY (Ref1, Ref2, RefN) REFERENCES Tabla externa [(Campo externo1), Campo externo2, Campo externoN]}

 

 

CONSTRAINT: cláusula que sirve para crear índices.

Nombre: nombre del índice a crear.

Primario1: nombre campo1 forma el indice.

Primario2: nombre campo2 forma el indice.

PrimarioN: nombre campoN forma el indice.

Unico1: nombre campo1 forma el indice de clave única.

Unico2: nombre campo2 forma el indice de clave única.

UnicoN: nombre campoN forma el indice de clave única.

Ref1: es el nombre del campo1 de la otra tabla que forman el indice externo.

Ref1: es el nombre del campo2 de la otra tabla que forman el indice externo.

Ref1: es el nombre del campoN de la otra tabla que forman el indice externo.

Tabla externa: es el nombre de la tabla que contienes el campos referenciados.

Campo externo1: es el campo1 de la tabla externa especificado por Ref1.

Campo externo2: es el campo2 de la tabla externa especificado por Ref2. 

Campo externoN: es el campoN de la tabla externa especificado por RefN.

UNIQUE: genera un índice de clave única, implicando que los registros de la tabla no pueden estar duplicados en el campo indexado.

PRIMARY KEY: genera un indice primario con el campo o campos especificados, los registros de la clave principal deben ser únicos y no nulos, cada tabla puede tener solo una clave única principal.

FOREING KEY: Genera un índice externo tomando como valor del índice campos de otras tablas, si la clave principal de la tabla externa consta de más de un campo , se debe utilizar una definición de índice de múltiples campos, listando todos los campos de referencia, el nombre de la tabla externa y los nombre de los campos referenciados en dicha tabla externa, en el mimo orden que los campos listados. Si los campos referenciados son clave principal de la tabla externa, no se debe especificar los mismos, el motor Jet de base de datos predeterminará el valor como si la clave principal de la tabla externa fueran los campos referenciados.

 

 

CLAUSULA CREATE
Permite crear índices se usa con el motor de base de datos Jet de Microsoft, solo sirve para crear bases de datos del mismo motor, se puede utilizar CREATE INDEX para crear un pseudo índice sobre una tabla adjunta en una fuente de datos ODBC tal como SQL Server que no tenga todavía un índice, no es necesario tener permiso o acceso a un servidor remoto para ello, la base de datos remota no es afectada por el pseudo índice, la sintaxis es la misma para las tablas adjuntas que para las originales, siendo útil para crear un índice en una tabla que es solo lectura debido a la falta de índice; la sintaxis es la siguiente

CREATE [ UNIQUE ] INDEX indice ON Tabla (campo1 [ASD DESC], campo2 [ASD DESC], campoN [ASD DESC]) [WITH {PRIMARY DISALLOW NULL IGNORE NULL}]


CREATE: cláusula SQL que permite crear un pseudo índice.
UNIQUE: no puede contener valores duplicados el campo indexado.
Indice: nombre de índice a crear.
Tabla: nombre de la tabla donde se creara el índice.
Campo1: nombre del campo1 de constituye el índice.
Campo2: nombre del campo2 de constituye el índice.
CampoN: nombre del campoN de constituye el índice.
ASC: indica el orden ascendente de los valores de los campos, es opcional, ASC es predeterminado.
DESC: indica el orden descendente de los valores de los campos, es opcional.
PRIMARY: genera un indice primario con el campo o campos especificados, los registros de la clave principal deben ser únicos y no nulos, cada tabla puede tener solo una clave única principal.
DISALLOW NULL: no admite valores nulos en el índice. 
IGNORE NULL: excluye del índice los valores nulos incluidos en los campos que lo componen.

El ejemplo crea un indice llamado MyIndice en la tabla ventas usando los campos Fecha y Cliente no permite que contenga valores repetidos ni nulos.

CREATE INDEX MyIndice ON Ventas (Fecha, Cliente) WITH DISALLOW NULL

CLAUSULA ALTER
Esta cláusula permite la modificación del diseño de una tabla existente, pudiendo modificar los campos e índices existentes, la sintaxis es la que sigue:
ALTER TABLE Tabla {ADD {COLUMN Tipo [(Tamaño)] [CONSTRAINT Indice] CONSTRAINT Indice multicampo} DROP {COLUMN Campo CONSTRAINT NombreIndice] }

 

ALTER: cláusula SQL que permite modificar un índice.
Tabla: nombre de la tabla donde se modificará el índice.
Indice: nombre de índice del campo a modificar o a eliminar.

Tipo: es el tipo de datos del campo.

Tamaño: es el tamaño del campo, se debe ingresar solo en campos tipo texto o string.

Indice muticampto: nombre de índice multicampo a modificar o a eliminar.

ADD COLUMN: se usa para añadir un nuevo campo a la tabla, indicando nombre, tipo de campo y tamaño en caso de ser texto.

ADD: se usa para agregar un índice multicampo o de un único campo.

DROP COLUMN: Se utiliza para borrar un campo, solo se debe especificar el nombre del mismo.

DROP: sirve para eliminar un índice, se debe especificar el nombre del índice a continuación de la palabra reservada CONSTRAINT.

El siguiente ejemplo crea un campo tipo moneda.

ALTER TABLE Ventas ADD COLUMN ImporteTotal CURRENCY


En este ejemplo se elimina el campo creado con la sentencia anterior.

ALTER TABLE Ventas DROP COLUMN ImporteTotal


En este otro ejemplo se agrega un índice externo a la tabla pedidos, este se basa en el campo IDEmpleado y se refiere al campo IDEmpleado de la tabla Empleados, no es necesario indicar el campo junto al nombre de la tabla en la cláusula REFERENCES ya que IDEmpleado es la clave principal de la tabla Empleados.

ALTER TABLE Pedidos ADD CONSTRAINT RelacionPedidos FOREIGN KEY (IDEmpleado) REFERENCES Empleados (IDEmpleado)


En este ejemplo se elimina el índice de la tabla Pedidos

ALTER TABLE Pedidos DROP CONSTRAINT RelacionPedidos


BASE DE DATOS EXTERNA CLAUSULA IN
Esta cláusula permite accede a bases de datos externas, entre ellas dBase, Paradox o Btrieve, permitiendo la conexión con una base de datos externa a la vez, se define base de datos externa aquella que no es la activa, es recomendable para incrementar el rendimiento y productividad adjuntar la base de dato externa a la actual y trabajar con ella; es preciso agregar punto y coma (;) cuando la base de datos no es Access además de encerar entre comillas simples, también se puede usar DATABASE para referir a ellas por ejemplo:

FROM Tabla IN '[dBASE IV; DATABASE=C:\DB\VENTAS ]'
FROM Tabla IN 'C:\DB\VENTAS' 'dBASE IV;'

Cuando se requiere acceder a una base externa de Access se deber referenciar de la siguiente forma:
SELECT Cliente FROM Clientes IN Ventas.accdb WHERE Cliente LIKE 'Day'

Cuando se requiere acceder a una base externa de dBase III se deber referenciar de la siguiente forma:
SELECT Cliente FROM Clientes IN 'C:\DB\VENTAS' 'dBASE III;' WHERE Client

Cuando se requiere acceder a una base externa de dBase IV se deber referenciar de la siguiente forma:
SELECT Cliente FROM Clientes IN 'C:\DB\VENTAS' 'dBASE IV;' WHERE Cliente LIKE 'Day'


Cuando se requiere acceder a una base externa de Paradox 3.x se deber referenciar de la siguiente forma:
SELECT Cliente FROM Clientes IN 'C:\PARADOX\VENTAS' 'Paradox 3.x;' WHERE Cliente LIKE 'Day'

Cuando se requiere acceder a una base externa de Paradox 4.x se deber referenciar de la siguiente forma:
SELECT Cliente FROM Clientes IN 'C:\PARADOX\VENTAS' 'Paradox 4.x;' WHERE Cliente LIKE 'Day'

Cuando se requiere acceder a una base externa de Btrieve se deber referenciar de la siguiente forma:
SELECT Cliente FROM Clientes IN 'C:\BTRIEVE\VENTAS\FILE.DDF' 'Btrieve;' WHERE Cliente LIKE 'Day'


CLAUSULA WITH OWNERACCESS OPTION
En entornos de base de datos con permisos de seguridad para grupos de trabajo es posible usar la cláusula WITH OWNERACCESS OPTION y con ello se omiten permisos de ejecución; de esta forma el usuario actual adquiere los derechos de propietario cuando se está ejecutando la consulta, la sintaxis es la siguiente:

Instrucción SQL WITH OWNERACCESS OPTION

Seguidamente se expone un ejemplo de su uso, donde se deben obtener los datos de Fecha, Cliente y Venta de la tabla Ventas omitiendo los permisos de ejecución con la cláusula en estudio.

SELECT Fecha, Cliente, Ventas FROM Ventas ORDER BY Fecha WITH OWNERACCESS OPTION


CLAUSULA PROCEDURE
Se usa para crear una consulta a la misma vez que se la ejecuta, en forma opcional se pueden definir los parámetros de la misma, la sintaxis es la siguiente:

PROCEDURE NombreConsulta Parametro1 tipo1, Paramentro2 tipo2, ParametroN tipoN; ConsultaSQL

PROCEDURE: sirve para crear una consulta a la vez que se ejecuta.
NombreConsulta: nombre con el que se guarda la consulta en la base de datos.
Parametro1: es el nombre del parametro1 de dicha consulta.
Parametro2: es el nombre del parametro2 de dicha consulta.
ParametroN: es el nombre del parametroN de dicha consulta.
Tipo: es el tipo de datos del parámetro.
ConsulaSQL: es la consulta que se desea grabar y ejecutar.

El siguiente ejemplo crea una consulta que se denominará ListadoClientes y a su vez la ejecuta requiriendo listar los clientes únicos de la tabla Ventas, ordenados por Cliente.

PROCEDURE ListadoClientes; SELECT DISTINCTROW Clientes FROM Ventas ORDER BY Clientes

El siguiente ejemplo crea y ejecuta la consulta denominada ResumenVentas incorporando dos parámetros uno es la Fecha Desde y el otro Fecha Hasta; cuyos tipos de datos son DATATIME; la expresión SQL establece que se extraiga datos del campo Fecha, Codigo e Importe agregando un campo denominado Año que se obtiene del campo fecha de envío estableciendo el formato para mostrar el año solamente todo esto se debe extraer dela tabla Ventas cuando el campo Fecha este entre los parámetros FechaDesde y FechaHasta; ordenando los datos por Fecha en forma descendente.


PROCEDURE ResumenVentas FechaDesde DATETIME, FechaHasta DATETIME; SELECT DISTINCTROW Fecha, Codigo, Importe, Format (FechaEnvio,"yyyy") AS Año FROM Ventas WHERE Fecha BETWEEN FechaDesde AND FechaHasta ORDER BY Fecha DESC

El vídeo que sigue muestra una explicación más detallada y gráfica de la macro presentada, recomiendo observar para una más fácil comprensión de la macro; suscribe a nuestra web desde la parte superior derecha de la página ingresando tu mail y a nuestro canal de You Tube para recibir en tu correo vídeos explicativos sobre macros interesantes, como por ejemplo formulario que crea un listado de todas las hojas para poder luego seleccionarlas, buscar en listbox mientras escribes en textbox, ordenar hojas libro excel por su nombre, conectar Excel con Access y muchos ejemplos más.




Continua en parte I Principales sentencias SQL

Continua en parte II Seleccionar Datos Comando SELECT

Continua en parte III Insertar, actualizar y eliminar Datos Comando INSERT, UPDATE DELETE


Si te fue de utilidad puedes INVITARME UN CAFÉ y de esta manera ayudar a seguir manteniendo la página, CLICK para descargar en ejemplo en forma gratuita.


If this post was helpful INVITE ME A COFFEE and so help keep up the page, CLICK to download free example.


Si te gustó por favor compártelo con tus amigos
If you liked please share it with your friends