Академический Документы
Профессиональный Документы
Культура Документы
AUTOESTUDIO
César Navarro
Agosto de 2018
IMPLEMENTACIÓN
Archivos .PAR
BSFN_B590009_60_99.par DSTR_D590009_60_99.par
Los campos que siguen son los propios que se quieren almacenar en el caché
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
B590009.h
En el archivo .C incluir
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:
IB590009InitializeCache
IB590009ValidateInput
IB590009ValidateInput
IB590009CloseCacheCursor
IB590009CopyCacheDS
IB590009ZeroNonDataBaseFields
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
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
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.