PDA

View Full Version : Newbie: Fragen zu programm..



LoCal
08-10-02, 11:41
Das programm hatte ich ja schon im Klist-Thread es "läuft" zwar, wirft verursacht bei mir aber einiges Stirnrunzeln.
Hier erstmal der code



FFEAADAX2IF E K DISK UC
FGBCLRG00O E DISK
C OPEN FEAADAX2
C *ENTRY PLIST
C PARM FIRM 30
C PARM NDRL 3
C PARM VDAT 60
C PARM BDAT 60
C EXSR VOR
C EXSR KGEN
C AYB SETLLFEAADAX2 41
C AYB READEFEAADAX2 50
C N50 *IN26 DOUEQ*ON
C READ FEAADAX2 26
C *IN26 IFEQ *ON
C AAAA01 ORNE FIRM
C LEAVE
C ENDIF
C AAAA02 IFEQ NDRL
C AAC031 ANDNE*BLANKS
C DO
C AAC015 IFGE VDAT
C AAC015 ANDLEBDAT
C DO
C EXSR FOO
C WRITEGBCLRGR
C ENDDO
C ENDIF
C ENDDO
C ENDIF
C ENDDO
C MOVE *ON *INLR
C CLOSE*ALL


vdat und bdat sind datumsfelder. in der datenbank sind sie in der form jjmmtt und ich übergebe sie mit z.b. 011224 (heilig abend 2001 benutzte ich im eigentlich aufruf natrülich nicht! is nur ein beispiel). wenn ich für vdat 011201 und für bdat 011231 angebe müssten ja nur die dazwischenliegenden tage ausgewertet werden... nur irgendwie werden alle daten ausgegeben.
und ein weiteres problem ist die laufzeit...das programm braucht EWIG.. mit SQL dauert die gleiche abfrage sekunden... ich solls aber mit rpg lösen http://www.as400-forum.de/ubb/frown.gif

Im voraus schonmal danke für die hilfe.

Peace,

LoCal

^Hawkmoon
08-10-02, 12:35
Mh.. als allererstes ist der Key interessant.

Die Auswahlsbezugszahl bei DOU ist schonmal schlecht, dazu kommt noch die SETTL, READE Zugriff (Mit einem Chain bist du dabei)

Wenn ich noch den Schlüssel der Datei hab, dann ist das kein Thema. Ist wahrscheinlich recht einfach.. Geht nebenbei auch ohne Leave, der macht das ganze nur fehleranfälliger.

Es sind auch noch ein paar Fehler drin:
1. Nach dem Beginn der ersten DOU Schleife der Read, damit liest er erst den 2. Satz.... Der erste ist also nicht dabei...

2. Es gibt 2 DO Schleifen.. wo zum Geier verlässt er die?

Ein ähnlicher Code würde bei mir so aussehen:
C AYB CHAINFEAADAX2 50
C *IN50 DOWEQ*OFF
C AAAA01 ANDEQFIRM
*
C AAAA02 IFEQ NDRL
C AAC031 ANDNE*BLANKS
C AAC015 DOWGEVDAT
C AAC015 ANDLEBDAT
C EXSR F00
C WRITEGBCLRGR
C ENDDO
C ENDIF
*
C ????? AYB READEFEADAX2 50
C ENDDO

Wenn man den Key noch kennen würde, dann könnte man gleich wissen, ob das ganze in der ersten Schleife noch weiter zu optimieren ist...

Grüsse Marcus

LoCal
08-10-02, 12:40
Die keys sind aaaa01, aaaa02 und aac015. Das mit dem fehlenden ersten read is mir eingefallen als ich dein post gelesen hab http://www.as400-forum.de/ubb/smile.gif
Was mich trotzdem wundert is, daß das max und das min Datum nicht beachtet werden..

^Hawkmoon
08-10-02, 13:09
Na dann..

Benutze die Vorteile der AS/400... Wieso IF, wenn du es durch die Lese-Struktur gleich ausschliessen kannst:

VONKEY KLIST
KFLD FIRM
KFLD NDRL
KFLD VDAT

READKY KLIST
KFLD FIRM
KFLD NDRL

VONKEY SETLLFEADAX2
READKY READEFEADAX2 50
*IN50 DOWEQ*OFF
AAC015 ANDLEBDAT
EXSR F00
WRITEGBCLRGR
READKY READEFEADAX2 50
ENDDO

Damit wäre dein ganzer Lesezyklus drin.
Du verarbeitest über die direkten Key-Zugriffe nur die Daten, die du auch wirklich haben willst. Sparst dir also die IF´s, den Leave usw.

Die Geschichte mit allen Daten kann 2 Gründe haben:
Sind das wirklich Datumsfelder (d. H. in der DDS mit L und DATFMT(*ISO oder was auch immer)) definiert? Oder einfach 6 Stellen numerische Felder?

1. Bei Datumsfeldern solltest du darauf achten, dass in den H-Specs das richtige Datumsformat verwendet wird. Da ich aber nicht davon ausgehe, dass das so gehandelt ist, siehe 2.

2. Datum richtig gedreht? Denn dein eingehendes Datum ist ja in der Form TTMMJJ, aber dein Lesezugriff soll ja mit JJMMTT stattfinden. Geht am schnellsten über 1 DS mit 10 Stellen numerisch.

Am besten einfach mal im Debugger nachschauen. Und vielleicht nicht mit dem Datum 011201 arbeiten, da man dort kaum sieht, dass es gedreht wurde... *grins*

Grüsse Marcus