jueves, 2 de junio de 2016

[JD Edwards] Reserva de Objeto

Cuando un usuario está trabajando con un documento y lo está editando, deberíamos siempre no permitir que ningún otro usuario pueda modificarlo para no se produzca incongruencias. Ésto es lo que se conoce como Reserva de Objetos o Reserva de Documentos.

En JDE en la mayoría de pantallas estándar ésto está implementado, pero cuando creamos una pantalla custom deberíamos tenerlo en cuenta.

¿Cómo JDE realiza ésto?

Muy sencillo, lo que simplemente hace es cuando alguien se propone a editar un documento inserta un registro en la tabla F00095 y no lo elimina hasta que el usuario abandona la edición. De ésta manera, cuando otro usuario entra en otra instancia de la misma aplicación comprueba si existe el registro en la tabla F00095, de ser así muestra un error y bloquea para no permitir editar.

¿Qué hay que hacer?


Bien, entonces utilizando la función estándar "F00095 Reserve Object" con el UKID "RRESERVE", y normalmente con los valores claves del documento que estemos trabajando, ésta función realiza 2 cosas: por un lado comprueba si ya está reservado o no, y en caso de que no inserta el registro, o lo que es lo mismo lo reserva. En caso de que esté reservado, utilizamos la función "Set Object Reservation Text Substitution Error" para mostrar un error en la pantalla y además sería más deseable y más limpio que bloqueáramos todos los campos de la pantalla.

Ejemplo:


0080       //
0081       //  # Reserva #
0082       //
0083       // Cogemos un UKID (RRESERVE) de la F00022
0084       //
0085       Get Next Unique Key ID
              "RRESERVE" -> BF szObjectName
              VA frm_UniqueKeyIDInternal_UKID <- BF mnUniqueKeyID
0086       //
0087       // Lo convertimos a string para pasarselo a la función de reserva parámetro
0088       // PID
0089       //
0090       Math Numeric to String, Convert
              VA frm_UniqueKeyIDInternal_UKID -> BF mnMathNumeric01
              VA frm_szUniqueIDRecReserve_PID <- BF szVideoConstant30A
0091       //
0092       // Cogemos como clave el id de incidencia
0093       //
0094       VA frm_GenericKey_GENKEY = [FI mnIdentificadorIncidencia]
0095       //
0096       // Lo reservamos, pasándole usuario, clave, tabla, PID Único
0097       //
0098       F00095 Reserve Object
              "F55N42IC" -> BF szNameObject
              VA frm_UserId_USER -> BF szUserId
              "1" -> BF cSuppressErrorMessage
              VA frm_szRecordReserveErrMsg_DTAI <- BF szErrorMessageID
              VA frm_ReserversNameAlpha_ALPH <- BF szReserversNameAlpha
              VA frm_GenericKey_GENKEY -> BF szGenericKey
              VA frm_szUniqueIDRecReserve_PID -> BF szApplication
              VA frm_szReserversAplication_PID <- BF szReserversApplication
              "1" -> BF cWarningError
0099       //
0100       // Si está reservado, nos lo indicará en ErrorMesageID. Entonces mostramos
0101       // error y deshabilitamos el OK y los campos
0102       //
0103       If VA frm_szRecordReserveErrMsg_DTAI is not equal to <Blank> And VA frm_szRecordReserveErrMsg_DTAI is not equal to <Null>
0104          Set Object Reservation Text Substitution Error
                 VA frm_ReserversNameAlpha_ALPH -> BF szReserversNameAlpha
                 VA frm_GenericKey_GENKEY -> BF szGenericKey
                 VA frm_szReserversAplication_PID -> BF szApplication
                 "2" -> BF cWarningError
0105          Disable Control(HC &OK)
0106          Disable Control(FC 2nd Address Number)
0107          Disable Control(FC Address Book Name)
0108          Disable Control(FC Electronic Address)
0109          Disable Control(FC Phone Number)
0110          Disable Control(FC Fuente Incidencia)
0111          Disable Control(FC Motivo Incidencia)
0112          Disable Control(FC Estado Incidencia)
0113          Disable Control(FC Departamento Incidencia)
0114          Disable Control(FC Comment)
0115          Disable Control(FC Conclusión)
0116       End If

Por supuesto, una vez que finalicemos con la edición (cuando pulsemos el botón OK o Cancel normalmente), tenemos que quitar la reserva (el registro de la F00095) para que no se quede bloqueado y podamos editarlo a futuro mediante la BSFN "F00095 Remove Business Object Reservation".

Ejemplo:

0040    // # Quitamos la reserva
0041    //
0042    // Si la variable PID devuelta es blanco, es porque lo hemos reservado, por lo
0043    // tanto quitamos la reserva pasando el usuario, tabla, clave y PID con el UKI
0044    // unico
0045    //
0046    If VA frm_szReserversAplication_PID is equal to <Blank>
0047       F00095 Remove Business Object Reservation
              VA frm_UserId_USER -> BF szUserId
              "F55N42IC" -> BF szNameObject
              VA frm_GenericKey_GENKEY -> BF szGenericKey
              VA frm_szUniqueIDRecReserve_PID -> BF szApplication
0048    End If
0049    //


Y con ésto minimizamos el impacto de que varios usuarios a la vez trabajen con el mismo documento, algo muy simple y que nos puede evitar de bastantes problemas a futuro!