The Version 9.x binary dump and load process does not experience the problem because the corresponding .DF file contains physical position information (RPOS) that is not available to a Version 8.x .DF file.
See also Progress Knowlege Base # 20192 where the problem explained in details.
The following program is suppose to fix this problem. It is standard PSC program that you can find in $DLC\src\prodict\dump directory. It in running from src\prodict\dump_df.p and it is creating database.df file. Changes were made just in one piece of src\prodict\dump\_dmpsddl.p code, so it will be easy to port to your current version of Progress. See DAL comments in the code. This Progress source code is from 8.1C. Besides _dmpsddl.p you will probably also need _dmpdefs.p, located in the same directory.
Note: when making changes, notice that all progams start with underscore "_". So every time you do the change and compile, you need to exit and restart your entire Progress session to clear out the r-code cache, because dot-r files starting with an underscore are cached as if -q was set for them
/*************************************************************/ /* Copyright (c) 1984-1995 by Progress Software Corporation */ /* */ /* All rights reserved. No part of this program or document */ /* may be reproduced in any form or by any means without */ /* permission in writing from PROGRESS Software Corporation. */ /*************************************************************/ /* _dmpsddl.p - dump data definitions */ /* in: user_env[1] = containing comma-separated list of filenames in current database, *only* if user_filename = "SOME". user_env[2] = Name of file to dump to. user_env[5] = "" or " " (only for "d"!) /* hutegger 94/02 */ user_env[6] = "no-alert-boxes" or something else user_env[9] = "d" - dump defs - if user selected a specific table: translates into "t" for dumpdefs. - if user selected ALL: translates into "d","s" and "t" for dumpdefs where "d" will output both auto connect and collation info. "a" - auto connect "c" - collation info "s" - sequences. user_env[25] = "AUTO" or "" user_filename = "ALL" all files of a schema "SOME" some of the files of the first schema "SOME MORE" some of the files of a following schema "ONE" one file of the first schema "ONE MORE" one file of a following schema When dumping automatically all definitions of all schemas, the .df-file should contain only one trailer - at the very end. Therefor the batch- program passes "AUTO" to suppress the trailer for the 1. to n-1. db. "" symbolizes the default-behaviour (:= generate trailer). History: hutegger 95/01/24 single-files in multiple schemas hutegger 94/06/09 batch-automatism hutegger 94/02/24 code-page - support and trailer-info added */ /*h-*/ { prodict/dictvar.i } { prodict/user/uservar.i } { prodict/fhidden.i} DEFINE VARIABLE Dbs AS CHARACTER NO-UNDO. DEFINE VARIABLE file_len AS INTEGER NO-UNDO. DEFINE VARIABLE i AS INTEGER NO-UNDO. DEFINE VARIABLE Seqs AS CHARACTER NO-UNDO. DEFINE VARIABLE stopped AS LOGICAL NO-UNDO init true. DEFINE VARIABLE old-num AS INTEGER NO-UNDO. /* DAL */ DEFINE VARIABLE dummy-count AS INTEGER NO-UNDO. /* DAL */ DEFINE NEW SHARED STREAM ddl. /* LANGUAGE DEPENDENCIES START */ /*----------------------------------------*/ FORM Dbs LABEL "Database" COLON 11 FORMAT "x(32)" SKIP _File._File-name LABEL "Table" COLON 11 FORMAT "x(32)" SKIP Seqs LABEL "Sequence" COLON 11 FORMAT "x(32)" SKIP HEADER "Dumping Definitions. Press " + KBLABEL("STOP") + " to terminate the dump process." format "x(70)" WITH FRAME working ROW 4 CENTERED SIDE-LABELS ATTR-SPACE USE-TEXT. COLOR DISPLAY MESSAGES _File._File-name Dbs Seqs WITH FRAME working. if TERMINAL <> "" then DISPLAY "" @ Dbs "" @ _File._File-name "" @ Seqs WITH FRAME working. /* LANGUAGE DEPENDENCIES END */ /*------------------------------------------*/ if TERMINAL <> "" then run adecomm/_setcurs.p ("WAIT"). if user_env[5] = " " OR user_env[5] = ? then assign user_env[5] = " ". if user_env[5] = " " then OUTPUT STREAM ddl TO VALUE(user_env[2]) NO-ECHO NO-MAP NO-CONVERT. else OUTPUT STREAM ddl TO VALUE(user_env[2]) NO-ECHO NO-MAP CONVERT SOURCE SESSION:CHARSET TARGET user_env[5]. assign SESSION:IMMEDIATE-DISPLAY = yes. DO ON STOP UNDO, LEAVE: if user_env[9] = "a" then DO: if TERMINAL <> "" then DISPLAY "(Auto-Connect)" @ Dbs WITH FRAME working. RUN "prodict/dump/_dmpdefs.p" ("a",drec_db). end. else if user_env[9] = "c" then DO: if TERMINAL <> "" then DISPLAY user_dbname + " (Collate)" @ Dbs WITH FRAME working. RUN "prodict/dump/_dmpdefs.p" ("c",drec_db). end. else if user_env[9] = "s" then DO: if TERMINAL <> "" then DISPLAY user_dbname @ Dbs "ALL" @ Seqs WITH FRAME working. RUN "prodict/dump/_dmpdefs.p" ("s",drec_db). end. else FOR EACH DICTDB._File WHERE _File._Db-recid = drec_db AND ( if user_filename = "ALL" then (IF NOT fHidden THEN NOT DICTDB._File._Hidden ELSE DICTDB._File._File-Number > 0) else if user_filename begins "SOME" then CAN-DO(user_env[1],DICTDB._File._File-name) else RECID(DICTDB._File) = drec_file ) BREAK BY DICTDB._File._File-num: if FIRST(DICTDB._File._File-num) then do: /* first _file of this _db */ if user_filename = "ALL" or user_filename = "SOME MORE" or user_filename = "ONE MORE" then do: /* we need db-token */ if TERMINAL <> "" then DISPLAY "ALL" @ Dbs WITH FRAME working. RUN "prodict/dump/_dmpdefs.p" ("d",drec_db). end. /* we need db-token */ if user_filename = "ALL" then do: /* "all" to dump */ if TERMINAL <> "" then DISPLAY user_dbname @ Dbs "ALL" @ Seqs WITH FRAME working. RUN "prodict/dump/_dmpdefs.p" ("s",drec_db). end. /* "all" to dump */ end. /* first _file of this _db */ else if TERMINAL <> "" then DISPLAY user_dbname @ Dbs WITH FRAME working. if TERMINAL <> "" then DISPLAY _File._File-name WITH FRAME working. /***************************************************************************************** This code is necessary if you have tables deleted. You can check it in your database and see if you have gaps in table numbers. for each _file where _file-number > 0: disp _file-name _file-number. end. The following code will fill the gaps with DUMMY tables in .df file. After loading .df file you probably want to delete these DUMMY tables. Dmitri Levin, DAL 5/12/1997 *****************************************************************************************/ if old-num > 0 and DICTDB._File._File-num - old-num > 1 then do: /* DAL */ do i = 1 to DICTDB._File._File-num - old-num - 1 : /* DAL */ dummy-count = dummy-count + 1. /* DAL */ PUT STREAM ddl UNFORMATTED "ADD TABLE ""DUMMY" string(dummy-count) """" skip. /* DAL */ PUT STREAM ddl UNFORMATTED " LABEL ""DUMMY" string(dummy-count) """" skip. /* DAL */ PUT STREAM ddl UNFORMATTED " DUMP-NAME ""DUMMY" string(dummy-count) """" skip(1). /* DAL */ end. /* DAL */ end. /* DAL */ old-num = DICTDB._File._File-num. /* DAL */ RUN "prodict/dump/_dmpdefs.p" ("t",RECID(_File)). end. /* for each _file */ if user_env[25] <> "AUTO" then do: /* no other _db-schema will follow -> trailer */ {prodict/dump/dmptrail.i &entries = " " &seek-stream = "ddl" &stream = "stream ddl" } /* adds trailer with code-page-entry to end of file */ end. /* no other _db-schema will follow -> trailer */ stopped = false. end. file_len = SEEK(ddl). OUTPUT STREAM ddl CLOSE. SESSION:IMMEDIATE-DISPLAY = no. if TERMINAL <> "" then run adecomm/_setcurs.p (""). if user_env[6] = "no-alert-boxes" then do: /* output WITHOUT alert-box */ if stopped then MESSAGE "Dump terminated.". else do: if file_len < 3 then do: /* the file is empty - nothing to dump */ OS-DELETE VALUE(user_env[2]). if TERMINAL <> "" then MESSAGE "There were no " + (if user_env[9] = "a" then "auto-connect records" else if user_env[9] = "s" then "sequence definitions" else "data definitions" ) + " to dump." SKIP "The output file has been deleted.". end. else if TERMINAL <> "" then MESSAGE "Dump of definitions completed.". end. end. /* output WITHOUT alert-box */ else do: /* output WITH alert-box */ if stopped then MESSAGE "Dump terminated." VIEW-AS ALERT-BOX INFORMATION BUTTONS OK. else do: if file_len < 3 then do: /* the file is empty - nothing to dump */ OS-DELETE VALUE(user_env[2]). if TERMINAL <> "" then MESSAGE "There were no " + (if user_env[9] = "a" then "auto-connect records" else if user_env[9] = "s" then "sequence definitions" else "data definitions" ) + " to dump." SKIP "The output file has been deleted." VIEW-AS ALERT-BOX INFORMATION BUTTONS OK. end. else if TERMINAL <> "" then MESSAGE "Dump of definitions completed." VIEW-AS ALERT-BOX INFORMATION BUTTONS OK. end. end. /* output WITH alert-box */ if TERMINAL <> "" then HIDE FRAME working NO-PAUSE. RETURN.