viernes, 25 de marzo de 2011

Reiniciar Campos Identity en SQL Server


use NOMBRE-BASE-DE-DATOS
/* PERMITE REINICIAR EL VALOR DE UN CAMPO IDENTITY A CERO*/
/**/
/**/
DECLARE @NombreTabla VARCHAR(30)
DECLARE @TotalTablas INT
SET @TotalTablas=0
DECLARE Tablas CURSOR FOR
SELECT Name FROM SYS.objects T WHERE T.type='U' AND T.name NOT IN
('sysdiagrams',
'TABLA X')

OPEN Tablas

/*IF @@CURSOR_ROWS>0*/
/*PRINT @@CURSOR_ROWS*/
FETCH NEXT FROM Tablas
INTO @NombreTabla

WHILE @@FETCH_STATUS=0
BEGIN
PRINT 'REINICIANDO '+ @NombreTabla+'...'
SET @TotalTablas=@TotalTablas+1
DBCC CHECKIDENT (@NombreTabla, RESEED,0)
FETCH NEXT FROM Tablas
INTO @NombreTabla
END
PRINT CONVERT(VARCHAR,@TotalTablas) +' TABLAS FUERON REINICIADAS'
/*END*/
CLOSE Tablas
DEALLOCATE Tablas

viernes, 11 de marzo de 2011

Generar Diccionario de datos para Base de Datos SQL Server

A continuacion muestro el script sql, aplica para cualquier base de datos....




declare @databases varchar(150)

set @databases = 'AQUI PONEN EL NOMBRE DE LA BASE DE DATOS'

use NOMBRE DE LA BASE DE DATOS

set nocount on

declare @srvname sysname

/* Variables para llenar el combo*/
declare @nombre_tabla varchar(80)

/* Variables para la base de datos */
declare @db_name sysname
declare @dbid smallint
declare @db_filename nvarchar(520)
declare @db_crdate datetime

/* Variables archivos */
declare @f_name nchar(256)
declare @f_filename nchar(520)
declare @f_size int
declare @f_groupname sysname

/* Variables tablas de la bd */
declare @id int
declare @table_name sysname
declare @Descripcion_tabla varchar(max)
declare @xtype char(2)
declare @crdate datetime
declare @refdate datetime

/* Variables columnas de laas tablas */
declare @column_name sysname
declare @column_desc varchar(max)
declare @column_type sysname
declare @cdefault int
declare @isnullable int
declare @pk char(2)

select @db_name = name, @dbid = dbid, @db_filename = filename, @db_crdate = crdate
from master..sysdatabases where dbid = db_id(@databases)

select top 1 @srvname = srvname from master..sysservers

print '<html>'
print '<head><title>'
print 'Diccionario de Datos'
print '</title>'

print '<script>'
print 'function navegar(){'
print 'var indice = document.form1.Listado.selectedIndex'
print 'location.href="#"+document.form1.Listado.options[indice].text'
print '}'
print '</script>'

print '<style type="text/css">'
print '<!--'
print '.style5 {color: #CCCCCC; font-weight: bold; }'
print '.style6 {color: #0000CC}'
print '.style7 {color: #000066}'
print '-->'
print '</style>'
print '</head>'
print '<body>'
print '<form name="form1">'
print '<div>'

print '<div>'
print '<h1><span class="style7">Base de Datos: </span>' + @db_name + '</h1>'
print '<hr noshade/>'
print '<strong><span class="style7">Archivo: </span>' + @db_filename + '</strong>'
print '<br />'

print '<strong><span class="style7">Fecha de Creación: </span>' + convert(varchar,@db_crdate) + '</strong>'

print '<br />'
print '<strong><span class="style7">Servidor: </span>' + (@srvname) + '</strong>'
print '<hr />'

declare files_cursor cursor for

select name, filename, size, isnull((select groupname from sysfilegroups b where b.groupid = a.groupid),'N/A')
from sysfiles a

open files_cursor

fetch next from files_cursor
into @f_name, @f_filename, @f_size, @f_groupname

print '<ul>'

while @@fetch_status = 0
begin

