Вы находитесь на странице: 1из 12

ADMINISTRAR CHACHE

AUTOESTUDIO
César Navarro

Agosto de 2018
IMPLEMENTACIÓN

Archivos .PAR

BSFN_B590009_60_99.par DSTR_D590009_60_99.par

Crear la estructura de datos con estos campos fijos:

Los campos que siguen son los propios que se quieren almacenar en el caché

En la BSFN, las funciones se crean con el siguiente estándar así:

Nombre Descripción
XXXXXXXCacheAdd XXXXXXX Cache Add
XXXXXXXCacheAddUpdate XXXXXXX Cache Cache Add Update
XXXXXXXCacheCloseCursor XXXXXXX Cache Cache Close Cursor
XXXXXXXCacheDelete XXXXXXX Cache Cache Delete
XXXXXXXCacheFetch XXXXXXX Cache Cache Fetch
XXXXXXXCacheFetchNext XXXXXXX Cache Cache Fetch Next
XXXXXXXCacheTerminate XXXXXXX Cache Cache Terminate
XXXXXXXCacheUpdate XXXXXXX Cache Cache Update

Donde XXXXXXX es el nombre específico de la BSFN


En el archivo .H incluir lo siguiente
Y luego incluir la estructura propia, para el caso del ejemplo la D590009
Ver archivo .H

B590009.h

En el archivo .C incluir

Definir el índice del caché y el nombre del caché.

Los índices y el número de claves de cada índice, es decir los campos de la estructura de datos
por los cuales se van a realizar búsquedas, por lo general 1 índice y el número de campos
depende de cómo se conforme la clave para buscar en el caché

Si el caché va a tener más de un índice, definirlo en este lugar de la misma manera que el
INDEX_1, por ejemplo 2 índices

#define INDEX_1 1
#define INDEX_1_NUM_KEYS 2

#define INDEX_2 1
#define INDEX_2_NUM_KEYS 2 este depende del número de campos
que conformen el índice 2

#define TOTAL_NUM_INDEXES 2
El CACHE_NAME es con el nombre interno con que se quiera identificar el caché, por lo general
se coloca el mismo nombre de la función, pero se puede colocar cualquier cosa.
Definir las funciones internas

Siempre van fijas estas, lo único que se hace es cambiar la estructura de datos por la D590009
que es la del ejemplo.
En el nombre de la Internal BSFN, llamarla con el código de la BSFN principal, para el ejemplo
B5900009, es decir:

I+ BXXXXXX + El nombre de cada función interna

IB590009InitializeCache
IB590009ValidateInput
IB590009ValidateInput
IB590009CloseCacheCursor
IB590009CopyCacheDS
IB590009ZeroNonDataBaseFields

En la función XXXXXXXCacheFetch y XXXXXXXCacheFetchNext hay un CASE donde se indica el


índice y dentro de este otro case para indicar los campos del índice en orden descendente. Si
hay mas de un índice repetir las dos estructuras CASE (índice y campos del índice)
En la función XXXXXXXInitializeCache, se definen los índices y los campos del índice con los
nombres como están en la estructura de datos, para el caso del ejemplo, el caché tiene 4
campos pero solo dos hacen parte del índice

El resto por hacer es reemplazar el nombre de llamado de las funciones y estructuras de datos
de esta función de muestra por los nombres de las funciones y estructura de datos de la
función que vaya a hacer
Archivo .C

B590009.c

En la aplicación intervenida se llama así a esta BSFN

En el evento Dialog is Initialized generar un número de JOBN para manejar el caché

GetInternalNextNumber(B0000564.GetInternalNextNumber)
           VA frm_JOBS_mnJobnumber_Receipt [JOBS] <- mnJobnumberA [JOBS]

En el evento Write Grid Line -Before, se cargan los datos en el caché. Todo esto depende de
cómo se implemente la lógica de programación

