You are on page 1of 16

Programación DLL´s

Introducción
La opción de añadir DLL´s a a3ERP permite modificar algunos procesos que realiza la
aplicación estándar y cambiarlo para adecuarlo a las necesidades del cliente.

Instalación en la oficina del cliente


1. En el servidor, copie la dll en la carpeta 'Binarios' de la aplicación. Recuerde la
estructura de carpetas: “Fabricante\ Producto\ Binarios”.
2. Abrir al directorio C:\ Program Files\ A3\ ERP\ Sistema.Custom\Sistema.
3. Copiar archivo regdlls.ini y pegar en carpeta donde está ubicada su dll.
4. Editar este nuevo el fichero regdlls.ini
5. Aparecerá contenido como este:

6. En este ejemplo estamos registrando una dll que se llama:


ejemplo_dll_con_framework4.dll y que está ensamblada para trabajar con el
framenwork 4.0
7. Si su dll utiliza otro framework, deberá incluir la línea debajo del asm que
corresponda.
8. Una vez añadida la línea, guarde el archivo.
9. Después, pasar una vista SQL desde el Managment Studio, insertando la dll. Esto se
debe hacer para cada una de las bases de datos que se quiera utilizar esta dll.
Los valores de la table DLL´s son:
DLL:
 Si trabaja con delphi, C++, etc. debe escribir el nombre de la dll.
Ejemplo: dll.dll.
 Si es un Active hecha en .NET como C# o Vd.NET, se debe poner en
formato NAMESPACE.NOMBRECLASE (generalmente el namespace
coincide con el nombre de la DLL).

Nota: en caso de duda, consulte la documentación de su plataforma de desarrollo.

Fabricante: Nombre carpeta creada en Extensiones \ Fabricante


Iddll: Identificador numérico de la DLL
Producto: Nombre de la carpeta creada por usted en \Extensiones\
Empresa\Producto

Insert into dlls(dll, fabricante, iddll, producto)


Values('ejemplo_dll_con_framework4.dll', 'fabricante', '2',
'ejemplo_dll_con_framework4')
Después, debe ejecutar el asistente del servidor, así los clientes se actualizarán
automáticamente y registrará las DLL's modificadas o nuevas.

Eventos
A3ERP implementa un sistema de eventos mediante el cual a través de una dll el programador
puede interactuar con la aplicación e introducir nueva lógica de negocio con nuevas
funcionalidades o restricciones.
Cuando a3ERP va a realizar ciertas acciones, como por ejemplo guardar una factura, consulta
antes a las dlls a ver si alguna de ellas implementa el evento ANTESDEGUARDARDOCUMENTO y
si alguna de las dlls registradas lo implementa llama a esa dll a ese método para que sea la dll
la que decida si permite según su lógica de negocio guardar el documento.
Actualmente A3ERP consulta a las dlls registradas en la tabla DLLS para ver si implementa
alguno de los siguientes eventos:

Sistemas

Método Iniciar
procedure( Empresa: PChar); stdcall;

Al entrar en una empresa


Método IniciarConSistema
procedure( Empresa: PChar); stdcall;
Al inicializar el a3ERP
Método IniciarGeneral
IniciarGeneral: procedure ( Parametros: Variant); stdcall;

Variante del método anterior. Se ejecuta al inicializar el a3ERP. Puede coexistir con cualquiera de
los dos métodos anteriores, en cuyo caso, se ejecutaría tras éstos.
Parametros: Esta función recibe un único parámetro que corresponde con una estructura ‘fila. El
primer valor de dicho array contiene el número de filas que la componen: 1.
El segundo valor de la array se trata de otra fila:
 El primer valor del subarray contiene el número de campos que contiene el subarray
 El segundo valor del subarray contiene los campos en sí en subsubarrays de dos elementos
con la estructura campo-valor. Estos datos son en este orden:

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.

Password Contraseña cifrada del usuario.

UsuarioNexus Usuario de sistema a3ERP.

PasswordNexus Contraseña cifrada del usuario de sistema.


Objeto Conection del ADO apuntando a la b.d. de
SistemaConnectionObject sistema (usuario a3ERP).

