sábado, 26 de diciembre de 2009

Script y reglas Firewall con Iptables


Les dejo un script de configuración para las reglas de un firewall o cortafuegos con iptables. Las fundamentaciones pueden encontrarlas en las referencias y satisfacer sus necesidades particulares. Cualquier mejora pueden dejar sus comentarios para enriquecer el script.

#!/bin/sh
# /etc/rc.d/rc.firewall
# GNU/Linux FIREWALL con Iptables

f_start() {
iptables -F
iptables -X
iptables -Z
iptables -t nat -F

# A nuestro firewall tenemos acceso total desde nuestra IP
# iptables -A INPUT -s 127.0.0.1 -j ACCEPT

# Establecemos politicas por defecto
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
# Permitir todo a Localhost
iptables -A INPUT -j ACCEPT -i lo

# Enmascaramiento de la red local
# activamos el BIT DE FORWARDING
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE


# www
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# mail (25, 110, 143)
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 143 -j ACCEPT
# ftp
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
# ssh
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# xdmcp
iptables -A INPUT -p udp --dport 177 -j ACCEPT
# cups/lpd
iptables -A INPUT -p udp --dport 631 -j ACCEPT
# Reglas específicas por ejemplo: bittorrent
# iptables -A INPUT -p tcp --dport 6881:6883 -j ACCEPT

# apply rules
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
echo "Firewall iniciado..."
}

f_stop() {
iptables -F
iptables -X
iptables -Z
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
echo "Firewall parado..."
}

f_status() {
iptables -nL
}

f_restart() {
fw_stop
fw_start
}

case "$1" in
'start')
f_start
;;
'stop')
f_stop
;;
'status')
f_status
;;
'restart')
f_restart
;;
*)
echo "Usage: $0 start|stop|restart|status"
esac


Referencias:

domingo, 13 de diciembre de 2009

Salvar y Restaurar Base de Datos en MySQL de forma rápida y sencilla


En un sistema Debian la ubicación del directorio de datos de MySQL por omisión es en /var/lib/mysql . Para salvar la(s) base(s) dato(s) realizamos los siguientes pasos:

Salvar:

1. Paramos el servicio MySQL con:
/etc/init.d/mysql stop

2. Compiamos el directorio de datos a un directorio de respaldo:
cp -r /var/lib/mysql/ /algun_dir/
ó lo comprimimos mediante:
tar czf mysql-backup.tar.gz /var/lib/mysql
3. Iniciamos el servicio:
/etc/init.d/mysql start

Restaurar:

1. Paramos el servicio MySQL con:
/etc/init.d/mysql stop

2. Restauramos la copia de los datos
cp /algun_dir/respaldo-mysql/* /var/lib/mysql
3. Importate restaurar el dueño y el grupo a los archivos de datos para tener los accesos correctamente. Por omisión es el usuario mysql el encargado del servicio.
chown -R mysql:mysql /var/lib/mysql
4. Iniciamos el servicio:
/etc/init.d/mysql start

Les dejo un documento interesante sobre Bases de datos en MySQL donde el objetivo principal es: "adquirir las habilidades y conocimientos de MySQL necesarios para utilizar y administrar este SGBD (Sistema Gestor de Bases de Datos)".

En el punto Copias de seguridad abordan con más profundidad este tema.

Referencias:
Base de datos en MySQL
Activar innoDB en Mysql Server

jueves, 10 de diciembre de 2009

Serie sobre cómo construir un datawarehouse


Cuando estamos investigando en el tema de Business Intelligence o Inteligencia de negocio y poco a poco nos damos cuenta que hay muchas temáticas, nos suele surgir preguntas como, ¿Por dónde empezar? .

Existen muchos sitios que aborden este mundo. Una forma fácil de entender los principales conceptos y herramientas que dispone la inteligencia empresarial, es en el siguiente blog: Business Intelligence fácil

Una sección recomendada es: Serie sobre cómo construir un datawarehouse.

En este post les dejo la sección en formato pdf para que la puedas consultar offline. Espero que disfruten del buen contenido del blog.

Referencias:
Artículos sobre Serie DWH (web, pdf)

miércoles, 9 de diciembre de 2009

SQL Server 2005, Limpiar base de datos y restablecer columnas identity, todo en 6 lineas!


Una manera sencilla para vaciar nuestras base de datos en SQL Server 2005 se muestra a continuación. El artículo original se encuentra en DotNetSlackers.

/*Disable Constraints & Triggers*/
exec sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
exec sp_MSforeachtable 'ALTER TABLE ? DISABLE TRIGGER ALL'

