SELECT
Der PxPLUS Befehl SELECT ist auf
den ersten Blick vielleicht nicht ganz so beeindruckend. Nach einiger Erfahrung
mit SELECT stellt sich heraus, daß man sich eine Vielzahl von
Programmzeilen ersparen kann. Die nachfolgende Routine zeigt die klassische Art,
mit der man mit einem Sekundarschlüssel auf 'Kundennummer' im Rechnungsbestand
(sale) liest. Mit Hilfe der Rechnungsnummer holen wir uns dann die einzelnen
Positionen aus der Datei 'sale_itm'.
0010 rem TT1A
0020 begin
0030 open (1)"sale"
0040 open (2)"sale_item"
0050 input (0,err=0050)'CS',@(10,10),'SB',"Customer number ",'SF',CUST$
0060 gosub GET_INVOICE
0070 goto 0050
1000 GET_INVOICE: ! ^1000 --------------------------------------------
1010 let K$=CUST$
1020 extract (1,key=CUST$,kno=2,dom=1030)iol=1140; goto 1150
Filepointer direkt vor die Rechnung des gewünschten Kunden setzen.
Lesen mit kno=2'
1100 READ_INVOICE: rem ^100
1110 let K$=key(1,end=1180)
1120 if K$(1,5)>CUST$ then goto 1180
Lesen bis Dateiende oder bis zur letzten
Rechnung der von uns gewählten Kundennummer.
1130 read (1)iol=1140
1140 iolist INVOICE$,DATE$,EXPDATE$,CUSTOMER$,TOTAL,NET,TAX,DISCOUNT
1150 print INVOICE$," ",DATE$," ",CUSTOMER$,TOTAL:"###B###B##0.00-"
1160 gosub GET_DETAIL
1170 goto READ_INVOICE
1180 return
2000 GET_DETAIL: rem ^1000 ------------------------------------------
2010 let D$=INVOICE$
2020 extract (2,key=INVOICE$,dom=2030)iol=2140; goto 2150
Filepointer auf die richtige Rechnung setzen.
2100 READ_DETAIL: rem ^100
2110 let D$=key(2,end=2170)
2120 if D$(1,10)>INVOICE$ then goto 2170
Die notwendige Kontrolle damit die richtigen Rechnungspositionen gelesen
werden.
2130 read (2)iol=2140
2140 iolist D_INVOICE$,LINE$,PRODUCT$,D_TOTAL,D_NET,D_TAX,D_DISCOUNT
Sollte 'TOTAL', etc. breits in der ersten IOLIST verwendet sein,
muß jetzt ein anderer Name für die entsprechenden Variablen gewählt werden.
2150 print @(20),PRODUCT$,D_TOTAL:"###B###B##0.00-"
2160 goto READ_DETAIL
2170 return
In der nächsten Routine verwenden wir "SELECT" und die 'embedded iolist'. Diese
Routine hat deutlich weniger Programmzeilen. Viele Programmzeilen aus der
vorherigen Routine sind jetzt überflüssig geworden. Es gibt keine lästigen
IF..THEN' und GOTO' mehr. Wir brauchen auch am Anfang keine Dateien zu
öffnen.
0010 rem TT1B
0020 begin
0030 !
0040 !
0050 input (0,err=0050)'CS',@(10,10),'SB',"Customer number ",'SF',CUST$
0060 gosub GET_INVOICE
0070 goto 0050
1000 GET_INVOICE: ! ^1000 --------------------------------------------
1010 !
1020 !
1100 ! ^100
1110 !
1120 !
1130 select * from "sale",kno=2 begin CUST$ end CUST$+$FF$
Achten Sie, wie wir mit Hilfe der Alternativ-Schlüssel
Zugriff auf die Rechnungsdatei haben.
1140 !
1150 print INVOICE$," ",DATE$," ",CUSTOMER$,TOTAL:"###B###B##0.00-"
1160 gosub GET_DETAIL
1170 next record
1180 return
2000 GET_DETAIL: rem ^1000 ------------------------------------------
2010 !
2020 !
2100 ! ^100
2110 !
2120 !
2130 select *,rec=D$ from "sale_item" begin INVOICE$ end INVOICE$+$FF$
Um gleichnamigen Variablen zu vermeiden wird der prefix ,rec=D$' gesetzt'
2140 !
2150 print @(20),D.PRODUCT$,D.TOTAL:"###B###B##0.00-"
2160 next record
2170 return
Weitere Empfehlungen für SELECT sind:
SELECT A$,B$,C$ FROM "filename"
Selektieren mit Variablen anstelle embedded iolist.
SELECT iol=500 FROM "filename"
Selektieren mit einer IOLIST
SELECT * FROM 1
Selektieren einer bereits geöffneten Datei auf Kanal 1
SELECT * FROM "company" WHERE ( lang$="1" and ZIP$>"B")
Datensätze selekti lesen. Felder ohne Schlüssel mit WHERE selektieren.
X$="lang$="+quo+"1"+quo
SELECT * FROM "company" WHERE EVN(X$)
Datensätze selekti lesen. Selektieren mit der Funktion EVN()
Mit 'EXITTO' unterbrechen wir eine SELECT ... NEXT RECORD routine.
Beispiel:
Um einen Kunden löschen zu wollen, sollten wir
zuerst prüfen ob noch Datensätze im Rechnungsbestand vorhanden sind. Der
Löschvorgang wird sofort unterbrochen sobald nur ein Datensatz gefunden wird.
SELECT * FROM "sale",kno=2 BEGIN cust$ END cust$+$FF$
PRINT "Kunde darf nicht gelöscht werden"
EXITTO NICHT_LÖSCHEN
NEXT RECORD
LÖSCHEN:
mit K$=KEC(LFO)
, erhält man den Schlüssel der gerade mit SELECT gelesen wurde.
|