Desarrollo de Sistemas a Medida

Realizando sistemas a medida orientado a servicios

Realizamos Tiendas Online

Te construimos tu tienda online para que ofrescas tus productos y ganes más

Realizamos reportes online y en excel

Analisis de información para generar reportes

Soporte Informático

No pierdas tiempo tenemos el mejor servicio de soporte garantizado

Auditoria Informática

Te asesoramos para sacar el mayor beneficio de la tecnología

miércoles, 31 de enero de 2018

Generar automáticamente procedimientos almacenados a partir de una tabla


La creación de procedimientos almacenados para un CRUD puede resultar una tarea bastante repetitiva. Aquí publico un procedimiento almacenado para SQL Server (T-SQL) que sirve para generar un script para crear 4 procedimientos almacenados a partir del nombre de una tabla.

El script creará 4 procedimientos. Todos los procedimientos que crea el script reciben como parámetros todos los campos de la tabla.

- SELECT filtrará por los campos recibidos que no sean NULL (where condicionado)

- INSERT insertará un registro con los parámetros recibidos

- UPDATE tal y como se genera no tiene sentido, simplemente borra las líneas que no quieras (del SET ó del WHERE)

- DELETE borrará registros filtrando por los campos recibidos que no sean NULL

- EXISTS devolverá registros que coincidan con el filtro creado con los campos recibidos que no sean NULL (where condicionado)
CREATE PROCEDURE [dbo].[sp_generate]  
  @tableName AS VARCHAR(100)  
AS  
  
--CAPITALIZE TABLENAME  
SET @tableName = UPPER(LEFT(@tableName,1)) + RIGHT(@tableName, LEN(@tableName) -1)  
  
--SALTO DE LÍNEA  
DECLARE @nl AS CHAR  
SET @nl = CHAR(10) + CHAR(13)   
  
--CABECERA  
DECLARE @spHeaders AS VARCHAR(1000)  
SET @spHeaders = 'SET ANSI_NULLS ON' + @nl +  
'GO' + @nl +  
'SET QUOTED_IDENTIFIER ON' + @nl +  
'GO' + @nl +  
'-- =============================================' + @nl +  
'-- Author:  TU_NOMBRE' + @nl +  
'-- Create date: ' + CONVERT(VARCHAR, GETDATE(), 3) + @nl +  
'-- ============================================='  
  
DECLARE @table AS VARCHAR(MAX)  
DECLARE @column AS VARCHAR(MAX)  
DECLARE @data_type AS VARCHAR(MAX)  
DECLARE @length AS INT  
DECLARE @precision AS INT  
DECLARE @scale AS INT  
  
--PARÁMETROS  
DECLARE @spParameters AS VARCHAR(MAX) SET @spParameters = ''  
  
--LISTA DE CAMPOS  
DECLARE @fieldList AS VARCHAR(MAX) SET @fieldList = ''  
  
--LISTA DE CAMPOS PARA EL SET DEL UPDATE  
DECLARE @fieldSetList AS VARCHAR(MAX) SET @fieldSetList = ''  
  
--LISTA DE PARÁMETROS PARA EL INSERT  
DECLARE @insertParameters AS VARCHAR(MAX) SET @insertParameters = ''  
  
--CONDICIONES  
DECLARE @spConditions AS VARCHAR(MAX) SET @spConditions = ''  
  
