lunes, 21 de diciembre de 2009

Ejecución programada de scripts con MySQL

Si utilizas sistemas operativos Windows, y como motor de base de datos a MySql, es posible que tengas que configurar procesos recurrentes, para respaldo o mantenimiento a la base de datos, por ejemplo.

Pues bien, si vienes de utilizar MS SQL Server, recordarás que Enterprise Manager ( o de 2005 para acá Management Studio ) y SQL Agent tiene las opciones que necesitas, pero ¿cómo lograrlo con MySQL?

Podemos echar mano del cliente de consola de MySQL ( mysql.exe ) combinandola con las tareas programadas de windows.

Lo que haremos será crear un archivo *.bat ( ejecución de comandos por lotes o "batch file" que utilice las herramientas de consola de MySQL y despues se programa su ejecución con una tarea programada. )

Ejemplos:
Operaciones a la base de datos a través de scripts.

Paso 1: Crear un archivo sql con las operaciones que necesites, como creación de indíces, actualización de registros, etc. Guardalo con la extención *.sql.

Paso 2: Crear un archivo *.bat, con el siguiente contenido:
mysql --user=[nombreusuario] --password=[pwdusuario] [basededatos] < [tuscript.sql]

Donde:
[nombreusuario] es el nombre del usuario que utilizarás para conectarte a MySQL Server.
[pwdusuario] es el password del usuario.
[tuscript.sql] es la ruta del script.
[basededatos] es el nombre de la base de datos en la que se deberán efectuar las operaciones.

Puedes grabar los dos archivos en el mismo directorio, para que puedas poner solamente el nombre del archivo.

Paso 3: Crear una Tarea Programada en Windows para que "apunte" al archivo *.bat creado, en la programación requerida.


Bueno, todo esto esta muy bien pero, ¿y los respaldos? Pues bien, para ello echaremos mano de sqldump.

Paso 1: Crear un archivo *.bat con el contenido:
mysqldump --user=[nombreusuario] --password=[pwdusuario] [basededatos] > [tubackfile.sql]

Donde:
[nombreusuario] es el nombre del usuario que utilizarás para conectarte a MySQL Server.
[pwdusuario] es el password del usuario.
[tubackfile.sql] es la ruta del archivo donde se guardará el respaldo.
[basededatos] es el nombre de la base de datos en la que se deberá efectuar el respaldo.

Paso 2: Crear una Tarea Programada en Windows para que "apunte" al archivo *.bat creado, en la programación requerida.

Y eso es todo amigos! Fácil ¿no? Ok, espero les sea de utilidad, nos vemos.

jueves, 13 de agosto de 2009

Data Drop Down en PHP

Hola, esta vez publico una sencilla función para renderear datos a un objeto "select" o "drop down" HTML, desde una consulta a una base de datos MySql, por medio de PHP.

Esto nos puede ser muy util, a la hora de traer los datos, al llamar simplemente a una función, en lugar de tener que estar recorriendo los registros de la consulta, adecuando la impresión y codificando el HTML cada vez.

El código de la función es:


Codigo PHP
<?php
/**
* Funcion de Data Drop Down.
*/
function DataDropDown($id,$rs,$val,$display)
{
if( $rs )
{
$select = '<select id="' . $id . '">';
while($row = $this->mysql_fetch_array($rs))
{
$select .= '<option value="' . $row[$val] . '">' . $row[$display] . '</option>';
}
$select .= '</select>';
echo $select;
}
else

{
echo mysql_error($Conn);
}
}


?>




El uso de la función quedaría:


Codigo PHP
<?php


$Conn = mysql_connect("tuserverurl","tuusuario","tupassword",TRUE) or die("Error de conexion:" . mysql_error($Conn));
mysql_select_db("tubasededatos",$Conn);

$sqlqry = "SELECT Campo1 as Folio,

Campo2 as Descripcion
FROM TuTabla;";


$rs = mysql_query($sqlqry,$Conn);

if( $rs )
{
echo DataDropDown("MyDataDropDown",$rs,"Folio","Descripcion");
}
else

