ACCESS Vs REFERENCE in XREF Utility

Team,
While using XREF utility i was little confused with the 2 below keywords. Could someone explain the difference between them?

1. ACCESS
2. REFERENCE

In most cases both of them, are equal adn the only differece i could see is the keyword as below;

"utility/bridge.p" 17 "ACCESS" "mas.TERR" "TY-1"
"utility/bridge.p" 12 "REFERENCE" "mas.TERR" "TY-1"
 

rzr

Member
Reference type
Object identifier
ACCESS

{ [ DATA-MEMBER ] [ database. ] table field
[ WORKFILE | TEMPTABLE ] } |
{ SHARED variable } |
{ PUBLIC-DATA-MEMBER class-name:data-member-name } |
{ INHERITED-DATA-MEMBER
class-name:data-member-name } |
{ PUBLIC-PROPERTY
class-name:property-name } |
{ INHERITED-PROPERTY
class-name:property-name } |
{ sequence-name SEQUENCE }
From the help pages:​
Table 15:
Reference types and object identifiers

REFERENCE

{ [ database. ] table [ field ]
[ WORKFILE]} | { SHARED variable |
{ [ DATA-MEMBER | INHERITED-DATA-MEMBER ]
class-name:table [ field ] }
 
I am not sure if we are on the same page. I am referring to the ACCESS and REFERENCE in XREF utility...

"util/brg_ty.p" 17 "ACCESS" "mas.TERR" "TY-ID"
"util/brg_ty.p" 12 "REFERENCE" "mas.TERR" "TY-ID"
"util/brg_ty.p" 20 "REFERENCE" "mas.TERR" ""
"util/brg_ty.p" 17 "SEARCH" "mas.TERR" "TY-1"
"util/brg_pr.p" 17 "ACCESS" "mas.print" "pr-id"
 

TomBascom

Curmudgeon
It's nothing that I've ever looked in to but, looking at your output, I see that the "reference" line number comes before the "access" line number. I would, therefore, hazard a guess that it is telling you what block the element is scoped to.

But I could be wrong. I'm just taking a wild guess.
 
It looks like the output file from an XREf compile. In which case the "ACCESS" means the code is connecting to the database at runtime to "mas.TERR.TY-ID", and "REFERENCE" means it connects to the db at compile time (i.e. Temp-table field define LIKE "mas.TERR.TY-ID") but will run without a db connection.
 

tamhas

ProgressTalk.com Sponsor
One could make this a little less of a guessing game if you posted the corresponding source lines.
 

GregTomkins

Active Member
I believe 'ACCESS' implies that the data was actually used, and 'REFERENCE' implies that the field was referred to in some way but it's data wasn't actually read or updated.

Code:
/* foo.p */
find first mfclac.
disp mfclac.acct. /* i'm actually looking at data */
def var x like mfsc.short_name. /* i'm looking at the field definition, but not the data */

greg/foo.p greg/foo.p 1 COMPILE greg/foo.p
greg/foo.p greg/foo.p 2 ACCESS exc2.mfclac acct
greg/foo.p greg/foo.p 3 REFERENCE exc2sm.mfsc short_name
 

tamhas

ProgressTalk.com Sponsor
Which, really, is reinforcing what Mike said and what I would have thought was the meaning. Gets apparent when one sees a concrete example.
 

GregTomkins

Active Member
I didn't quite get that from his use of the term "connecting", but maybe I'm just being obtuse.

Also, I am doubtful that "will run without a db connection" is true; I am too lazy to check, especially when I know Tom B. will know the answer ;)
 

tamhas

ProgressTalk.com Sponsor
I suspect "will run" is rarely tested since, if one defines a field LIKE a DB field, chances are that one is going to connect to and access that DB field in the near vicinity.

The point is really the difference between a compile-time REFERENCE which at most refers to the schema, not any actual data versus a run-time ACCESS to some specific data in the DB.

Frankly, my own inclination is to think that a REFERENCE is an indicator of bad practice in most cases.
 