DECLARE c CURSOR STATIC FOR  
select table_name, column_name, data_type, character_maximum_length,numeric_precision, numeric_scale from information_schema.columns where table_name = @tableName order by ordinal_position  
OPEN c FETCH NEXT FROM c INTO @table, @column, @data_type, @length, @precision, @scale  
WHILE @@FETCH_STATUS = 0 BEGIN  
  
 SET @spParameters = @spParameters + (CASE WHEN LEN(@spParameters) >0 THEN @nl + ' ,' ELSE '  ' END) + '@' + @column + ' ' + UPPER(@data_type) + (CASE @data_type WHEN 'VARCHAR' THEN '('+CAST(@length AS VARCHAR)+')' WHEN 'DECIMAL' THEN '('+CAST(@precision AS VARCHAR)+', '+CAST(@scale AS VARCHAR)+')' ELSE '' END) + ' = NULL'  
 SET @fieldList = @fieldList + (CASE WHEN LEN(@fieldList) >0 THEN @nl + '    ,' ELSE '' END) + @column  
 SET @spConditions = @spConditions + (CASE WHEN LEN(@spConditions) >0 THEN @nl + '   AND ' ELSE '' END) + '(@' + @column + ' IS NULL OR @' + @column + '=' + @column + ')'  
 SET @fieldSetList = @fieldSetList + (CASE WHEN LEN(@fieldSetList) >0 THEN @nl + '     ,' ELSE '      ' END) + @column + ' = @' + @column  
 SET @insertParameters = @insertParameters + (CASE WHEN LEN(@insertParameters) >0 THEN @nl + '    ,' ELSE '' END) + '@' + @column  
  
 FETCH NEXT FROM c INTO @table, @column, @data_type, @length, @precision, @scale  
END  
CLOSE c DEALLOCATE c  
  
--********************************  
--*********** SELECT *************  
--********************************  
DECLARE @SELECT AS VARCHAR(MAX)  
SET @SELECT = @spHeaders + @nl  
SET @SELECT = @SELECT + 'CREATE PROCEDURE ' + @tableName + '_Select' + @nl  
SET @SELECT = @SELECT + @spParameters + @nl  
SET @SELECT = @SELECT + 'AS' + @nl + ' SET NOCOUNT OFF;' + @nl + @nl  
SET @SELECT = @SELECT + '    SELECT ' + @fieldList + @nl  
SET @SELECT = @SELECT + '    FROM ' + @table + @nl  
SET @SELECT = @SELECt + '    WHERE ' + @spConditions + @nl  
  
--********************************  
--*********** UPDATE *************  
--********************************  
DECLARE @UPDATE AS VARCHAR(MAX)  
SET @UPDATE = @spHeaders + @nl  
SET @UPDATE = @UPDATE + 'CREATE PROCEDURE ' + @tableName + '_Update' + @nl  
SET @UPDATE = @UPDATE + @spParameters + @nl  
SET @UPDATE = @UPDATE + 'AS' + @nl + ' SET NOCOUNT OFF;' + @nl + @nl  
SET @UPDATE = @UPDATE + '    UPDATE ' + @table + ' SET ' + @nl  
SET @UPDATE = @UPDATE + @fieldSetList + @nl  
SET @UPDATE = @UPDATE + '    WHERE ' + @spConditions + @nl  
  
--********************************  
--*********** DELETE *************  
--********************************  
DECLARE @DELETE AS VARCHAR(MAX)  
SET @DELETE = @spHeaders + @nl  
SET @DELETE = @DELETE + 'CREATE PROCEDURE ' + @tableName + '_Delete' + @nl  
SET @DELETE = @DELETE + @spParameters + @nl  
SET @DELETE = @DELETE + 'AS' + @nl + ' SET NOCOUNT OFF;' + @nl + @nl  
SET @DELETE = @DELETE + '    DELETE FROM ' + @table + @nl  
SET @DELETE = @DELETE + '    WHERE ' + @spConditions + @nl  
  
--********************************  
--*********** INSERT *************  
--********************************  
DECLARE @INSERT AS VARCHAR(MAX)  
SET @INSERT = @spHeaders + @nl  
SET @INSERT = @INSERT + 'CREATE PROCEDURE ' + @tableName + '_Insert' + @nl  
SET @INSERT = @INSERT + @spParameters + @nl  
SET @INSERT = @INSERT + 'AS' + @nl + ' SET NOCOUNT OFF;' + @nl + @nl  
SET @INSERT = @INSERT + '    INSERT INTO ' + @table + '(' + @nl  
SET @INSERT = @INSERT + '     ' + @fieldList + @nl  
SET @INSERT = @INSERT + ' )' + @nl + ' VALUES(' + @nl + '     ' + @insertParameters + @nl  
SET @INSERT = @INSERT + ' )' + @nl  
  
