Skip to content

Infraestructura

Andres Ramos edited this page Oct 25, 2022 · 7 revisions

Flujo De Trabajo

En todos los desarrollos donde se consuma el SDK el flujo de trabajo siempre sera el siguiente:

  1. Inicializar el SDK - Al inicio de cada proceso y antes de poder hacer uso de las funciones del SDK se debe inicializar el SDK para establecer una conexión con el sistema. El SDK solo se debe inicializar una vez por proceso.
  2. Abrir empresa - Se deberá asignar la empresa con la que el SDK va a trabajar. El SDK solamente puede trabajar con una empresa a la vez.
  3. Correr tus procesos (crear documentos, catálogos, etc..)
  4. Analizar y resolver errores
  5. Cerrar empresa - Se debe cerrar la empresa antes de finalizar el SDK o si se quiere trabajar con una empresa diferente.
  6. Terminar el SDK - Se debe terminar SDK para terminar la conexión con el sistema y liberar los recursos utilizados por el SDK.

Declaraciones de funciones

El SDK de CONTPAQi Comercial esta desarrollado en C++ y todas sus funciones se encuentran en el archivo MGWServicios.dll. Este archivo normalmente se encuentra en la ruta "C:\Program Files (x86)\Compac\COMERCIAL\MGWServicios.dll".

En el manual del SDK, que pueden descargar en documentos de CONTPAQi, puedes encontrar el listado de las funciones disponibles por el SDK. Desafortunadamente, por experiencia, sé que el manual no tiene todas las funciones disponibles y en algunos casos la documentación de algunas funciones está incompleta o es incorrecta.

Para poder invocar las funciones del SDK en nuestra aplicación debemos exportarlas del archivo MGWServicios.dll a nuestra aplicación haciendo uso del atributo DllImportAttribute. Pueden encontrar más información acerca de cómo Consumir funciones DLL no administradas.

Ejemplo de cómo declarar las funciones:

[DllImport("MGWServicios.dll", EntryPoint = "fSetNombrePAQ")]
public static extern int fSetNombrePAQ(string aSistema);

[DllImport("MGWServicios.dll", EntryPoint = "fAbreEmpresa")]
public static extern int fAbreEmpresa(string aDirectorioEmpresa);

[DllImport("MGWServicios.dll", EntryPoint = "fCierraEmpresa")]
public static extern void fCierraEmpresa();

[DllImport("MGWServicios.dll", EntryPoint = "fTerminaSDK")]
public static extern void fTerminaSDK();

[DllImport("MGWServicios.dll", EntryPoint = "fError")]
public static extern void fError(int aNumError, StringBuilder aMensaje, int aLen);

Para los sistemas Factura Electronica y Adminpaq las funciones se declaran con el archivo MGW_SDK.dll.

Puedes encontrar las declaraciones de todas las funciones en la clase ComercialSdk.cs.

Manejo De Errores

Como te puedes dar cuenta, muchas de las funciones del SDK regresan un resultado de tipo int. Este resultado representa si la operación se realizó exitosamente. El valor 0 representa un resultado exitoso, cualquier otro valor representa un código de error. Es importante saber cómo leer el mensaje de error de los códigos de error para poder tener una mejor idea de cómo resolverlo.

Para leer el mensaje de error de un código se utiliza la función fError.

Ejemplo como podemos leer el mensaje de error de un código:

[DllImport("MGWServicios.dll", EntryPoint = "fError")]
public static extern void fError(int aNumError, StringBuilder aMensaje, int aLen);

public class ResultadoSdk
{
    public const int Exitoso = 0;

    public static string LeerMensajeError(int numeroError)
    {
        var mensajeError = new StringBuilder(512);
        ComercialSdk.fError(numeroError, mensajeError, 512);
        return mensajeError.ToString();
    }
}

// Trata de abrir una empresa con una ruta incorrecta donde la función regresara un código de error
void AbrirEmpresaYMostrarMensajeError(string rutaIncorrecta)
{
    int resultadoSdk = ComercialSdk.fAbreEmpresa(rutaIncorrecta);
    if (resultadoSdk != ResultadoSdk.Exitoso)
    {
        string mensajeError = ResultadoSdk.LeerMensajeError(resultadoSdk);
        Console.WriteLine(mensajeError);
    }
}

Estructuras De Datos

El SDK nos proporciona diferentes tipos de estructuras que podemos utilizar para crear y modificar catálogos y documentos. Estas estructuras, así como las funciones, tienen que ser exportadas correctamente a nuestra aplicación para poder hacer uso de ellas.

En el manual del SDK, que pueden descargar en documentos de CONTPAQi, puedes encontrar las estructuras disponibles utilizadas.

Ejemplo de cómo exportar la estructura de un documento:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 4)]
public struct tDocumento
{
    public double aFolio;
    public int aNumMoneda;
    public double aTipoCambio;
    public double aImporte;
    public double aDescuentoDoc1;
    public double aDescuentoDoc2;
    public int aSistemaOrigen;

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = SdkConstantes.kLongCodigo)]
    public string aCodConcepto;

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = SdkConstantes.kLongSerie)]
    public string aSerie;

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = SdkConstantes.kLongFecha)]
    public string aFecha;

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = SdkConstantes.kLongCodigo)]
    public string aCodigoCteProv;

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = SdkConstantes.kLongCodigo)]
    public string aCodigoAgente;

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = SdkConstantes.kLongReferencia)]
    public string aReferencia;

    public int aAfecta;
    public double aGasto1;
    public double aGasto2;
    public double aGasto3;
}

Puedes encontrar las declaraciones de todas las estructuras en el folder DatosAbstractos

Proyecto NuGet

Declarar todas las funciones y estructuras disponibles en el SDK puede ser una tarea compleja y existe la posibilidad de equivocarse en la declaración de los nombres de las funciones o en los tipos y numero de los parámetros requeridos.

Para no tener que preocuparse de esta tarea tengo disponible en este repositorio el proyecto ARSoftware.Contpaqi.Comercial.Sdk que contiene todas las funciones y clases disponibles por el SDK ya declaradas correctamente.

Este proyecto está listo para consumirse en tus desarrollos y puedes instalarlo utilizando NuGet.

Instalar librería utilizando NuGet

Package Manager:

NuGet\Install-Package ARSoftware.Contpaqi.Comercial.Sdk

.NET CLI:

dotnet add package ARSoftware.Contpaqi.Comercial.Sdk

Package Reference:

<PackageReference Include="ARSoftware.Contpaqi.Comercial.Sdk"/>