progress-4gl
Requêtes
Recherche…
Introduction
Les exemples seront basés sur une copie de la base de données de démonstration Sports 2000
fournie avec la configuration de Progress.
Lorsque vous travaillez avec des requêtes en cours, vous devez:
DEFINE
la requête et définir les tampons (tables) et les champs sur lesquels elle fonctionne.
OPEN
la requête avec une WHERE
spécifique qui définit comment récupérer les enregistrements. Peut-être aussi trier ( BY
/ BREAK BY
)
GET
les données réelles - qui peuvent être FIRST
, NEXT
, PREV
(pour précédent) ou LAST
correspondant.
Syntaxe
- DEFINE QUERY nom-requête FOR nom-tampon. // Définition générale de la requête pour un tampon
- DEFINE QUERY nom-requête FOR nom-tampon1, nom-tampon2. // Rejoindre deux tampons
- DEFINE QUERY nom-requête FOR nom-tampon FIELDS (champ1 champ2). // Ne récupère que field1 et field2
- DEFINE QUERY nom-requête FOR nom-tampon EXCEPT (field3). // Récupère tous les champs sauf field3.
Requête de base
/* Define a query named q1 for the Customer table */
DEFINE QUERY q1 FOR Customer.
/* Open the query for all Customer records where the state is "tx" */
OPEN QUERY q1 FOR EACH Customer WHERE Customer.state ='TX'.
/* Get the first result of query q1 */
GET FIRST q1.
/* Repeat as long as query q1 has a result */
DO WHILE NOT QUERY-OFF-END('q1'):
/* Display Customer.Name in a frame called frame1 with 10 rows */
DISPLAY Customer.Name WITH FRAME frame1 10 DOWN.
/* Move down the target line where to display the next record */
DOWN WITH FRAME frame1.
/* Get the next result of query q1 */
GET NEXT q1.
END.
/* Display how many results query q1 had. */
DISPLAY NUM-RESULTS('q1') LABEL "Number of records".
/* Close the query */
CLOSE QUERY q1.
Sortie (troisième écran sous Windows gui):
Requête multi-tables
Cette requête joint trois tables: Client, Commande et Ligne de commande.
L'utilisation de l'instruction OF
comme dans childtable OF parenttable
suppose que les index sont construits de manière spécifique. C'est le cas dans la base de données sports2000.
DEFINE QUERY q1 FOR Customer, Order, Orderline.
OPEN QUERY q1 FOR EACH Customer WHERE Customer.state = 'TX'
, EACH Order OF customer WHERE order.custnum < 1000
, EACH orderline OF order.
GET FIRST q1.
DO WHILE NOT QUERY-OFF-END('q1'):
DISPLAY Customer.Name Order.OrderNum OrderLine.LineNum
WITH FRAME frameA 20 DOWN.
DOWN WITH FRAME frameA.
GET NEXT q1.
END.
CLOSE QUERY q1.
Résultat: dans l'interface graphique de Windows:
Déplacement d'une empreinte avec une requête utilisant next, first, prev et last
DEFINE QUERY q1 FOR Customer.
OPEN QUERY q1 FOR EACH Customer.
GET FIRST q1.
loop:
REPEAT:
IF AVAILABLE Customer THEN DO:
DISPLAY Customer.NAME CustNum WITH FRAME frClient TITLE "Client data".
DISPLAY
"(P)revious" SKIP
"(N)ext" SKIP
"(F)irst" SKIP
"(L)ast" SKIP
"(Q)uit" SKIP
WITH FRAME frInstr
TITLE "Instructions".
END.
READKEY.
IF LASTKEY = ASC("q") THEN LEAVE loop.
ELSE IF LASTKEY = ASC("n") THEN
GET NEXT q1.
ELSE IF LASTKEY = ASC("p") THEN
GET PREV q1.
ELSE IF LASTKEY = ASC("l") THEN
GET LAST q1.
ELSE IF LASTKEY = ASC("f") THEN
GET FIRST q1.
END.
MESSAGE "Bye" VIEW-AS ALERT-BOX.