--********************************  
--*********** EXISTS *************  
--********************************  
DECLARE @EXISTS AS VARCHAR(MAX)  
SET @EXISTS = @spHeaders + @nl  
SET @EXISTS = @EXISTS + 'CREATE PROCEDURE ' + @tableName + '_Exists' + @nl  
SET @EXISTS = @EXISTS + @spParameters + @nl  
SET @EXISTS = @EXISTS + ' ,@exists BIT OUT' + @nl  
SET @EXISTS = @EXISTS + 'AS' + @nl + ' SET NOCOUNT OFF;' + @nl + @nl  
SET @EXISTS = @EXISTS + '    IF EXISTS (' + @nl + ' SELECT ' + LEFT(@fieldList,CHARINDEX(@nl,@fieldList))  
SET @EXISTS = @EXISTS + '    FROM ' + @table + @nl  
SET @EXISTS = @EXISTS + '    WHERE ' + @spConditions + @nl + ' )' + @nl  
SET @EXISTS = @EXISTS + ' SET @exists = 1' + @nl + ' ELSE SET @exists = 0'  
  
--MOSTRAR GENERADOS  
PRINT + '-- =====INSERT==================================' + @nl + @INSERT  
PRINT + '-- =====DELETE==================================' + @nl + @DELETE  
PRINT + '-- =====UPDATE==================================' + @nl + @UPDATE  
PRINT + '-- =====SELECT==================================' + @nl + @SELECT  
PRINT + '-- =====EXISTS==================================' + @nl + @EXISTS

Se usa así:
sp_generate NOMBRE_DE_TABLA 

viernes, 26 de enero de 2018

Utilizar varios repositorios remotos con Git

Cuando utilizamos git como control de versiones de nuestros proyectos, lo normal es tener un repositorio central donde subir nuestros cambios, ya sea en GitHubBitbucket, servidor propio, etc.
Hace poco me he encontrado con la necesidad de tener que mantener dos repositorios diferentes con el mismo código, por ejemplo en Bitbucket (repositorio privado) y en GitHub (repositorio público).
Para conseguirlo, lo que tenemos que hacer es simplemente añadir un remote más.
Por ejemplo, cuando asignamos el remote de Bitbucket, lo hacemos así:
git remote add bitbucket git@bitbucket.org:user/myproject.git
Para hacer push, utilizamos el siguiente comando:
git push bitbucket master
Ahora añadimos el repositorio adicional de Github. Utilizaremos también el comando git remote:
git remote add github git@github.com:user/myproject.git
git@github.com:jonseg/crud-admin-generator.git
Y de nuevo, para hacer push al repositorio de Github utilizamos el siguiente comando:
git push github master
Personalmente prefiero tener organizados los repositorios remotos separados de esta forma y hacer el push cuando yo quiera.
Hay otra forma de hacerlo que consiste en que cada vez que hagamos un push, se actualicen los cambios al mismo tiempo en los dos repositorios remotos. Para ello, en el momento de añadir el nuevo remote tenemos que indicar los parámetros set-url con la opción –add.
En el siguiente ejemplo añado el repositorio de GitHub. Como no separamos los repositorios remotos por nombre, supongamos que tenemos un único repositorio remoto llamado origin.
git remote set-url --add origin git@github.com:user/myproject.git
De esta forma, cada vez que hagamos un push, se actualizarán los cambios tanto en Bitbucket como en Github al mismo tiempo.

miércoles, 24 de enero de 2018

Calendario de feriados de Bolivia - 2018


Calendario de feriados de Bolivia - 2018



 Días con feriado nacional
 Días sin feriado nacional
 Días con feriado departamental


Días con feriado nacional

FECHADÍACONMEMORACIÓN
1 de Enero
Lunes
Año nuevo
22 de Enero
Lunes
Día de la Fundación del Estado Plurinacional de Bolivia.
12 de Febrero
Lunes
Carnaval
13 de Febrero
Martes
Carnaval
30 de Marzo
Viernes
Viernes santo
1 de Mayo
Martes
Día del trabajador
31 de Mayo
Jueves
Corpus Christi
21 de Junio
Jueves
Año nuevo Aymara
6 de Agosto
Lunes
Día de la independencia de Bolivia.
2 de Noviembre
Viernes
Día de todos los santos.
25 de Diciembre
Martes
Navidad