{
echo "Error en la conexion con MySQL Server:" . mysql_error($Conn);
}

?>




Lo cual nos daría por resultado, por ejemplo, si se consulta una tabla de "Marcas" como ejemplo:



Como se puede observar, el ahorro de código al llamar a la función en una línea, en comparación con el recorrido de registros es significativo, por lo que es una función realmente útil para aplicaciones con formularios que contengan selecciones multiples.

Happy coding!

miércoles, 29 de julio de 2009

Clase para crear un RSS Feed en PHP

En esta ocasión les quiero compartir una sencilla clase para poder realizar un RSS desde PHP. Con ella, simplemente es necesario traer una consulta con los campos llamados: "Title", "Link", "Description" y "PubDate", ajustables a cualquier consulta, media la clausa "AS". Ejemplo, si el campo de tu table se llama "nombre_articulo", lo seleccionas como " AS Title".

Posteriormente se crea una instancia de la clase, y se manda llamar la función principal. Mediante la instrucción "echo" se imprime el resultado, que esta en formato xml, esuqematizado para RSS versión 2.0.

Ahora veamos el código de la clase:


Codigo PHP
<?php
/**

* PHP Feeder, clase para contruir un feeder a partir de una consulta
* a una base de datos.
*/

Class Feeder
{

Function Feed($title, $link, $description, $result)
{
$feedstr = "";

$feedstr .= '<?xml version="1.0" encoding="UTF-8"?>';
$feedstr .= $this->RssTag($this->ChannelTag($this->TitleTag($title) .
$this->LinkTag($link) .
$this->DescriptionTag($description) . $this->FeedItems($result)));

return $feedstr;
}


function FeedItems($result)
{
$feefitems = "";

if( $result )
{
while($row = mysql_fetch_array($result))
{
$feeditems .= $this->ItemTag($this->TitleTag($row["Title"]) .
$this->LinkTag($row["Link"]) . $this->DescriptionTag($row["Description"]) .
$this->PubDateTag($row["PubDate"]));
}
}

return $feeditems;
}

function PubDateTag($content)
{
return "<pubDate>\n\t" . $content . "\n</pubDate>\n";
}

function DescriptionTag($content)
{
return "<description>\n\t" . $content . "\n</description>\n";
}

function LinkTag($content)
{
return "<link>\n\t" . $content . "\n</link>\n";
}

function TitleTag($content)
{
return "<title>\n\t" . $content . "\n</title>\n";
}

function ItemTag($content)
{
return "<item>\n\t" . $content . "\n</item>\n";
}

function ChannelTag($content)
{
return "<channel>\n\t" . $content . "\n</channel>\n";
}

function RssTag($content)
{
return "\n" . '<rss version="2.0">' . "\n\t" . $content . "\n</rss>\n";
}

}

?>



El uso de esta clase en una página externa quedaría:



Codigo PHP

<?php
/**

* Prueba de PHPFeeder.
*/

include("Feeder.php");

$Conn = mysql_connect("tuserverurl","tuusuario","tupassword",TRUE) or die("Error de conexion:" . mysql_error($Conn));
mysql_select_db("tubasededatos",$Conn);

$sqlqry = "SELECT Campo1 as Title,
Campo2 as Description,
Campo3 as Link,
Campo4 as PubDate
FROM TuTabla
ORDER BY Campo4 DESC
LIMIT 100;";


$rs = mysql_query($sqlqry,$Conn);

$Feed = new Feeder();
echo $Feed->Feed("Titulo del feed", "http://urlDelFeed",
"Descripción del feed", $rs);


if( $rs )
{
echo $Feed->Feed("Titulo del feed", "url del feed",
"Descripción del feed", $rs);
}
else

{
echo "Error en la conexion con MySQL Server:" . mysql_error($Conn);
}

?>






Y esto nos dará por resultado un canal de noticias en RSS.

