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):

entrer la description de l'image ici

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:

entrer la description de l'image ici

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.


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow