ÍNDICE


01. VISIÓN GENERAL

Configure y ejecute la importación de registros para la rutina FINA040 - Cuentas por Cobrar mediante MILE.

Importante

El parámetro MV_MULNATR debe estar habilitado .T. para que los registros se importen con éxito.

02. CONFIGURACIÓN MILE

Para realizar la importación de los datos en la rutina FINA040 - Cuentas por Cobrar utilizando el MILE, son necesarias algunas configuraciones adicionales de acuerdo con lo siguiente.

Básicamente, el MILE funciona de la siguiente manera: para cada canal creado, se enviará en secuencia a la rutina en cuestión un array como parámetro, seguido del nOpc de 3 de inclusión.

Al realizar la llamada de la MsExecAuto de la rutina FINA040, se enviará de la siguiente manera:

Si tenemos 1 canal (1 Master):

    • FMile040(vetor[1], 3)

Si tenemos 2 canales:

    • FMile040(vetor[1], vetor[2], 3)

Y así por delante. 

Importante

La rutina FINA040 tiene soporte al tipo de Adapter Función (Vea en el documento de referencia el ítem - tópico Composición del Layout - General

03. EJEMPLO DE CONFIGURACIÓN MILE

Modelo de configuración del layout del MILE:

1) Informaciones sobre el tipo de Adapter, el nombre de la función Adapter, la Tabla Principal (SE1 en este modelo) y el Tipo de Layout (Importación):


2) Defina el formateo del archivo. 

Obs.: 

  1. Origen del canal:Posición de dónde está la información del canal del layout. Cuando el formato del TXT es ancho fijo se informa la posición inicial y final separadas por un guion. Ej. 0001-0005. 
    Cuando el formato del TXT es por separador se informa la posición de la información. Ej. 0001, esto significa que el canal es el 1º campo de la línea. 
    Cuando no hay canales informe 0000-0000 o 0000 según el formato.
  2. Entrada Multicanal:según veremos detalles más adelante.

La ilustración de este modelo de configuración:


3) Configurando el tipo Adapter Función los siguientes campos no estarán disponibles para modificación:

4) Definición de los Canales: Por involucrar más de una tabla en el destino (SE1/SEV/SEZ) de los datos utilizaremos el modelo de Multicanales (Vea Doc. Referencia: Exemplificando alguns Layouts). Para este modelo se configurarán 2 canales, según lo siguiente:

    • Canal E1: Lista de campos de la tabla SE1 - Cuentas por Cobrar - Defina la orden de los campos que estarán dentro del archivo de importación. Note que la secuencia del primer campo es 0002 porque la posición 0001 es identificadora del canal E1. Definiremos 12 campos:
      • Canal NTCC: Servirá para representar los datos mínimos del prorrateo Modalidades vs. Centro de Costo:
      • Apunte el canal que se configurará:


    • Incluya los campos según lo siguiente:

04. USER FUNCTION - ADAPTER

Utilizaremos una User Function para ejecutar el Adapter.

Modelo de Adapte
User Function MileF040(lInterface, aInfos, aLayOut, aSaidas)
//-- Declaraciones - Propiedades
    Local nPosVl    As Numeric
    Local nPosPc    As Numeric
    Local nPosNt    As Numeric
    Local nPosCc    As Numeric
    Local nI        As Numeric
    Local lNewNt    As Logical
    Local cNat      As Char
    Local aVetorRat As Array
    Local aTitulo   As Array
    Local aRatNtCc  As Array
    Local aRatNt    As Array
    Local aRatCc    As Array
    Local aLstRatCc As Array

    Default lInterface := .F.
    Default aInfos := {}
    Default aLayOut := {}
    Default aSaidas := {}


//- Control y separación de los prorrateos     
    aLstRatCc := {} //-- Lista de los prorrateos de CC por modalidad
    aRatCc := {}    //-- Un registro - prorrateo CC
    aRatNt := {}    //-- Un prorrateo origen
    aRatNtCc := {}  //-- Lista de los prorrateos Modalidad con respectivos CCs
    aTitulo := {}   //-- Datos del título

    aVetorRat := {} //-- Auxiliar en el procesamiento de los prorrateos Nt/Cc
    cNat := ""      //-- Auxiliar en el procesamiento de los prorrateos Nt
    lNewNt := .T.   //-- Auxiliar en el procesamiento de los prorrateos Nt
    nI := 0         //-- Auxiliar en el procesamiento de los prorrateos Nt/Cc
    nPosCc := 0     //-- Auxiliar en el procesamiento de los prorrateos Cc
    nPosNt := 0     //-- Auxiliar en el procesamiento de los prorrateos Nt
    nPosPc := 0     //-- Auxiliar en el procesamiento de los prorrateos Nt/Cc
    nPosVl := 0     //-- Auxiliar en el procesamiento de los prorrateos Nt/Cc

  //-- Control de error de la rutina automática
	Private lMsErroAuto		:= Empty(aSaidas)
	Private lAutoErrNoFile	:= .T.    

