Kbase P3219: Decimals lost when dynamically changing the format of a Browse cells on ROW-DISPLAY
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  03/02/2006 |
|
Status: Verified
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:
Bug# 20030113-006
CAUSE:
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:
Upgrade to 9.1D06 or later.
If the upgrade is not possible, use the following as a workaround:
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.
*******************
Example to apply the fix to SmartDataBrowsers:
Modify the 3 following ADM2 files:
1) src/adm2/browser.p/refreshBrowse :
DEFINE VARIABLE hBrowse AS HANDLE NO-UNDO.
{get BrowseHandle hBrowse}.
{src/adm2/BeforeRefreshKDSV.i &KDSVbrws. = "hBrowse"}
hBrowse:REFRESH() NO-ERROR.
{src/adm2/AfterRefreshKDSV.i &KDSVbrws = "hBrowse"}
2) src/adm2/datavis.i/displayObject: (modify the bottom)
{src/adm2/BeforeRefreshKDSV.i &KDSVbrws = "BROWSE {&BROWSE-NAME}"}
BROWSE {&BROWSE-NAME}:REFRESH() NO-ERROR.
{src/adm2/AfterRefreshKDSV.i &KDSVbrws = "BROWSE {&BROWSE-NAME}"}
3) src/adm2/brschnge.i (at the bottom (line 63), modify)
{src/adm2/BeforeRefreshKDSV.i &KDSVbrws = "{&BROWSE-NAME}"}
BROWSE {&BROWSE-NAME}:REFRESH() NO-ERROR. /* Make sure that calc'd fields are refreshed */
{src/adm2/AfterRefreshKDSV.i &KDSVbrws = "{&BROWSE-NAME}"}
.