Objeto Conection del ADO apuntando a la b.d. de


EmpresaConnectionObject empresa (usuario a3ERP).

Objeto Conection del ADO apuntando a la b.d. de


UserEmpresaConnectionObject empresa (usuario autentificado).

Método Finalizar
procedure; stdcall;

Al salir de una empresa


Método SePuedeFinalizar
function(var aNotAllowCloseReason: PChar):Boolean; stdcall;
Método para evitar que el erp se pueda cerrar o no

Documentos

Método ObtPrecioCompra
function( PrcCompra: Double; Cabecera, Linea: Variant): Double; stdcall;

Al obtener el precio de compra en los documentos de compra


Método ObtPrecioVenta
function( PrcVenta: Double; Cabecera, Linea: Variant): Double; stdcall;

Al obtener el precio de venta en los documentos de venta


Método AutorizarPrecioVenta
function( CodArt: string; Unidades, Precio, Desc1, Desc2, Desc3, Desc4: Double): Boolean; stdcall;

Método para validar los precios de venta de los couemntos


Método DespuesDeGuardarDocumento
procedure(Documento: string; IdDoc: Double); stdcall;

Después de guardar cualquier documento de compra o venta


Método DespuesDeGuardarDocumentoV2
procedure(Documento: String; IdDoc: Double; Estado: Integer); stdcall;

Después de guardar cualquier documento de compra o venta


Método AlValidarClienteProveedor
function(Documento, CodCliPro: string): boolean; stdcall;

Al validar el cliente o proveedor en cualquier document de compra o venta


Método AntesDeActualizaStock
function(CodArt,CodAlm: string): boolean; stdcall;

Método para realizer operaciones antes de que se actualice el stock del erp
Método AntesDeGuardarDocumento
function(Documento: string; IdDoc: Double; var Cabecera: Variant; var Lineas: Variant): boolean;
stdcall;
Antes de guardar cualquier documento de compra o venta
Método AntesDeGuardarDocumentoV2
function(Documento: string; IdDoc: Double; var Cabecera: Variant; var Lineas: Variant;
Estado:Integer): boolean; stdcall;
Antes de guardar cualquier documento de compra o venta
Método RePintar
function( Tabla: string): boolean; stdcall;

Actualiza una ventana con los nuevos datos


Método AntesDeGuardarLinea
function(Documento: String; Cabecera: Variant; Linea: Variant): Variant; stdcall;

Antes de guardar la linea del documento


Método AntesDeGuardarLineaV2 – Nuevo versión 9.6.8
function(Documento: String; Cabecera: Variant; Linea: Variant; Estado:Integer; var
PermitirGuardar: boolean): Variant;
Variante del método anterior. Se ejecuta antes de guardar una línea en documentos de venta y
compra.
Documento es una cadena, el tipo de documento que genera el evento. ‘FV’ para factura de venta,
FC para factura de compra, etc.
Cabecera y Línea, son dos estructuras tipo ‘fila’, representa una fila de un conjunto de datos. Son
un array de variants. La primera posición, es el número de campos que tiene la fila. Las demás
posiciones son arrays de dos posiciones, la primera es el nombre del campo y la segunda su valor.
Hay tantas como indique la primera posición. Cada estructura contiene los campos de la cabecera y
la línea del documento, respectivamente.
Estado, entero. Tiene tres valores, que se corresponden con el estado de la línea en el documento:
 0: La línea es nueva.
 1: La línea se va a modificar.
 2: La línea se va a borrar.
PermitirGuardar: booleano. Si se devuelve a false, se impide guardar o borrar la línea. No se da
ningún mensaje desde ERP, así que el desarrollador de la DLL debería aportar la explicación
pertinente al usuario.
Se puede devolver en la función un array tipo ‘fila’, en el que sólo hay que devolver los campos de
la línea que se quieren modificar. Si no se va a modificar nada, pasar a NULL.

Método AntesDeGuardarLineaConDetalle
function(Documento: String; Cabecera: Variant; Linea: Variant; Detalle: Variant): Variant; stdcall;

