Ich habe das seiner Zeit ohne Pointer und Masochismus einfach mit einem SQL-RPGLE gelöst.

Ob das elegant ist - keine Ahnung. War aber zielführend, nicht teuer, und hatte funktioniert

Für jedes Feld der zu untersuchenden Datei ...
Code:
SELECT CAST(COLUMN_TEXT AS CHARACTER (50) ccsid 273),       
 SYSTEM_COLUMN_NAME, 
 SYSTEM_TABLE_NAME 
 FROM QSYS2/SYSCOLUMNS
 WHERE             
 SYSTEM_TABLE_NAME = 'DeineTabelle' AND       
 SYSTEM_TABLE_SCHEMA = 'DeineLib'

... ein SQL-Vergleich auf Feldunterschiede durchführen
Code:
SELECT

CASE WHEN
%trim(p$Datei1) + '.' +
%trim(p$Feld) + ' <> ' +   
%trim(p$Datei2) + '.' +      
%trim(p$Feld) + ' THEN ' +
p$Feld                        
ELSE ' ' END            
... n mal für jedes Feld ...

FROM p$Datei1
LEFT OUTER JOIN p$Datei2 ON ...
WHERE ...
... anschließend Fetch into dieses SQL in eine interne DS (hier sqlsatz)
Code:
d sqlsatz         ds              
d   sq001                       70
d   sq002                       70
...
d   sq250                       70

d sqlsatzx        ds                          
d   sqxxx                       70    dim(250)

...
c+ FETCH NEXT FROM xyz into :sqlsatz
...
c                   move      sqlsatz       sqlsatzx
Die Felder mit Datenänderung stehen dann als Feldname jeweils in einem Element von sqxxx.
Also alles lesen wo sqxxx(p$Counter) <> *blanks ist und ggf. für die Subfileanzeige mit SQL die Vorher/Nachher Werte dieses speziellen Feldes ermitteln.