Kbase P29346: How to determine which table and area a record id (recid) exists in for V9
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  2/22/2011 |
|
Status: Verified
GOAL:
How to determine which table and area a record id (recid) exists in for V9
GOAL:
What area does a specific recid in?
GOAL:
What table is a specific recid in?
GOAL:
How to locate table and area information by recid?
GOAL:
How to find out what table a recid is in?
GOAL:
How to find a recid in a specific table?
GOAL:
How to determine which table a recid is in?
GOAL:
How to determine which table a recid exists in?
GOAL:
How to determine what table a record exists in?
GOAL:
Is there a way to identify a table name based only on the recid of a record?
FACT(s) (Environment):
All Supported Operating Systems
Progress 9.x
FIX:
The following code can be run to identify which tables and areas a contain a given recid. Execute the code, enter the recid and database name when prompted. The table names and areas will be displayed in message boxes.
DEFINE VARIABLE iRecID AS INTEGER NO-UNDO LABEL "Enter RECID".
DEFINE VARIABLE cDB AS CHARACTER NO-UNDO LABEL "Enter Database to Search".
DEFINE VARIABLE cTableList AS CHARACTER NO-UNDO.
IF NUM-DBS GT 0 THEN
ASSIGN cDB = LDBNAME(1).
UPDATE iRecID FORMAT ">>>>>>>>>9" cDB FORMAT "X(50)".
RUN BuildListOfTables IN THIS-PROCEDURE (iRecID, cDB, OUTPUT cTableList).
RUN BuildListOfAreas IN THIS-PROCEDURE (iRecID, cDB, cTableList).
PROCEDURE BuildListOfTables:
DEFINE INPUT PARAMETER piRecID AS INTEGER NO-UNDO.
DEFINE INPUT PARAMETER pcDB AS CHARACTER NO-UNDO.
DEFINE OUTPUT PARAMETER pcTableList AS CHARACTER NO-UNDO.
DEFINE VARIABLE cQueryString AS CHARACTER NO-UNDO.
DEFINE VARIABLE cTableName AS CHARACTER NO-UNDO.
DEFINE VARIABLE hQuery AS HANDLE NO-UNDO.
DEFINE VARIABLE hQueryTable AS HANDLE NO-UNDO.
DEFINE VARIABLE hBufferFile AS HANDLE NO-UNDO.
DEFINE VARIABLE hBufferTable AS HANDLE NO-UNDO.
DEFINE VARIABLE hBufferField AS HANDLE NO-UNDO.
CREATE QUERY hQuery.
CREATE BUFFER hBufferFile FOR TABLE pcDB + '._File'.
hQuery:SET-BUFFERS(hBufferFile).
hQuery:QUERY-PREPARE('FOR EACH ' + pcDB + '._File NO-LOCK WHERE SUBSTRING(_File-Name,1,1) NE "_"').
hQuery:QUERY-OPEN().
REPEAT WHILE hQuery:QUERY-OFF-END = FALSE:
hQuery:GET-NEXT() NO-ERROR.
IF hBufferFile:AVAILABLE = TRUE THEN
DO:
ASSIGN hBufferField = hBufferFile:BUFFER-FIELD('_File-Name')
cTableName = TRIM(hBufferField:STRING-VALUE)
cQueryString = 'FOR EACH &1.&2 NO-LOCK WHERE RECID(&1.&2) = &3'
cQueryString = SUBSTITUTE(cQueryString,pcDB,cTableName,piRecID).
CREATE QUERY hQueryTable.
CREATE BUFFER hBufferTable FOR TABLE pcDB + '.' + cTableName NO-ERROR.
IF ERROR-STATUS:GET-MESSAGE(1) = '' THEN
DO:
hQueryTable:SET-BUFFERS(hBufferTable).
hQueryTable:QUERY-PREPARE(cQueryString).
hQueryTable:QUERY-OPEN().
hQueryTable:GET-FIRST().
IF hBufferTable:AVAILABLE = TRUE THEN
IF pcTableList NE '' THEN
ASSIGN pcTableList = pcTableList + ',' + cTableName.
ELSE
ASSIGN pcTableList = cTableName.
hQueryTable:QUERY-CLOSE().
END.
DELETE OBJECT hQueryTable NO-ERROR.
DELETE OBJECT hBufferTable NO-ERROR.
END.
END.
hQuery:QUERY-CLOSE().
DELETE OBJECT hQuery NO-ERROR.
DELETE OBJECT hBufferFile NO-ERROR.
END PROCEDURE.
PROCEDURE BuildListOfAreas:
DEFINE INPUT PARAMETER piRecID AS INTEGER NO-UNDO.
DEFINE INPUT PARAMETER pcDB AS CHARACTER NO-UNDO.
DEFINE INPUT PARAMETER pcTableList AS CHARACTER NO-UNDO.
DEFINE VARIABLE cQueryString AS CHARACTER NO-UNDO.
DEFINE VARIABLE hQuery AS HANDLE NO-UNDO.
DEFINE VARIABLE hBufferFile AS HANDLE NO-UNDO.
DEFINE VARIABLE hBufferField AS. HANDLE NO-UNDO.
DEFINE VARIABLE hBufferStorageObject AS HANDLE NO-UNDO.
DEFINE VARIABLE iLoop AS INTEGER NO-UNDO.
DO iLoop = 1 to NUM-ENTRIES(pcTableList):
ASSIGN cQueryString = 'FOR EACH &1.&2 WHERE &1.&2._File-Name = "&3" NO-LOCK, EACH &1.&4 WHERE &1.&4._Object-Number = &1.&2._File-Number AND &1.&4._Object-Type = 1 NO-LOCK'
cQueryString = SUBSTITUTE(cQueryString, pcDB, '_File', TRIM(ENTRY(iLoop,pcTableList)), '_StorageObject').
CREATE QUERY hQuery.
CREATE BUFFER hBufferFile FOR TABLE pcDB + '._File'.
CREATE BUFFER hBufferStorageObject FOR TABLE pcDB + '._StorageObject'.
hQuery:SET-BUFFERS(hBufferFile, hBufferStorageObject).
hQuery:QUERY-PREPARE(cQueryString).
hQuery:QUERY-OPEN().
hQuery:GET-FIRST().
IF hBufferFile:AVAILABLE = TRUE AND hBufferStorageObject:AVAILABLE = TRUE THEN
DO:
ASSIGN hBufferField = hBufferStorageObject:BUFFER-FIELD('_Area-Number').
MESSAGE 'RECID ' +
STRING(piRecID) +
' was found for table "' +
TRIM(ENTRY(iLoop,pcTableList)) +
'", which is located in storage area ' +
hBufferField:BUFFER-VALUE
VIEW-AS ALERT-BOX.
END.
hQuery:QUERY-CLOSE().
DELETE OBJECT hQuery NO-ERROR.
DELETE OBJECT hBufferFile NO-ERROR.
DELETE OBJECT hBufferStorageObject NO-ERROR.
END.
END PROCEDURE.
.