lunes 30 de enero de 2012

Desarrollo de talento dentro de las organizaciones

Hace días publiqué un artículo para mi blog deportivo Mike en los deportes donde indicaba que había dirigentes que ayudaban a desarrollar talento jóvenes al mismo tiempo que competían contra los mejores equipos de la liga. Pues esa misma premisa debe aplicarse a cualquier empresa, un director o gerente debe ser capaz de desarrollar talento joven con tal de poder competir contra otras organizaciones.

De esta forma fue que organizaciones como Google y Facebook lograron llegar al lugar donde se encuentran hoy en día. Microsoft y Apple son la antitesis de este tipo de organizaciones, donde han logrado conseguir el mayor beneficio sin importar el costo que este signifique.

Pero, no todos se pueden dar ese lujo, empresas pequeñas y medianas necesitan de talento joven para poder competir contra empresas de mayor envergadura económica y ahí es donde se debe aplicar la manera de dirigir de estos individuos que a los que me refiero en el artículo.

Relacionados:

viernes 20 de enero de 2012

Buenas aplicaciones de Android que los ayudarán hoy en día.

En este artículo les vamos a presentar unas buenas aplicaciones que existen hoy en día para el sistema operativo Android. Estas aplicaciones lo van a ayudar bastante haciendo más eficiente y a la vez más eficaz en las tareas que tiene que hacer día a día.

  • Expensive manager: excelente herramienta para llevar el control de sus gastos diarios y de esta forma poder manejar de forma eficiente tu presupuesto.
  • EverNote: Buena aplicación para tomar notas y compartirla en su computadora personal y cualquier otro equipo que se pueda conectar a Internet.
  • DropBox: si necesita compartir sus documentos con su PC, su tablet y su teléfono celular, dropbox te va a ayudar con eso, ya que permite compartir documentos sobre el Internet con una sincronización casi en tiempo real.
  • FxCamera: permite sacar fotos vistosas  con este software mejorado que hará de su cámara un pequeño editor digital.
  • Ebuddy: maneja cuentas de messenger de varios tipos (msn, yahoo, etc) en una sola aplicación.
  • Facebook: la mejor red social de la historia, y tiene su propio cliente de android para que se encuentre actualizado de lo que se comenta a su alrededor.
  • Shazam: desconoce la canción que está sonando en la radio y le gustaría saber como se llama y quien la canta, con Shazam puede descubrirlo.
  • Seesmic: permite manejar varias cuentas de facebook y twitter dentro de una misma aplicación, y tomando en consideración lo deficiente que son las herramientas propietarias de Twister y Factbook, esta es una gran mejora a ambas aplicaciones.
  • TeamViewer: si necesita conectarse de forma remota a un computador u otro equipo, esto es lo que necesita. Efectiva, gratuita para uso personal y muy sencillo de utilizar.
  • Google Traductor: no necesita un diccionario en sus manos, con el traductor de Google puede traducir cualquier cosa de forma muy amigable. Solo necesita estar conectado a Internet.
  • Advance Task Killer: Android tiene una pequeña deficiencia en el manejo de memoria y para eso necesitamos de herramienta de este tipo para poder tener nuestro equipo de forma eficiente. Este pequeño task manager es bastante bueno a la hora de liberar memoria de su equipo móvil.
  • Aldiko: si te gusta leer, esta pequeña biblioteca te va a ayudar a tener tus libros organizados y poder leerlo de una forma sencilla y eficiente.
  • Cool Reader: otra aplicación de lectura de libros que es bastante buena, y con un diseño que evita ofrecer incomodidades al momento de leer ya que el fondo de las hojas del libro no molestan a la vista.
Espero que estas aplicaciones lo ayuden en su desempeño diario dando un muy buen uso de su equipo móvil.

lunes 9 de enero de 2012

Desarrollo de jóvenes profesionales en pequeñas y medianas empresas

Las pequeñas y medianas empresas en muchas ocasiones no cuentan con el poder adquisitivo para poder contratar profesionales experimentados para incluirlos en sus nóminas a tiempo completo. Muchas veces pueden contratar este tipo de profesionales, pero se le hace casi imposible mantenerlos porque no pueden costear su valor a largo plazo.

Ahora, ¿de que forma estas empresas pueden competir contra otras compañías de mayor poder económico?