Antes de guardar linea del documento, pero en aquellos casos que hay articulos con detalle ( lotes,
series, tallas, etc)
Método AntesDeGuardarLineaConDetalleV2 – Nuevo versión 9.6.8
function(Documento: String; Cabecera: Variant; Linea: Variant; Detalle: Variant; Estado:Integer; var
PermitirGuardar: boolean): Variant;
Variante del método anterior. Se ejecuta antes de guardar una línea en documentos de venta y
compra.
Documento es una cadena, el tipo de documento que genera el evento. ‘FV’ para factura de venta,
FC para factura de compra, etc.
Cabecera y Línea, son estructuras tipo ‘fila’, representa una fila de un conjunto de datos. Son un
array de variants. La primera posición, es el número de campos que tiene la fila. Las demás
posiciones son arrays de dos posiciones, la primera es el nombre del campo y la segunda su valor.
Hay tantas como indique la primera posición. Cada estructura contiene los campos de la cabecera y
la línea del documento, respectivamente.
Detalle, es un array que imita un conjunto de datos. La primera posición indica cuántos elementos
tipo ‘fila’ contiene. Cada elemento tipo ‘fila’ es idéntico a los usados en Cabecera o Línea.
Estado, entero. Tiene tres valores, que se corresponden con el estado de la línea en el documento:
 0: La línea es nueva.
 1: La línea se va a modificar.
 2: La línea se va a borrar.
PermitirGuardar: booleano. Si se devuelve a false, se impide guardar o borrar la línea. No se da
ningún mensaje desde ERP, así que el desarrollador de la DLL debería aportar la explicación
pertinente al usuario.
Se puede devolver en la función un array tipo ‘fila’, en el que sólo hay que devolver los campos de
la línea que se quieren modificar. Si no se va a modificar nada, pasar a NULL.

Método DespuesDeGuardarLinea
procedure(Documento: String; Cabecera: Variant; Linea: Variant); stdcall;

Después de guardar la linea del documento


Método DespuesDeGuardarLineaV2
procedure(Documento: String; Cabecera: Variant; Linea: Variant; Estado: Integer); stdcall;
Versión dos del método anterior. Se ejecuta después de guardar una línea de documento. Los
parámetros Documento, Cabecera y Línea son iguales que en los demás métodos de líneas.
El parámetro ‘Estado’ informa de la operación que se ha realizado con la línea:
 0: La línea es nueva.
 1: La línea se va a modificar.
 2: La línea se va a borrar.
En caso de borrado, el parámetro Línea contendrá un valor nulo. La línea en este momento ya no
existe.
Método SeProporcionaDetalle
function(Documento: String; Cabecera: Variant; Linea: Variant): Boolean; stdcall;

Método para indicar que se usará el método ObtDetalle posteriormente

Método ObtDetalle
procedure(Documento: String; Cabecera: Variant; Linea: Variant; var Detalle: Variant); stdcall;

Especificar un detalle de la linea posicionada según un criterio


Método AntesDeFacturarDocumento
function(Documento: string; IdDoc: Double; const Cabecera: Variant; const Lineas: Variant; var
Motivo: string): boolean; stdcall;
Método para expedientes antes de facturarlo
Método DespuesDeFacturarDocumento
procedure(Documento: string; IdDoc, IdFac: Double); stdcall;

Método para expedientes después de facturarlo


Método ActivarMetodoAlServir
function: Boolean; stdcall;

Método que se llama después de haber guardado el documento cuando se sirve


Método ActivarMetodoAlAnular
function: Boolean; stdcall;

Método que se llama después de haber guardado el documento cuando se anula


Método AntesDeAceptarOferta
function (TipoDocumento: string; IdDoc: Double): Boolean; stdcall;

Método para llamarse antes de que se acepte la oferta

Método EsDocumentoExterno
function(TipoDocumento: string): Boolean; stdcall;

