Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Mientras tanto se han añadido, subrepticiamente, nuevas funcionalidades para mitigar este
problema…
Nomenclatura:
Denominaremos “dll de extensión” a aquellos binarios registrados en la tabla “dlls” de a3ERP,
que se cargan al conectar a una empresa.
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.
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.
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 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:
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
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;
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
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
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.
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
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:
17 }
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.
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
Deja un comentario
Comments 0
Seguir
http://comunidadnexus.com/2013/11/01/pero-mira-como-beben-los-peces-en-la-b-d-de-a3erp/ 9/9