En ocasiones cuando las bases de datos van creciendo y la instalación y configuración de Enkontrol en máquinas de los usuarios resulta tedioso si no se cuenta con una herramienta para automatizar esta instalación y configuración. El objetivo de este Articulo, es crear un instalador personalizado que Agregue los ODBC’s para la conexión a Enkontrol.
Para lograr esto existen otras opciones, como el configurar un ODBC de una pc y exportar las claves del registro del sistema, esto lo veremos en otro artículo.
(Para seguir este ejemplo se requiere nociónes informáticas medio - avanzado).
(Para seguir este ejemplo se requiere nociónes informáticas medio - avanzado).
Para la creación del instalador personalizado usaremos NSIS ((Nullsoft Scriptable Install System) que es un software para crear Instaladores, se eligio este por su facilidad de uso, amplia documentación y sobre todo free, se puede descargar en: (http://nsis.sourceforge.net/Download).
![]() |
Instalando NSIS. |
Lo que se instala es únicamente el compilador, para la creación del documento se puede utilizar cualquier editor de textos como el Notepad de Microsoft, para este ejemplo utilizaremos Notepad++.
![]() |
Notepad++ con soporte para NSIS. |
Lo que crearemos en el instalador será lo siguiente:
· Crear los ODBC’s en el registro del sistema (regedit) Para la conexión a las Bases de datos Administrativas.
· Crear los ODBC’s en el registro del sistema (regedit) Para la conexión a las bases de datos de Nominas.
· Configurar el Archivo Kontrol.ini que se copia en C:\Windows en la máquina del cliente.
De los cuales al momento de la instalación se podrán elegir los deseados, este instalador será capaz de detectar la plataforma del Sistema Operativo (x86 u x64) para la correcta configuración de los ODBC’s.
Iniciemos ...
Se abre el Notepad++ o su editor de texto favorito (Creamos un archivo con Nombre ProyectoEnk.nsi), copiar y modificar las partes indicadas del Archivo (Anexo en la ultima parte de este articulo o lo pueden descargar Aqui), en la ruta donde se guarde el archivo ProyectoEnk.nsi es necesario que se encuentre su archivo Kontrol.ini.
Abrir el compilador de NSIS y buscar y Cargar el Archivo ProyectoEnk.nsi
Después de cargar este, si no existen errores se habilita el Botón Test Installer, este es para probar que nuestro instalador se haya creado correctamente
![]() |
Probando Proyecto |
Después de la Instalación se abre el Administrador de Orígenes de datos y se comprueba que los ODBC's se hayan creado correctamente (Considerar abrir el Correcto Administrador de ODBC's 32bits si la plataforma es de x64esto se debe a que las aplicaciones de Enkontrol aun no han sido compiladas para x64).
El resultado de la compilación es el Archivo SetupODBCEnkontrol_1.o.exe
![]() |
SetupODBCEnkontrol_1.0.exe |
------------------------------------------------- INICIO DE SCRIPT -------------------------------------------------------
/*
* Info: Crea los ODBC's del Registros de Enkontrol.
* Author: ISC. Jerohan MC.
* Creation: 07 Jun 2011
* Modify: 07 Jun 2011
* Version: 1.0ÓN:ónss
* Name: ProyectEnk.nsi
*/
# Se Crean las variables que servirá lo largo de todo el proyecto.
!define App_version "1.0" ; Para indicar el número de versión Incrementar manualmente).
;!define HKCU_Ini "Software\ODBC\ODBC.INI"
; Ruta en el regedit donde se guarda los ODBC's de Enkontrol
!define HKLM_Ini "Software\ODBC\ODBC.INI"
!define HKLM_Data "Software\ODBC\ODBC.INI\ODBC Data Sources"
;Ruta de Instalación deón Sybase para Plataforma 64Bits y 32bits.
!define Ruta_Sybase "$PROGRAMFILES64\Sybase\SQL Anywhere 9\win32\dbodbc9.dll"
!define Ruta_Sybase32 "$PROGRAMFILES\Sybase\SQL Anywhere 9\dbodbc9.dll"
!define Nombre_Servicio "serv_v9" ;Nombre del servicio
!define IP_Servidor="192.168.1.7"
# Se incluye el Skin MUI, para una apariencia moderna del Instalador.
!include "MUI.nsh"
!include "${NSISDIR}\Contrib\Modern UI\System.nsh"
!include x64.nsh ;Para que soporte algunas variables de 64bits.
#Datos del Instalador.
SetCompressor ZLIB ; Nivel de Compresión Puede ser cualquiera: LZMA, BZIP2,ZLIB.
InstallDir $WINDIR ; Para la ruta del Kontrol.ini
SetOverwrite ON ; Sobrescribir los Archivos si existen.
SetCompress Auto
#Pantallas a Mostrar.
!insertmacro MUI_PAGE_WELCOME ;Página de Bienvenida.
!insertmacro MUI_PAGE_COMPONENTS ; Página de Componentes.
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
#Macros de las Pantallas que se mostrarán.
!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH
!insertmacro MUI_LANGUAGE "SPANISH" ; Para el idioma.
# Nombre del Instalador que se generara SetupODBCEnkontrol_1.0.exe
OutFile "SetupODBCEnkontrol_${App_version}.exe"
Var msg ;variable Para mostrar mensajes en el proceso de la instalación.
Var aux ;variable auxiliar.
Var RutaSybase ;Ruta de Sybase (dependiendo de la plataforma x86 u x64).
/*En esta sección se crean los ODbc's
de las bases de datos administrativas.
Cambiar por los numeros que se desee
*/
Section "Odbc Cias de 1 al 10" ODBC
#Determina la plataforma del Sistema Operativo (x86 u x64).
${If} ${RunningX64}
StrCpy $RutaSybase "${Ruta_Sybase}"
${Else}
StrCpy $RutaSybase "${Ruta_Sybase32}"
${EndIf}
# Los ODBC's deben estar creados en HKLM (HKEY_LOCAL_MACHINE),
${For} $R0 1 10 ; Cambiar por el número que se desee.
strCpy $msg "Creando $R0" ;Mensaje para el usuario.
DetailPrint $msg
strCpy $R1 $R0 ; Para no afectar el For y evitar que se cicle.
IntFmt $R1 "%02i" $R1 ; Para darle formato de [00], ejemplo 01,02, etc.
# En este caso cambiar se crea la siguiente estructura
# EK_ADM01_9,EK_ADM02_9,...,EK_ADM10_9
# Cambiar por la estructura que se desee, ejemplo: si se desea EK_ADM01 cambiar
# EK_ADM$R1_9 por EK_ADM$R1.
strCpy $aux "${HKLM_Ini}\EK_ADM$R1_9"
# Cambiar los valores por los deseados en las siguientes variables
# DatabaseName,EngineName,CommLinks,Uid,Pwd
WriteRegStr HKLM $aux "Driver" $RutaSybase
WriteRegStr HKLM $aux "DatabaseName" "EK_ADM$R1.db"
WriteRegStr HKLM $aux "EngineName" "${Nombre_Servicio}"
WriteRegStr HKLM $aux "AutoStop" "Yes"
WriteRegStr HKLM $aux "CommLinks" "SharedMemory,TCPIP{host=192.168.1.3}"
WriteRegStr HKLM $aux "UID" "dba"
WriteRegStr HKLM $aux "PWD" "password"
WriteRegStr HKLM $aux "Integrated" "No"
WriteRegStr HKLM $aux "Debug" "NO"
WriteRegStr HKLM $aux "DisableMultiRowFetch" "NO"
WriteRegStr HKLM $aux "Compress" "no"
# Registramos esta en el ODBC Data Sources (No olvide
# cambiar por la estructura deseada.
WriteRegStr HKLM "${HKLM_Data}" "EK_ADM$R1_9" "Adaptive Server Anywhere 9.0"
${Next}
SectionEnd
/*En esta sección de crean los ODbc's
de las bases de datos de nomina
Cambiar por los numeros que se desee
*/
Section "Odbc Nominas del 20 al 30" ODBC_Nomina
#Determinamos el Sistema Operativo
${If} ${RunningX64}
StrCpy $RutaSybase "${Ruta_Sybase}"
${Else}
StrCpy $RutaSybase "${Ruta_Sybase32}"
${EndIf}
#Los ODBC's deben estar creados en HKLM.
${For} $R0 20 30
strCpy $msg "Creando $R0" ;Mensaje para el usuario.
DetailPrint $msg
strCpy $R1 $R0 ; Para no afectar el For y evitar que se cicle.
IntFmt $R1 "%02i" $R1 ; Para darle formato de [00], ejemplo 01,02, etc.
/* En este caso cambiar se crea la siguiente estructura
# EK_NOM01_9,EK_NOM02_9,...,EK_NOM10_9
# Cambiar por la estructura que se desee, ejemplo:
si se desea EK_NOM0 cambiar EK_NOM$R1_9 por EK_NOM$R1. */
strCpy $aux "${HKLM_Ini}\EK_NOM$R1_9"
# Cambiar los valores por los deseados en las siguientes
# variables DatabaseName,EngineName,CommLinks,Uid,Pwd
WriteRegStr HKLM $aux "Driver" $RutaSybase
WriteRegStr HKLM $aux "DatabaseName" "EK_NOM$R1.db"
WriteRegStr HKLM $aux "EngineName" "serv_v9_Nomina"
WriteRegStr HKLM $aux "AutoStop" "Yes"
WriteRegStr HKLM $aux "CommLinks" "SharedMemory,TCPIP{host=192.168.1.7}"
WriteRegStr HKLM $aux "UID" "dba"
WriteRegStr HKLM $aux "PWD" "passwordenkontrol"
WriteRegStr HKLM $aux "Integrated" "No"
WriteRegStr HKLM $aux "Debug" "NO"
WriteRegStr HKLM $aux "DisableMultiRowFetch" "NO"
WriteRegStr HKLM $aux "Compress" "no"
# Registramos esta en el ODBC Data Sources
# (No olvide cambiar por la estructura deseada).
WriteRegStr HKLM "${HKLM_Data}" "EK_NOM$R1_9" "Adaptive Server Anywhere 9.0"
${Next}
SectionEnd
/* Se copia el Kontrol.ini en C:\Windows
Es importante que este archivo se encuentre donde
se guarde este archivo (ProyectEnk.nsi).
*/
Section "Kontrol.ini" Kontrol_Ini
SetOutPath $INSTDIR
file Kontrol.ini
SectionEnd
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;Para la descripción de las Secciones.
LangString Desc_Odbc ${LANG_SPANISH} "Dependiendo del S.O y la plataforma (x86,x64)se instalarán los ODBC's"
LangString Desc_Odbc_Nomina ${LANG_SPANISH} "Instalación de los ODBC's de Nomina."
LangString Desc_Kontrol_Ini ${LANG_SPANISH} " Instalación Kontrol.ini en C:\Windows"
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${ODBC} $(Desc_Odbc)
!insertmacro MUI_DESCRIPTION_TEXT ${ODBC_Nomina} $(Desc_Odbc_Nomina)
!insertmacro MUI_DESCRIPTION_TEXT ${Kontrol_Ini} $(Desc_Kontrol_Ini)
!insertmacro MUI_FUNCTION_DESCRIPTION_END
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Q tal Jero, estuve leyendo tu articulo y me parece super interesante, alguna vez has podido crear un ODBC para contectar Enkontrol y Visual Studio?
ResponderEliminarSi tienes mas o menos la idea de como hacerle, me podrías dar algín tip?
Saludos
Que tal Daniel,
ResponderEliminarEn realidad es muy sencillo, existen diferentes modos de conectarse a la bd, pero sin más, para conectarse a un ODBC de Enkontrol:
Importa esta referencia en tu proyecto (c#) y usa esta libreria:
using System.Data;
public static bool ConectarOdbcConnection(string pStrConecction)
{
try
{
if (Variables.m_cnnSybase == null)
Variables.m_cnnSybase = new OdbcConnection();
else
{
if (Variables.m_cnnSybase.State == ConnectionState.Open) Variables.m_cnnSybase.Close();
}
Variables.m_cnnSybase.ConnectionString = pStrConecction;
}
catch (Exception ex)
{
throw new Exception("Fallo al conectar con la Base de datos." + pStrConecction + "\n\r" + ex.Message);
}
return true;
}
La cadena de conexión seria la siguiente:
string strCnn = "ODBC;Driver=Adaptive Server Anywhere 9.0; Uid=dba; Pwd=elpassword;Dsn=ek-adm_etc;";
Apenas tenga un tiempo pienso publicar algunos ejemplos de conexiones desde distintas plataformas y lenguajes.
NOTA: variables.m_cnnSybase , lo tengo declarado en una clase publica public static OdbcConnection m_cnnSybase;
Saludos!.