PDA

View Full Version : Länge einer DTAARA ermitteln



Seiten : [1] 2

flytokiwi
28-03-06, 10:27
Hallo Forum,

ich muss in einem CL die Länge (nicht den Inhalt) eines Datenbereiches ermitteln. DSPDTAARA und *PRINT (dann die Spool auslesen) finde ich nur Suboptimal. Hat jemand eine Idee wie ich da noch rankomme? DSPOBJD *FULL in eine OUTFILE liefert auch nicht die Länge.

Gruss
Ralph

kuempi von stein
28-03-06, 10:48
hello,

würde mich wundern, wenns dafür nich nen API gibt.

Mal ne Gegenfrage:
Was stört am augenblicklichen Weg (nach *PRINT usw..)?

Und gehts es immer um ne DTAARA in *CHAR oder gibts da auch logische oder welche mit *DEC?

k.

flytokiwi
28-03-06, 11:01
Es sind immer *CHAR.

DSPDTAARA mit *PRINT in OUTFILE stört deshalb, da ich ja abprüfen muss in welcher Zeile/Spalte die Länge steht. Bei Mehrsprachigen Systemen ist das Wort "Länge" nachdem ich mich richten würde übersetzt. Somit müsste ich auch nach allen Kombinationen prüfen.

Gruss
Ralph

Fuerchau
28-03-06, 11:22
Das geht nur per MI:
RSLVSP: Get Systempointer from Objekt
SETSPPFP: Get Spacepointer from Systempointer

In den Stellen 1-3 steht Attribut und Länge des Datenbereiches.

Allerdings geht das nicht bei DDM-Dataareas.

kuempi von stein
28-03-06, 11:29
..Bei Mehrsprachigen Systemen ist das Wort "Länge" nachdem ich mich richten würde übersetzt. Somit müsste ich auch nach allen Kombinationen prüfen.
...

aha...
ist mir nicht ganz klar aber okay.
So eine DTAARA hat ja immer ne maximale Länge. (Bei 5.2 sinds 2000 glaube ich.)
Man könnte alternativ versuchen inner Schleife nacheinander die Stellen von hinten nach vorne auszulesen (resp. ändern) für jedes einzelne *CHAR-Zeichen.
Die CPF die hochkommt wenn man auf ne Position zugreift die es nicht gibt abfangen...
Voila...
Weil die CPF-IDs sind doch auch bei Multilanguage immer gleich?

k.

kuempi von stein
28-03-06, 11:43
Verbesserungsvorschlag:

Um Ressourcen zu sparen, sollte man besser von vorne nach hinten dann lesen. Sonst werden zu viele Fehlermessages produziert.
Also von vorne nach hinten und beim ersten ungültigen Lesen Schleife abbrechen...

k.

flytokiwi
28-03-06, 11:51
Danke für die Ideen.

Ich denke ich mache das in einer Schleife.

Gruss
Ralph

Fuerchau
28-03-06, 12:02
Ich würde da eher das binäre Halbierungsverfahren anwenden. Da eine DTAARA immer noch nur 2000 Bytes lang sein kann, kommt man mit max. 11 Zugriffen hin (2^11=2048).
Bei einer DTAARA mit einer Länge > 11 Zeichen bist du dann sehr viel schneller als über eine sequentielle Schleife.

kuempi von stein
28-03-06, 12:25
Grundsätzlich stimme ich dem zu.
Nur wie programmiert man das halbwegs vernünftig im CL?
Ne Schleife braucht mit DECLARE na sagen wir mal 7 Zeilen oder irgendwie sowas in der Richtung.
Bei ner Binärsuche muss ich doch immer die maxlen und die validlen mitziehen und je nachdem halbieren, zuzählen, entscheiden usw.
Gibts da ne knackige Formel für - umgesetzt in ein paar kurze Statements?

kuempi

Nachtrag:
ok habs mal gerade durchgespielt.
Nen 10-Zeiler oder so bei Binärsuche.... toll was alles so geht.

k.

wwg
04-04-07, 09:01
Der Thread ist zwar schon ein Jahr alt, aber trotzdem:

würde mich wundern, wenns dafür nich nen API gibt.
Das geht nur per MI:
RSLVSP: Get Systempointer from Objekt
SETSPPFP: Get Spacepointer from SystempointerDas API QWCRDTAA liefert nicht nur den Inhalt, sondern auch Type und Länge von Datenbereichen zurück.
Ist allerdings direkt aus CL nicht nutzbar; da muß man schon ein Kurzprogramm zum Aufruf drumsetzen.

Gruß,
Werner.