/*Perform delete operation on all table for cleanup*/
exec sp_MSforeachtable 'DELETE ?'

/*Enable Constraints & Triggers again*/
exec sp_MSforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
exec sp_MSforeachtable 'ALTER TABLE ? ENABLE TRIGGER ALL'

/*Reset Identity on tables with identity column*/
exec sp_MSforeachtable 'IF OBJECTPROPERTY(OBJECT_ID(''?''), ''TableHasIdentity'') = 1 BEGIN DBCC CHECKIDENT (''?'',RESEED,0) END'

Referencias:
SQL Server 2005, Clean your Database Records & reset Identity Columns, all in 6 lines!

lunes, 7 de diciembre de 2009

Configurar JDK 6 por default en GNU/Linux Debian


A veces suele ocurrir que tenemos en nuestro sistema más de una máquina virtual para Java y necesitamos establecer una por omisión. De esta manera podrás establecer el JDK (Java Development Kit) de Sun Microsystems:

update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jdk/jre/bin/java" 1

update-alternatives --set java /usr/lib/jdk/jre/bin/java

Comprobamos con la siguiente instrucción:

java -version

Referencias:

domingo, 6 de diciembre de 2009

Configuración sitio web principal en Apache


Para establecer un sitio web por omisión en el servidor web Apache utilizaremos la directiva RedirectMatch. Para ello creamos un fichero de configuración en el directorio /etc/apache2/conf.d
, por ejemplo: websitedefault.conf

# Web Site default Apache configuration
# Configuración Sitio Web por omisión en Apache

Alias /website /var/www/website/
RedirectMatch ^/$ /website

Options +FollowSymLinks
AllowOverride None

Order Deny,Allow
#Deny From All
#Allow From 127.0.0.0/255.0.0.0 ::1/128
Allow From All

Referencias:
Apache Module mod_alias


sábado, 28 de noviembre de 2009

Software World: PowerBuilder 9: Internet and Distributed Application Development


Software World: PowerBuilder 9: Internet and Distributed Application Development: "

PowerBuilder 9: Internet and Distributed Application Development
By William Green, John D. Olson

* Publisher: Sams
* Number Of Pages: 816
* Publication Date: 2003-10-03
* ISBN-10 / ASIN: 0672324997
* ISBN-13 / EAN: 9780672324994
* Binding: Paperback

Product Description:

Version 9 of PowerBuilder introduces many features designed specifically to blend the traditional strength of PowerBuilder as a rapid Client/Server application development tool with the new and emerging models for distributed application development. PowerBuilder developers need PowerBuilder-specific information on interacting with Java application servers, such as WebSphere, WebLogic, and Sybase’s Enterprise Application Server (EAServer) and Web Service development. This book presents the new capabilities of PowerBuilder 9 along with the architecture and patterns required to create distributed systems in PowerBuilder."


Referencias:
Descargar: http://ifile.it/l9w0yi/0672324997.chm

miércoles, 18 de noviembre de 2009

Filtros SQL dinámico para reportes en SQL Server


Me ha sido de gran utilidad este artículo sobre Filtros dinámicos en SQL Server para realizar Reportes. Se los recomiendo y les puede ser de utilidad usando DataWindow con procedimientos almacenados como fuente de datos para generar los reportes que necesiten.

Espero les sea de utilidad.


martes, 10 de noviembre de 2009

Funte de datos Stored Procedure y Transact SQL


Trabajando con Datawindow y las diferentes fuentes de datos (DataSource), al utilizar la fuente de datos Stored Procedure me ha sido de gran utilidad los siguientes enlaces para trabajar con Transact SQL y la programación para el SQL dinámico generando consultas con criterios de búsqueda.

Referencias:


sábado, 7 de noviembre de 2009

Poblar un DropDownListBox control desde base datos