Lo que se sugiere es que estas empresas inviertan suficiente dinero en personas con experiencia para que se desempeñen en las posiciones claves y que sean no solo buenos profesionales, más bien deben ser líderes en los departamentos en que les toquen desempeñarse. Después de tener cubiertas las principales posiciones de la empresa, se deben agregar otros tipos de empleados con menos experiencia, jóvenes universitarios que puedan servir de apoyo a los experimentados.

Es preferible que estos empleados suplementarios sean jóvenes universitarios con poca experiencia que puedan ser inducidos por los compañeros más experimentados. Como les había indicado anteriormente, estos líderes no solo deben tener un buen desempeño como profesional, sino que deben fungir como mentores de este grupo de jóvenes con los que cuenta la empresa.

Estos líderes deben ayudar a moldear a este grupo de jóvenes, ayudarlos en su desarrollo y tratar de inculcarle la cultura empresarial de la institución y de esta forma pueda la empresa crecer junto a este grupo de promesas que tienen dentro de su nómina. Si los líderes no son capaces de ayudar a desarrollar los jóvenes, se debe analizar si este es el personal ideal para lograr el crecimiento de la empresa en un futuro cercano.

Un buen líder a nivel gerencial debe ser capaz de lograr que una joven promesa se desarrolle a nivel técnico en 1 a 2 años como máximo y de 3 a 5 años a nivel gerencial si es necesario. El supervisor directo (gerente, director o encargado) debe ser capaz de lograr eso, y ya queda en la empresa mantener a sus empleados que han logrado descollar como buenos profesionales, que si tienen inculcada una buena cultura empresarial van a preferir crecer junto con la empresa que les dio la oportunidad cuando lo necesitaban.

Es una apuesta difícil para los reclutadores. Muchas veces queremos llenar las posiciones con un personal que cumpla el perfil que estamos buscando, las preguntas importantes que hay que hacerse antes de contratar o decidir buscar llenar esas posiciones son: ¿Somos capaces de captar ese tipo de profesional? ¿Podemos mantener un profesional de esa calidad por un tiempo mayor a 3 o 5 años? ¿Ese es el tipo de profesional que realmente necesitamos? ¿Puede adaptarse un empleado de vasta experiencia a este tipo de empresa o negocio? 

lunes 2 de enero de 2012

Beneficios de una buena planificación Personal

La organización es sumamente importante para todo aquel que quiere llevar una vida estable tanto a nivel familiar como profesional, a pesar de que esto pueda llevar a algún tipo de “vida monótona”. Sin embargo,  ser organizado no implica que deba llevar una vida aburrida o monótona, más bien sirve para tener el control de las cosas que hace, sin afectar a los demás.

La planificación personal es sumamente importante en el ámbito familiar y profesional, ya que los seres humanos por más libres que queramos ser, nos debemos a siempre a terceros (a sus padres, hijos, novio(a)s, esposo(a)s, comunidades o grupos a lo que pertenezca, entre otros). Este mismo esquema lo puede llevar a su vida profesional, donde la planificación lo puede separar de un profesional exitoso y uno no tan exitoso.
Ahora, como podemos mejorar el control de las cosas que realizamos día a día y de este forma tener una buena planificación.


Uso de agenda: esta herramienta es vital para que una persona pueda tener control de las cosas que tiene que realizar, ya puede ser un simple cuaderno, o una agenda electrónica en su computadora, Tablet, Smart phone o en cualquier celular. La agenda crea cierta disciplina en el ser humano, ya que nos hace llevar de forma controlada todas nuestras tareas del día a día.


Herramientas control de presupuestos: esto es sumamente importante para todos aquellos que queremos controlar nuestra entrada y salida de efectivo. Con el uso de las tarjetas de crédito muchas personas pueden perder el control de sus gastos (imágenes, pagar la renta de alquiler, energía eléctrica, factura celulares, internet, teléfonos, compra de alimentos, pago de tarjeta de créditos, entre otros).

Si no controlamos todo este tipo de gastos es muy posible que tengamos atrasos por no conocer los cortes de los pagos que tenemos que realizar, y puede llegar un momento en que terminemos uno que otro mes en números rojos (saldos negativos) por descontrol y falta de planificación.

Existen numerosos software de planificación y control de gastos personales desde rqmoney (sistema portable para Windows gratis), expensive manager (interesante sistema para android) hasta una simple hoja de Excel o un cuaderno donde apunte sus entradas, salida y calcule su balance a la fecha.