...The point is really the difference between a compile-time REFERENCE which at most refers to the schema, not any actual data versus a run-time ACCESS to some specific data in the DB.
...
Yes, this was my point.

And "will run without a db connection" is true, or rather, the COMPILED CODE will run without a db connection. REFERENCE shows up often in our Appserver UI code because we use DEFINE LIKE for some of our temp tables. Now, whether or not that is "best practice", I don't know...
 
Great..

Here is one such example;

Sample.p:
DEFINE VARIABLE ipcType AS CHARACTER NO-UNDO.
DEFINE VARIABLE iocPrinter AS CHARACTER NO-UNDO.
DEFINE VARIABLE lookup-ok AS LOGICAL NO-UNDO.

DEF VAR cPrinter LIKE print.pr-id NO-UNDO.

DEF QUERY qPrinter FOR print.

DEF BROWSE brPrinter QUERY qPrinter
DISPLAY
print.pr-id
print.pr-name
WITH 5 DOWN.

DEF FRAME fPrinter
brPrinter
WITH ROW 2 COL 1 DOWN OVERLAY.

FORM
"SELECT(F1) PREVIOUS(F4)"
WITH FRAME fkPrinter CENTERED ROW 20 NO-BOX NO-LABELS OVERLAY ATTR.

ON F1, GO, ENTER, RETURN OF FRAME fPrinter ANYWHERE DO:
HIDE MESSAGE.
iocPrinter = print.pr-id.
DISABLE brPrinter WITH FRAME fPrinter.
lookup-ok = TRUE.
APPLY "CLOSE" TO THIS-PROCEDURE.
RETURN NO-APPLY.
END.

main:
DO ON ERROR UNDO main, LEAVE main:
cPrinter = iocPrinter.

OPEN QUERY qPrinter
FOR EACH print NO-LOCK
WHERE print.pr-type EQ ipcType
AND print.pr-id BEGINS cPrinter.

VIEW FRAME fkPrinter.
ENABLE brPrinter WITH FRAME fPrinter.
APPLY "ENTRY":U TO brPrinter IN FRAME fPrinter.
WAIT-FOR CLOSE OF THIS-PROCEDURE FOCUS brPrinter IN FRAME fPrinter
PAUSE 150.
END.

CLOSE QUERY qPrinter.
HIDE FRAME fkPrinter.
HIDE FRAME fPrinter.

XREF Detail:
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 1 COMPILE /saravanakumarb/Sample.p
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 1 CPINTERNAL iso8859-1
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 1 CPSTREAM iso8859-1
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 1 STRING "ipcType" 7 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 2 STRING "iocPrinter" 10 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 3 STRING "lookup-ok" 9 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 5 STRING "cPrinter" 8 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 5 REFERENCE systems.print pr-id
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 7 STRING "print" 5 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 9 STRING "brPrinter" 9 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 9 ACCESS systems.print pr-id
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 9 ACCESS systems.print pr-name

/saravanakumarb/Sample.p /saravanakumarb/Sample.p 9 STRING "x(8)" 4 NONE TRANSLATABLE FORMAT
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 9 STRING "X(30)" 5 NONE TRANSLATABLE FORMAT
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 15 STRING "fPrinter" 8 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 19 STRING "fkPrinter" 9 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 19 STRING "SELECT(F1) PREVIOUS(F4)" 24 NONE TRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 25 ACCESS systems.print pr-id
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 28 STRING "CLOSE" 5 NONE TRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 30 STRING "fPrinter" 8 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 36 ACCESS systems.print pr-type
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 36 ACCESS systems.print pr-id
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 36 SEARCH systems.print pr-4
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 36 STRING "pr-4" 4 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 43 STRING "ENTRY" 5 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 50 STRING "qPrinter" 8 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 50 STRING "Printer" 7 NONE TRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 50 STRING "pr-id" 5 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 50 STRING "Description" 11 NONE TRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 50 STRING "pr-name" 7 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 50 STRING "fPrinter" 8 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 50 STRING "pr-4" 4 NONE UNTRANSLATABLE