// =============================================================
// Se busca en el caché si el registro existe, si no se adiciona, en caso
// contrario se actualiza
//
VA frm_DTAI_szErrorCacheReceipt [DTAI] = <Blank>
VA frm_PAID_mnExtendedCost_Cmp = 0
POReceiptCacheFetch(B590009.POReceiptCacheFetch)
                VA frm_JOBS_mnJobnumber_Receipt [JOBS] -> mnJobnumberA [JOBS]
                "1" -> nIndexNumber [INT01]
                "2" -> nNumberOfKeys [INT02]
                "1" -> cSuppressErrorMessage [SUPPS]
                VA frm_DTAI_szErrorCacheReceipt [DTAI] <- szErrorMessageID [DTAI]
                GC 2º nº artículo [LITM] -> szIdentifier2ndItem [LITM]
                GC Sucursal/ planta [MCU] -> szBussinesUnit [MCU]
                VA frm_PAID_mnExtendedCost_Cmp [PAID] <> mnExtendedCost_Line [PAID]
                VA frm_PAID_mnAmtExtendedCost [PAID] <> mnExtendedCost_Item [PAID]
//
If VA frm_DTAI_szErrorCacheReceipt [DTAI] is equal to <Blank>
           Or VA frm_DTAI_szErrorCacheReceipt [DTAI] is equal to <NULL>
//
// =============================================================
// Si el registro existe en el caché, se trae el costo de la línea y se le
// resta el monto comparado
//
GC ExtendedCost/Price Diference = [GC Amount]-[GC AmountCmp]
//
// =============================================================
// Se actualiza el caché del monto de por item/bodega con lo que se ingrese en
// la grid
//
If GC Precio/costo total [PAID] is equal to "0"
//
GC ExtendedCost/Price Diference = [VA frm_PAID_mnExtendedCost_Cmp]
//
Else
//
VA frm_PAID_mnExtendedCost_Cmp = [VA frm_PAID_mnExtendedCost_Cmp]-[GC AmountCmp]+[GC Amount]
//
POReceiptCacheUpdate(B590009.POReceiptCacheUpdate)
                          VA frm_JOBS_mnJobnumber_Receipt [JOBS] -> mnJobnumberA [JOBS]
                          "1" -> nIndexNumber [INT01]
                          "2" -> nNumberOfKeys [INT02]
                          GC 2º nº artículo [LITM] <> szIdentifier2ndItem [LITM]
                          GC Sucursal/ planta [MCU] <> szBussinesUnit [MCU]
                          VA frm_PAID_mnExtendedCost_Cmp [PAID] <> mnExtendedCost_Line [PAID]
                          VA frm_PAID_mnAmtExtendedCost [PAID] <> mnExtendedCost_Item [PAID]
//
GC ExtendedCost/Price Diference = [VA frm_PAID_mnExtendedCost_Cmp]
//
End If
//
Else
//
POReceiptCacheAdd(B590009.POReceiptCacheAdd)
                     VA frm_JOBS_mnJobnumber_Receipt [JOBS] -> mnJobnumberA [JOBS]
                     "1" -> nIndexNumber [INT01]
                     "2" -> nNumberOfKeys [INT02]
                     GC 2º nº artículo [LITM] <> szIdentifier2ndItem [LITM]
                     GC Sucursal/ planta [MCU] <> szBussinesUnit [MCU]
                     GC Importe  [AOPNR] <> mnExtendedCost_Line [PAID]
                     VA frm_PAID_mnAmtExtendedCost [PAID] <> mnExtendedCost_Item [PAID]
//
GC ExtendedCost/Price Diference = [GC Amount]
//
End If

