display fornat error 10.2b

jmac13

Member
Hi All,

I've got a program that creates a query dynamically and displays all columns in a browse. Sometimes the data in the browse is the incorrect format which causes lots of errors to come up as you scroll thru the data. Obviously in a perfect world the format would be changed on the database. But this isn’t really practical at the moment so is there a way to capture the error or suppress it so it doesn’t always come up on the row display.

Thanks
 
We have a dynamic browse for querying the database. A lot of the system tables have formats that do not match their data, these are simply patched in (hard coded). When showing everything dynamically you can trap the error in the row-display trigger and then adjust the buffer-value - beware that you do not do this with actual data and do not write the data back to the database!

You could do all sorts of fancy stuff to display as much as you can of the data based on the format available for the column, but that's up to you.

Code:
DEF VAR hwin AS HANDLE.
DEF VAR hfrm AS HANDLE.
DEF VAR hbrw AS HANDLE.
DEF VAR hq   AS HANDLE.
DEF VAR hb   AS HANDLE.


DEFINE TEMP-TABLE tt NO-UNDO
   FIELD ii AS INT FORMAT ">>9".


CREATE tt. tt.ii = 100. 
CREATE tt. tt.ii = 200.
CREATE tt. tt.ii = 1000.


CREATE WINDOW hwin ASSIGN
   WIDTH          =  80
   HEIGHT         =  10
   STATUS-AREA    =  FALSE
   MESSAGE-AREA   =  FALSE
   VISIBLE        =  TRUE
   .


CREATE FRAME hfrm ASSIGN
   PARENT   =  hwin
   WIDTH    =  hwin:WIDTH
   HEIGHT   =  hwin:HEIGHT
   VISIBLE  =  TRUE
   .


CREATE QUERY hq.
CREATE BUFFER hb FOR TABLE "tt".
hq:ADD-BUFFER( hb ).
hq:QUERY-PREPARE( "FOR EACH tt" ).
hq:QUERY-OPEN().


CREATE BROWSE hbrw ASSIGN
   FRAME       =  hfrm
   QUERY       =  hq
   WIDTH       =  hfrm:WIDTH - 1
   HEIGHT      =  hfrm:HEIGHT - 1
   SENSITIVE   =  TRUE
   .


DEF VAR ii AS INT.


DO ii = 1 TO hb:NUM-FIELDS:
   hbrw:ADD-LIKE-COLUMN( hb:BUFFER-FIELD( ii ) ).
END.


ON ROW-DISPLAY OF hbrw DO:


   DEF VAR cc AS CHAR.


   DO ii = 1 TO hb:NUM-FIELDS:
      
      DO ON ERROR UNDO, LEAVE:
         cc = STRING( hb:BUFFER-FIELD(ii):BUFFER-VALUE, hb:BUFFER-FIELD(ii):FORMAT ).
         CATCH e AS Progress.Lang.Error:
            IF e:GetMessageNum(1) = 74 THEN
               hb:BUFFER-FIELD( ii ):BUFFER-VALUE = ?.
         END CATCH.
      END.
   END.
END.


hbrw:VISIBLE = TRUE.


WAIT-FOR CLOSE OF THIS-PROCEDURE.
 
Hi Jmac13, taking the example of Stefan, with some modification,error handling is because I work with version 9.1D

DEF VAR hwin AS HANDLE.
DEF VAR hfrm AS HANDLE.
DEF VAR hbrw AS HANDLE.
DEF VAR hq AS HANDLE.
DEF VAR hb AS HANDLE.




DEFINE TEMP-TABLE tt NO-UNDO
FIELD FIELD-1 AS DEC FORMAT ">>9.99"
FIELD FIELD-2 AS DATE FORMAT '99-99-99'.




CREATE tt. ASSIGN tt.field-1 = 100
tt.field-2 = 01/11/2011.
CREATE tt. ASSIGN tt.field-1 = 300
tt.field-2 = 01/11/2011.
CREATE tt. ASSIGN tt.field-1 = 10000000000.00
tt.field-2 = 01/11/1901.




CREATE WINDOW hwin ASSIGN
WIDTH = 80
HEIGHT = 10
STATUS-AREA = FALSE
MESSAGE-AREA = FALSE
VISIBLE = TRUE
.




CREATE FRAME hfrm ASSIGN
PARENT = hwin
WIDTH = hwin:WIDTH
HEIGHT = hwin:HEIGHT
VISIBLE = TRUE
.




CREATE QUERY hq.
CREATE BUFFER hb FOR TABLE "tt".
hq:ADD-BUFFER( hb ).
hq:QUERY-PREPARE( "FOR EACH tt" ).
hq:QUERY-OPEN().




CREATE BROWSE hbrw ASSIGN
FRAME = hfrm
QUERY = hq
WIDTH = hfrm:WIDTH - 1
HEIGHT = hfrm:HEIGHT - 1
SENSITIVE = TRUE
COLUMN-RESIZABLE = TRUE /* add */
.




DEF VAR ii AS INT.
DEF VAR hcol AS HANDLE. /* add */




DO ii = 1 TO hb:NUM-FIELDS:
hbrw:ADD-LIKE-COLUMN( hb:BUFFER-FIELD( ii ) ).
hcol = hbrw:GET-BROWSE-COLUMN(ii). /* add */
hb:BUFFER-FIELD(ii):PRIVATE-DATA = STRING(hcol). /* add */
END.




ON ROW-DISPLAY OF hbrw DO:


DEF VAR cc AS CHAR.


DO ii = 1 TO hb:NUM-FIELDS:


DO ON ERROR UNDO, LEAVE:
cc = STRING( hb:BUFFER-FIELD(ii):BUFFER-VALUE, hb:BUFFER-FIELD(ii):FORMAT ) NO-ERROR.


IF ERROR-STATUS:NUM-MESSAGES > 0 AND
ERROR-STATUS:GET-NUMBER(1) = 74
THEN DO:
hcol = WIDGET-HANDLE(hb:BUFFER-FIELD(ii):PRIVATE-DATA).
IF VALID-HANDLE(hcol) THEN DO:
IF hb:BUFFER-FIELD(ii):DATA-TYPE = 'DECIMAL'
THEN ASSIGN hcol:FORMAT = '->>,>>>,>>>,>>9.99'.
ELSE
IF hb:BUFFER-FIELD(ii):DATA-TYPE = 'DATE'
THEN ASSIGN hcol:FORMAT = '99/99/9999'.
END.


END.
/*
CATCH e AS Progress.Lang.Error:
IF e:GetMessageNum(1) = 74 THEN
hb:BUFFER-FIELD( ii ):BUFFER-VALUE = ?.
END CATCH.
*/
END.
END.
END.




hbrw:VISIBLE = TRUE.




WAIT-FOR CLOSE OF THIS-PROCEDURE.



Regards.
 
Thanks Stefan and SergioC this is exactly what I was after, thanks to your help I've managed to change the format of each field in error to have the exact format of the value.

Once again thanks, it much appreciated!!!
 
Back
Top