Días sin feriado nacional

FECHADÍACONMEMORACIÓN
24 de Enero
 Miércoles
Alasita.
19 de Marzo
 Lunes
Día del padre
23 de Marzo
Viernes
Día del mar
12 de Abril
Jueves
Día del niño
27 de Mayo
Domingo
Día de la madre
24 de Junio
Domingo
San Juan
17 de Agosto
Viernes
Día de la bandera boliviana
11 de Octubre   
Jueves
Día de la mujer boliviana.

Días con feriado departamental

FECHADÍACONMEMORACIÓN
10 de Febrero
   Sábado
Día del departamento de Oruro
15 de Abril
   Domingo
Día del departamento de Tarija
25 de Mayo 
   Viernes
Día del departamento de Chuquisaca
16 de Julio
   Lunes
Día del departamento de La Paz
14 de Septiembre
   Viernes
Día del departamento de Cochabamba
24 de Septiembre
   Lunes
Día del departamento de Pando
24 de Septiembre
   Lunes
Día del departamento de Santa Cruz
10 de Noviembre
  Sábado
Día del departamento de Potosí.
18 de Noviembre
  Domingo
Día del departamento de Beni.

Microsoft Net Framework Offline Sin Internet Todas las versiones



Descargar e instalar Net Framework Offline, instalador completo Sin Internet (Todas las versiones 4.6.1 / 4.6 / 4.5.2 / 4.5.1 / 4 / 3.5 / 3 / 2.0 / 1.1). En este tema encontrarás el instalador de la versión de Microsoft .Net Framework que necesites sin tener que recurrir al gestor de descargas liviano que normalmente entrega esta empresa, incluso podrás instalarlo sin conexión a Internet. 

A estos instaladores también se les conoce como standalone o full. Te recomiendo que descargues todos los archivos para que los tengas a disposición cuando los necesites. Este tema siempre estará actualizado para su comodidad. A continuación los enlaces de los archivos completos de todas las versiones.
Si no sabes que versión es el tuyo, visita ¿Qué versión de Windows tengo, 32 o 64 bits?  Para instalar simplemente ejecuta el archivo .exe descargado según la versión de Microsoft .Net Framework que hayas elegido.

Requisitos y compatibilidad de Net Framework Offline

  • .NET Framework 4.6.1: Windows 10 ; Windows 7 Service Pack 1; Windows 8; Windows 8.1; Windows Server 2008 R2 SP1; Windows Server 2012; Windows Server 2012 R2.
  • .Net Framework 4.6: Windows 7 Service Pack 1; Windows 8; Windows 8.1; Windows Server 2008 R2 SP1; Windows Server 2008 Service Pack 2; Windows Server 2012; Windows Server 2012 R2; Windows Vista Service Pack 2.
  • .Net Framework 4.5.2: Windows 7 Service Pack 1; Windows 8; Windows 8.1; Windows Server 2008 R2 SP1; Windows Server 2008 Service Pack 2; Windows Server 2012; Windows Server 2012 R2; Windows Vista Service Pack .
  • .Net Framework 4.5.1: Windows 7 Service Pack 1; Windows 8; Windows Server 2008 R2 SP1; Windows Server 2008 Service Pack 2; Windows Server 2012; Windows Vista Service Pack 2.
  • .Net Framework 4.0: Windows 7; Windows 7 Service Pack 1; Windows Server 2003 Service Pack 2; Windows Server 2008; Windows Server 2008 R2; Windows Server 2008 R2 SP1; Windows Vista Service Pack 1; Windows XP Service Pack 3.
  • .NET Framework 3.5: Windows Server 2003; Windows Server 2008; Windows Vista; Windows XP.
  • .NET Framework 2.0: Windows 7; Windows Server 2003; Windows Server 2008; Windows Vista; Windows XP .
  • .NET Framework 2.0: Windows Server 2003, Datacenter x64 Edition; Windows Server 2003, Enterprise x64 Edition; Windows Server 2003, Standard x64 Edition; Windows XP 64-bit , IE 5.01 o versión posterior, Windows Installer 3.0.
  • .NET Framework 1.1: Windows 2000; Windows Server 2003 Service Pack 1 for Itanium-based Systems; Windows Server 2003 x64 editions; Windows Server 2008 Datacenter; Windows Server 2008 Enterprise; Windows Server 2008 for Itanium-based Systems; Windows Server 2008 Standard; Windows Vista Business; Windows Vista Enterprise; Windows Vista Home Basic; Windows Vista Home Premium; Windows Vista Starter; Windows Vista Ultimate; Windows XP; Windows XP Professional x64 Edition.