Para poblar dinámicamente un DropDownListBox control desde una tabla en Power Builder podemos usar un DataStore, en el contructor del DropDownListBox hacemos el retrieve sobre el datastore y luego insertamos en el control los elementos recuperados. Ejemplo:

datastore ds
ds = create datastore
ds.dataobject='dw_tdo_doc'
ds.settransobject(sqlca)
ds.retrieve()
int li
for li=1 to ds.rowcount()
insertitem(ds.getitemstring(li,'tdo_desc'),li)
next
insertitem('Seleccionar...',1)
selectitem(1)

Referencia:


viernes, 30 de octubre de 2009

Datos y Notación por punto en Power Builder


En un post anterior vimos las diferencia entre Culumnas computadas vs Campos computados en Power Builder. Es importante entender estos conceptos para facilitar la implementación sobre los datawindows.

Ahora si queremos por ejemplo acceder al valor de un campo computado, de un datawindow que esta en el header, footer o summary se especifica el número de fila como 1 a través de la notación por puntos, ejemplo:


dw_1.Object.avg_cf[1]

He encontrado referencia sobre este tema en PowerBuilder Technique - Data and Dot Notation. Espero que les sirva de aclaración o ayuda.

miércoles, 28 de octubre de 2009

Power Builder 10.5 ShellExecute


Para abrir cualquier tipo de documentos desde Power Builder versión 10.5 debemos hacer lo siguiente:

  • Declaramos la función local externa:
FUNCTION long ShellExecute(ulong ihwnd,string lpszOp,string lpszFile,string lpszParams, string lpszDir,int wShowCmd ) LIBRARY "shell32.dll" ALIAS FOR "ShellExecuteW"

Para la versión 10.5 utilizamos ShellExecuteW en vez de ShellExecuteA porque PB en la version 10.5 usa Unicode en vez de ASCII.

Este problema se le da respuesta en la siguiente hilo de la lista del grupo de Google comp.soft-sys.powerbuilder.

  • Luego podemos utilizar la función externa de la siguiente forma:
ShellExecute( 0 , "open" , ls_full_path , ls_parm , ls_path , 1 )

Espero que les sea de utilidad.

Referencias:



martes, 13 de octubre de 2009

Solucionando error Mondrian y PostgreSQL 8.3.8


Para solucionar el error:

Caused by: javax.servlet.ServletException: javax.servlet.jsp.JspException: org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: com.tonbeller.jpivot.olap.model.OlapException: ERROR: no existe la función upper(smallint)

de las versiones antiguas de Mondrian y la visualizacion de Cubos OLAP sobre el gestor de base de datos PostgreSQL 8.3.8, tenemos que especifiar en el esquema del cubo el tipo de dato de cada colmna en la etiqueta Level atributo type . Les dejo un fragmento del esquema de un cubo y su definición en XML.



<!-- Producto -->
<Dimension name="Producto">
<Hierarchy name="Tipo" hasAll="true" primaryKey="id_dim" caption="Producto/Tipo" allMemberName="Todas" allMemberCaption="(Todas)">
<Table name="dim_producto"/>
<Level name="Tipo" column="tipo_codigo" nameColumn="tipo_desc" hideMemberIf="IfBlankName" type="String"/>
<Level name="Producto" column="id_producto" nameColumn="nombre_producto" hideMemberIf="IfBlankName" type="Numeric">
<Property name="Precio_mn" column="precios" type="Numeric"/>
<Property name="Precio_usd" column="precio_usd" type="Numeric"/>
<Property name="Unidad_medida" column="unidad_medida" type="String"/>
</Level>
</Hierarchy>
<Hierarchy name="Grupo" hasAll="true" primaryKey="id_dim" caption="Producto/Grupo" allMemberName="Todas" allMemberCaption="(Todas)">
<Table name="dim_producto"/>
<Level name="Grupo" column="grupo_codigo" nameColumn="grupo_desc" hideMemberIf="IfBlankName" type="String"/>
<Level name="Producto" column="id_producto" nameColumn="nombre_producto" hideMemberIf="IfBlankName" type="Numeric">
<Property name="Precio_mn" column="precios" type="Numeric"/>
<Property name="Precio_usd" column="precio_usd" type="Numeric"/>
<Property name="Unidad_medida" column="unidad_medida" type="String"/>
</Level>
</Hierarchy>
</Dimension>