Método para indicar al ERP si el tipo de documento indicado se edita mediante una pantalla o
edición externa (true) o por el contrario usa el mantenimiento estandar (false) para el tipo de
documento indicado (TipoDocumento).
Este método permite que se pueda editar, mediante el método que elija el programador de la dll de
terceros que la implemente, un documento concreto del tipo especificado (TipoDocumento).
En caso de respuesta afirmativa (true) posteriormente se llamará a HacerDocumentoExterno para
permitir que la programación de terceros realice la edición de un documento concreto del tipo
especificado. En caso contrario, se llamará a la edición de ERP del tipo de documento para
mostrar/editar un documento concreto.
Nota: A día de hoy, este método puede ser invocado por ERP varias veces a lo largo de su ejecución
para el mismo tipo de documento, generalmente llamando primero a EsDocumentoExterno y
posteriormente a HacerDocumentoExterno.
Método HacerDocumentoExterno (Ampliado versión 10.0.5)
procedure(TipoDocumento: string; IdDocumento: Double); stdcall;
Método para invocar una edición, implementada por la dll de terceros, de un documento que no sea
la estándar de ERP.
Este método permite, a una programación a medida, presentar una edición de un documento
(IdDocumento) concreto de un determinado tipo (TipoDocumento) distinta a la proporcionada por
ERP.
Sólo se llamará a este método si previamente se devolvió true en EsDocumentoExterno, para el
mismo tipo de documento pasado por parámetro.
Método DespuesDeCargarDocumento
procedure (const Documento: string; const IdDoc: Double; var Cabecera, Lineas: Variant; const
Estado:Integer);stdcall;
Procedimiento que se ejecuta tras cargar documentos de venta y compra, albaranes de traspaso y
regularización, expedientes y órdenes de producción.
Documento es una cadena, el tipo de documento que genera el evento. ‘FV’ para factura de venta,
FC para factura de compra, etc.
IdDoc es el número interno de identificación del documento que se carga.
Cabecera y Líneas, son dos estructuras tipo ‘fila’, representa una fila de un conjunto de datos. Son
un array de variants. La primera posición, es el número de campos que tiene la fila. Las demás
posiciones son arrays de dos posiciones, la primera es el nombre del campo y la segunda su valor.
Hay tantas como indique la primera posición. Cada estructura contiene los campos de la cabecera y
la línea del documento, respectivamente.
Estado, entero. Tiene dos valores, que se corresponden con el estado del documento:
 0: El documento es nuevo.
 1: El documento ya existía antes de la carga.
Método DespuesDeCargarDocumentoV2
function DespuesDeCargarDocumentoV2(const Documento: string; const IdDoc: Double; var
Cabecera, Lineas: Variant; const Estado:Integer): Variant;
Función que se ejecuta tras cargar documentos de venta y compra, albaranes de traspaso y
regularización, expedientes y órdenes de producción.
Documento es una cadena, el tipo de documento que genera el evento. ‘FV’ para factura de venta,
FC para factura de compra, etc.
IdDoc es el número interno de identificación del documento que se carga.
Cabecera y Líneas, son dos estructuras tipo ‘fila’, representa una fila de un conjunto de datos. Son
un array de variants. La primera posición, es el número de campos que tiene la fila. Las demás
posiciones son arrays de dos posiciones, la primera es el nombre del campo y la segunda su valor.
Hay tantas como indique la primera posición. Cada estructura contiene los campos de la cabecera y
la línea del documento, respectivamente.
Estado, entero. Tiene dos valores, que se corresponden con el estado del documento:
 0: El documento es nuevo.
 1: El documento ya existía antes de la carga.
Se puede devolver en la función un array tipo ‘fila’, en el que sólo hay que devolver los campos de
la cabecera que se quieren modificar. Si no se va a modificar nada, pasar a NULL.
Método DespuesDeCancelarDocumento
procedure (const Documento: string; const IdDoc: Double; const Cabecera, Lineas: OleVariant; const
Estado:Integer);
Función que se ejecuta tras cancelar documentos de venta y compra.
Documento es una cadena, el tipo de documento que genera el evento. ‘FV’ para factura de venta,
FC para factura de compra, etc.
IdDoc es el número interno de identificación del documento que se carga.
Cabecera y Líneas, son dos estructuras tipo ‘fila’, representa una fila de un conjunto de datos. Son
un array de variants. La primera posición, es el número de campos que tiene la fila. Las demás
posiciones son arrays de dos posiciones, la primera es el nombre del campo y la segunda su valor.
Hay tantas como indique la primera posición. Cada estructura contiene los campos de la cabecera y
la línea del documento, respectivamente.
Estado, entero. Tiene dos valores, que se corresponden con el estado del documento:
 0: El documento es nuevo.
 1: El documento ya existía antes de la carga.
