FORM
_file-name LABEL "Processing File"
_field-name
WITH FRAME xx SIDE-LABELS 1 COL WIDTH 78.
DEFINE TEMP-TABLE sqlw
FIELD fileName AS CHARACTER FORMAT "x(24)"
FIELD fieldName AS CHARACTER FORMAT "x(24)"
FIELD sz AS INTEGER
INDEX ix IS PRIMARY UNIQUE fileName fieldName.
RUN FIND_fields.
FOR EACH sqlw NO-LOCK :
DISPLAY sqlw WITH TITLE "Change SQL-WIDTH for this fields" .
END.
DEFINE VARIABLE vlOK AS LOGICAL.
IF CAN-FIND( FIRST sqlw NO-LOCK ) THEN
MESSAGE "Do you wish to continue?" VIEW-AS ALERT-BOX BUTTONS YES-NO
UPDATE vlok.
ELSE
MESSAGE "Dataserver schema was validated." VIEW-AS ALERT-BOX.
IF vlok
THEN DO TRANSACTION:
FOR EACH _file NO-LOCK WHERE NOT _hidden,
EACH _field OF _file WHERE _data-type = "CHARACTER",
EACH sqlw NO-LOCK WHERE FILENAME = _file-name AND fieldName = _field-name:
ASSIGN _width = sz + 8.
END.
END.
PROCEDURE FIND_fields:
DEFINE VARIABLE vFieldList AS CHARACTER NO-UNDO.
DEFINE VARIABLE vSizeList AS CHARACTER NO-UNDO.
DEFINE VARIABLE vFieldName AS INTEGER NO-UNDO.
DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO.
DEFINE VARIABLE hQuery AS HANDLE NO-UNDO.
DEFINE VARIABLE hField AS HANDLE NO-UNDO.
DEFINE VARIABLE VarBoucle AS INTEGER NO-UNDO.
DEFINE VARIABLE VarSize AS INTEGER NO-UNDO.
FOR EACH _file WHERE NOT _hidden NO-LOCK :
ASSIGN vFieldList = ''
vSizeList = ''.
FOR EACH _field OF _file NO-LOCK WHERE _data-type = "CHARACTER" :
ASSIGN vFieldList = vFieldList + ',' + _field-name
vSizeList = vSizeList + ',' + STRING(INTEGER(_width - 2)).
END.
IF vFieldList = ''
THEN NEXT.
/* Suppression de la virgule de début de liste */
ASSIGN vFieldList = SUBSTRING(vFieldList,2)
vSizeList = SUBSTRING(vSizeList,2).
/* Création du buffer de parcours des enregistrements */
CREATE BUFFER hBuffer FOR TABLE _file-name.
CREATE QUERY hQuery.
hQuery:SET-BUFFERS(hBuffer).
hQuery:QUERY-PREPARE("FOR EACH " + _file-name + " NO-LOCK ").
hQuery:QUERY-OPEN().
DISPLAY _file-name WITH FRAME xx .
IF hQuery:GET-FIRST()
THEN REPEAT:
hBuffer = hQuery:GET-BUFFER-HANDLE(1).
DO vFieldName = 1 TO NUM-ENTRIES(vFieldList):
ASSIGN hField = hBuffer:BUFFER-FIELD(ENTRY(vFieldName,vFieldList)).
VarSize = 0 .
IF HField:EXTENT > 0
THEN DO :
DO VarBoucle = 1 TO HField:EXTENT :
IF (LENGTH(hField:BUFFER-VALUE(Varboucle)) >
INTEGER(ENTRY(vFieldName,vSizeList))) AND
( LENGTH(hField:BUFFER-VALUE(Varboucle)) >
VarSize )
THEN DO :
VarSize = LENGTH(hField:BUFFER-VALUE(Varboucle)).
END.
END.
END.
ELSE DO :
IF LENGTH(hField:BUFFER-VALUE) >
INTEGER(ENTRY(vFieldName,vSizeList))
THEN DO:
VarSize = LENGTH(hField:BUFFER-VALUE).
END.
END.
IF Varsize > 0
THEN DO :
FIND sqlw WHERE FILENAME = _file-name
AND fieldName = ENTRY(vFieldName,vFieldList) NO-ERROR.
IF NOT AVAILABLE(sqlw)
THEN DO:
CREATE sqlw.
ASSIGN FILENAME = _file-name
fieldName = ENTRY(vFieldName,vFieldList).
END.
IF sz < varsize
THEN ASSIGN sz = varsize .
END.
END.
hQuery:GET-NEXT().
IF hQuery:QUERY-OFF-END
THEN LEAVE.
END.
hQuery:QUERY-CLOSE.
DELETE OBJECT hQuery.
DELETE OBJECT hBuffer.
END. /* FOR EACH _file... */
END PROCEDURE.
I had problems with SQL width in Progress DB, and I found a 4GL program which browse each table and resizes if necessary.
Code:FORM _file-name LABEL "Processing File" _field-name WITH FRAME xx SIDE-LABELS 1 COL WIDTH 78. DEFINE TEMP-TABLE sqlw FIELD fileName AS CHARACTER FORMAT "x(24)" FIELD fieldName AS CHARACTER FORMAT "x(24)" FIELD sz AS INTEGER INDEX ix IS PRIMARY UNIQUE fileName fieldName. RUN FIND_fields. FOR EACH sqlw NO-LOCK : DISPLAY sqlw WITH TITLE "Change SQL-WIDTH for this fields" . END. DEFINE VARIABLE vlOK AS LOGICAL. IF CAN-FIND( FIRST sqlw NO-LOCK ) THEN MESSAGE "Do you wish to continue?" VIEW-AS ALERT-BOX BUTTONS YES-NO UPDATE vlok. ELSE MESSAGE "Dataserver schema was validated." VIEW-AS ALERT-BOX. IF vlok THEN DO TRANSACTION: FOR EACH _file NO-LOCK WHERE NOT _hidden, EACH _field OF _file WHERE _data-type = "CHARACTER", EACH sqlw NO-LOCK WHERE FILENAME = _file-name AND fieldName = _field-name: ASSIGN _width = sz + 8. END. END. PROCEDURE FIND_fields: DEFINE VARIABLE vFieldList AS CHARACTER NO-UNDO. DEFINE VARIABLE vSizeList AS CHARACTER NO-UNDO. DEFINE VARIABLE vFieldName AS INTEGER NO-UNDO. DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO. DEFINE VARIABLE hQuery AS HANDLE NO-UNDO. DEFINE VARIABLE hField AS HANDLE NO-UNDO. DEFINE VARIABLE VarBoucle AS INTEGER NO-UNDO. DEFINE VARIABLE VarSize AS INTEGER NO-UNDO. FOR EACH _file WHERE NOT _hidden NO-LOCK : ASSIGN vFieldList = '' vSizeList = ''. FOR EACH _field OF _file NO-LOCK WHERE _data-type = "CHARACTER" : ASSIGN vFieldList = vFieldList + ',' + _field-name vSizeList = vSizeList + ',' + STRING(INTEGER(_width - 2)). END. IF vFieldList = '' THEN NEXT. /* Suppression de la virgule de début de liste */ ASSIGN vFieldList = SUBSTRING(vFieldList,2) vSizeList = SUBSTRING(vSizeList,2). /* Création du buffer de parcours des enregistrements */ CREATE BUFFER hBuffer FOR TABLE _file-name. CREATE QUERY hQuery. hQuery:SET-BUFFERS(hBuffer). hQuery:QUERY-PREPARE("FOR EACH " + _file-name + " NO-LOCK "). hQuery:QUERY-OPEN(). DISPLAY _file-name WITH FRAME xx . IF hQuery:GET-FIRST() THEN REPEAT: hBuffer = hQuery:GET-BUFFER-HANDLE(1). DO vFieldName = 1 TO NUM-ENTRIES(vFieldList): ASSIGN hField = hBuffer:BUFFER-FIELD(ENTRY(vFieldName,vFieldList)). VarSize = 0 . IF HField:EXTENT > 0 THEN DO : DO VarBoucle = 1 TO HField:EXTENT : IF (LENGTH(hField:BUFFER-VALUE(Varboucle)) > INTEGER(ENTRY(vFieldName,vSizeList))) AND ( LENGTH(hField:BUFFER-VALUE(Varboucle)) > VarSize ) THEN DO : VarSize = LENGTH(hField:BUFFER-VALUE(Varboucle)). END. END. END. ELSE DO : IF LENGTH(hField:BUFFER-VALUE) > INTEGER(ENTRY(vFieldName,vSizeList)) THEN DO: VarSize = LENGTH(hField:BUFFER-VALUE). END. END. IF Varsize > 0 THEN DO : FIND sqlw WHERE FILENAME = _file-name AND fieldName = ENTRY(vFieldName,vFieldList) NO-ERROR. IF NOT AVAILABLE(sqlw) THEN DO: CREATE sqlw. ASSIGN FILENAME = _file-name fieldName = ENTRY(vFieldName,vFieldList). END. IF sz < varsize THEN ASSIGN sz = varsize . END. END. hQuery:GET-NEXT(). IF hQuery:QUERY-OFF-END THEN LEAVE. END. hQuery:QUERY-CLOSE. DELETE OBJECT hQuery. DELETE OBJECT hBuffer. END. /* FOR EACH _file... */ END PROCEDURE.
But if some tool is available in DLC, I'll go and check it ! Thanks for the information.
Ok, used till 100 in "threads", but nothing... same reply.
My question is not how to schedule a task or add a cron job, but what command line to use for the task? I've tried 'echo 2 | dbtool <dbname>' and it does correct any problems with table 2, probably using 2 for each entry. I've tried searching for switches or params for dbtool, so far no luck. Any pointers?Run this scheduled on a daily basis if you use SQL on your database.
dbtool pathtodatabase/databasename >/dev/null 2>&2 <<!
9
2
3
0
all
all
3
!