Aunque ya la mayoría de los blogs y sistemas de administración de contenido tienen preinstaladas herramientas para feed, el tener una clase propia y sencilla de usar tiene sus ventajas, ya que se le pueden dar usos personalizados, como rastreador de eventos espeficicos, errores, auditorías, o el clasico uso de noticias con mayor control, etc., sin echar mano de correos, ya que estos pueden consumir recursos y transferencia del servidor en mayor medida que los canales de noticias.

lunes, 20 de julio de 2009

Conversiones binario, octal y hexadecimal a decimal en SQL Server

Como continuación del anterior artículo, esta vez veremos como convertir de cualquier base numérica (hexadecimal, octal y binaria) a base decimal en SQL Server. A continuación presentamos el código:


Codigo T-SQL

CREATE FUNCTION dbo.udf_base_a_decimal(@S varchar(250), @Base int)

RETURNS bigint

AS

BEGIN

DECLARE @Result bigint, @i int, @P int,

@NumChars varchar(50)

-- Declaramos las variables

SET @NumChars = '0123456789ABCDEF'

SET @Result = -1

SET @S = UPPER(@S)

SET @i = 1

-- Validamos las bases

IF ( (@Base = 2) OR (@Base = 8) OR (@Base = 16) OR (@Base = 10) )

BEGIN

SET @Result = 0

-- Iniciamos el ciclo

WHILE ( @i <= LEN(@S) )

BEGIN

SET @P = CHARINDEX(SUBSTRING(@S,@i,1),@NumChars)

IF ( (@P = 0) OR (@P > @Base) )

BEGIN

SET @Result = -1

BREAK

END

SET @Result = @Result + (@P - 1) * (POWER(@Base,(LEN(@S) - @i)))

SET @i = @i + 1

END

END

RETURN @Result

END

GO





La forma de usar esta función es:

Codigo T-SQLSELECT dbo.udf_base_a_decimal('1000111010100',2)

SELECT dbo.udf_base_a_decimal('10724', 8)

SELECT dbo.udf_base_a_decimal('11D4', 16)




Los resultados obtenidos

Resultados T-SQL
--------------------
4564

(1 row(s) affected)


--------------------
4564

(1 row(s) affected)


--------------------
4564

(1 row(s) affected)





Es todo por ahora, nos leeremos la próxima.

sábado, 18 de julio de 2009

Conversiones decimal a binario, octal y hexadecimal en SQL Server

En esta ocasión veremos una función simple para convertir numeros decimales a otras bases como son, binario, octal y hexadecimal.


Codigo T-SQLCREATE FUNCTION dbo.udf_decimal_a_base(@N bigint, @Base int)

RETURNS varchar(200)

AS

BEGIN

-- Declaramos las variables a utilizar

DECLARE @Result varchar(200),

@NumChars varchar(50)

-- Inicializamos las variables

SET @NumChars = '0123456789ABCDEF'

SET @Result = ''

-- Validamos la base a convertir

IF ( (@Base = 2) OR (@Base = 8) OR (@Base = 10) OR (@Base = 16) )

BEGIN

-- Ejecutamos el ciclo

WHILE ( @N > 0 )

BEGIN

-- Realizamos la conversion

SET @Result = SUBSTRING(@NumChars,(@N % @Base) + 1,1) + @Result

-- Disminuimos N, dividiendola entre la base

SET @N = FLOOR(@N / @Base)

END

END

-- Retornamos el resultado

RETURN @Result

END

GO



El uso de esta funcion quedaría:

SELECT dbo.udf_decimal_a_base(4564,2)

SELECT dbo.udf_decimal_a_base(4564,8)

SELECT dbo.udf_decimal_a_base(4564,16)

Codigo T-SQL

Dandonos como resultados:


Resultados T-SQL---------------------------------------------------------------------------------------------
1000111010100

(1 filas afectadas)

---------------------------------------------------------------------------------------------
10724

(1 filas afectadas)

---------------------------------------------------------------------------------------------
11D4

(1 filas afectadas)



Esta función puede incluirse dentro de Stored Procedures y tener múltiples aplicaciones, espero que les sirva. Hasta la próxima.

miércoles, 1 de abril de 2009

Enviar correo con SQL SERVER (sin SQLMail)