Método CamposAEscucharEnDocumento
function(Documento: string; IdDoc: Double): OleVariant; stdcall;
Función que se ejecuta en la edición de documentos de venta y compra.
Documento es una cadena, el tipo de documento que genera el evento. ‘FV’ para factura de venta,
FC para factura de compra, etc.
IdDoc es el número interno de identificación del documento que se carga.
ListaCampos es un array de objetos, puede devolver como primer valor el número de campos a
escuchar y a continuación la lista de campos que se van a escuchar indicando si es de cabecera o
líneas (ej: "CABECERA.REFERENCIA").

Método AntesDeCambioEnDocumento
procedure (Documento: string; IdDoc: Double; Campo: string; ValorAnterior: OleVariant; var
NuevoValor: OleVariant); stdcall;
Procedimiento que se ejecuta antes del cambio de campos en documentos de venta y compra,
cuando el campo que se está modificando está dentro de la lista de campos a escuchar (función
anterior).
Documento es una cadena, el tipo de documento que genera el evento. ‘FV’ para factura de venta,
FC para factura de compra, etc.
IdDoc es el número interno de identificación del documento que se carga.
Campo es el nombre del campo que se está cambiando.
ValorAnterior contiene el valor del campo a escuchar previo al cambio.
ValorNuevo contiene el nuevo valor que se va a asignar. Es una variable de retorno, por lo que se
puede asignar un nuevo valor, que será trasladado al campo del documento que se está
modificando/creando.
Método DespuesDeCambioEnDocumento
procedure (Documento: string; IdDoc: Double; Campo: string; ValorAnterior, NuevoValor:
OleVariant); stdcall;
Procedimiento que se ejecuta después del cambio de campos en documentos de venta y compra,
cuando el campo que se está modificando está dentro de la lista de campos a escuchar.
Documento es una cadena, el tipo de documento que genera el evento. ‘FV’ para factura de venta,
FC para factura de compra, etc.
IdDoc es el número interno de identificación del documento que se carga.
Campo es el nombre del campo que se está cambiando.
ValorAnterior contiene el valor del campo a escuchar previo al cambio.
ValorNuevo contiene el nuevo valor que se va a asignar. Al contrario que en en el procedimiento
anterior, este nuevo valor no puede ser modificado.
Método TrasGenerarFacturaE
procedure (IdFac: Double; XMLDocument: Variant; var XMLText: string; var TextModified: Boolean);
stdcall;
IdFac es el número interno de identificación de la Factura.
XMLDocument el documento generado en formato XML.
XMLText la facturaE generada en formato texto. Es un parámetro de retorno, por lo que permitiría
la modificación de la misma.
TextModified parámetro boleano de retorno con dos posibles valores:
 True cuando se ha modificado la FacturaE en el procedimiento.
 False cuando no se ha modificado la FacturaE.
Cartera

Método AntesDeGuardarEfecto
function( Operacion: string; Datos: Variant): boolean; stdcall;

Antes de guardar un efecto en cartera


Método DespuesDeGuardarEfecto
procedure( Operacion: string; NumCartera: Double; NumVen: integer); stdcall;

Después de guardar un efecto en cartera


Método AntesDeGuardarRemesa
function( Operacion, Tipo: string; Cabecera, Lineas: variant):boolean; stdcall;

Antes de guardar una remesa en cartera


Método DespuesDeGuardarRemesa
procedure( Operacion, Tipo: string; IdRemesa: Double); stdcall;
Después de guardar una remesa en cartera

Maestros
Método AntesDeGuardarMaestro
function(Tabla: String; Datos: Variant): Boolean; stdcall

Antes de guardar cualquier fichero maestro


Método AntesDeGuardarMaestroV2
function(Tabla: String; var Datos: Variant; Estado:Integer): Boolean; stdcall;

Antes de guardar cualquier fichero maestro pero sabemos el estado del mismo (alta,edición,etc)
Método DespuesDeGuardarMaestro
procedure(Tabla: String; Datos: Variant); stdcall