sábado, 6 de enero de 2018

¿Qué son las unidades de estado sólido (SSD)?

Seguramente más de una vez has escuchado hablar sobre las unidades de estado sólido. Si aún te quedan dudas sobre ellas o simplemente quieres saber si vale la pena comprar una, en esta entrada trataré de ayudarte a resolverlo.

¿Qué es una SSD?

Las unidades de estado sólido o SSD (solid state drive) son unidades de almacenamiento no volátil, es decir, que mantendrán los datos almacenados aunque no estén conectadas a una fuente de alimentación, basadas en circuitos integrados (como las memorias flash). A diferencia de los discos duros (HDD) que basan su funcionamiento en una cabeza de lectura que se mueve a través de las caras de los discos, las unidades de estado sólido no tienen partes móviles, son un solo componente (de ahí su nombre).

¿Cómo funcionan las SSD?


Una unidad de estado sólido consiste en una serie de circuitos integrados con millones de celdas en las que se almacenan datos en forma de voltajes. Dichas celdas forman matrices de las que a cada fila se le conoce como página; comúnmente cada página de datos almacena de 2,000 a 16,000 celdas. Una matriz (también llamada bloque) puede almacenar de 128 a 256 páginas. Actualmente (2017) las SSD en su mayoría están compuestos de compuertas NAND.



Clasificación de las SSD


Una jerarquía muy común para las SSD está basada en la variedad de datos que puede almacenar cada una de sus celdas, esto es:
SLC: Single level cell o celda de un solo nivel. Cada celda puede contener un solo bit de información (1 o 0), como consecuencia, el espacio físico necesario para almacenar grandes cantidades de información puede llegar a ser muy grande. La ventaja de este tipo de unidad es que permite una mayor cantidad de operaciones de lectura y escritura sin que el componente presente fallos, ya que solo hace falta saber si el bit de cada celda está encendido sin ninguna otra operación extra. Son un poco caras por a la gran cantidad de bloques que se requieren para almacenar la misma cantidad de datos que las otras alternativas de SSD hacen con una menor cantidad de ellos. Suele ser una tecnología principalmente usada por empresas a las que les interesa la tolerancia a fallos y fiabilidad sin importar mucho el precio.
MLC: Multi level cell o celda de múltiple nivel. Esta clase de unidades están formadas por celdas que permiten almacenar 2 bits cada una, es decir, 4 valores diferentes (00, 01, 10 y 11), lo cual se traduce en poder almacenar el doble de información que un SLC en el mismo espacio. La desventaja es que la cantidad de operaciones que se necesitan hacer sobre las celdas es mayor puesto que ahora es necesario aplicar un voltaje extra para detectar cuál valor se encuentra almacenado específicamente, a diferencia del SLC donde bastaba con saber si estaba encendida o apagada. Lo anterior provoca que fallen más rápido debido al uso de los componentes. Es común que esta sea una de las tecnologías disponibles para la compra al público.
TLC: Triple level cell o celda de triple nivel. Cada celda puede contener 3 bits, es decir, hasta 8 estados diferentes. Se logra una mayor cantidad de memoria disponible en un espacio menor a un precio más bajo de fabricación y venta. El rendimiento y vida útil, a comparación de las otras dos alternativas, es menor puesto que ahora es necesario ser más preciso para determinar el voltaje de cada celda. Esta es la otra tecnología más común para la compra al público.
El problema de borrar y sobrescribir