print '<li><b>' + @f_name + '</b&gt;<br /> - Archivo: ' + @f_filename + '<br /> - Tamaño (Bytes): ' + convert(varchar,@f_size) + '<br /> - Grupo de Archivos: ' + @f_groupname + '</li>'

fetch next from files_cursor
into @f_name, @f_filename, @f_size, @f_groupname

end
print '</ul>'

close files_cursor
deallocate files_cursor


declare llena_combo cursor for
select x.name
from
sysobjects x
where xtype = 'u' order by x.name

open llena_combo

fetch next from llena_combo
into @nombre_tabla

print '<A name="inicio"></A>'
print '<hr noshade/>'
print'Elija Nombre Tabla: <SELECT name="Listado" onChange="navegar()">'
while @@FETCH_STATUS=0
begin
PRINT '<option value='+@nombre_tabla+'>'+@nombre_tabla+'</option>'
fetch next from llena_combo
into @nombre_tabla
end
print '</select>'
print '<hr noshade/>'
close llena_combo
deallocate llena_combo

declare table_cursor cursor for

select id,x.name, CONVERT(varchar(max),ep.value), xtype, crdate, refdate
from
sysobjects x inner join sys.extended_properties ep
on x.id=ep.major_id and ep.name='Descripción'
where xtype = 'u' order by x.name

open table_cursor

fetch next from table_cursor
into @id, @table_name,@Descripcion_tabla, @xtype, @crdate, @refdate

while @@fetch_status = 0
begin

print ' <h2><a NAME='+@table_name+'> Tabla: ' + @table_name + '</A></h2>'
print ' <h4 class="style6">Fecha Creación: ' + convert(varchar,@crdate) + '</h4>'
print '<h4 class="style6">Descripción: '+@descripcion_tabla+'</h4>'
print ' <table border="1" cellpadding="2" cellspacing="0" bordercolor="#CCCCCC">'
print ' <tr bordercolor="#0066CC" bgcolor="#0066CC">'
print ' <th><span class="style5"> </strong></th>'
print ' <th><span class="style5">Nombre Columna</strong></th>'
print ' <th><span class="style5">Descripción</strong></th>'
print ' <th><span class="style5">Tipo de dato</strong></th>'
print ' <th><span class="style5">Valor por defecto</strong></th>'
print ' <th><span class="style5">Nulo</strong></th>'
print ' </tr>'

declare columns_cursor cursor for
select
c.name,
CONVERT(varchar (max),ep.value),
b.name,
cdefault,
isnullable,
pk = isnull((Select TOP 1 CONSTRAINT_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE X where X.COLUMN_NAME=c.name and  CONSTRAINT_NAME like 'PK%' and X.TABLE_NAME=@table_name),' ')
from   sys.objects o INNER JOIN sys.extended_properties ep
            ON o.object_id = ep.major_id
            INNER JOIN sys.schemas s
            ON o.schema_id = s.schema_id
            LEFT JOIN syscolumns c
            ON ep.minor_id = c.colid
            AND ep.major_id = c.id
            ,systypes b  
where b.xtype = c.xtype and c.id=@id
order by c.colid

open columns_cursor

fetch next from columns_cursor
into @column_name,@column_desc,@column_type,@cdefault, @isnullable, @pk

while @@fetch_status = 0
begin

print ' <tr>'
print ' <td>' + CONVERT(VARCHAR,@pk) + '</td>'
print ' <td>' + ISNULL(@column_name,'VARCHAR') + '</td>'
print ' <td>' + @column_desc+ '</td>'
print ' <td>' + ISNULL(@column_type,'VARCHAR') + '</td>'
print ' <td>' + CONVERT(VARCHAR,@cdefault) + '</td>'
print ' <td>' + CONVERT(VARCHAR,@isnullable) + '</td>'
print ' </tr>'

fetch next from columns_cursor
into @column_name,@column_desc,@column_type,@cdefault, @isnullable, @pk

end

print ' </table>'
print '<br><a href=#inicio>=|=Volver=|=</a>'
close columns_cursor
deallocate columns_cursor

fetch next from table_cursor
into @id, @table_name,@Descripcion_tabla, @xtype, @crdate, @refdate

end

close table_cursor
deallocate table_cursor