Despues de guardar cualquier fichero maestro


Método DespuesDeGuardarMaestroV2
procedure(Tabla: String; Datos: Variant; Estado:Integer); stdcall;
Despues de guardar cualquier fichero maestro pero sabemos el estado en que estaba (alta,edición..)
Método AntesDeBorrarMaestro
function( Tabla: string; IdMaestro: Variant): boolean; stdcall;

Antes de borrar cualquier fichero maestro


Método DespuesDeBorrarMaestro
procedure( Tabla: string; IdMaestro: Variant); stdcall;

Después de borrar cualquier fichero maestro

Apuntes
Método AntesDeGuardarApunte
function( Apunte: variant):boolean; stdcall;

Antes de guardar linea de un asiento


Método AntesDeGuardarAsiento
function( IdAsiento: Double; Asiento: variant):boolean; stdcall;

Antes de guardar el asiento completo.


Método DespuesDeGuardarAsiento
procedure( IdAsiento: Double; Asiento: variant); stdcall;

Antes de guardar el asiento completo

Producción

Método OrdenNuevoComponente
function( Linea: variant; Cabecera: variant): variant; stdcall;

Cuando se da de alta un nuevo componente en la orden de producción


Método OrdenNuevoProducto
function( Linea: variant; Cabecera: variant): variant; stdcall;

Cuando se da de alta un nuevo producto (artículo), en la orden de producción


Método OrdenNuevoOperario
function( Linea: variant; Cabecera: variant): variant; stdcall;

Cuando se da de alta un nuevo operario en la orden de producción


Método OrdenNuevaMaquina
function( Linea: variant; Cabecera: variant): variant; stdcall;
Cuando se da de alta una nueva máquina en la orden de producción

Comisiones

Método DespuesDeProcesarComisiones
procedure ( var Datos:Variant); stdcall;

Para modificar los valores de las comisiones antes de que las procese el programa.
(Sólo se permite cambiar la comisión a pagar y a descontar)
Método AntesDeProcesarComisiones
procedure(IdLiqCom: integer); stdcall;

Cuando se han procesado todas las comisiones se invoca el método

Listados

Método SepuedeImprimirDocumento
function(TipoDocumento: string; IdDocumento: Double; var Mensaje: string): Boolean; stdcall;

Método para indicar si se puede imprimir o no el documento


Método EsListadoExterno
function(IdListado: String): Boolean; stdcall;
Método para indicar si el listado será externo al erp o no (por ejemplo hecho en cristal repots)
Método HacerListado
procedure(IdListado: String; Parametros: Variant); stdcall;
Método para realizar el listado externo al erp con los parametros de la pantalla del ERP
Método AntesDeImprimir
procedure(IdListado: String; Modelo: string; Destino: Integer; Parametros: Variant); stdcall;
Este método se ejecuta cuando se va a imprimir cualquier listado/impreso del ERP
Los parámetros tienen
IdListado: el identificador del listado, igual que en el objeto ‘Listado’
Modelo: la definición que el usuario ha escogido. Se compone de dos partes, separadas por
el signo igual (=). En primer lugar, se informa el nombre físico de la definición. Después se
concatena el nombre que figura en el desplegable en pantalla. Por ejemplo:
LstCli.000=Clientes con foto.
Si el usuario imprime el listado original, se informa: LstCli.dfm=Original.
Destino: a dónde se envía el listado. Puede ser cualquier valor del enumerado ‘destino’
utilizado en el objeto ‘Listado’ de a3ActiveX.
DESTIMPRESORA 0 IMPRESORA
DESTHTML 1 FICHERO EN FORMATO HTML
DESTPDF 2 FICHERO EN FORMATO PDF
DESTRTF 3 FICHERO EN FORMATO RTF
DESTJPG 4 FICHERO EN FORMATO JPG
DESTGIF 5 FICHERO EN FORMATO GIF
DESTBMP 6 FICHERO EN FORMATO BMP
DESTEMF 7 FICHERO EN FORMATO EMF
DESTWMF 8 FICHERO EN FORMATO WMF
DESTPANTALLA 9 PRESENTACIÓN PRELIMINAR
DESTEXCEL 10 FICHERO EN FORMATO XLS (REVISADO EN 9.5.13)
destFacturaE 11 Fichero en formato EFACTURA (Revisado en 9.5.13)
Parámetros: Los parámetros que utiliza el listado es un array tipo ‘Dataset’, igual a la que
se usa en eventos de documentos. La posición 0 es un entero, que indica cuántos elementos
tipo ‘row’ vienen detrás. En este caso, siempre vale 1, todos los parámetros se pasan en una
sola ‘row’. La posición 1, es a su vez un array.
En este último, la posición 0 es un entero que indica cuántos campos tiene la ‘row’. A partir
de la posición 1, hay tantos arrays de dos posiciones como campos haya. La primera posición
es el nombre del parámetro, la segunda el valor.