...The point is really the difference between a compile-time REFERENCE which at most refers to the schema, not any actual data versus a run-time ACCESS to some specific data in the DB.

I agree...
 
Great..

Here is one such example;

Sample.p:
DEFINE VARIABLE ipcType AS CHARACTER NO-UNDO.
DEFINE VARIABLE iocPrinter AS CHARACTER NO-UNDO.
DEFINE VARIABLE lookup-ok AS LOGICAL NO-UNDO.

DEF VAR cPrinter LIKE print.pr-id NO-UNDO.

DEF QUERY qPrinter FOR print.

DEF BROWSE brPrinter QUERY qPrinter
DISPLAY
print.pr-id
print.pr-name
WITH 5 DOWN.

DEF FRAME fPrinter
brPrinter
WITH ROW 2 COL 1 DOWN OVERLAY.

FORM
"SELECT(F1) PREVIOUS(F4)"
WITH FRAME fkPrinter CENTERED ROW 20 NO-BOX NO-LABELS OVERLAY ATTR.

ON F1, GO, ENTER, RETURN OF FRAME fPrinter ANYWHERE DO:
HIDE MESSAGE.
iocPrinter = print.pr-id.
DISABLE brPrinter WITH FRAME fPrinter.
lookup-ok = TRUE.
APPLY "CLOSE" TO THIS-PROCEDURE.
RETURN NO-APPLY.
END.

main:
DO ON ERROR UNDO main, LEAVE main:
cPrinter = iocPrinter.

OPEN QUERY qPrinter
FOR EACH print NO-LOCK
WHERE print.pr-type EQ ipcType
AND print.pr-id BEGINS cPrinter.

VIEW FRAME fkPrinter.
ENABLE brPrinter WITH FRAME fPrinter.
APPLY "ENTRY":U TO brPrinter IN FRAME fPrinter.
WAIT-FOR CLOSE OF THIS-PROCEDURE FOCUS brPrinter IN FRAME fPrinter
PAUSE 150.
END.

CLOSE QUERY qPrinter.
HIDE FRAME fkPrinter.
HIDE FRAME fPrinter.

XREF Detail:
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 1 COMPILE /saravanakumarb/Sample.p
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 1 CPINTERNAL iso8859-1
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 1 CPSTREAM iso8859-1
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 1 STRING "ipcType" 7 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 2 STRING "iocPrinter" 10 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 3 STRING "lookup-ok" 9 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 5 STRING "cPrinter" 8 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 5 REFERENCE systems.print pr-id
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 7 STRING "print" 5 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 9 STRING "brPrinter" 9 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 9 ACCESS systems.print pr-id
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 9 ACCESS systems.print pr-name

/saravanakumarb/Sample.p /saravanakumarb/Sample.p 9 STRING "x(8)" 4 NONE TRANSLATABLE FORMAT
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 9 STRING "X(30)" 5 NONE TRANSLATABLE FORMAT
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 15 STRING "fPrinter" 8 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 19 STRING "fkPrinter" 9 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 19 STRING "SELECT(F1) PREVIOUS(F4)" 24 NONE TRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 25 ACCESS systems.print pr-id
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 28 STRING "CLOSE" 5 NONE TRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 30 STRING "fPrinter" 8 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 36 ACCESS systems.print pr-type
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 36 ACCESS systems.print pr-id
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 36 SEARCH systems.print pr-4
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 36 STRING "pr-4" 4 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 43 STRING "ENTRY" 5 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 50 STRING "qPrinter" 8 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 50 STRING "Printer" 7 NONE TRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 50 STRING "pr-id" 5 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 50 STRING "Description" 11 NONE TRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 50 STRING "pr-name" 7 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 50 STRING "fPrinter" 8 NONE UNTRANSLATABLE
/saravanakumarb/Sample.p /saravanakumarb/Sample.p 50 STRING "pr-4" 4 NONE UNTRANSLATABLE

...The point is really the difference between a compile-time REFERENCE which at most refers to the schema, not any actual data versus a run-time ACCESS to some specific data in the DB.

I agree...
 
Top