{"String", "Numeric", "Integer", "Boolean", "Date", "Time", "Timestamp"}

por defecto es
String. Seguido les dejo algnas referenias que me ayudaron a reslver el problema.


Referencias:
http://forums.pentaho.org/showthread.php?t=26453&highlight=upper
http://forums.pentaho.org/showthread.php?t=51166
http://docs.huihoo.com/javadoc/mondrian/3.0.4/src-html/mondrian/olap/MondrianDef.Level.html#line.1193

lunes, 12 de octubre de 2009

Asistente para la publicación de datos en MSSQL 2005


Una herramienta útil para exportar y generar secuencias de comandos para bases de datos y objetos es Database Publishing Wizard, esta nos permite conectarnos a un servidor local o remoto de base de datos Microsoft SQL Server 2005 y realizar estas tareas con gran facilidad y rapidez. Para más información visite los enlaces de referencia. Espero que les sea de utilidad.

Referencias:

sábado, 10 de octubre de 2009

Crear un Esquema de Base Datos en SQL Server Management Studio


Para crear un esquema de base de datos mediante SQL Server Management Studio

1. En SQL Server Management Studio, abrir el Explorador de Objetos y expandir la carpeta Base de datos.

2. Expandir la base de datos en la cual se quiere crear el nuevo esquema.

3. Click derecho en la carpeta Seguridad, Nuevo y click en Esquema.

4. En la página General, entre un nombre para el nuevo esquema en la caja Nombre del esquema.

5. En la caja Propietario del esquema, entre el nombre del usuario de la base de datos o el rol de propietario (dbo) para el esquema.

6. Click OK

Para crear un esquema usando Transact-SQL

1. En el editor de consulta. conectar a la base de datos en la cual se creara el nuevo esquema para ejecutar el siguiente comando Transact-SQL

USE
GO

2. Crear el usuario para ejecutar el siguiente comando Transact-SQL

CREATE SCHEMA AUTHORIZATION [new schema owner] ;
GO


Referencia:


viernes, 18 de septiembre de 2009

Modify DropDown Datawindow DDDW en Power Builder


En la entrada anterior he dejado referencias para el trabajo con el control DropDownDW. Uno de los contratiempos que he tenido trabajando con este control es cuando aplicamos la función Modify sobre un campo, del DataWindow control, que ha sido editado con este estilo (DropDownDW ) y luego queremos acceder a los registros del Datawindow Child, devolvía valores nulos.

Conclusiones, deberíamos recoger los valores antes de aplicar la función Modify, por ejemplo si nos interesaría proteger el campo o mostrar siempre la flecha.

A otros colegas les ha sucedido algo similar y pueden ver sus comentarios en TodoExpertos .


domingo, 13 de septiembre de 2009

Trabajando con DropDownDW Datawindow


El Datawindow posee varios controles que forman parte del Datawindow Object, los cuales pueden ser modificados en tiempo de deseño o ejecución. Esta vez les dejo referencia sobre como trabajar con el dropdown datawindow para obtener o establecer las propiedades que necesitemos. Por ejemplo si recuperamos datos desde una tabla código-descripción y queremos establecer un item por defecto.

Referencias:

miércoles, 9 de septiembre de 2009

Culumnas computadas vs Campos computados en Power Builder


En el trabajo con Datawindow en Power Builder, podemos diseñar un datawindow object con columnas computadas. Estas poseen gran utilidad frente a los campos computados, pues las columnas computadas forman partes del datawindow object, pudiendo establecer o leer los valores mediantes las funciones GetItemString (Number,Decimal,Date,Time,DateTime) o SetItem.

Para construir una columna computada, vamos a Painter Datawindow, luego definimos el Data Source, en modo Sintaxis en "Design - Convert to Syntax" y establecemos la consulta SQL del datawindow object con las columnas de nuestro interes en la tabla seleccionada. Luego podemos adicionar otra columna como número o cadena en el SELECT y al volver al Painter DataWindow se adiciona automáticamente una columna computada a nuestro datawindow object .