Formularios (relacionados con los eventos en maestros y en documentos)


Método DespuesDeNuevoFormulario
procedure (ClaseFormulario: string; Handleformulario: HWND); stdcall;

Procedimiento que se ejecuta tras crear un nuevo formulario.


ClaseFormulario Nombre de la clase de formulario creado como cadena de caracteres.
Handleformulario Identificador numérico del handle del formulario.
Método AntesDeDestruirFormulario
procedure (ClaseFormulario: string; Handleformulario: HWND); stdcall;

Procedimiento que se ejecuta cerrar/salir un formulario.


ClaseFormulario Nombre de la clase de formulario creado como cadena de caracteres.
Handleformulario Identificador numérico del handle del formulario.
Método DespuesDeActivarFormulario
procedure (ClaseFormulario: string; Handleformulario: HWND); stdcall;

Procedimiento que se ejecuta tras invocar un formulario.


ClaseFormulario Nombre de la clase de formulario creado como cadena de caracteres.
Handleformulario Identificador numérico del handle del formulario.

Control de excepciones procedentes de las DLLS


A3ERP implementa dentro de lo que es la gestión de dlls un mecanismo para informar al
usuario de “Quien” y “Que” ha generado una excepción. Este mecanismo está disponible a
partir de la versión 9608.
Por definición una dll jamás debería generar una excepción sino que debería devolver códigos
de error, pero hay ocasiones en que la llamada de a3ERP a una dll acaba generando una
excepción. En versiones anteriores el resultado era que la excepción se acababa mostrando
en pantalla pero ni el usuario, ni el programador que había hecho la dll tenían información de
donde estaba el problema. Lo único que se sabia era que a3ERP generaba un error.
Para solucionar este problema, todos los eventos de dll de a3ERP capturan cualquier
excepción que se produzca durante la llamada a los métodos de dll y en vez de mostrar el
mensaje de la excepción se muestra la dll y el método que genera la excepción más el
mensaje de excepción.

Generación del fichero LOG para las dlls


Otro de los mecanismos que se han implementado para ayudar en la depuración y control de
errores en las dlls es la posibilidad de generar un log de todas las llamadas a los eventos de
dll. Este control permite saber a que métodos de dll se ha invocado por fecha y hora así como
conocer si se ha entrado y salido del evento de dll o por el contrario se ha generado una
excepción durante su ejecución. Para ello es necesario añadir las siguientes entradas en el
fichero CONFIGURACION.INI ubicado en %APPDATA%\A3:

[DLLS]

Log=1
Con esto conseguimos que automáticamente a3ERP generé ficheros de LOG en la siguiente
ruta:
%APPDATA%\A3\LOGS\DLLS

Ejemplos
Adjunto a este manual, hay dos ficheros comprimidos, donde podremos encontrar ejemplos:
Dll Externas.zip: En este fichero se encuentra un ejemplo en Delphi.
A3ERPAddIn.rar: En este fichero se encuentra un ejemplo en C#.

Cómo llamar a una DLL desde MIMENU.MENU


Desde A3ERPV8 se pueden añadir opciones de menú que llamen a una DLL. Debemos
diferenciar entre dos tipos de DLL´s:
DLL´s win32
DLL´s ActiveX

Llamando a una DLL WIN32


Vamos a ver cómo se haría:
Lo primero sería generar nuestro propio menú con la opción que queremos añadir.