//-- Inicio del proceso de separación de datos
    If !Empty(aSaidas)
        aTitulo := {}
        AEVAL(aSaidas[1,4,1],{|e| AAdd(aTitulo,e)})
        AAdd(aVetorRat,aSaidas[2,4])
        nPosNt := ASCAN(aVetorRat[1,1],{|a| alltrim(a[1]) == "EZ_NATUREZ"})
        nPosCc := ASCAN(aVetorRat[1,1],{|a| alltrim(a[1]) == "EZ_CCUSTO"})
        nPosVl := ASCAN(aVetorRat[1,1],{|a| alltrim(a[1]) == "EZ_VALOR"})
        nPosPc := ASCAN(aVetorRat[1,1],{|a| alltrim(a[1]) == "EZ_PERC"})

        For nI := 1 To Len(aVetorRat[1])
            If lNewNt
                //-- Agrega ítem prorrateo origen
                cNat := aVetorRat[1][Ni][nPosNt][2]
                AAdd(aRatNt,{"EV_NATUREZ",cNat,Nil})
                AAdd(aRatNt,{"EV_VALOR",0,NIL})
                AAdd(aRatNt,{"EV_PERC",0,NIL})
                AAdd(aRatNt,{"EV_RATEICC","1",NIL})
            EndIf

            //-- Actualiza valores del prorrateo de orígenes
            aRatNt[2][2] += aVetorRat[1][Ni][nPosVl][2]
            aRatNt[3][2] += aVetorRat[1][Ni][nPosPc][2]
            
            //-- Agrega Ítem Prorrateo Centro Costo
            AAdd(aRatCc,aVetorRat[1][Ni][nPosNt])
            AAdd(aRatCc,aVetorRat[1][Ni][nPosCc])
            AAdd(aRatCc,aVetorRat[1][Ni][nPosVl])
            AAdd(aLstRatCc,AClone(aRatCc))
            FwFreeArray(aRatCc)
            aRatCc := {}

            //-- Verifica si es último ítem de la lista general o si es nuevo ítem de origen
            lNewNt := (nI == Len(aVetorRat[1])) .Or. (aVetorRat[1][Ni+1][nPosNt][2] <> cNat)

            //-- Si es nuevo ítem o el último de la lista, finaliza la inclusión del prorrateo del origen actual.
            If lNewNt
                AAdd(aRatNt,{"AUTRATEICC", aLstRatCc, Nil })
                AAdd(aRatNtCc,AClone(aRatNt))
                FwFreeArray(aRatNt)
                aRatNt := {}
                FwFreeArray(aRatCc)
                aRatCc := {}
                FwFreeArray(aLstRatCc)
                aLstRatCc := {}
            EndIf
        Next nI
		//-- Fim 

		//-- Ejecución del Adapter por rutina automática.
        MsExecAuto({ |x,y,z,a| FINA040(x,y,z,a)},aClone(aTitulo),3,,aClone(aRatNtCc))

		//-- Tratamiento para el caso de errores
        If lMsErroAuto
            MOSTRAERRO()
        EndIf
    EndIf

Return !lMsErroAuto

05. EJEMPLO DE ARCHIVO DE IMPORTACIÓN - TXT

E1;D MG 01;GRV;MILE00001;C;NF;001;001;01;20230113;20230113;1000;1
NTCC;000003;000001;500;100
NTCC;000001;000002;500;100
E1;D MG 01;GRV;MILE00001;D;NF;001;001;01;20230113;20230113;1000;1
NTCC;000003;000001;250;50
NTCC;000003;000002;250;50
NTCC;000001;000002;500;100
E1;D MG 01;GRV;MILE00001;E;NF;001;001;01;20230113;20230113;1000;1
NTCC;000003;000001;500;100
NTCC;000001;000001;250;50
NTCC;000001;000002;250;50

06. EJEMPLO DE ARCHIVO LAYOUT IMPORTACIÓN - XML

fina040.xml

¡IMPORTANTE!

El archivo de importación se debe crear según las reglas definidas en el registro del Mile.

07. TABLAS UTILIZADAS

    • SE1 - Cuentas por cobrar
    • SEV - Múltiples orígenes por título
    • SEZ - Distrib de orígenes en CC

08. ASUNTOS RELACIONADOS

MILE - Model Integrator Layout Engine