print '</div>'

print '</div>'
print '</form>'
print '</body>'
print '</html>'

martes, 30 de noviembre de 2010

CALCULO DE LA CURP PARA PODER INCLUIRLA EN SUS APLICACIONES...EN C#

Hace unos días publiqué la manera de como poder obtener el RFC, para personas morales y físicas, para poder integrarlo en sus aplicaciones.
En esta ocasión quiero mostrarles como hacer el cálculo de la CURP, ya que seguramente algunas vez en clases han hecho tareas de las materias de Chico, Serafín o Clemente, y en sus formularios incluyen un campo que se llama CURP, pues con solo conocer los datos de nacimiento de la persona podrán hacer el cálculo de la CURP, sin verse en la molestia de tener que teclear los 18 dígitos que la integran.

Requisitos:
·        Microsoft Visual Studio 2008
·        Unos cuantos nombres de personas para prueba….
Iniciando
Lo primero que haremos será crear un nuevo proyecto del tipo Windows Form, en este caso lo llamaré “ObtieneCURP”, el diseño deberá quedar más o menos así:
A continuación declaramos las siguientes variables, de alcance global:
        char SEXO;
        string[,] estados;

SEXO”: Esta variable almacenará un dígito según el sexo elegido por el usuario (M=Masculino, F=Femenino).
ESTADOS”: Arreglo de dimensión 34*2 en el cual almacenaremos los estados con su respectivo código.

Luego declaramos el siguiente método:
/// <summary>
        /// AL perder el foco la caja de texto, convierte el texto a
        /// mayúsculas,para ello asignar este metodo al evento Leave
        /// del TextBox
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
       
        private void Mayus(object sender, EventArgs e)
        {
            TextBox texto = (TextBox)sender;
            texto.Text = texto.Text.ToUpper();
        }

Este método nos permitirá convertir el texto contenido en los texBox a mayúsculas, para ello en el evento “Leave” de los TexBox (el del apellido paterno, del materno y del nombre) asignar el método “Mayus()”.

Después, en el evento “Load()” del formulario agregamos el siguiente código:
private void Form1_Load(object sender, EventArgs e)
        {
            //string[,]
                estados =new string[,]
            {
                {"",""},
                {"AGUASCALIENTES","AS"},
                {"BAJA CALIFORNIA","BC"},
                {"BAJA CALIFORNIA SUR","BS"},
                {"CAMPECHE","CC"},
                {"CHIAPAS","CS"},
                {"CHIHUAHUA","CH"},
                {"COAHUILA","CL"},
                {"COLIMA","CM"},
                {"DISTRITO FEDERAL","DF"},
                {"DURANGO","DG"},
                {"GUANAJUATO","GT"},
                {"GUERRERO","GR"},
                {"HIDALGO","HG"},
                {"JALISCO","JC"},
                {"MEXICO","MC"},
                {"MICHOACAN","MN"},
                {"MORELOS","MS"},
                {"NAYARIT","NT"},
                {"NUEVO LEON","NL"},
                {"OAXACA","OC"},
                {"PUEBLA","PL"},
                {"QUERETARO","QT"},
                {"QUINTANA ROO","QR"},
                {"SAN LUIS POTOSI","SP"},
                {"SINALOA","SL"},
                {"SONORA","SR"},
                {"TABASCO","TC"},
                {"TAMAULIPAS","TS"},
                {"TLAXCALA","TL"},
                {"VERACRUZ","VZ"},
                {"YUCATÁN","YN"},
                {"ZACATECAS","ZS"},
                {"NACIDO EXTRANJERO","NE"}
            };
           
            dateTimePicker1.Format = DateTimePickerFormat.Custom;
            dateTimePicker1.CustomFormat = "yy/MM/dd";

            int contador=0;
            comboBox1.Items.Add("<Seleccione Estado>");
            comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
            comboBox1.SelectedIndex = 0;
            while (contador != estados.Length / 2)
            {
                comboBox1.Items.Add(estados[contador,0]);
                contador++;
            }
            comboBox1.Items.Remove("");
        }
