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.