Enviar correos desde SQL SERVER 2000 sin utilizar SQLMail es posible. Se logra utilizando CDONTS.

Lo que tenemos que hacer, es crear un objeto CDO.Message, confirgurar las propiedades tal y como lo haríamos si lo fueramos a utilizar desde una página ASP y enviar el mensaje. El siguiente codigo fuente comentarizado detalla el proceso de configuración y envío.

*** Nota: Tenemos la limitante de CDONTS, máximo 4000 caracteres en el mensaje.

Codigo fuente

CREATE PROCEDURE usp_EnviarCorreo

(

@De varchar(100),

@Para varchar(100),

@Titulo varchar(100),

@Mensaje varchar(4000),

@TipoMensaje varchar(50) -- 'HTMLBody' ó 'TextBody'

)

AS


DECLARE @ObjMensaje int,

@RC int,

@Fuente varchar(255),

@Descripcion varchar(500),

@MsjSalida varchar(1000),

@Servidor varchar(100),

@Puerto varchar(10),

@Autenticar char(1),

@Usuario varchar(100),

@Password varchar(100)


-- Aqui ahi que cambiar los valores por los reales de la cuenta a usar


SET @Autenticar = '1' -- Manda a autentificarse con una cuenta y password

SET @Servidor = 'TuServidor' -- Nombre de host o IP

SET @Usuario = 'TuUsuario' -- Nombre de usuario, en los servidores POP puede ser la direccion de correo completa

SET @Password = 'TuPassword' -- Password de la cuenta de correo

SET @Puerto = 'TuPuerto' -- Puerto de correo, normalmente es el 25, aunque esto puede cambiar dependiendo del ISP


-- Crear el objeto CDO.Message

EXEC @RC = sp_OACreate 'CDO.Message', @ObjMensaje OUT


-- Configurar el SMTP remoto

EXEC @RC = sp_OASetProperty @ObjMensaje, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusing").Value','2'

-- Set: Servidor

EXEC @RC = sp_OASetProperty @ObjMensaje, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value', @Servidor

-- Set: Puerto

EXEC @RC = sp_OASetProperty @ObjMensaje, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value', @Puerto

-- Set: Autenticacion

EXEC @RC = sp_OASetProperty @ObjMensaje, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value', @Autenticar

-- Set: Usuario

EXEC @RC = sp_OASetProperty @ObjMensaje, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusername").Value', @Usuario

-- Set: Password

EXEC @RC = sp_OASetProperty @ObjMensaje, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value', @Password

-- Guardar cambios

EXEC @RC = sp_OAMethod @ObjMensaje, 'Configuration.Fields.Update', null


-- Parametros del correo:


-- Para:

EXEC @RC = sp_OASetProperty @ObjMensaje, 'To', @Para

-- De:

EXEC @RC = sp_OASetProperty @ObjMensaje, 'From', @De

-- Titulo:

EXEC @RC = sp_OASetProperty @ObjMensaje, 'Subject', @Titulo

-- Tipo de mensaje y mensaje:

EXEC @RC = sp_OASetProperty @ObjMensaje, @TipoMensaje, @Mensaje


-- Enviar el correo:

EXEC @RC = sp_OAMethod @ObjMensaje, 'Send', NULL



-- Obtener el mensaje de salida, tanto por éxito como por error.

IF ( @RC <> 0 )

BEGIN

EXEC @RC = sp_OAGetErrorInfo NULL, @Fuente OUT, @Descripcion OUT

IF ( @RC = 0 )

BEGIN

SET @MsjSalida = 'Error enviando el mensaje, Fuente:' +

@Fuente + ', Descripcion: ' + @Descripcion

END

ELSE

BEGIN

SET @MsjSalida = 'Error enviando el mensaje. Error obteniendo información de la falla'

END

END

ELSE

BEGIN

SET @MsjSalida = 'Envío realizado'

END


-- Limpiar el objeto

EXEC @RC = sp_OADestroy @ObjMensaje


-- Mostrar el mensaje

SELECT @MsjSalida


GO



No debes olvidar cambiar los valores de servidor, usuarios, password y puerto por los de la cuenta que desees usar. Nos leemos en la próxima entrega. Happy Mailing.

