Consultor Eletrônico



Kbase P34752: Error 26 or 450 and 3191 trying to display or export a record
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   8/5/2008
Status: Verified

SYMPTOM(s):

Error 26 running a FIND statement from the 4GL to find the record


** Array subscript <value> is out of range. (26)

Errors 129 and 4431 running a proutil index check utility

The total length of the fields in an index exceeds max key size. (129)

SYSTEM ERROR: Failed to build key for recid = <RECID> index number <index-num> table number <table-num>. (4431)

Errors 129 and 4431 are shown within the database log

Errors 450 and 3191 trying to display or export data

SYSTEM ERROR: Cannot read field <field-num> from record, not enough fields. (450)

SYSTEM ERROR: Failed to extract field <field-num> from <file-name> record (table <table-num>) with recid <RECID>. (3191)

Errors 450 and 3191 are shown in the database log file

FACT(s) (Environment):

All Supported Operating Systems
Progress 9.x
OpenEdge 10.x
Progress 8.x

CAUSE:

The database contain one or more blocks with corrupted data at the field level in one or more records.

FIX:

In order to fix this data corruption you will need to delete and re-create if possible each corrupt record.
We recommend try to dump each field from each corrupt record so that you can get as much information as possible from each record by following the steps:

Remember to always make sure that you have a good current backup before proceed with this steps.

1) Record all recid values from error 3191.

2) Use the following code to find out the field name refereed by field-num on error 450 or 3191.

FIND _file WHERE _file-num = "<table-num>".
FOR EACH _field OF _file where _field-rpos = <field-num-value>:
DISP _file._file-name _field._field-name.
END.

3) For each recid use the following code to export the fields that are not corrupted by changing the <field-name> found in the step 2 .

OUTPUT TO VALUE(string(<recid>) + ".txt").
FIND <table-name> WHERE RECID(<table-name>) = <recid>.
EXPORT <table-name> EXCEPT <field-name>.

4) You can now delete the bad records using the command:

proutil dbname -C idxfix

You will be presented with a menu, select these options:

Menu Item 6. Delete one record and it's index entries.
It will then ask you to "Type the recid to delete."
It will then ask you to "Type the area for the recid(s)."

Repeat for each recid that is corrupt.

5) Use dbrpr with options 1, 3, 4, 7 and 8 from option 1. Database Scan menu to reformat the bad blocks and rebuild RM and Free chains.

6) Once this is complete, you can then proceed to re-create your records using the data obtained on step 3.
For the fields that was corrupted, you may want to look for their values in a historic database.