miércoles 2 de noviembre de 2011

Virtualización de equipos

Para los administradores de sistemas, la parte más difícil es lidiar con los backups de sistemas, a que hora debe ejecutarse un determinado backup, si terminó de ejecutarse, muchas veces cuando tenemos problemas con el equipo los backups se encuentran corruptos por una razón u otra (discos duros dañados, problemas con la instalación del sistema operativo o memoria).

Para esto le sugiero utilizar equipos virtuales, donde la mayor parte de la ejecución de las operaciones se encuentre en una maquina virtual y el servidor solo ejecute este equipo virtual, de esta forma si tenemos cualquier inconveniente, podemos borrar o reiniciar el equipo y nuestro sistema continuará trabajando igual como lo teníamos.

Esto también evita bastante los virus que tanto atacan a sistemas operativos Windows de Microsoft, para evitar este tipo de inconvenientes, les sugiero el uso de las siguientes herramientas para esos fines:

Microsoft Virtual PC: herramienta lanzada por Microsoft para realizar virtualizaciones y de esta forma competir con el famoso VMWare.

VMWare: Una de las primeras herramientas para realizar virtualización de sistemas operativos y quizás la mas famosa del mercado, soporta casi todos los sistemas operativos actuales y permite ejecutar un equipo virtual con los requerimientos mínimos permitido por cualquier sistema operativo.

Virtual Box: aplicacion open source que soporta casi todos los sistemas operativos. Visita el siguiente enlace en caso de desear una copia.

Disk2VHD: es una herramienta de Microsoft que permite realizar imágenes de equipos previamente instalados. Lo mejor de esta herramienta que es complemente gratis y no necesita instalación para ejecutarse. Puede descargarlo del siguiente enlace.

domingo 9 de octubre de 2011

Discurso Steve Jobs en la universidad de Standford

Les dejo un emotivo discurso de genio Steve Jobs, que será recordado por todos sus aportes a la tecnología, pero no solo los tecnólogos deberían estudiar a este hombre, todos aquellos hombres de negocios, administradores y mercadólogos (especialmente estos últimos) deben hacer mucho hincapié en como este hombre se manejaba. 

Este hombre hizo del mercadeo algo simple, demostró que para vender no hay que utilizar palabras rebuscadas o pocos usuales, solo hay que saber llegar a todos y tener un objetivo claro a quien dirigirse (como dirían los profesionales de esa área, conocía bastante bien su nicho de mercado). 

Para aquellos, que piensan que aveces es imposible superar algunas barreras, este sr. fue un vivo ejemplo, que cuando algo deseas con ganas, lo puedes alcanzar y que no existe la palabra imposible si existe empeño en lo que se quiere.

lunes 26 de septiembre de 2011

Generar Diccionario de Datos Sql Server 2005 o 2008

Hace más de dos años publiqué un artículo de como podíamos generar un diccionario de datos desde una base de datos SQL 2000. Un lector realizó unas mejoras significativas al diccionario para corregir algunos valores como son los tipos de datos y las variables primary keys que no eran identificadas correctamente en el script anterior. Además, el script anterior solo generaba el diccionario para una sola base de datos, mientras que este script lo hace para todas las bases de datos que se encuentren en un servidor.

Por esta vía deseo agradecer a Adán Salvador Aguilera Campos desde México por el aporte que nos ha hecho a todos con las mejoras al script de generación de un diccionario de datos.


/*
para systypes and xusertype <= 256)
Creado por Adán Salvador Aguilera Campos
Aguascalientes, Mexico
Basado en gran parte en el trabajo hecho por el Ing. Ely Michael Núñez
26/08/2011
*/
set nocount on
/*
------------------------------------------------------------------------------
 Variables y tablas temporales
*/
declare @dbname sysname 
declare @name   sysname
declare @tabla    sysname
declare @uid    smallint
declare @usuario sysname
declare @fecha nvarchar(11)
declare @cmd      nvarchar(600)
declare @low nvarchar(11)
declare @cont int
declare @total int
set @cont=0
set @total=0

create table #Base
(
      ident    smallint,
      base         sysname
)
----------------------------------------------------------------
/*Del script de diccionario de datos*/

/* Declares for databases variables */
declare @db_name2 sysname
declare @dbid smallint
declare @db_filename nvarchar(520)
declare @db_crdate datetime
declare @db_size nvarchar(20)