Lo que hacemos en estas líneas, es primeramente, llenar el arreglo con todos los estados y su respectivo código asignado para el cálculo de la CURP.
Luego asignamos el formato de cómo se muestra la fecha del “dateTimePicker” a personalizado (“año en dos cifras/mes/día”), después procedemos a llenar el “comboBox” de estados con lo que contiene el arreglo “estados”.

A continuación agregamos un nuevo método llamado “ObtieneSexo()”:
private string ObtieneSexo()
        {
            if (radioButton1.Checked)
            {
                SEXO = 'H';
            }
            else if (radioButton2.Checked)
            {
                SEXO = 'M';
            }
            else
            {
                SEXO = 'X';
            }

            return SEXO.ToString();
        }

Este método lo que hará es retornar un digito indicando el sexo elegido.

Luego procedemos a agregar la referencia a la librería “CURPLib”, que es la que nos generará la CURP, para ello hacemos click derecho sobre el proyecto (“ObtieneCURP”), y clicamos en “agregar referencia”, y elegimos la librería (se incluye en la carpeta donde viene el código fuente, aunque en el código fuente ya viene agregada la referencia).

Luego en el evento click del botón que hará el cálculo de la CURP agregamos las siguientes líneas:

private void button1_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(estados[comboBox1.SelectedIndex, 1]) || ObtieneSexo().Equals("X") || string.IsNullOrEmpty(textBox1.Text) || string.IsNullOrEmpty(textBox3.Text))
            {
                MessageBox.Show("Por favor ingrese todos los datos...","Mira Bien...");
            }
            else
            {
                CURPLib.CURPLib calculocurp = new CURPLib.CURPLib();
                //MessageBox.Show(SEXO.ToString());
                textBox4.Text = calculocurp.CURPCompleta(textBox1.Text, textBox2.Text, textBox3.Text, dateTimePicker1.Text, ObtieneSexo(), estados[comboBox1.SelectedIndex, 1]);
                //.Show(estados[comboBox1.SelectedIndex,1]);
            }
        }

Primero se hace una validación que no haya campos vacios (solo se acepta apellido materno vacio), después creamos una nueva instancia de CURPLib, y luego  en la propiedad “Text” del campo donde se mostrará el CURP calculado, asignamos el resultado de ejecutar el método “CURPCompleta”, que recibe 6 parámetros: el apellido paterno, el apellido materno, el nombre, la fecha de nacimiento en formato de año en 2 dígitos/mes/día, el sexo y por último la clave de estado.
Para mostrar que funciona pueden probar con los siguientes datos:

Y el resultado mostrado deberá ser igual al de la imagen:.

Bueno pus parece que esto es todo por hoy, y no olviden hacer sus comentarios, se los agradeceré muchísimo….

J
El codigo fuente del ejemplo lo pueden descargar del siguiente enlace

domingo, 28 de noviembre de 2010

CONVERTIR NUMEROS ROMANOS A LETRAS…EN C#

