Professional Documents
Culture Documents
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.
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;
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:
Método Finalizar
procedure; stdcall;
Documentos
Método ObtPrecioCompra
function( PrcCompra: Double; Cabecera, Linea: Variant): Double; 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;
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;
Método ObtDetalle
procedure(Documento: String; Cabecera: Variant; Linea: Variant; var Detalle: Variant); stdcall;
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;
Maestros
Método AntesDeGuardarMaestro
function(Tabla: String; Datos: Variant): 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
Apuntes
Método AntesDeGuardarApunte
function( Apunte: variant):boolean; stdcall;
Producción
Método OrdenNuevoComponente
function( Linea: variant; Cabecera: variant): variant; stdcall;
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;
Listados
Método SepuedeImprimirDocumento
function(TipoDocumento: string; IdDocumento: Double; var Mensaje: string): Boolean; stdcall;
[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#.
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.
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é?