Esta es una manera de adicionar columnas, a nuestro datawindow, que no se reflejan en la tabla selecccionada y poder realizar operaciones sobre ella como parte del datawindow object.

Puedes ver el siguiente ejemplo en Converting a Computed Field to a Computed Column

miércoles, 19 de agosto de 2009

Sincronización de marcadores en Chrome 4


Continúa el activo desarrollo del navegador Google Chrome y el lanzamiento de nuevas versiones. Con la versión 4 de desarrollo han incorporado una característica que me ha gustado mucho y que siempre desee que estuviera disponible, se trata se la sincronización de los marcadores en la nube, permitiendo que cualquier usuario lo tenga disponible al usar cualquier equipo.

Para tener esta característica habilitada establecemos el parámetro --enable-sync en las propiedades del acceso directo del escritorio : "C:\Documents and Settings\<usuario>\Configuración local\Datos de programa\Google\Chrome\Application\chrome.exe" --enable-sync


Al ejecutar el navegador con la característica habilitada este sube y almacena los marcadores, utilizando una cuenta de usuario en Google, a través de Google Docs para facilitar el acceso web.




Referencias:


domingo, 16 de agosto de 2009

Salvar y Restaurar Base de Datos en MS SQL Server 2005


Les presento a continuación una vía de salvar y restaurar base de datos de forma práctica mediante sencillos pasos:

Salvar:

1. Paramos la instancia del Servidor MSSQL a través de SQL Server Configuration Manager.

2. En una instalación estandar los archivos de Datos y Logs se guardan en "C:\Archivos de programa\Microsoft SQL Server\MSSQL.1\MSSQL\Data\", debemos copiar los archivos con el nombre de la base de datos a respaldar y con extensiones *.mdf y *.ldf

3. Iniciamos los servicios sqlservr y sqlagent [SQL Server-MSSQL$SQLEXPRESS y SQLAgent$PINNACLESYS]

Restaurar:

1. Iniciamos la instancia del Servidor MSSQL

2. Creamos la base de datos con el mismo nombre

3. Detenemos los servicios relacionados con MSSQL Server

4. Sobreescribimos los archivos con extencion *.mdf y *.ldf de la base de datos a restaurar

5. Reiniciamos el servicio y Listo


jueves, 13 de agosto de 2009

Blogger y resumenes de entradas "Más información"


En el siguiente enlace explican ¿Cómo puedo crear resumenes de entradas ampliables? en Blogger, de manera fácil, modificando la plantilla de nuestro blog. Para la modificación de la plantilla debe ser en "Edición de HTML" y tener chequeado "Expandir plantillas de artilugios", hacemos las modificaciones orientadas sobre la plantilla y luego podremos redactar una entrada (larga) y mejorar su lectura y presentación, mostrando un resumen y enlace adjunto que apunta al resto de la información.


Control de Versiones de Fuente en Power Builder con Subversion


Para lograr esta integración los requisitos son los siguientes:

Requisitos:

Power Builder 10.5

Subversion (aplicaciones de consola SVN)

TortoiseSVN (interfaz visual SVN para Window)

PbSccProxy (ver 2009-08-01)

PBSCC Proxy

Power Builder 10.5 posee una utilidad para hacer algunas operaciones de control de versiones llamadas PBNativo, la cual cumple con el estándar SCC (Source Code Control). Un buen documento que explica como configurar y utilizar un repositorio de fuentes PBNativo se puede consultar en MTBase Sysbase de Colombia.

PBNativo vs. PBSCC Proxy

En el repositorio de fuentes PBNativo no se almacena un histórico de las versiones de cada objeto, es decir de los cambios hechos en cada check-out. Aunque cuando se hace un check-in se incrementa el número de versión del objeto, solamente queda guardada la última versión en el repositorio; mientras que con PBSCC y TortoiseSVN podemos obtener un histórico de manera fácil, además de todas las bondades que podemos tener usando Subversion como control de versiones de nuestros fuentes.

Desarrollo

En esta entrada abordare sobre el software necesario que necesitaríamos para hacer un buen control de versiones en Power Builder utilizando Subversion y PbSccProxy.

1. Descargamos, configuramos e instalamos Subversion. Asegurarse de que este ejecutándose como servicio (svnserve.exe)