/* Declares for databases files variables */
declare @f_name nchar(256)
declare @f_filename nchar(520)
declare @f_size int
declare @f_groupname sysname

/* Declares for tables variables */
declare @id int
declare @table_name sysname
declare @xtype char(2)
declare @crdate datetime
declare @refdate datetime


-----------------------PRUEBA para syscolumns--------

create table #pk (
      TABLE_QUALIFIER varchar(100),
      TABLE_OWNER varchar(100),
      TABLE_NAME varchar(100),
      COLUMN_NAME varchar(100),
      KEY_SEQ smallint,
      PK_NAME varchar(100)
)

create table #columnas(TABLE_QUALIFIER   sysname     ,
      TABLE_OWNER sysname     ,
      TABLE_NAME  sysname     ,
      COLUMN_NAME sysname     ,
      DATA_TYPE   smallint    ,
      TYPO  varchar(100)      ,
      PREC  int   ,
      LENGTH      int   ,
      SCALE smallint    ,
      RADIX smallint    ,
      NULLABLE    smallint    ,
      REMARKS     varchar(254)      ,
      COLUMN_DEF  nvarchar(3000)    ,
      SQL_DATA_TYPE     smallint    ,
      SQL_DATETIME_SUB  smallint    ,
      CHAR_OCTET_LENGTH int   ,
      ORDINAL_POSITION int   ,
      IS_NULLABLE varchar(254)      ,
      SS_DATA_TYPE      tinyint    
)
/*select column_name,typo, column_def,length,is_nullable,column_name
into @column_name, @column_type, @cdefault, @prec, @isnullable, @pk
*/----------------------------------------------------------

/* Declares for columns variables*/
declare @llave sysname
declare @column_name sysname
declare @column_type varchar(13)
declare @cdefault nvarchar(3000)
declare @prec int
declare @isnullable varchar(254)
declare @nulo as varchar(3)
declare @pk sysname


------------------------------------------------------------------------------
/* Dado que se tienen que extraer datos de dos tablas diferentes se tiene
** que requerir al uso de tablas temporales para crear las descripciones
*
*/
/*
**  Se crea #Base a partir de sysdatabases
    para identificar las bases de datos registradas en el servidor y se descartan
    las que son de SQL Server
*/
insert into #Base (base, ident )
      select name, dbid
            from master.dbo.sysdatabases
            where (@dbname is null or name = @dbname)
                  AND name<> 'master' AND name<> 'tempdb'
                  AND name<> 'model' AND name<> 'msdb'
                  AND name<> 'pubs' AND name<> 'Northwind'


/*
** Se busca cuales bases están accesibles para el usuario
** y las que no las elimina de #Base
*/

declare ms_crs_c1 cursor for
      select db_name (ident) from #Base
open ms_crs_c1
fetch ms_crs_c1 into @name
while @@fetch_status >= 0
begin
      if (has_dbaccess(@name) <> 1)
      begin
            delete #Base where current of ms_crs_c1
            raiserror(15622,-1,-1, @name)
      end
      fetch ms_crs_c1 into @name
end
deallocate ms_crs_c1
/*
**  Se utiliza @curdbid para recorrer los identificadores de BD
**  en #Base para construir las otras dos tablas temporales, se construyen sus caracteristicas
**  @ErrorSave1 se utiliza para manejar errores
*/
print '<html>'
print '<head><title>'
print '           Diccionario de Datos'
print '</title>'
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 '     <table>                
            <tr>       
                  <td colspan="7">
                        <h1><strong><span class="style7">Servidor: </span>' + @@servername + '</strong></h1>
                  </td>
            </tr>
      </table>'


