Está en la página 1de 9

17/3/2014 Pero mira como beben los peces en la b.d.

de a3ERP | Comunidad a3ERP

Pero mira como beben los peces en la b.d.


de a3ERP
NOV 1
Publicado por El monstruo de Caerbannog
- Pequeño saltamontes dime tu, desde tu… inocencia, ¿qué lección podemos extraer de la
caída del castillo de Ghu-ang Thon a manos de los sanguinarios e los impíos enemigos del
emperador, los Guan-tle klu-be, justo tras tu visita espiritual a nuestros hermanos que allí
moraban?
- Maesto, ¿Será quizás la vanidad del general de los ejércitos del emperador? ¿Confiarse con la
solidez de sus defensas y magnitud de su ejercito? ¿Menospreciar a sus oficiales? ¿No tejer
una red de sigilosos espías y aguerridos exploradores? ¿Programar en visual chufa, digo
basic?…

Durante la implementación de una solución de adaptación de a3ERP


(http://www.a3software.com/a3erp_solucion_integral_gestion_pymes.htm) a un cliente, no
podremos evitar iniciar sesión con a3ERPActiveX (antiguo NAX) para crear documentos,
maestros, etc… como con la b.d. para realizar consultas o modificaciones en las tablas. Hasta
versión 8 inclusive, muchos programadores se apoyaban en el usuario de sistema Nexus
(ahora a3ERP) o en uno creado “ex profeso”. Pero desde la introducción de la versión 9, con el
licenciamiento concurrente por usuario y máquina, esas estrategias se tornan un problema.

Mientras tanto se han añadido, subrepticiamente, nuevas funcionalidades para mitigar este
problema…

…como es la posibilidad de, para las dlls/activeX de extensión de a3ERP, conectar a la


empresa en la que el usuario se encuentra trabajando sin tener que aportar credenciales (y
por lo tanto usando la misma licencia) y la de usar las conexiones (ADO
(http://msdn.microsoft.com/en-us/library/windows/desktop/ms676539(v=vs.85).aspx)) a la
base de datos que usa la aplicación (por ejemplo para lanzar consultas sin tener que crear otra
conexión a la base de datos) tanto en dlls de extensión como en aplicaciones que usen
a3ERPActiveX (disponibles en la última versión 9 a fecha de hoy).

Nomenclatura:
Denominaremos “dll de extensión” a aquellos binarios registrados en la tabla “dlls” de a3ERP,
que se cargan al conectar a una empresa.

Conectar sin credenciales (a3ERPActiveX)

http://comunidadnexus.com/2013/11/01/pero-mira-como-beben-los-peces-en-la-b-d-de-a3erp/ 1/9
17/3/2014 Pero mira como beben los peces en la b.d. de a3ERP | Comunidad a3ERP

Se han modificado las funciones del objeto enlace “Iniciar” y “Acabar” para permitir, a las dlls
de extensión que usen a3ERPActiveX, conectar a la empresa actual sin tener que indicar las
credenciales (usuario y contraseña). No funcionará el ejecutables que usen a3ERPActiveX.

Función Enlace.Iniciar

Ahora, si se pasa a los parámetros empresa y ubicación la cadena vacía, conecta a la empresa
actual sin autenticarse. Sería el equivalente de llamar a “LoginUsuario” y a continuación a
“SeleccionarEmpresaActiva”.Llamamos a “Iniciar” sin invocar anteriormente a la función
“LoginUsuario“ (De hecho, se prohíbe hacer previamente una llamada a “LoginUsuario” o a
“Iniciar” con otros parámetros) como se puede ver en los siguientes ejemplos:

1 // en Delphi
2 var
3 enlace: IEnlace;
4 begin
5 enlace = CoEnlace.Create;
6 enlace.RaiseOnException := true;
7 enlace.Iniciar("", "");
8 // resto del código
9 enlace.Acabar;

1 // en C#
2 var enlace = new a3ERPActiveX.Enlace();
3 enlace.RaiseOnException = true;
4 enlace.Iniciar("", "");
5 // resto del código
6 enlace.Acabar();

Nota: Como habíamos avanzado, también se ha modificado la función Acabar (que desde dlls
de extensión estaba prohibido llamar) para que, si estamos trabajando conectados de la nueva
manera, no haga nada. Así es más fácil usar el mismo código fuente en ejecutables y
extensiones de a3ERP.

Usar la conexión de a3ERP

a3ERP, ya sea a las dll de extensión como a los ejecutables que usan a3ERPActiveX, ofrece las
conexiones que usa para acceder a las bases de datos de la ejecución en curso. Es decir,
permite acceder a la de la empresa actual y a la de sistema de la instalación. Veamos cómo
podemos obtenerlas.

Dll de extensión (dll / activeX)


http://comunidadnexus.com/2013/11/01/pero-mira-como-beben-los-peces-en-la-b-d-de-a3erp/ 2/9
17/3/2014 Pero mira como beben los peces en la b.d. de a3ERP | Comunidad a3ERP

Hay un nuevo evento de inicialización llamado “IniciarGeneral” que, aparte de las cadenas
ADO de conexión a la base de datos de la empresa y sistema (“Iniciar” o “IniciarConSistema“
(http://comunidadnexus.com/2009/03/26/yo-y-nexus-la-consumacion)) nos devuelve los
objetos conexión (http://msdn.microsoft.com/en-
us/library/windows/desktop/ms681519(v=vs.85).aspx) usados por a3ERP para conectar a
ellas.
Nota: Este evento no impide la ejecución de “Iniciar” o “IniciarConSistema“. De hecho, si una dll
implementa “Iniciar” (o “IniciarConSistema“) e “IniciarGeneral“, primero llamará a
“Iniciar/IniciarConSistema” y después a “IniciarGeneral“.

1 // en Delphi
2 procedure IniciarGeneral(Parametros: Variant); stdcall;

1 // en C#
2 void IniciarGeneral(object Parametros);

Esta función recibe un único parámetro que corresponde con una estructura Dataset
(http://comunidadnexus.com/2009/03/26/yo-y-nexus-la-consumacion/) mencionada en los
artículos de este blog sobre los eventos de a3ERP.
En este caso concreto se trata de una matriz de dos elementos, el primero contiene el número
de elementos que la componen (uno en principio) y el segundo, los datos en sí.
Estos datos son otra matriz en el que el primer elemento vuelve a indicar cuantos elementos la
componen (nueve a día de hoy) y cada uno es otra matriz de dos elementos; en el que el
primero es una cadena usada como descripción de lo almacenado en el segundo.
Gráficamente:

(http://comunidadnexus.files.wordpress.com/2013/10/iniciargeneral.png)

Los nueve valores contenidos en la estructura mencionada son:

Los dos primeros corresponden a las cadenas de conexión a la empresa y a sistema que ya
nos proporciona IniciarConSistema.
Después siguen las credenciales del usuario y del usuario a3ERP (con la contraseña
cifrada).
Finalmente, los tres últimos, son los objetos de conexión (http://msdn.microsoft.com/en-
us/library/windows/desktop/ms681519(v=vs.85).aspx) a la b.d. de empresa, sistema
(ambos usando el usuario de sistema a3ERP) y la de empresa nuevamente (pero usando el
usuario actual).

En detalle:

Valor descripción Contenido


ConexionSistema Cadena conexión ADO a B.D. sistema.
ConexionEmpresa Cadena conexión ADO a B.D. empresa.
Usuario Usuario autentificado.

http://comunidadnexus.com/2013/11/01/pero-mira-como-beben-los-peces-en-la-b-d-de-a3erp/ 3/9
17/3/2014 Pero mira como beben los peces en la b.d. de a3ERP | Comunidad a3ERP

Password Contraseña cifrada del usuario.


UsuarioNexus Usuario de sistema a3ERP.
PasswordNexus Contraseña cifrada del usuario de sistema.
SistemaConnectionObject Objeto Conection del ADO apuntando a la b.d. de
sistema (usuario a3ERP).
EmpresaConnectionObject Objeto Conection del ADO apuntando a la b.d. de
empresa (usuario a3ERP).
UserEmpresaConnectionObject Objeto Conection del ADO apuntando a la b.d. de
empresa (usuario autentificado).
Ejemplo de uso:

1 // en Delphi
2 procedure IniciarGeneral(Parametros: Variant);
3 var
4 Datos: TDatasetObject;
5 ConnectionObject: Variant;
6 begin
7 Datos := TDatasetObject.Create(Parametros);
8 try
9 ConnectionObject := Datos.Rows[0].FieldByName('EmpresaConnectionObjec
10 finally
11 Datos.Free;
12 end;

Nota: Hemos usado la utilidad del blog RowObject


(http://comunidadnexus.com/2012/01/26/delphi-snippet-rowobject/).

1 // en C#
2 void IniciarGeneral(object Parametros)
3 {
4 var fila = (Parametros as Object[])[1];
5 var campo = (fila as Object[])[8];
6 dynamic connectionObject = (campo as Object[])[1];
7
8 // o buscar por nombre (recomendado)
9 // por ejemplo con linq:
10 dynamic connectionObject = (from linea in (datos as object[]).OfType<
11 from campo in (linea as object[]).OfType<
12 where (campo[0] as string) == "EmpresaConn
13 select campo[1]).FirstOrDefault();

Para ver cómo usar el objeto recibido, saltad al punto “Como usar el objeto Connection de
ADO”.

a3ERPActiveX

http://comunidadnexus.com/2013/11/01/pero-mira-como-beben-los-peces-en-la-b-d-de-a3erp/ 4/9
17/3/2014 Pero mira como beben los peces en la b.d. de a3ERP | Comunidad a3ERP

Se ha añadido la función “GetConexionDB” que devuelve el objeto conexión ADO


(http://msdn.microsoft.com/en-us/library/windows/desktop/ms681519(v=vs.85).aspx)
utilizados por a3ERPActiveX para conectar a la empresa o a la b.d. de sistema:

1 // en Delphi
2 function GetConexionDB(const Nombre: WideString): OleVariant;

1 // en C#
2 dynamic GetConexionDB(Nombre: string); // .NET 4.0 o superior.
3 object GetConexionDB(Nombre: string); // .NET 3.5 o inferior

Donde el parámetro “Nombre”, a día de hoy, puede ser:

Valor Resultado
EMPRESA Objeto Conection del ADO apuntando a
la empresa actual.
SISTEMA Objeto Conection del ADO apuntando a
la b.d. de sistema.
Podréis encontrar ejemplos de uso en el siguiente apartado.

Como usar el objeto ADO Conection

Ya hemos visto en los puntos anteriores como obtener los objetos conexión que usa a3ERP
para acceder a las bases de datos de la ejecución en curso. Ahora veamos cómo usarlos desde
Delphi y C# (.NET).

Delphi

En tan sencillo como usar un componente de la paleta, TADOConnection


(http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html
y asignarle el objeto recibido a la propiedad “ConnectionObject
(http://docwiki.embarcadero.com/RADStudio/XE5/en/Accessing_the_Connection_Object)“. A partir de
ese momento dispondremos de una conexión abierta (es decir, no hay que abrirla y menos aún
cerrarla) contra la base de datos de empresa o sistema. Si queréis dejar de usarla, basta con
asignar NIL a dicha propiedad, por ejemplo porque se descargue la dll o no se requiera más.
En realidad, como el objeto lo recibimos como OleVariant
(http://docwiki.embarcadero.com/RADStudio/XE5/en/Variant_Types), no hace falta asignarlo a un
TADOConnection. Se pueden llamar a los métodos de objeto Conection de ADO
(http://msdn.microsoft.com/en-us/library/windows/desktop/ms681519(v=vs.85).aspx)
directamente, si los conocéis. Pero es más cómodo hacerlo de aquella manera, ya que nos
incluirá los uses que necesitemos, evitará errores de sintaxis (usando code completition) y nos
permitirá usar los componentes de acceso a datos mediante ADO.

http://comunidadnexus.com/2013/11/01/pero-mira-como-beben-los-peces-en-la-b-d-de-a3erp/ 5/9
17/3/2014 Pero mira como beben los peces en la b.d. de a3ERP | Comunidad a3ERP

Ejemplo:

1 var
2 Enlace: IEnlace;
3 a3ERPEmpresaConnection: OleVariant;
4 begin
5 Enlace := CoEnlace.Create();
6 Enlace.RaiseOnException := True;
7
8 if (not Enlace.SelecEmpresa) then exit;
9
10 a3ERPEmpresaConnection := Enlace.GetConexionDB('EMPRESA');
11 ADOConnection1.ConnectionObject := IInterface(a3ERPEmpresaConnection)
12 // resto del código
13 // supongamos que queremos dejar de usarla
14 ADOConnection1.ConnectionObject := nil;

C# (.NET)

En principio no conocemos una técnica que simplifique el uso del objeto recibido, al contrario
de lo que ocurre desde Delphi (no somos insondables pozos de sabiduría aunque lo
parezcamos. Usamos google como el que más). Pero eso no significa que sea muy complicado.
Como el objeto recibido es dynamic (http://msdn.microsoft.com/es-
es/library/dd264741.aspx) (sólo .net 4.0 o superior), podemos realizar las llamadas a las
funciones que conozcamos (recomendable consultar la información de la MSDN
(http://msdn.microsoft.com/es-ES/) anteriormente referenciada).
Ahora bien si es .net 3.5 (o inferior) o si queremos utilizar “code insight” para evitar errores,
nos bastará con importar las referencias a los TLBs de los componentes ADO. Para ello, desde
la pestaña pestaña “COM” del apartado “References” de nuestro proyecto de Visual Studio,
elegiremos “Microsoft ActiveX DataObjects X.X Library” (donde X.X será la versión mínima
que necesitemos de ADO. Recomendamos al menos una 2.7).
Una vez importada las referencias (o si conocemos las funciones a usar), podemos usar el
objeto de la siguiente manera:

1 using ADODB; // <<< nuevo namespace definido en la referencia importada


2
3 // (c) DSDLM Anno Domini 2013
4 private string ObtenerProveedorGenerico()
5 {
6 ADODB.Connection ConexionSQL = NaxEnlace.GetConexionDB("EMPRESA");
7 object RecordAffected;
8
9 ADODB.Recordset recordset = ConexionSQL.Execute("select top 1 codpro
10 //Para poder acceder a los fields en la referencia ADODB se ha de des
11 //Cuidado que esto copia la ADODB.DLL en la ruta donde esté nuestro e
12 if (recordset.RecordCount != 1)
13 {
14 throw new Exception("No se ha encontrado NINGÚN proveedor genéric
15 }
16 return recordset.Fields["CODPRO"].Value.ToString();
http://comunidadnexus.com/2013/11/01/pero-mira-como-beben-los-peces-en-la-b-d-de-a3erp/ 6/9
17/3/2014 Pero mira como beben los peces en la b.d. de a3ERP | Comunidad a3ERP

17 }

Nota: Observad bien en el comentario que hay en el código.

Aparte de usar el objeto Connection (http://msdn.microsoft.com/en-


us/library/windows/desktop/ms681519(v=vs.85).aspx), podremos instanciar otros objetos
ADO (http://msdn.microsoft.com/en-
us/library/windows/desktop/ms679836(v=vs.85).aspx) que nos permitirán realizar más
operaciones con las bases de datos de manera sencilla (usando las clases de la referencia
ADODB importada, o instanciándolas vía COM).
En el resto de lenguajes .net debería poderse usar de manera similar.

Con esto y un bizcocho que nos enviéis (preferiblemente no envenenado. Aunque si lo está,
agradeceríamos que lo indicaseis que uso le daremos) hemos terminado. Recordad, como
siempre, que esto no es información oficial, es solo oficiosa. Cualquier parecido con la
realidad es producto de la locura de una noche de verano (http://www.youtube.com/watch?
v=Vz-B-GDIABo). Si funciona es que alguien de a3ERP ha hecho bien. En caso contrario os
habéis equivocado y/o no conocéis el entorno.

NOTA: Nunca, jamás de los jamases de nunca, bajo pena del mayor escarnio o muerte (lo que
dependiendo del bar de abajo sea la oferta del día o de que haya llegado San Martín) debéis
cerrar la conexión. El grupo de operaciones especiales de “El Santo Oficio Informático
(http://www.youtube.com/watch?v=8mzfyVluiIU)” acudirá a vuestra localización para
acabar con vosotros, vuestras familias, amigos y la vecina cotilla del tercero derecha, hasta el
tercer grado de consanguinidad (servicio de recogida y limpieza posterior a cargo del finado a
abonar por adelantado). Recordad que es la conexión que está usando a3ERP.

No mi joven saltamontes, no. Acércate y verás que algo más sutil. Es algo más pequeño,
aparentemente más insignificante. Es como aquel poeta que, absorto en la contemplación del
bello nenúfar que mecido por la brisa de la tarde deslumbra en el estanque por el sol de
atardecer, se olvida de que esa estampa durará un suspiro; el tigre que cruza el estanque ya se
ha percatado de su presencia…
…¡Clonc! Y esto es para que recuerdes cerrar la puerta antes de marchar de cualquier lugar
(sobre todo si es levadiza) y para que me busques otra escupidera ya que no doy a basto
contigo.

Agradecimientos: D. Daniel Sánchez de León y Menéndez, fustigador de infieles, a D. Josep


Maria Artigas primer oficial de galeotes de su católica majestad y a D. Jose María López,
artillero mayor del reyno.

http://comunidadnexus.com/2013/11/01/pero-mira-como-beben-los-peces-en-la-b-d-de-a3erp/ 7/9
17/3/2014 Pero mira como beben los peces en la b.d. de a3ERP | Comunidad a3ERP

About these ads


(http://en.wordpress.com/about-these-ads/)

Acerca de El monstruo de Caerbannog

Temible guardián de la gruta que esconde un temible y obscuro secreto...


Ver todas las entradas de El monstruo de Caerbannog »
Publicado el noviembre 1, 2013 en Desarrolladores, Enlaces con terceros, Nuevas versiones,
Programación, Versión 9 y etiquetado en .net, a3ERP, ADO, c#, delphi, dll terceros, nax.
Guarda el enlace permanente. Deja un comentario.

Deja un comentario

Comments 0

Blog de WordPress.com. El tema Mystique.

Seguir

Seguir “Comunidad a3ERP”


http://comunidadnexus.com/2013/11/01/pero-mira-como-beben-los-peces-en-la-b-d-de-a3erp/ 8/9
17/3/2014 Pero mira como beben los peces en la b.d. de a3ERP | Comunidad a3ERP

Ofrecido por WordPress.com

http://comunidadnexus.com/2013/11/01/pero-mira-como-beben-los-peces-en-la-b-d-de-a3erp/ 9/9

También podría gustarte