2.Creamos el repositorio para los fuentes en Subversion (svnadmin) o mediante TortoiseSVN.

3. Instalamos TortoisesSVN y creamos el repositorio local SVN.

4. Instalamos PbSccsetup (pbsccsetup.exe)

5. Abrimos y configuramos las propiedades del espacio de trabajo (workspace) de nuestro proyecto, para un control de Fuentes utilizando PBSCC Proxy. Veamos las propiedades establecidas:



6. Nos conectamos al repositorio SVN

7. Adicionamos los objetos de nuestro espacio de trabajo al repositorio SVN (Add to Source Control…, haciendo click derecho sobre el workspace)

8. Escribimos el mensaje para log del SVN

9. Verificar que los objetos (SR*) fueron adicionados al repositorio SVN

10. Actualizamos nuestra espacio de trabajo haciendo un "PowerBuilder Check Out"

11. Ver el historial del objeto, haciendo click derecho sobre el objeto de la librería y "Show History".


miércoles, 12 de agosto de 2009

Informe de Bodega III

Estas son las últimas respuestas a preguntas relacionadas con el Informe de Bodega (I y II)

Confeccionar una consulta SQL que permita:

5. Obtener para cada producto el stock actual (considerar todas las compras y ventas)

SELECT p.pro_codigo, ((

SELECT ISNULL(SUM(compra.com_cantidad),0)

FROM compra

WHERE p.pro_codigo=compra.pro_codigo)-(

SELECT ISNULL(SUM(venta.vta_cantidad),0)

FROM venta

WHERE p.pro_codigo=venta.pro_codigo)) AS stock

FROM producto p




6. Obtener un listado de todos los productos que se encuentran bajo el stock crítico.

SELECT p.pro_codigo

FROM producto p

GROUP BY p.pro_codigo, p.pro_stock

HAVING p.pro_stock > ((

(

SELECT ISNULL(SUM(compra.com_cantidad),0)

FROM compra

WHERE p.pro_codigo=compra.pro_codigo)-(

SELECT ISNULL(SUM(venta.vta_cantidad),0)

FROM venta

WHERE p.pro_codigo=venta.pro_codigo))

)



7. Obtener por cada producto, el código, nombre y precio vigente el 01 de Enero de 2008.

SELECT p.pro_codigo , producto.pro_nombre, p.pre_valor

FROM precio p, producto

WHERE pre_desde = (

SELECT MAX(pre_desde) FROM precio

WHERE pro_codigo=p.pro_codigo AND pre_desde < '20080101')

AND producto.pro_codigo=p.pro_codigo


lunes, 10 de agosto de 2009

Temas para Google Chrome

Con las nuevas versiones de Google Chrome, han mejorado muchas características, como son la velocidad de ejecución y navegación, optimización de cada una de las pestañas, entre otras .

Una característica que le gusta a muchos usuarios es la personalización. En este punto Chrome posee una colección de temas
(themes) para personalizar el ambiente gráfico y brindar una navegación más agradable. Sientese libre de instalar el que más le guste, pues da la posibilidad de volver al tema por defecto si no se siente satisfecho.


viernes, 7 de agosto de 2009

Informe de Bodega II

Continuamos respondiendo dos preguntas sobre el Informe de Bodega que vimos recientemente. Pueden obtener los datos de ejemplo en el respaldo de la base de datos. Recuerden compartir sus respuestas o vias de solución, dejando sus comentarios.


Confeccionar una consulta SQL que permita:

3. Obtener el código y nombre de cada producto que registre más de 500 unidades vendidas durante el 2005.

SELECT producto.pro_codigo, producto.pro_nombre

FROM producto, venta

WHERE producto.pro_codigo=venta.pro_codigo AND vta_fecha BETWEEN '20050101' AND '20051231'

GROUP BY producto.pro_codigo, venta.vta_cantidad, producto.pro_nombre

HAVING 500 < SUM(vta_cantidad)



4. Obtener cada uno de los productos que no registra ventas en el último mes.

SELECT producto.pro_codigo, producto.pro_nombre

FROM producto

WHERE pro_codigo NOT IN

(SELECT pro_codigo

FROM venta

WHERE venta.vta_fecha BETWEEN DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) AND dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))

)