View Full Version : Display Attribute Hex
Das betrifft das erhalten der Cursor-Position, aber nicht das Setzen !
Beim Setzen des Cursors muss man immer noch Zeile/Spalte angeben (oder DSPATR(PC)).
Schön wäre es, auch hier einen Feldnamen anzugeben.
Aber es geht doch.(Aber ohne Namen)
INFDS Stelle 370-371 B 0 #CURSOR
Eine DS
#C_LINE 1 3 0
#C_POS 4 6 0
Direkt nach EXFMT
folgender Code
#CURSOR DIV 256 #C_LINE
MVR #C_POS
Damit bekommst Du die Cursoposition NACH Datenfreigabe, Jetzt die Felder retten und bei einem Fehler wieder setzen (Felder Zeile/Spalte)
INFDS Stelle 370-371 B 0 #CURSOR
Eine DS
#C_LINE 1 3 0
#C_POS 4 6 0
Direkt nach EXFMT
folgender Code
#CURSOR DIV 256 #C_LINE
MVR #C_POS
Warum definierst Du ein 2-Stelliges Feld Binär und dividierst dann durch 256 und ermittelst den Rest?
Wenn Du statt dessen Stelle 370 (Zeile) als Integer definierst und Stelle 371 (Spalte) ebenfalls als Integer kannst Du Dir die ganze Recherei sparen!
D SAVINF DS
D DDSFKY 369 369
D DDSRow 370 370I 0
D DDSCol 371 371I 0
*------------------------------------------------
/Free
Select;
When DDSFky = F04 and BSFeld = 'FELD1';
//Aufruf Matchcode
CsrRow = DDSRow;
CsrCol = DDSCol;
EndSL;
/End-Free
Den Cursor wieder auf die gleiche Position zu setzen ist einfach. Schwierig wird es, wenn man, z.B. im Fehler-Fall den Cursor auf ein bestimmtes Feld positionieren will. Dann hilft die Datei-Status-Datenstruktur nicht weiter. Dann hilft nur noch das API QDFRTVFD (wie Baldur bereits vorgeschlagen hat).
Unter dem folgenden Link ist übrigens eine Prozedur zu finden, in dem die Zeile und Spalte für ein beliebiges Feld über das API QDFRTVFD ermittelt wird:
ILE Procedure for using Display File API's (http://www.as400pro.com/servlet/sql.tipView?key=177&category=RPG)
Birgitta
Warum definierst Du ein 2-Stelliges Feld Binär und dividierst dann durch 256 und ermittelst den Rest?
Wenn Du statt dessen Stelle 370 (Zeile) als Integer definierst und Stelle 371 (Spalte) ebenfalls als Integer kannst Du Dir die ganze Recherei sparen!
D SAVINF DS
D DDSFKY 369 369
D DDSRow 370 370I 0
D DDSCol 371 371I 0
*------------------------------------------------
/Free
Select;
When DDSFky = F04 and BSFeld = 'FELD1';
//Aufruf Matchcode
CsrRow = DDSRow;
CsrCol = DDSCol;
EndSL;
/End-FreeDen Cursor wieder auf die gleiche Position zu setzen ist einfach. Schwierig wird es, wenn man, z.B. im Fehler-Fall den Cursor auf ein bestimmtes Feld positionieren will. Dann hilft die Datei-Status-Datenstruktur nicht weiter. Dann hilft nur noch das API QDFRTVFD (wie Baldur bereits vorgeschlagen hat).
Unter dem folgenden Link ist übrigens eine Prozedur zu finden, in dem die Zeile und Spalte für ein beliebiges Feld über das API QDFRTVFD ermittelt wird:
ILE Procedure for using Display File API's (http://www.as400pro.com/servlet/sql.tipView?key=177&category=RPG)
Birgitta
Hallo Birgitta,
natürlich hast Recht, aber dieser Code stammt irgendwann aus den 90ern und wurde nicht angepasst.
mfg
Also alle die sich hier ins Zeug geworfen haben einen herzlichen Dank.
Ich werde das mal mit dem API probieren
Also das mit dem API hat super funktioniert.
Jetzt habe ich aber noch eine Frage bezüglich dieses APIs
Ich bin absolut unerfahren was APIs anbelangt. Wie sicher kann man sein wenn ich das jetzt in künftige Programme einbaue daß die nach einem Releasewechsel noch so laufen wie sie sollen. Also könnte es vorkommen das dieses API nur noch bis zu einem bestimmten Release läuft und dann nicht mehr.
Oder es gibt doch auch so was wie einen Sicherheitslevel bis zu welchem manche APIs laufen und ab welchem nicht mehr.
Naja wäre gut wenn mir da jemand was dazu sagen könnte in Bezug auf dieses API (QDFRTVFD)
Bisher ist mir bezüglich API's nichts aufgefallen.
Das einzige API, dass u.U. mal nicht kompatibel war, ist das Spool-API, da hier eine Varibale von 2-byte-binär (seit V2) auf 4-byte-binär (ab V5) erweitert wurde (Spool-Nbr).
Neuere API's sind von IBM da etwas großzügiger konzipiert.
Tja, und ansonsten wird man bei den Release-Notes (ggf.) darauf hingewiesen.
Hallo,
IBM hat das folgende Statement angegeben:
1. Werden in APIs zusätzliche Parameter hinzugefügt, geschieht dies am Ende der Parameter-Liste als optionale Parameter.
2. Werden in Datenstrukuren zusätzliche Felder benötigt, werden diese ans Ende der Datenstruktur angefügt.
3. Passen neue Felder zu keinem der bestehenden Formate, wird ein zusätzliches Format erstellt.
Compatibility with future releases (http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=/apiref/aboutapis.htm)
Birgitta
Also ich habe die von Birgitta vorgeschlagene Procedur mit dem API verwendet. Läuft "eigentlich" alles.
Allerdings habe ich jetzt das Problem das meine Bildschirmdatei so groß ist das die 65535 Stellen der RCVVAR-Variablen nicht mehr ausreichen.
Gibts eine Möglichkeit die Variable noch größer zu machen oder habe ich bei dem Api die Möglichkeit nur die Felder eines Formats zu ermitteln ?
Um dieses Problem zu umgehen hab ich mir gedacht vielleicht einfach selbst zu Beginn des Programms einen DSPFFD auszuführen. Da gibts aber auch einen Haken. Während die Anzeige die Zeile und Spalte eines Feldes liefert, werden diese bei *OUTFILE nicht mehr zur Verfügung gestellt.
Da kann man doch wohl mal wieder sagen IRGENDWAS IST IMMER :mad:
Naja hoffentlich hat jemand ne Lösung.
Vielen Dank für Eure Mühe
kuempi von stein
17-04-07, 10:10
.....
Um dieses Problem zu umgehen hab ich mir gedacht vielleicht einfach selbst zu Beginn des Programms einen DSPFFD auszuführen. Da gibts aber auch einen Haken. Während die Anzeige die Zeile und Spalte eines Feldes liefert, werden diese bei *OUTFILE nicht mehr zur Verfügung gestellt.
....
Hello,
bist Du sicher?
Bei mir klappt das.
kuempi
Yep bin ich mir sicher. Während die Anzeige des DSPFFD die Zeile und Spalte anzeigt werden diese beim DSPFFD *OUTFILE nicht geliefert.
An welcher Stelle der Datei stehen die Werte. Also nach bzw. vor welchem Feld stehen die Informationen ?