2016-04-26 1 views
2

Je suis assez nouveau à ABL (et je suis français s'il vous plaît excusez mon anglais) donc j'ai besoin de votre aide. Je voudrais savoir comment utiliser un BREAK BY dans une requête ouverte.Progression ABL: BREAK BY Avec plusieurs jointures dans une requête ouverte

Voici ce que je fais:

define query Q-REQ for 
ENT_RCP_FRN, 
LIG_RCP_FRN, 
CONSO_UNV_MDIM, 
LIG_DOC_TRS, 
ENT_DOC_TRS scrolling. 

open query Q-REQ for 
each ENT_RCP_FRN no-lock 
    where ENT_RCP_FRN.STO-c-CodeDes = "DRET", 
each LIG_RCP_FRN no-lock break by LIG_RCP_FRN.SKU-c-cod 
    where LIG_RCP_FRN.SOU-c-Cod = ENT_RCP_FRN.SOU-c-Cod 
    and LIG_RCP_FRN.ERF-c-NumRcpFrn = ENT_RCP_FRN.ERF-c-NumRcpFrn, 
each CONSO_UNV_MDIM no-lock 
    where CONSO_UNV_MDIM.UMA-c-Code = "8B6A9/0001354" 
    and CUMD-c-LstCleCumConso = LIG_RCP_FRN.SKU-c-cod, 
each LIG_DOC_TRS no-lock LEFT OUTER-JOIN 
    where LIG_DOC_TRS.SKU-c-Cod = LIG_RCP_FRN.SKU-c-Cod, 
each ENT_DOC_TRS no-lock left outer-join 
    where ENT_DOC_TRS.SOU-c-Cod = LIG_DOC_TRS.SOU-c-Cod 
    and ENT_DOC_TRS.EDT-c-NumDocTrs = LIG_DOC_TRS.EDT-c-NumDocTrs 
    and ENT_DOC_TRS.TR-c-CodeCatDoc = "BT" 
    and ENT_DOC_TRS.STO-c-CodeOri = "DRET" 
    and ENT_DOC_TRS.STO-c-CodeDes = "DWHO". 


repeat : 

    get next Q-REQ. 
    if not available ENT_RCP_FRN then leave. 


end. 

je reçois une erreur dans la déclaration suivante:

each LIG_RCP_FRN no-lock break by LIG_RCP_FRN.SKU-c-cod 
    where LIG_RCP_FRN.SOU-c-Cod = ENT_RCP_FRN.SOU-c-Cod 
    and LIG_RCP_FRN.ERF-c-NumRcpFrn = ENT_RCP_FRN.ERF-c-NumRcpFrn, 

Impossible de comprendre après: "LIG_RCP_FRN.SKU-c-morue" (mon erreur est en français, mais c'est l'erreur 247):

247 ** L'expression après: "LIG_RCP_FRN.SKU-c-cod" est incompréhensible. (247)

Ce que je voudrais faire est de pouvoir additionner une colonne de la table LIG_RCP_FRN, en cassant quand la SKU-c-Cod change.

J'ai essayé de supprimer chaque instruction après cette erreur, mais cela n'a pas fonctionné non plus.

S'il vous plaît demander si vous avez besoin de plus d'informations. OpenEdge 10.2A progrès

Merci pour votre aide, Corentin

PS: impossible de dire "Salut" dans un poste ??

+0

Selon le manuel (bien v9.1) - vous ca n ordonner une requête en utilisant "BY" dans une requête ouverte, mais vous ne pouvez pas utiliser de pause. Vous devez utiliser une boucle FOR EACH si vous voulez utiliser "BREAK BY". – Screwtape

+0

@Screwtape Ce n'est pas correct, du moins pas dans les versions ultérieures. – Jensd

+1

C'est bon alors. Je ne peux pas tester au-delà de la v9 pour le moment.Dans un pour chaque le manuel implique que le BREAK BY devrait être après toutes les phrases d'enregistrement, alors peut-être juste le déplacer à la fin de la requête fonctionnera dans OE10? Juste une supposition. – Screwtape

Répondre

4

C'est une erreur très simple. Vous devez mettre l'option "BREAK BY" à la toute fin de la requête.

De plus, il est très agréable de publier une définition de table temporaire (qui pourrait être fausse) qui facilite le copier-coller.

J'ai improvisé quelques tables dans le code ci-dessous en fonction de la requête, elles ne sont là que pour compiler le code.

La méthode FIRST-OF appelée sur la demande de recherche fonctionne comme suit:

requête: PREMIERE DE (niveau)

index

: Expression d'entier qui indique une pause en groupe, où 0 est l'ensemble de query, 1 est le premier BREAK BY, 2 est le deuxième BREAK BY, et ainsi de suite.

Si vous avez BREAK BY fieldA BY fieldB puis

query:FIRST-OF(1) concerne BREAK BY fieldA et

query:FIRST-OF(2) concerne BREAK BY fieldB

Il y a aussi LAST-OF(n)

/* Completely fake temp-tables that are here only to make the query work! */ 
DEFINE TEMP-TABLE ENT_RCP_FRN NO-UNDO 
    FIELD STO-c-CodeDes AS CHARACTER 
    FIELD SOU-c-Cod  AS INTEGER 
    FIELD ERF-c-NumRcpFrn AS INTEGER. 

DEFINE TEMP-TABLE LIG_RCP_FRN NO-UNDO 
    FIELD SOU-c-Cod  AS INTEGER 
    FIELD ERF-c-NumRcpFrn AS INTEGER 
    FIELD SKU-c-cod  AS INTEGER. 

DEFINE TEMP-TABLE CONSO_UNV_MDIM NO-UNDO 
    FIELD UMA-c-Code   AS CHARACTER 
    FIELD CUMD-c-LstCleCumConso AS INTEGER. 

DEFINE TEMP-TABLE LIG_DOC_TRS NO-UNDO 
    FIELD SKU-c-Cod  AS INTEGER 
    FIELD SOU-c-Cod  AS INTEGER 
    FIELD EDT-c-NumDocTrs AS INTEGER. 

DEFINE TEMP-TABLE ENT_DOC_TRS NO-UNDO 
    FIELD SOU-c-Cod  AS INTEGER 
    FIELD EDT-c-NumDocTrs AS INTEGER 
    FIELD TR-c-CodeCatDoc AS CHARACTER 
    FIELD STO-c-CodeOri AS CHARACTER 
    FIELD STO-c-CodeDes AS CHARACTER. 


DEFINE QUERY Q-REQ FOR ENT_RCP_FRN, LIG_RCP_FRN, CONSO_UNV_MDIM, LIG_DOC_TRS, ENT_DOC_TRS SCROLLING. 

OPEN QUERY Q-REQ FOR EACH ENT_RCP_FRN NO-LOCK WHERE ENT_RCP_FRN.STO-c-CodeDes = "DRET", 
    EACH LIG_RCP_FRN NO-LOCK WHERE LIG_RCP_FRN.SOU-c-Cod = ENT_RCP_FRN.SOU-c-Cod 
           AND LIG_RCP_FRN.ERF-c-NumRcpFrn = ENT_RCP_FRN.ERF-c-NumRcpFrn, 
    EACH CONSO_UNV_MDIM NO-LOCK WHERE CONSO_UNV_MDIM.UMA-c-Code = "8B6A9/0001354" 
           AND CUMD-c-LstCleCumConso = LIG_RCP_FRN.SKU-c-cod, 
    EACH LIG_DOC_TRS NO-LOCK LEFT OUTER-JOIN WHERE LIG_DOC_TRS.SKU-c-Cod = LIG_RCP_FRN.SKU-c-Cod, 
    EACH ENT_DOC_TRS NO-LOCK LEFT OUTER-JOIN WHERE ENT_DOC_TRS.SOU-c-Cod = LIG_DOC_TRS.SOU-c-Cod 
               AND ENT_DOC_TRS.EDT-c-NumDocTrs = LIG_DOC_TRS.EDT-c-NumDocTrs 
               AND ENT_DOC_TRS.TR-c-CodeCatDoc = "BT" 
               AND ENT_DOC_TRS.STO-c-CodeOri = "DRET" 
               AND ENT_DOC_TRS.STO-c-CodeDes = "DWHO" BREAK BY LIG_RCP_FRN.SKU-c-cod. 


REPEAT: 

    GET NEXT Q-REQ. 
    IF NOT AVAILABLE ENT_RCP_FRN THEN LEAVE. 

    IF QUERY q-req:FIRST-OF(1) THEN DO: 
     DISPLAY "First!". 
    END. 

END. 
+0

Salut, Merci pour votre réponse. Je cours des tests. Je ne rencontre plus d'erreurs, mais le résultat n'est pas ce que j'attends. Je vous tiendrai au courant. – Corentin

+0

@Corentin Si vous avez besoin de plus d'aide, vous devez décrire ce que vous enregistrez et afficher plus de code! – Jensd