miércoles, 25 de marzo de 2009

Visual Studio Express Edition 2008

La versión gratuita de Visual Studio de Microsoft resulta bastante útil. El sitio brinda la posibilidad de descargar herramientas específicas o todas en un ISO. Debido a que el enfoque de nuestro sitio es la simplicidad, nos enfocaremos en Visual Web Developer 2008 y Visual Basic 2008. No es que no sea posible desarrollar sistemas de manera fácil y rápida con Visual C# y Visual C++, no obstante, estas herramientas aumentan en complejidad significativamente, aunque también en potencia y en capacidad.
Las ventajas son:
  1. Absolutamente gratis (solo tienes que registrar tu copia).
  2. Incluye Sql Server Express 2008 por separado y en dos de sus distribuibles.
  3. Puedes utilizarlos tanto para desarrollo profesional como para aprendizaje.
  4. Gran variedad de controles.
  5. Orientación total a objetos.

Las desventajas… las mismas que cualquier software corriendo bajo Windows, no obstante debo decir que específicamente estos están muy bien diseñados e incorporados.
He aquí el link de descarga: http://www.microsoft.com/exPress/download/
En las próximas entregas nos ocuparemos de su estudio, y de claro, la manera fácil de desarrollas medienta esta poderosa herramienta. Hasta pronto.

lunes, 23 de marzo de 2009

Moprosoft

¿Qué es el Moprosoft?

En pocas palabras, es un conjunto de mejores prácticas para el desarrollo del software, aunque enfocado desde el punto de vista organizacional, no de programación de manera específica. Significa "Modelo de Procesos para la Industria del Software", y esta regulado, es decir, es oficialmente una norma mexicana.

El modelo de Procesos contempla nueve procesos básicos, distribuidos en tres categorías, que son:
Categoría de Alta Dirección (DIR).
1.- Gestión de Negocios.
Categoría de Gerencia (GER).
2.- Gestión de Procesos.
3.- Gestión de Proyectos.
4.- Gestión de Recursos.
5.- Bienes, Servicios e Infraestructura.
6.- Recursos Humanos y Ambiente de Trabajo.
7.- Conocimiento de la Organización.
Categoría de Operación (OPE).
8.- Administración de Proyectos Específicos.
9.- Desarrollo y Mantenimiento de Software.

Bien, mediante un Patrón de Procesos, se estipula la manera en que cada proceso se documenta. Utilizando esta documentación de procesos, se implementa dentro de las organizaciones, la norma.

¿Es útil Moprosoft?
La pregunta es ¿Útil para quién? Como desarrolladores realmente no nos es muy útil, no proporciona metodologías maravillosas que nos saquen de apuros, por el contrario, “burocratiza” mucho el trabajo.

¿Es útil para las organizaciones? Sí. Definitivamente si lo es. La estructura de los procesos y las actividades, si se ejecutan correctamente en toda la organización, conllevarían un control de documentación bastante útil, además de proveer de herramientas de trabajo estandarizadas.

¿Es útil para los desarrolladores freelance o para quienes quieren trabajar de manera independiente? Sí, sí lo es. Las principales ventajas que observo en Moprosoft son el control del flujo de proyectos y su instrumentación. Los procesos de Gestión de Negocios, Gestión de Proyectos y Administración de Proyectos Específicos realmente valen la pena, tanto para los desarrolladores freelance, como los programadores y administradores de proyectos que trabajen en alguna empresa.

Por ahora, dejaremos el tema hasta aquí, no obstante, posteriormente nos involucraremos más en el tema de la implementación y el uso del modelo, sus ventajas, sus desventajas, etc. Si tienen alguna opinión del presente artículo, no duden en dejar sus comentarios. Hasta la próxima.

Enlaces de interés:

Mas posts de Moprosoft en este blog.

NYCE, organización verificadora:http://www.moprosoft.com.mx/

Comunidad Moprosoft, de su página de descargas se pueden obtener los documentos: http://www.comunidadmoprosoft.org.mx