El día de ayer como no tenía nada que hacer, me encontraba realizando la librería para obtener el RFC, además del tutorial para implementarla, pero leyendo la documentación del SAT me encontré con 2 obstáculos al momento de querer obtener el RFC para personas morales. El primer obstáculo era que si en la razón social se encuentra un numero (12, 13,500, etc.) para hacer el cálculo de la homonimia hay que convertir el numero a su correspondiente en letras, pero hice un poco de memoria y recordé que para convertir de números a letras ya había hecho una librería meses antes (Convertir Numeros a Letras en C#), en fin problema resuelto, pero el segundo obstáculo era que si también en la razón social había cifras en números romanos de igual forma habría que hacer la conversión, por eso en unos cuantos minutos me puse manos a la obra y por eso explico a continuación la forma como solucione ese inconveniente, cabe recalcar que no es la forma más optima, pero fue lo único que se me ocurrió en poco tiempo.

Requisitos:
  • Microsoft Visual Studio 2008
  • Código de la librería para convertir de NumerosaLetras (se incluye en el código fuente que esta al final)
  • Unos cuantos números romanos, J jejejeje…..

Iniciando:
Lo primero que tenemos que hacer es crear un nuevo proyecto del tipo “Aplicación de Consola”, claro, en una nueva solución, después agregar a la solución un nuevo proyecto del tipo “Biblioteca de Clases”, la estructura de la solución deberá quedar más o menos así:

En el proyecto “ConvierteRomanosLetras”, renombramos la clase creada (click derecho sobre el archivo->cambiar nombre), en este caso la nombré “ConvierteRomLetras”.
La clase “ConvierteRomLetras” deberá quedar con el código siguiente:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConvierteRomanosaLetras
{
    /// <summary>
    /// Clase para obtener en cifras una cantidad dada en romanos
    /// </summary>
    public class ConvierteRomLetras
    {
        string[,] simbolosromanos =
        {
            {"I","1"},
            {"V","5"},
            {"X","10"},
            {"L","50"},
            {"C","100"},
            {"D","500"},
            {"M","1000"}
        };

        string[,] antecesores =
        {
            {"IV","4"},
            {"IX","9"},
            {"XL","40"},
            {"XC","90"},
            {"CD","400"},
            {"CM","900"}
        };
        //"MCMXCV"

        /// <summary>
        /// Retorno una cifra pero en numeros reales
        /// ejemplo:XX retorna 20
        /// </summary>
        /// <param name="romanos">Cifra en numeros romanos</param>
        /// <returns>El equivalente en numeros reales</returns>
        public string Convierte(string romanos)
        {

            //string cadena = romanos;
            int contador = 0;
            int apuntador=0;
            int suma = 0;

           
        //antecesores
           
        while (apuntador != antecesores.Length/2)
            {
              if (romanos.Contains(antecesores[apuntador, 0]))
                {
                suma += int.Parse(antecesores[apuntador, 1].ToString());
                romanos = romanos.Replace(antecesores[apuntador, 0], "");
                       
                }
                apuntador++;
             }
          
            contador = 0;
            apuntador = 0;

            //sumo uno por uno
            if (romanos.Length > 0)
            {
                while (contador != romanos.Length)
                {
                    while (apuntador != simbolosromanos.Length / 2)
                    {
          
                   if (romanos.Substring(contador, 1) ==  simbolosromanos[apuntador, 0].ToString())
                        {
                            suma += int.Parse(simbolosromanos[apuntador, 1].ToString());
                        }
                        apuntador++;
                    }
                    apuntador = 0;
                    contador++;
                }
            }
            //sumo uno por uno

            return suma.ToString() ;
        }
    }
}

Lo primero que se hace es declarar dos matrices, la primera contiene los simbolos utilizados con su respectivo valor numérico, la segunda matriz contiene los simbolos romanos a los cuales nombre “antecesores” que serian los valores menores a los de la matriz 1.
A continuacion se explica la primera parte del codigo:
//antecesores
while (apuntador != antecesores.Length/2)
 {

   if (romanos.Contains(antecesores[apuntador, 0]))
      {
        suma += int.Parse(antecesores[apuntador, 1].ToString());
        romanos = romanos.Replace(antecesores[apuntador, 0], "");
        
      }
   apuntador++;
 }

Recorro la cadena de los numeros romanos en busca de simbolos que este en la matriz 2, por ejemplo si el numero a convertir es XIX, primero extraigo los que se componen de 2 digitos (IX)  en base a su valor los voy sumando en la variable “suma”, y asi sucesivamente.

Una vez que he depurado la cadena de numeros romanos, me quedaria ir sumandolos de 1 en uno, en base a los valores de la matriz 1
//sumo uno por uno
            if (romanos.Length > 0)
            {
                while (contador != romanos.Length)
                {
                    while (apuntador != simbolosromanos.Length / 2)
                    {
          
                   if (romanos.Substring(contador, 1) ==  simbolosromanos[apuntador, 0].ToString())
                        {
                            suma += int.Parse(simbolosromanos[apuntador, 1].ToString());
                        }
                        apuntador++;
                    }
                    apuntador = 0;
                    contador++;
                }
            }
            //sumo uno por uno
            return suma.ToString() ;


Con esto obtengo el equivalente de los simbolos romanos en numeros, por ejemplo si el romano=XIX en la variable suma tendre almacenado el valor “19”, por ultimo retorno el valor de suma pero como tipo cadena.

Solo nos queda por convertirlo a letras, pero como recordaran ya hemos creado una librería que convierte de numeros a letras (Convertir Numeros a Letras en C#), así que lo unico que tenemos que hacer es agregar la clase al proyecto “ConvierteRomanosaLetras”,

Si hacemos memoria la libreria “ConvierteNumLetras”, le pasamos un numero de tipo Double y nos retorna su valor en letras pero en el formato “LETRASNUMERO DECIMALES/100 PESOS”, para este ejemplo no nos serviria, asi que le quitamos o comentamos el siguiente fragmento de código:
  //string[] decim = Math.Round(cantidad, 2).ToString().Split(new char[] { '.' });//corregido redondear a dos decimales
            //string decimales = "00/100 M.N";
            //if (decim.Length > 1)
            //{
            //    decimales = decim[1].PadRight(2, '0') + "/100 M.N";
            //}
Si no mal recuerdo es de la linea 79-84.

Y casi al final, agregamos el siguiente fragmento de código:
//lineas anexadas
            if (letras.Substring(letras.Length - 1,1).Equals("N"))
            {
                letras += "O";//termina en N, entonces agrego O para que quede ...NO"
            }

con este fragmento lo que hacemos es que anteriormente si le introduciamos un 1 nos retornaba “UN”, pero para nuestro caso deberá retornar “UNO”.

Por ultimo comentar la siguiente parte del codigo:
   return letras.Trim();// + unidad + decimales;

ya que los decimales, ni la unidad “PESOS” nos interesan…

Probando Nuestro Ejemplo:
En el proyecto de aplicación de consola “NumRomanosaLetras”, anexamos el siguiente código a la clase principal, nos deberá quedar de la siguiente manera:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NumRomanosaLetras
{
    class Program
    {
        static void Main(string[] args)
        {
            ConvierteRomanosaLetras.ConvierteRomLetras rom = new ConvierteRomanosaLetras.ConvierteRomLetras();
            ConvierteRomanosaLetras.ConvierteNumLetras letras=new ConvierteRomanosaLetras.ConvierteNumLetras();
            Console.WriteLine("Escriba el numero romano que desea convertir:\n");
            string romano = Console.ReadLine().ToString().ToUpper();
            //RFC.ConvierteNumLetras letras = new RFC.ConvierteNumLetras();
            Console.WriteLine("\nEl número romano '{0}' convertido a numeros reales={1}\nSi lo convertimos a letras={2}",romano,rom.Convierte(romano),letras.ConvierteaLetras(double.Parse(rom.Convierte(romano))));
            Console.WriteLine("\n\nPresione una tecla para salir...");
            Console.ReadLine();
        }
    }
}

A continuacion explico algunas lineas:
Creo una instancia de la clase que convierte romanos a numeros y luego de la clase que convierte de numeros a letras.
ConvierteRomanosaLetras.ConvierteRomLetras rom = new ConvierteRomanosaLetras.ConvierteRomLetras();
            ConvierteRomanosaLetras.ConvierteNumLetras letras=new ConvierteRomanosaLetras.ConvierteNumLetras();

Luego  le indico al usuario que ingrese la cantidad en romanos que desea convertir, el valor introducido lo asigno a la variable “romano” y si las letras introducidas estan en minusculas las transformo a mayusculas.
Console.WriteLine("Escriba el numero romano que desea convertir:\n");
            string romano = Console.ReadLine().ToString().ToUpper();


Muestro el resultado, de la conversion, en la pantalla:
Console.WriteLine("\nEl número romano '{0}' convertido a numeros reales={1}\nSi lo convertimos a letras={2}",romano,rom.Convierte(romano),letras.ConvierteaLetras(double.Parse(rom.Convierte(romano))));
Console.WriteLine("\n\nPresione una tecla para salir...");
Console.ReadLine();


Veamos un ejemplo


Y pues creo que eso es todo…

En esta ocasión no probe del todo el codigo, solo probe con cifras como V,I,IV,MMCMXCIX,Y OTRAS MAS, asi que si encuentran algun error ya saben a donde reportarlo

El código fuente lo pueden descargar de aqui