A pesar de que la rapidez de lectura y escritura en una SSD es muy grande, estas presentan un par de desventajas importantes. Cuando queremos eliminar alguna página de datos es necesario borrar el bloque completo al que esta pertenece, la razón es simple: el voltaje necesario para realizar el borrado de una página es muy fuerte, por tanto, puede alterar las páginas vecinas de la que estamos borrando, en su lugar, al utilizar el voltaje para borrar un bloque completo en lugar de una página, mitigamos los efectos secundarios.

A veces queremos borrar una página en específico de un bloque que contiene varias de ellas; en esos casos la SSDalmacena una copia del bloque sin la página que deseamos borrar en cualquier bloque que esté vacío. Puedes observar este funcionamiento a continuación:



Tecnología de las SSD


Siendo específicos, el tipo de memoria que utilizan las unidades de estado sólido hoy en día son las 3D TLC NAND o, dicho de otro modo, son series de compuertas NAND de triple nivel (TLC) apiladas. Se les denomina 3D porque, además de colocar las compuertas una atrás de otra, se añade una tercera dimensión al hacer pilas de ellas. Esta clase de memorias tienen varias ventajas sobre las memorias de un solo nivel (2D TLC NAND), entre las más importantes tenemos que:
La capacidad de almacenaje aumenta sin aumentar mucho el tamaño del componente.
El consumo de energía disminuye.
Suelen ser más tolerantes a fallos a comparación de las 2D NAND.
Aumento en la velocidad de escritura de datos.

Entre las desventajas de las memoria 3D TLC NAND tenemos:
El costo de fabricación aumenta considerablemente (hasta 5 veces más) al de una 2D NAND.
El espacio que pueden ocupar las celdas en el chip base es hasta 25% inferior que el espacio de una 2D.
Las operaciones sobre estas memorias (leer, borrar o escribir) son considerablemente más complejas que en otras.

Mito de las SSD


Una de las razones principales por las que muchas personas dudan sobre adquirir una SSD se origina del rumor de la corta vida útil que estas tienen. Ciertamente las celdas de las SSD tienen un límite de algunos cientos de miles de escrituras y lecturas antes de que puedan comenzar a fallar, sin embargo, eso no significa que fallen muy rápido. Hace algunos años el tiempo de vida de un HDD era considerablemente mayor al de cualquier SSD, pero ese problema se ha solucionado desde hace tiempo, ahora es más común que los HDD fallen mucho antes que un SSD gracias a algoritmos de escritura sofisticados que tratan de evitar que siempre se usen las mismas celdas, y nuevas tecnologías que estas unidades incorporan. Dependiendo de la marca de la SSD que compremos y de la tecnología que esta utilice, el límite de lecturas y escrituras pueden variar mucho, sin embargo, dependiendo del uso que se le de, su tiempo de vida puede ser mucho más grande que el de un HDD.

El futuro de las SSD y HDD


Aun es muy pronto para declarar que el futuro del almacenamiento está en manos de las SSD, su costo por gigabytesigue siendo muy caro a comparación de los HDD. Lo cierto es que los avances en la tecnología NAND y 3D NAND han ayudado a que las unidades de estado sólido formen muy buenas bases en la industria. La mayoría de los inconvenientes que estas tienen, también están presentes en los HDD pero con las SSD tenemos un rendimiento mayor y más fiabilidad a un precio más elevado. Para solucionar dicho problema, muchas personas han recurrido a unidades híbridas de SSD y HDD en las que la primera actúa como una especie de memoria caché de los datos más utilizados de la segunda, así se disminuye la latencia de la unidad sin elevar mucho su costo.

Aún es posible que aparezca una nueva tecnología más eficiente que cualquier clase de disco o unidad de almacenamiento que conozcamos hasta ahora, por lo pronto, las SDD y los avances en la tecnología de circuitos integrados parecen ser el futuro del almacenamiento.