En el evento Row Exit & Changed – Asynch se hacen nuevamente las validaciones de
Adicionar o actualizar caché. Todo esto depende de cómo se implemente la lógica de
programación
// =============================================================
// Se busca en el caché si el registro existe, si no se adiciona, en caso
// contrario se actualiza
//
VA frm_DTAI_szErrorCacheReceipt [DTAI] = <Blank>
VA frm_PAID_mnExtendedCost_Cmp = 0
POReceiptCacheFetch(B590009.POReceiptCacheFetch)
                VA frm_JOBS_mnJobnumber_Receipt [JOBS] -> mnJobnumberA [JOBS]
                "1" -> nIndexNumber [INT01]
                "2" -> nNumberOfKeys [INT02]
                "1" -> cSuppressErrorMessage [SUPPS]
                VA frm_DTAI_szErrorCacheReceipt [DTAI] <- szErrorMessageID [DTAI]
                GC 2º nº artículo [LITM] -> szIdentifier2ndItem [LITM]
                GC Sucursal/ planta [MCU] -> szBussinesUnit [MCU]
                VA frm_PAID_mnExtendedCost_Cmp [PAID] <> mnExtendedCost_Line [PAID]
                VA frm_PAID_mnAmtExtendedCost [PAID] <> mnExtendedCost_Item [PAID]
//
If VA frm_DTAI_szErrorCacheReceipt [DTAI] is equal to <Blank>
           Or VA frm_DTAI_szErrorCacheReceipt [DTAI] is equal to <NULL>
//
// =============================================================
// Si el registro existe en el caché, se trae el costo de la línea y se le
// resta el monto comparado
//
GC ExtendedCost/Price Diference = [GC Amount]-[GC AmountCmp]
//
// =============================================================
// Se actualiza el caché del monto de por item/bodega con lo que se ingrese en
// la grid
//
If GC Precio/costo total [PAID] is equal to "0"
//
GC ExtendedCost/Price Diference = [VA frm_PAID_mnExtendedCost_Cmp]
//
Else
//
VA frm_PAID_mnExtendedCost_Cmp = [VA frm_PAID_mnExtendedCost_Cmp]-[GC AmountCmp]+[GC Amount]
//
POReceiptCacheUpdate(B590009.POReceiptCacheUpdate)
                          VA frm_JOBS_mnJobnumber_Receipt [JOBS] -> mnJobnumberA [JOBS]
                          "1" -> nIndexNumber [INT01]
                          "2" -> nNumberOfKeys [INT02]
                          GC 2º nº artículo [LITM] <> szIdentifier2ndItem [LITM]
                          GC Sucursal/ planta [MCU] <> szBussinesUnit [MCU]
                          VA frm_PAID_mnExtendedCost_Cmp [PAID] <> mnExtendedCost_Line [PAID]
                          VA frm_PAID_mnAmtExtendedCost [PAID] <> mnExtendedCost_Item [PAID]
//
GC ExtendedCost/Price Diference = [VA frm_PAID_mnExtendedCost_Cmp]
//
End If
//
Else
//
POReceiptCacheAdd(B590009.POReceiptCacheAdd)
                     VA frm_JOBS_mnJobnumber_Receipt [JOBS] -> mnJobnumberA [JOBS]
                     "1" -> nIndexNumber [INT01]
                     "2" -> nNumberOfKeys [INT02]
                     GC 2º nº artículo [LITM] <> szIdentifier2ndItem [LITM]
                     GC Sucursal/ planta [MCU] <> szBussinesUnit [MCU]
                     GC Importe  [AOPNR] <> mnExtendedCost_Line [PAID]
                     VA frm_PAID_mnAmtExtendedCost [PAID] <> mnExtendedCost_Item [PAID]
//
GC ExtendedCost/Price Diference = [GC Amount]
//
End If

En el evento End Dialog, se cierra el cursor y se termina el caché

POReceiptCacheCloseCursor(B590009.POReceiptCacheCloseCursor)
           VA frm_JOBS_mnJobnumber_Receipt [JOBS] -> mnJobnumberA [JOBS]

POReceiptCacheTerminate(B590009.POReceiptCacheTerminate)
           VA frm_JOBS_mnJobnumber_Receipt [JOBS] -> mnJobnumberA [JOBS]

Para este ejemplo no se emplearon las funciones de Cache Delete o Cache Fetch Next pero
sería cuestión de implementar los llamados de acuerdo a la lógica de programación requerida.

Вам также может понравиться