Consultar el capítulo Personalizar Menús

Este es un ejemplo típico:

Como se ve, en la propiedad PROGRAMA debe ir indicada tanto la DLL, como el método
publicado al que queremos que llame esa opción.
En el ejemplo, la DLL se llama TestDLL y el método al que llamamos es EjemploPantalla. Hay
que notar que para separar la DLL del método usaremos el símbolo arroba (@).
Para nuestro ejemplo copiamos la DLL en la misma ruta donde esté el a3ERP.exe y
arrancamos el a3ERP.
Nos aparecerá la nueva categoría “Llamadas a DLL´s”, que contiene una opción que se llama
“Llamar a una DLL win32”.
Fíjate que no hay que insertar ningún registro en la tabla DLL´s de a3ERP.

Llamando a una DLL ACTIVEX


Vamos a ver cómo se haría:
Como en el caso de las DLL´s de tipo WIN32, hay que generar nuestro propio menú (o usar uno
ya creado).
En este caso, lo único que cambia es que, en la propiedad PROGRAMA, se debe estructurar la
llamada de la siguiente manera:
@ClaseDelActiveX@ProcedimientoQueSePasaraComoParametro
En el caso de los ActiveX es necesario saber que a3ERP siempre invocará el método “OPCION”
(que debemos haber implementado y exportado nosotros en nuestro ActiveX) y que somos
nosotros quienes, mediante comparaciones, deberemos llamar a un método u otro, según el
parámetro que nos llegue.

Ejemplo en C# de este método


//Método para llamar a otras opciones desde el menú o desde programas externos
//En caso de llamarse la opción desde programas externos se rellenará el segundo parámetro
//con la clave del mantenimiento asociado
public void Opcion(string IdOpcion, string parámetro) {
if (IdOpcion.ToUpper() == " EJEMPLOPANTALLA ")
MessageBox.Show("se ha llamado a la pantalla");
else if (IdOpcion.ToUpper() == "MICLIENTE")
MessageBox.Show(parámetro);
}
Otra cosa más a tener en cuenta es que, en este caso, la DLL ha de estar registrada con
regasm, en el caso de ser un ActiveX que haya sido desarrollado usando .NET, o con regsvr32
en el caso de estar desarrollada con Delphi o VB 6.
Parámetros en programas externos
Seleccionar “Configuración/ Datos Generales/ Preferencias” y activar la opción de
“Programas externos”.
En ese momento, aparecerá una nueva opción en el menú “Herramientas/ Mantenimiento de
programas externos”.

En el caso de que tengamos activada la opción de Programas Externos desde Datos


Generales, será en el “Mantenimiento de programas externos” donde definiremos qué
parámetros se van a pasar.
Veamos un ejemplo:

Si nos fijamos, se ha puesto el ejecutable y los parámetros en la misma línea, separados por
un espacio.
En los programas externos es donde tiene sentido el parámetro: DEFECTO. ¿Por qué?

Si nosotros definimos en Artículos una llamada a un ejecutable y no indicamos ningún


parámetro a3ERP, por defecto, pasará el código del maestro (codcli, en el caso de artículos).
Pero cuando pasamos un parámetro al ejecutable, a3ERP no sabe en qué posición queremos
que pase el valor del parámetro del código del maestro por lo que, en este caso, somos
nosotros los encargados de indicarle, en primer lugar, si queremos que se pase y, en segundo
lugar, en qué posición.
Por lo tanto, si añadimos un parámetro y no ponemos el :DEFECTO, a3ERP dejará de pasar el
código del maestro.

Significado de cada parámetro


DEFECTO: es el valor del maestro que se pasa de forma automática cuando no hay
parámetros.
TIPOCONTABLE: es el tipo contable actual.
CARPETA: contiene la ruta donde está instalado a3ERP.
EMPRESA: contiene el nombre de la empresa desde la que se llama.
USUARIO: contiene el usuario logado que llama al programa externo.
PASSWORD: contiene el password ENCRIPTADO del usuario logado.
USUARIOANALYTICS: contiene el valor de la propiedad “Perfil” en la opción de
seguridad para las opciones de A3ERP Analytics.

You might also like