viernes, 10 de junio de 2022

Linux Ubuntu, commando basicos de para BD de Sql Server / mysql

Linux Ubuntu 20.04, commando basicos de para BD de Sql Server / MariaDB

Blog en construccion



SYSTEMCTL

systemctl -h

Consultar o enviar comandos de control al administrador del sistema.

 Commando Basicos mariaDB

  • sudo systemctl enable mariadb.service
  • sudo systemctl status mariadb.service
  • sudo systemctl start mariadb.service
  • sudo systemctl stop mariadb.service
Comandos basicos de MS-SQL Server
  • sudo systemctl enable mssql-server.service
  • sudo systemctl status mssql-server.service
  • sudo systemctl start mssql-server.service
  • sudo systemctl stop mssql-server.service

      martes, 8 de diciembre de 2020

       Developer Forms 6i a Oracle XE

      Para conectar Developer Forms 6i a Oracle XE deben de hacer lo siguiente:

      1. Instalar primero el Developer Forms 6i
      2. Instalar Oracle XE (Esto con el objetivo de que en las variables de entorno debe de estar primero el path de Oracle XE)
      3. Deben asegurarse que en el registro de windows en:
        1. HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE la variable NET80 quede con C:\ORANT\NET80
      4.  En la ruta C:\ORANT\NET80\ADMIN encontraran el TNSNAMES.ORA y SQLNET.ORA hagan backup de estos archivos y reemplacen estos archivos por los que instala Oracle XE que es en la ruta C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN  (en la prueba, funciono solo con agregar la conexion de XE al TNSNAMES.ORA que utiliza Forms 6i)
      5.  Por ultimo deben de ejecutar lo siguiente desde una ventada de DOS:
        1. C:\>sqlplus /nolog
        2. SQL> connect / as sysdba Conectado.
        3. SQL> shutdown immediate
        4. SQL> startup restrict
        5. SQL> alter database character set internal_use UTF8;
        6. SQL> shutdown immediate
        7. SQL> startup
              Nota: Esto es para que al momento de conectar a Oracle XE no de el error de windows:

      Para conectarse deben de hacerlo con:
      • User Name: system
      • Password : (Password que colocaron al momento de instalar Oracle XE)
      • Database : XE


      Nota:  Instruccion encontrada en Internet, gracias a todos

      lunes, 5 de febrero de 2018

      Script: Comparar estructura de dos tablas Sql Server

      En esta oportunidad comparto unos querys que pueden ayudarte a comparar dos tablas y identificar que campos existen en una u otra tabla.  Ademas agrego otros querys que genera la creación y eliminación de columnas.

      Solo debe de poner en @Table1 y @Table2 los nombres de las tablas que desea comprar y/o generar scripts.

      Query no.1 - Comparar estructura

      Este query compara dos tablas y muestra que campos no están en la tabla1 o tabla2.

      DECLARE @Table1 VARCHAR(100)='Tabla1'
              ,@Table2 VARCHAR(100)='Tabla2'

      SELECT *
      FROM (
             SELECT TABLE_NAME TABLE1, 
             COLUMN_NAME COLUMN1,
         CASE WHEN DATA_TYPE='VARCHAR' THEN 'VARCHAR('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
              WHEN DATA_TYPE='NVARCHAR' THEN 'NVARCHAR('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
          WHEN DATA_TYPE='VARBINARY' THEN 'VARBINARY('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
          WHEN DATA_TYPE='CHAR' THEN 'CHAR('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
          WHEN DATA_TYPE='DECIMAL' THEN 'DECIMAL('+Convert(VARCHAR(10),NUMERIC_Precision_Radix)+','+Convert(VARCHAR(10),NUMERIC_Scale)+')'
          WHEN DATA_TYPE='NUMERIC' THEN 'DECIMAL('+Convert(VARCHAR(10),NUMERIC_Precision_Radix)+','+Convert(VARCHAR(10),NUMERIC_Scale)+')'
            ELSE UPPER(DATA_TYPE)
         END DATA_TYPE1,
         CASE WHEN IS_NULLABLE='NO' THEN 'NOT NULL'
              ELSE 'NULL' 
         END IS_NULLABLE1
          FROM INFORMATION_SCHEMA.COLUMNS C
      WHERE Table_Name=@Table1
      ) T1
      LEFT OUTER JOIN
      (
             SELECT TABLE_NAME TABLE2, 
             COLUMN_NAME COLUMN2,
         CASE WHEN DATA_TYPE='VARCHAR' THEN 'VARCHAR('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
              WHEN DATA_TYPE='NVARCHAR' THEN 'NVARCHAR('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
          WHEN DATA_TYPE='VARBINARY' THEN 'VARBINARY('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
          WHEN DATA_TYPE='CHAR' THEN 'CHAR('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
          WHEN DATA_TYPE='DECIMAL' THEN 'DECIMAL('+Convert(VARCHAR(10),NUMERIC_Precision_Radix)+','+Convert(VARCHAR(10),NUMERIC_Scale)+')'
          WHEN DATA_TYPE='NUMERIC' THEN 'DECIMAL('+Convert(VARCHAR(10),NUMERIC_Precision_Radix)+','+Convert(VARCHAR(10),NUMERIC_Scale)+')'
            ELSE DATA_TYPE
         END DATA_TYPE2,
         CASE WHEN IS_NULLABLE='NO' THEN 'NOT NULL'
              ELSE 'NULL' 
         END IS_NULLABLE2
          FROM INFORMATION_SCHEMA.COLUMNS C
      WHERE Table_Name=@Table2
      ) T2
      ON T1.COLUMN1 = T2.COLUMN2
      WHERE ( T1.COLUMN1 IS NULL 
          OR T2.COLUMN2 IS NULL)


      Query no.2 - Generar Script de creación de nuevos campos

      Este query genera la creación de los nuevos campos, que existen en la búsqueda de la tabla1.

      DECLARE @Table1 VARCHAR(100)='Tabla1'
              ,@Table2 VARCHAR(100)='Tabla2'

      SELECT 'ALTER TABLE '+@Table2+' ADD '+COLUMN1 +' '+DATA_TYPE1+' ' +IS_NULLABLE1+
             CHAR(10)+CHAR(13)+'GO'
      FROM (
             SELECT TABLE_NAME TABLE1, 
             COLUMN_NAME COLUMN1,
         CASE WHEN DATA_TYPE='VARCHAR' THEN 'VARCHAR('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
              WHEN DATA_TYPE='NVARCHAR' THEN 'NVARCHAR('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
          WHEN DATA_TYPE='VARBINARY' THEN 'VARBINARY('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
          WHEN DATA_TYPE='CHAR' THEN 'CHAR('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
          WHEN DATA_TYPE='DECIMAL' THEN 'DECIMAL('+Convert(VARCHAR(10),NUMERIC_Precision_Radix)+','+Convert(VARCHAR(10),NUMERIC_Scale)+')'
          WHEN DATA_TYPE='NUMERIC' THEN 'DECIMAL('+Convert(VARCHAR(10),NUMERIC_Precision_Radix)+','+Convert(VARCHAR(10),NUMERIC_Scale)+')'
            ELSE UPPER(DATA_TYPE)
         END DATA_TYPE1,
         CASE WHEN IS_NULLABLE='NO' THEN 'NOT NULL'
              ELSE 'NULL' 
         END IS_NULLABLE1
          FROM INFORMATION_SCHEMA.COLUMNS C
      WHERE Table_Name=@Table1
      ) T1
      LEFT OUTER JOIN
      (
             SELECT TABLE_NAME TABLE2, 
             COLUMN_NAME COLUMN2,
         CASE WHEN DATA_TYPE='VARCHAR' THEN 'VARCHAR('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
              WHEN DATA_TYPE='NVARCHAR' THEN 'NVARCHAR('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
          WHEN DATA_TYPE='VARBINARY' THEN 'VARBINARY('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
          WHEN DATA_TYPE='CHAR' THEN 'CHAR('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
          WHEN DATA_TYPE='DECIMAL' THEN 'DECIMAL('+Convert(VARCHAR(10),NUMERIC_Precision_Radix)+','+Convert(VARCHAR(10),NUMERIC_Scale)+')'
          WHEN DATA_TYPE='NUMERIC' THEN 'DECIMAL('+Convert(VARCHAR(10),NUMERIC_Precision_Radix)+','+Convert(VARCHAR(10),NUMERIC_Scale)+')'
            ELSE UPPER(DATA_TYPE)
         END DATA_TYPE2,
         CASE WHEN IS_NULLABLE='NO' THEN 'NOT NULL'
              ELSE 'NULL' 
         END IS_NULLABLE2
          FROM INFORMATION_SCHEMA.COLUMNS C
      WHERE Table_Name=@Table2
      ) T2
      ON T1.COLUMN1 = T2.COLUMN2
      WHERE ( T2.COLUMN2 IS NULL)


      Query no.3 - Generar Script de eliminacion de campos

      Este query genera la eliminación de los nuevos campos, que existen en la búsqueda de la tabla1.  La idea es, si se desea hacer rollback de los cambios implementados con el script anterior.

      DECLARE @Table1 VARCHAR(100)='Tabla1'
              ,@Table2 VARCHAR(100)='Tabla2'

      SELECT 'ALTER TABLE '+@Table2+' DROP COLUMN '+COLUMN1+
             CHAR(10)+CHAR(13)+'GO'
      FROM (
             SELECT TABLE_NAME TABLE1, 
             COLUMN_NAME COLUMN1,
         CASE WHEN DATA_TYPE='VARCHAR' THEN 'VARCHAR('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
              WHEN DATA_TYPE='NVARCHAR' THEN 'NVARCHAR('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
          WHEN DATA_TYPE='VARBINARY' THEN 'VARBINARY('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
          WHEN DATA_TYPE='CHAR' THEN 'CHAR('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
          WHEN DATA_TYPE='DECIMAL' THEN 'DECIMAL('+Convert(VARCHAR(10),NUMERIC_Precision_Radix)+','+Convert(VARCHAR(10),NUMERIC_Scale)+')'
          WHEN DATA_TYPE='NUMERIC' THEN 'DECIMAL('+Convert(VARCHAR(10),NUMERIC_Precision_Radix)+','+Convert(VARCHAR(10),NUMERIC_Scale)+')'
            ELSE UPPER(DATA_TYPE)
         END DATA_TYPE1,
         CASE WHEN IS_NULLABLE='NO' THEN 'NOT NULL'
              ELSE 'NULL' 
         END IS_NULLABLE1
          FROM INFORMATION_SCHEMA.COLUMNS C
      WHERE Table_Name=@Table1
      ) T1
      LEFT OUTER JOIN
      (
             SELECT TABLE_NAME TABLE2, 
             COLUMN_NAME COLUMN2,
         CASE WHEN DATA_TYPE='VARCHAR' THEN 'VARCHAR('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
              WHEN DATA_TYPE='NVARCHAR' THEN 'NVARCHAR('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
          WHEN DATA_TYPE='VARBINARY' THEN 'VARBINARY('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
          WHEN DATA_TYPE='CHAR' THEN 'CHAR('+Convert(VARCHAR(10),CHARacter_maximum_length)+')'
          WHEN DATA_TYPE='DECIMAL' THEN 'DECIMAL('+Convert(VARCHAR(10),NUMERIC_Precision_Radix)+','+Convert(VARCHAR(10),NUMERIC_Scale)+')'
          WHEN DATA_TYPE='NUMERIC' THEN 'DECIMAL('+Convert(VARCHAR(10),NUMERIC_Precision_Radix)+','+Convert(VARCHAR(10),NUMERIC_Scale)+')'
            ELSE UPPER(DATA_TYPE)
         END DATA_TYPE2,
         CASE WHEN IS_NULLABLE='NO' THEN 'NOT NULL'
              ELSE 'NULL' 
         END IS_NULLABLE2
          FROM INFORMATION_SCHEMA.COLUMNS C
      WHERE Table_Name=@Table2
      ) T2
      ON T1.COLUMN1 = T2.COLUMN2
      WHERE ( T2.COLUMN2 IS NULL)    

      martes, 16 de enero de 2018

      Split de archivo Excel

      Hace poco tuve un problema en cargar un archivo Excel que estaba muy grande, había muchas soluciones pero la mas inmediata era fraccionar el archivo grande en archivos de Excel pequeños.  

      Como siempre la intención es compartir la solución que a mas de alguien  puede servir, aunque en la web hay muchas soluciones.

      Normalmente en Excel no viene habilitado la pestaña de "Programador", para el ejercicio estoy utilizando "Microsotf Office Professional Plus 2010", ubicamos la opciones de : "Archivo", "Opciones" y la opción de "Personalizar cinta de opciones"


      Una vez habilitado creamos una función en este caso la llamaremos: SplitSheets()


      Vamos a leer los datos de la hoja no.1 ( Sheets(1) ), generamos archivos pequeños de 5000 lineas. Para ello utilizamos la variable TotalLinea, veamos como queda el código.

      Sub SplitSheets()

        Dim lLoop As Long, lCopy As Long
        Dim LastRow As Long
        Dim wbNew As Workbook
        Dim TotalLinea As Long
        
        TotalLinea = 4999
           
        With ThisWorkbook.Sheets(1)
               
          LastRow = .Range("A" & Rows.Count).End(xlUp).Row
          For lLoop = 2 To LastRow Step TotalLinea
            lCopy = lCopy + 1
            Set wbNew = Workbooks.Add
            .Range(.Cells(1, 1), .Cells(1, .Columns.Count)).EntireRow.Copy Destination:=wbNew.Sheets(1).Range("A1")
            .Range(.Cells(lLoop, 1), .Cells(lLoop + TotalLinea - 1, .Columns.Count)).EntireRow.Copy Destination:=wbNew.Sheets(1).Range("A2")
            Columns("D:D").Select
            Selection.ColumnWidth = 50
            Cells.Select
            Cells.EntireColumn.AutoFit
            Cells.EntireRow.AutoFit
            ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\CargaMasiva" & lCopy, FileFormat:=xlExcel8
            wbNew.Close
          Next lLoop
        
        End With
          
      End Sub

      Una vez creado la función, ponemos un botón en el Excel y enlazamos la función SplitSheets(), como se ve el ejemplo de la imagen.


      Espero sea de utilidad!!

      Remover caracteres en C#, que no son parte del patrón

      En la web, inclusive en la propia pagina de Microsoft uno puede encontrar este ejemplo similar de como remover carácter que de un patrón especifico, de todas formas lo comparto a mas de alguien le puede ser útil  😊.

      En esta oportunidad publico una función muy útil que permite remover caracteres que no son parte del patrón.

      Para ellos utilizamos la clase de RegularExpression, para ello debe incluir en el proyecto:

       using System.Text.RegularExpressions;


      A nuestra función le hemos llamado RemoveCharInvalids, todo lo que es parte del patrón es removido.

              public string RemoveCharInvalids(string cadena)
              {
                  string patternvalid = @"[^\w \.*@-\\]";
                  string _result = null;
                  try
                  {
                      _result = Regex.Replace(cadena, patternvalid, "", RegexOptions.None);
                  }
                  catch (Exception ex)
                  {
                      _result = cadena;
                      throw ex;
                  }
                  return _result; 
              }

      Como se puede observar tenemos un patrón definido en la variable "patternvalid", le estamos diciendo que nuestra expresión que identifique los caracteres que NO son alfanuméricos, esto lo hacemos con ^\w que es equivalente a  [^a-zA-Z0-9] y que NO son los caracteres punto (.), asterisco (*), arroba (@), guion medio (-) y diagonal (\\).

        string patternvalid = @"[^\w \.*@-\\]";

      Una vez definido el patrón, entonces procedemos a remover los caracteres con Regex.Replace

      _result = Regex.Replace(cadena, patternvalid, "", RegexOptions.None);


      como puedes observar lo estamos reemplazando con carácter vacío ("").

      Espero que se de  utilidad

      jueves, 31 de agosto de 2017

      SSIS: Convertir UTF8 a ANSI Latin 1252 y formatos de fechas

      Sql  Server Integration Services (SSIS) es una excelente herramienta para la carga, procesamiento y traslado de información entre diferente fuente de datos.

      En esta oportunidad escribo un pequeño tutorial de como trabajar formatos de fecha y caracteres especiales como la ñ, o vocales tildadas (á,é,í,ú,ó).   Espero que les sea útil como guía.

      Primero vamos a detallar la versión de nuestra base de datos:  

      1. Sql Server 2008 R2
      2. Configuración de Intercalación(Collation): Modern_Spanish_CI_AS
      3. En la base de datos "Demos", hemos creado la tabla "DummyCargaSSIS", con 6 campos.  El campo "ID" es de tipo Int Identity(1,1).  La carga de información lo vamos hacer  en los otros 5 campos.


      Definición del archivo de texto:

      1. En el archivo de texto "DatosDummy.txt" tenemos 5 columnas separados por el caracter pipe (|).
      2. Columnas: Código, fecha creación, Nombre, fecha activo y fecha baja
      Como pueden observar no todas las filas tienen información en la columna "fecha baja", ademas en la columna "nombre" vienen nombres con caracteres especiales (ñ,á,é,í,ú,ó).


      SSIS: Cargar de archivo de texto y subirlo 

      Tenemos el los datos en el archivo  "DatosDummy.txt", nuestro SSIS debe ser capaz de leer los datos e insertarlos en la tabla "DummyCargaSSIS" de nuestra base de datos "Demos".  Al SSIS debemos agregar los siguientes componentes tal como lo describe la imagen mas abajo:
      1. Agregar un "Flat File Connection" y poner por nombre "FFCM_ArchivoDummy": Este se conecta al archivo "DatosDummy.txt"
      2. Agregar un "Oled DB Connection" y poner por nombre "BDDemos": Se conecta a la base de datos "Demos".
      3. Agregar un "Data Flow Task"



      El siguiente paso es configurar el "Data Flow Task":

      1. Agregar un "Flat File Source", el cual debe conectarse con el "FFCM_ArchivoDummy"
      2. Agregar el componente "Derived Column":  Importante porque nos va ayudar a ejecutar las conversiones que necesitemos.
      Vamos a explicar exactamente un poco que vamos hacer, comencemos.  

      Flat File Connection Manager

      Debemos agregar un "Flat File Connection Manager".   En este componente vamos a configurar la ubicación del archivo y  "Code Page" a "65001 (UTF-8)".    Con esto nos garantizamos que pueda reconocer los caracteres especiales.



      Configuración Columnas "Advanced"

      Ahora, vamos a revisar como están configurados cada uno de los campos, para eso vamos a la opción "Advanced".  
      1. Codigo:  Tipo String, longitud 50
      2. FechaCreacion: Tipo String, longitud 50
      3. Nombre: Tipo String, longitud 100
      4. FechaVigente: Tipo DT_DBDATE (database date)
      5. FechaBaja: Tipo String, longitud 50
      Si son observadores, podemos observar que el campo "FechaVigente", no viene como tipo String, sino que viene como DT_DBDATE.... 

      En Sql Server, el formato de la fecha (casi siempre), es YYYY-MM-DD.  En el archivo de texto para este campo vienen con este formato, entonces con solo indicarle que sea DT_DBDATE, el proceso lo castea y sin ningún problema lo sube a la base de datos.  Este es un ejemplo de conversión implícito.

      Image de cada campo





      Si se observa en el Preview podemos validar que los datos se visualiza tal como se visualiza el archivo de texto.  Vamos por buen camino.



      Data Flow Task

      En esta tarea procedemos a colocar tres componentes del SSIS:
      1. Flat File Source:  Fuente de datos, se conecta con el FCCM_ArchivoDummy.
      2. Derived Column:  Herramienta útil para la conversión de datos.  Mas adelante vamos a detallar su uso.
      3. Ole DB Destination:  Conexión con Sql Server, con la tabla DummyCargaSSIS.  Donde vamos a guardar los datos.


      Derived Column

      Estas en una de la grandes virtudes que tiene Sql Server Integration Service, el poder validar, castear, modificar el valor, etc de los campos que vamos a procesar.  Vamos a detallar su uso y como podemos desde este componente convertir juegos de caracteres de UTF8 a ANSI 1252 o leer un determinado formato de fecha y pasarlo según el formato que lo requiere el destino.



      Se puede observar que vamos a derivar 4 campos:  Código, fecha creación, nombre, y fecha de baja. Comencemos con el primero:

      Analicemos el campo "Codigo"

      En la configuración de Flat Flat Connection, recuerde que dejamos el "Code Page" con el valor  65001 (UTF-8).  Necesito convertirlo a ANSI 1252, ya que  nuestra BD asi esta.  Entonces lo que procede es escribir en "Expression":

      (DT_STR,10,1252)SUBSTRING(Codigo,1,10)

      Hemos resaltado dos colores en esta expresión.  Vamos con la primera
      • (DT_STR,10,1252):  Estamos indicando que vamos a castear el campo codigo, que es de tipo String, con longitud 10, y que se pasa del UFT-8 al ANSI 1252.  Con esto solventamos el problema de guardar los caracteres especial en la base de datos.
      • SUBSTRING(Codigo,1,10):  Con esto solo estamos indicando que vamos a tomar el campo código los caracteres del 1, con longitud 10.  Tal vez no es necesario esto, pero estoy validando que solo tome los primeros 10 caracteres.
      • Como se puede observar en el dibujo,  a la columna derivada le estamos indicando que  se va a llamar CodigoOut.

      Analicemos el campo "FechaCreacion"


      • Si recuerdan, este dato viene en la segunda posicion del archivo, para la primera fila trae "25/05/2017".  Este es un formato DD/MM/YYYY,  ok entonces procedamos a tratar este datos y lo convertimos al formato de Sql Server.
      LEN(TRIM(SUBSTRING(FechaCreacion,1,10))) == 10 ? (DT_DBDATE)(SUBSTRING(FechaCreacion,7,4) + "-" + SUBSTRING(FechaCreacion,4,2) + "-" + SUBSTRING(FechaCreacion,1,2)) :NULL(DT_DBDATE)

      • Evaluamos la expresion, si tiene los 10 caracteres.
      • En la evaluacion (a==b?true:false), en la parte true (?), realizamos un casteo de tipo DT_DBDATE y armamos las fecha en formato YYYY-MM-DD,   
      • Si el campo viene null entonces en la parte false (:), mandamos como resultado (DT_DBDATE)NULL
      • Nombre derivado: FechaCreacionOut
      El formato de la fecha puede venir DDMMYYY, YYYYMMDD, etc, lo que debemos hacer es leer la posición que representa cada dato y formatearlo al estilo de Sql Server (YYYY-MM-DD) u otro estilo que se requiera.

      Analicemos el campo "Nombre"

      El tratamiento a esto campo es muy similar al campo "Codigo", con la diferencia que omitimos la instrucción SUBSTRING.  Nombre derivado: NombreOut.

      Analicemos el campo "FechaBaja_Out"

      Volvamos al archivo de texto, el valor para este campo viene en la ultima columna, vemos que la fecha viene con formato DD/MM/YYYY y por cierto a veces viene vacio.  Aqui vamos a tomar otro camino, en vez de manipular la cadena String, vamos a proceder a utilizar el cast de fecha de SSIS.  

      LEN(TRIM(FechaBaja)) == 10 ? (DT_DATE)FechaBaja : NULL(DT_DATE)

      • Primero valida si cumple con la longitud del formato que es 10.
      • Si cumple, entonces realiza el casteo  (DT_DATE)FechaBaja.  En este punto SSIS  es capaz de reconocer en el formato que viene la fecha y la convierte implicitamente al formato de Sql Server.

      Si me pregunta que camino tomo, prefiero irme siempre por la manipulación de string y formatear la fecha.  Y creo que el rendimiento es mucho mejor.

      Al ejecutar el SSIS entonces tenemos el resultado esperado



      Espero les sirva 👊

      sábado, 19 de agosto de 2017

      Code folding en NetBeans, similar a #region y #endregion Visual Studio

      Posiblemente has utilizado etiquetas #region y #endregion en Visual Studio,  que permiten crear bloques de código que pueden colapsar y expandir.   En NetBeans se tiene algo similar llamado Code folding.

      En NetBeans, debe poner al principio del código el comentario //<editor-fold> y al final del código //</editor-fold>

      ejemplo:

       // <editor-fold>  
      public int sumardosnumeros (int a, int b)
          {
              return (a+b);
          }
      // </editor-fold>  

      Si quieres agregar comentarios debe expresarlo con este formato:

       // <editor-fold desc="sumar dos numeros">>  
      public int sumardosnumeros (int a, int b)
          {
              return (a+b);
          }
      // </editor-fold>  

      Si quieres que se muestre comentario y de una vez colapsar  el bloque entonces usa "defaultsstate"
       // <editor-fold  defaultstate="collapsed" desc="sumar dos numeros">>  
      public int sumardosnumeros (int a, int b)
          {
              return (a+b);
          }
      // </editor-fold>  

      martes, 15 de agosto de 2017

      Pasos basicos con Payara Server

      Arrancar payara server:

      Resultado de imagen para imagen payara server

      Arrancar el servidor "Payara Server" con Windows PowerShell

      1. Ingresar a "Windows PowerShell"
      2. Ubicar en la carpeta donde esta asadmin.bat.  En mi entorno de pruebas lo tengo ubicado en C:\Programs\payara-4.1.2.173\payara41\bin.  Con el comando CD realizar esto: cd C:\Programs\payara-4.1.2.173\payara41\bin
      3. Ejecutar: ./asadmin start-domain
      4. Ejecutar ./asadmin start-database




      Una vez que cargo  el servidor puede acceder a http://localhost:4848/common/index.jsf

      Si los pasos lo ejecutar con CMD, entonces:
      1. Tecla Win + R
      2. Ejecutar el comando CMD
      3. Ubicar en la carpeta donde esta asadmin.bat.  En mi entorno de pruebas lo tengo ubicado en C:\Programs\payara-4.1.2.173\payara41\bin.  Con el comando CD realizar esto: cd C:\Programs\payara-4.1.2.173\payara41\bin
      4. asadmin start-domain
      5. asadmin start-database
      Y luego ingresa al sitio:   http://localhost:4848/common/index.jsf


      lunes, 17 de julio de 2017

      Query Jerarquico (Recursivo) Sql Server

      Paso #1: Crear la tabla dummy_jerarquia


      CREATE TABLE [dbo].[dummy_jerarquia](
                [id] [int] NULL,
                [nombre] [varchar](20) NULL,
                [idpadre] [int] NULL
      ) ON [PRIMARY]

      Paso #2: Inserta datos


      INSERT [dbo].[dummy_jerarquia] ([id], [nombre], [idpadre]) VALUES (1, N'AMERICA', 0)
      INSERT [dbo].[dummy_jerarquia] ([id], [nombre], [idpadre]) VALUES (2, N'America del Nombre', 1)
      INSERT [dbo].[dummy_jerarquia] ([id], [nombre], [idpadre]) VALUES (3, N'America del Sur', 1)
      INSERT [dbo].[dummy_jerarquia] ([id], [nombre], [idpadre]) VALUES (4, N'America Central', 1)
      INSERT [dbo].[dummy_jerarquia] ([id], [nombre], [idpadre]) VALUES (5, N'Caribe', 1)
      INSERT [dbo].[dummy_jerarquia] ([id], [nombre], [idpadre]) VALUES (6, N'Canada', 2)
      INSERT [dbo].[dummy_jerarquia] ([id], [nombre], [idpadre]) VALUES (7, N'Estados Unidos', 2)
      INSERT [dbo].[dummy_jerarquia] ([id], [nombre], [idpadre]) VALUES (8, N'Guatemala', 4)
      INSERT [dbo].[dummy_jerarquia] ([id], [nombre], [idpadre]) VALUES (9, N'Salvador', 4)
      INSERT [dbo].[dummy_jerarquia] ([id], [nombre], [idpadre]) VALUES (10, N'Argentina', 3)
      INSERT [dbo].[dummy_jerarquia] ([id], [nombre], [idpadre]) VALUES (11, N'Brasil', 3)
      INSERT [dbo].[dummy_jerarquia] ([id], [nombre], [idpadre]) VALUES (12, N'Colombia', 3)
      INSERT [dbo].[dummy_jerarquia] ([id], [nombre], [idpadre]) VALUES (13, N'Republica Dominicana', 5)
      INSERT [dbo].[dummy_jerarquia] ([id], [nombre], [idpadre]) VALUES (14, N'Trinidad y Tobago', 5)


      Paso #3: Ejecutar el siguiente Query


      With Jerarquia ( id, nombre, idpadre, level, sort)
      As (
           SELECT
                        D.id,
                        CAST(D.nombre AS VARCHAR(100)),
                                    D.idpadre,
                                    0 as level,
                                    CAST (D.nombre AS VARCHAR (100)) as sort
           FROM dummy_jerarquia AS D
                 WHERE idpadre=0       
                 UNION ALL
                 SELECT D.ID,
                                    CAST(REPLICATE('|---',level+1)+D.nombre as varchar(100)),
                                    D.idpadre,
                                    level+1,
                                    CAST (sort + ' \\ ' + '('+CAST(D.ID AS VARCHAR(10))+')'+D.nombre AS VARCHAR (100)) as sort
           FROM dummy_jerarquia AS D
                       INNER JOIN Jerarquia J
                          ON D.idpadre=J.id)
      SELECT J.id, J.nombre,J.idpadre, level, sort
      FROM Jerarquia  J
      ORDER BY SORT
      option (maxrecursion 0)


      Paso #4:  Revisar el resultado obtenido.


      El ejemplo es bastante básico, pero espero con solo observar el Query puedo obtener la ayuda que necesitas.


      https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqL4AX6WYROm7jj_bPbafhtB5IwOVyD3bX4g-4CKNopuspk91u_rbR3gntitVqyZwQSuzMofHyZ6U8PhyphenhyphenCpUMPwxW6EVwpGXTam4ZIojmMu5q_XaXKpG3QzliRqup8uoWOAysjKkUTlyMY/s1600/ejemplo+Jerarquia.png

      sábado, 4 de febrero de 2017

      Identificar registros duplicados en Sql Server

      Otra vez publicando un articulo que posiblemente sea muy útil para cuando quieren identificar registros duplicados en SQL SERVER y así realizar algún tipo de actualización sobre dichos registros, por ejemplo.  Todo los registro duplicados identificarlo con la letra "X" o algo así. 

      Me imagino que muchos como yo, iniciaron su carrera en sistema con base de datos en Oracle, y luego tuvimos que migrar a otras como el caso de SQL Server.  Bueno resulta que Oracle teníamos el campo el ROWID que nos ayudaba a identificar los registros únicos de cada tabla.  Con este campo podíamos hacer preguntas a la base de datos que registros están duplicados por ejemplo, etc.

      Me lleve la sorpresa que no es exclusivo de Oracle, también en Sql Server también hay un campo que se llama %%physloc%%. Con el cual podemos hacer las mismas operaciones que hacíamos en Oracle.

      Sin tanto rodeos, miremos el siguiente query que es capaz de identificar los registros duplicados por los campos "Campo1" y  "Campo2" y una vez localizados actualiza el campo "Campo5".


      With a as (
            Select u.*,
                Count(*) over (partition by  Campo1, Campo2) as cnt,
                Min(%%physloc%%) over (partition by Campo1Campo2) as MINROWID,
                %%physloc%% as rowid
            From Mytable u )
      Update a
      Set Campo5="X"
      Where cnt > 1
      And Rowid > MINROWID;





      sábado, 12 de noviembre de 2016

      Payara Server: Configurar JDBC Connection Pools con MariaDB

      Configurar JDBC Connection Pools con MariaDB


      Resultado de imagen para Mariadb

      Estos son los pasos para configurar JDBC Connection Pools con base de datos MariaDB:

      • En la pagina de MariaDB, debemos descargar el MariaDB Connector/J.  En mi caso estoy usando el driver mariadb-java-client-2.2.3.jar.  
      • Hay dos formas de poder agregar el jar, miremos la primera opcion que seria manual:
        • Copiar en la ruta C:\Programs\payara5\glassfish\lib.  Seguro que cambia la carpeta de tu instalación, debes buscar ...\glassfish\lib.
        • La opción seria mas al estilo de Payara via cmds: Una vez que que inicies payara (asadmin start-domain), ejecutas  asadmin add-library --type common C:\Proyectos\Java\Lib\mariadb\mariadb-java-client-2.2.3.jar
      • Una vez instalado el driver mariadb-java-client-2.2.3.jar, debe reiniciar Payara Server. Las veces que lo he ejecutado me ha tocado reiniciar el servidor Payara (asadmin restart-domain)
      • Luego, ingresar a la consola de Payara Server (http://localhost:4848/common/index.jsf).  Por default esta configurado en el puerto 4848, o indicar el puerto con que se ha configurado si es tu caso.
      • Una vez que cargue la consola, debe navegar a la opción Resources\JDBC\JDBC Connection Pools, y ejecutar "New".
      • En esta pantalla debes indicar el nombre de Pool Name, Resource Type, Database Driver Vendor como lo describe la imagen.

      Datasource Classname: org.mariadb.jdbc.MariaDbDataSource
      • Pase a la siguiente pantalla (Step 2 of 2) y defina las propiedades que necesita
            • URL : jdbc:mariadb://localhost:3306/demo
      • Una vez definido estos propiedad, salve los cambios y realice una prueba de conexión, el cual debe ser exitoso.


      Espero que estos pasos sencillos puede ayudarte a configurar un JDBC Connection Pool con base de datos MariaDB.

      Si requieres mas información del driver de MariaDB, te dejo este link