declare @curdbid smallint   
select @curdbid = min(ident) from #Base
while @curdbid IS NOT NULL
begin
      set @name = db_name(@curdbid)
      select @db_name2 = name, @dbid = dbid, @db_filename = filename, @db_crdate = crdate
      from master..sysdatabases where dbid = db_id(@name)
      select @low = convert(varchar(11),low) from master.dbo.spt_values
                  where type = N'E' and number = 1

      select @cmd = '(select str(convert(dec(15),sum(size))* ' + @low + '/ 1048576,10,2)+ N'' MB'' from '
            + quotename(@name, N'[') + N'.dbo.sysfiles)'
      /*set @cmd= '@db_size = (select str(convert(dec(15),sum(size))* ' + @low + '/ 1048576,10,2)+ N'' MB'' from '
                                               + quotename(@name, N'[') + N'.dbo.sysfiles) '
      */   
      print '     <div>'
      print '           <hr noshade="noshade"/>'    
      print '           <table >'        
      print '                 <tr>
                        <td colspan="7"><strong><span class="style7">Nombre de Base de Datos: </span></strong>' + @name
      print '                      </td>
                  </tr>'
      print '                 <tr>
                        <td colspan="7"><strong><span class="style7">Ruta del archivo: </span></strong>' + @db_filename
      print '                      </td>
                  </tr>'
      print '                 <tr>
                        <td colspan="7"><strong><span class="style7">Fecha de creación: </span></strong>' + convert(varchar,@db_crdate)
      print '                      </td>
                  </tr>'     
      print '                 <tr>
                        <td colspan="7"><strong><span class="style7">Tamaño: </span></strong>' 
      exec (@cmd)
      print '                      </td>
                  </tr>
                  '    


      select @cmd= 'Use "' + @name + '"'+char(13)+' 
      declare files_cursor cursor for         
      select name, filename, isnull((select groupname from sysfilegroups b where b.groupid = a.groupid),''N/A'')
            from sysfiles a'
      exec (@cmd)

     

      open files_cursor
      fetch next from files_cursor
            into @f_name, @f_filename, @f_groupname
      print '                 <tr>
                        <td colspan="7">
                             <ul>'

      while @@fetch_status = 0
      begin
     
            print '                                  <li>
                                         <b>' + @f_name + '</b>
                                         <br/>
                                         - Archivo: ' + @f_filename + '<br/>                 
                                         - Tipo: ' + @f_groupname + '
                                   </li>'
     
            fetch next from files_cursor
            into @f_name, @f_filename,  @f_groupname
     
      end
      print '                            </ul>
                        </td>
                  </tr>
            </table>
            <hr />'
      print '     </div>'
     
     
      close files_cursor
      deallocate files_cursor
     
      select @cmd= 'Use "' + @name + '"'+char(13)+'       
            declare table_cursor cursor for
            select id, name, xtype, crdate, refdate from sysobjects where xtype = ''u''
      '
      exec(@cmd)
      open table_cursor
     
      fetch next from table_cursor
            into @id, @table_name, @xtype, @crdate, @refdate
     
      while @@fetch_status = 0
      begin
            set @cont=@cont +1
           

            select @cmd= 'Use "' + @name + '"'+char(13)+'       
                  declare total_cr cursor for
                  select count(*) from sysobjects where xtype = ''u''
            '
            exec(@cmd)
           

            open total_cr
           
            fetch next from total_cr
                  into @total
           
            while @@fetch_status = 0
            begin
                 
                  fetch next from total_cr
                        into @total
            end
            close total_cr
            deallocate total_cr
            print '     <div style="margin-left:5%;">
            <table >
                  <tr>'
                  If (@cont>1)
                  begin
                        print '<br/>'
                  end
                  print
                  '
                        <td>
                        </td>
                        <td colspan="1" style="border:1px solid black">
                             <b>Tabla</b> '+ convert(varchar,@cont) + ' de ' + convert(varchar,@total) +'
                        </td>
                        <td colspan="1" style="border:1px solid black">
                             <b>B.D. </b>'+ @name + '
                        </td>                 
                        <td colspan="4" style="border:1px solid black">     
                             <span class="style6">Fecha de creación: ' + convert(varchar,@crdate) + '</span>
                        </td>
                  </tr>
                  <tr>
                        <td>
                        </td>
                        <td colspan="6" style="font-weight:bold; font-size: 16px; border:1px solid black">
                              Nombre de tabla: ' + @table_name + '
                        </td>                 
                  </tr>
            </table>'
            print '           <table cellpadding="2" cellspacing="0">'-- bordercolor="#CCCCCC">'

            print '                 <tr>'-- bordercolor="#0066CC">'
