Consultor Eletrônico



Kbase 33219: Decimals lost when dynamically changing the format of a Browse cells on ROW-DISPLAY
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   5/10/1998
Solution ID: P3219

FACT(s) (Environment):

Progress 9.1D

SYMPTOM(s):

Decimals are lost in the SCREEN-VALUE of browse cells

Changing the format of Browse cells on ROW-DISPLAY

CAUSE:

Known issue: the REFRESH() method spoils the SCREEN-VALUE of decimal cells (can potentially remove decimals) when the format of these cells has been dynamically modified in the ROW-DISPLAY trigger.

FIX:

Store the FORMAT and the INPUT-VALUE of these cells before calling the REFRESH() method, then restore them after calling REFRESH().

This can be achieved with two include files to insert before and after REFRESH() is called, as illustrated bellow:

/*  File:  src/adm2/BeforeRefreshKDSV.i  (saved in src/adm2 for convenience)
{&KDSVbrws}  BrowseHandle or  Browse Name
{&KDSVFramePh}  'IN FRAME <Frame Name>'
*/

&IF "{&KeepDecScreenValue}" = "" &THEN
   DEFINE VARIABLE cKeepDecScreenValue AS CHARACTER  NO-UNDO.
   DEFINE VARIABLE fKeepDecScreenValue AS CHARACTER  NO-UNDO.
   DEFINE VARIABLE hKeepDecScreenValue AS HANDLE     NO-UNDO.
   DEFINE VARIABLE iKeepDecScreenValue AS INT        NO-UNDO.
&ENDIF
&SCOPED-DEFINE KeepDecScreenValue Don't define it twice

ASSIGN
hKeepDecScreenValue = {&KDSVbrws}:FIRST-COLUMN {&FramePh}
cKeepDecScreenValue = ""
fKeepDecScreenValue = "".

DO WHILE hKeepDecScreenValue <> ?:
   IF hKeepDecScreenValue:BUFFER-FIELD <> ? /*calculated field*/
     THEN IF hKeepDecScreenValue:DATA-TYPE = "DECIMAL"
       THEN ASSIGN
        cKeepDecScreenValue = (IF cKeepDecScreenValue = "" THEN ""
             ELSE cKeepDecScreenValue + CHR(1))
         + STRING(hKeepDecScreenValue:INPUT-VALUE)
        fKeepDecScreenValue = (IF fKeepDecScreenValue = "" THEN ""
             ELSE fKeepDecScreenValue + CHR(1))
         + hKeepDecScreenValue:FORMAT.
   hKeepDecScreenValue = hKeepDecScreenValue:NEXT-COLUMN.
END.

-------------------------------------------------------------
/* File: src/adm2/AfterRefreshKDSV.i  (saved in src/adm2 for convenience)
{&KDSVbrws}  BrowseHandle or  Browse Name
{&KDSVFramePh}  'IN FRAME <Frame Name>'
*/
ASSIGN
iKeepDecScreenValue = 0
hKeepDecScreenValue = {&KDSVbrws}:FIRST-COLUMN {&FramePh}.
 
DO WHILE hKeepDecScreenValue <> ?:
   IF hKeepDecScreenValue:BUFFER-FIELD <> ? THEN /*calculated field*/
     IF hKeepDecScreenValue:DATA-TYPE = "DECIMAL" THEN
       ASSIGN
         iKeepDecScreenValue = iKeepDecScreenValue + 1
         hKeepDecScreenValue:FORMAT =
          ENTRY(iKeepDecScreenValue,fKeepDecScreenValue,CHR(1))
         hKeepDecScreenValue:SCREEN-VALUE =
          ENTRY(iKeepDecScreenValue,cKeepDecScreenValue,CHR(1)).
   hKeepDecScreenValue = hKeepDecScreenValue:NEXT-COLUMN.
END.