/*          print '     <tr bordercolor="#0066CC" bgcolor="#cc9300">'
*/
            print '           <td style="border:none">
                        </td>                 
                        <td bgcolor="#0066CC"><span class="style5">Nombre de campo</span></td>'
            print '                      <td bgcolor="#0066CC"><span class="style5">Llave primaria </span></td>'
            print '                      <td bgcolor="#0066CC"><span class="style5">Tipo de columna</span></td>'
            print '                      <td bgcolor="#0066CC"><span class="style5">Valor por Default</span></td>'
            print '                      <td bgcolor="#0066CC"><span class="style5">Longitud</span></td>'
            print '                      <td bgcolor="#0066CC"><span class="style5">Valores nulos</span></td>'
            print '                </tr>'
           
            select @cmd= ' delete #columnas Use "' + @name + '"'+char(13)+'
                  insert into #columnas EXEC sp_columns "'+ @table_name +'"'
            EXEC (@cmd)
     
            Select @cmd = 'delete #pk Use "' + @name + '"'+char(13)+'
                  exec sp_pkeys "'+ @table_name +'"'
            insert into #pk exec(@cmd)

     
            select @cmd= 'update #columnas set REMARKS= '''' '
            exec (@cmd)
           
            select @cmd= 'Use "' + @name + '"'+char(13)+'
                  declare llaves cursor for
                        select column_name
                        from #pk'        
            exec (@cmd)
            open llaves
            fetch next from llaves
                  into @llave
            while @@fetch_status = 0
            begin                                         
                  select @cmd= 'update #columnas set remarks= ''X'' where column_name= ''' + @llave  + ''''
                  exec (@cmd)
                  fetch next from llaves
                        into @llave
            end        
            close llaves
            deallocate llaves
           

           
            select @cmd= 'Use "' + @name + '"'+char(13)+'
                  declare columns_cursor cursor for
                        select column_name,typo, isnull(column_def,'' ''),length,is_nullable,remarks
                        from #columnas'        
            exec (@cmd)      
            open columns_cursor
            fetch next from columns_cursor
                  into @column_name, @column_type, @cdefault, @prec, @isnullable, @pk
           

            /*select @cmd= 'Use "' + @name + '"'+char(13)+'
                  declare columns_cursor cursor for
                        select name, type = (select top 1 name from systypes b where b.xtype = a.xtype and b.xusertype = a.xusertype),
                             cdefault, isnull(prec,0) as prec, isnullable,
                             pk = isnull((select top 1 ''PK'' from sysobjects where xtype = ''u'' and parent_obj = id),''No tiene'')
                        from syscolumns a where id = ' + convert(varchar,@id)
                 
           
            exec (@cmd)
            open columns_cursor
     
            fetch next from columns_cursor
                  into @column_name, @column_type, @cdefault, @prec, @isnullable, @pk
      */
            while @@fetch_status = 0
            begin      
                  print '                 <tr>
                        <td>
                        </td>'
                  print '                      <td style="border:1px solid black;">'+ @column_name +  '</td>'
                  print '                      <td style="text-align:center; border:1px solid black;">' + @pk + '</td>'
                  print '                      <td style="border:1px solid black">' + isnull(@column_type,'varchar') + '</td>'
                  print '                      <td style="text-align:center; border:1px solid black;">' + convert(varchar,@cdefault) + '</td>'
                  print '                      <td style="text-align:center; border:1px solid black;">' + convert(varchar,@prec) + '</td>'
                  print '                      <td style="text-align:center; border:1px solid black;">' + @isnullable + '</td>'
                  print '                 </tr>'
                  /*if (@isnullable=0)
                  begin
                        set @nulo='No'
                  end
                  if (@isnullable=1)
                  begin
                        set @nulo='Si'
                  end
*/
                 
                 
                  fetch next from columns_cursor
                        into @column_name, @column_type, @cdefault, @prec, @isnullable, @pk
           
            end
     
            print '           <tr style="border:none">
                        </tr>
                        </table>'
            print '     </div>'
     
            close columns_cursor
            deallocate columns_cursor
      /**/
            fetch next from table_cursor
                  into @id, @table_name, @xtype, @crdate, @refdate
     
      end
      close table_cursor
      deallocate table_cursor

----------------------------------------------------------
      /*
      ** Buscamos el siguiente identificador de BD
      */set @cont=0
      select @curdbid = min(ident) from #Base where ident > @curdbid
end
print '     </body>'
print '</html>'

/* obtener el resultado
-----------------------------------------------------------------
select base, nombre, usuario, num_filas, fecha
from #resul
order by base, nombre
-----------------------------------------------------------------
*/

drop table #base
drop table #columnas
drop table #pk