2016-10-31 1 views
0

je fais souvent le code 4GL de progression suivanteProgress 4GL pour chaque et sélectionnez * de Cust

output to /OUTText.txt. 
    def var dRow as char. 
    dRow = "cmpid|CustNum|Cur". 
    put unformatted dRow skip. 
    for each Cust no-lock: 
    dRow = subst("&1|&2|&3", Cust.CmpId, Cust.CustNum, Cust.Curr). 
    put unformatted dRow skip.  
    end. 
    output close. 

afin de mimer

select * from cust (in MS SQL) 

ma question est est-il un moyen de faire ce bloc de code, même ressemblance étroite "sélectionnez *" en utilisant 4GL. De sorte que je n'ai pas à taper chaque nom de colonne et il imprimera toutes les valeurs dans toutes les colonnes. ma pensée est. quelque chose comme ça.

output to /OUTText.txt. 
    def var dRow as char. 
    dRow = "cmpid|CustNum|Cur". 
    put unformatted dRow skip. 
    for each Cust no-lock: 
    if row = 1 then do: 
     for each Column in Cust: 
     **'PRINT THE COLUMN HEADER** 
     end. 
    end. 
    else do: 
     **'PRINT EACH CELL** 
    end. 
    end. 
    output close. 

S'il existe une telle chose. alors je ne dois pas garder le nom de colonne explicite dans dRow.

Répondre

1
output to "somefile". 

for each customer no-lock: 
    display customer. 
end. 

Je ne mentionnerais pas en général ce que le SQL-89 intégré dans le L4G est la route de l'enfer (ce dialecte de SQL ne fonctionne que pour les plus élémentaires et triviales des fins et vraiment ne devrait pas être utilisé du tout dans le code de production), mais comme il arrive:

output to "somefile". 
select * from customer. 

ne se produit juste pour travailler à la spécification de la question initiale (bien que, comme la solution d'affichage, il ne supporte pas delimiter ...)

+0

Puis-je utiliser un délimiteur? comme un tuyau ou un délimiteur de virgule? – BobNoobGuy

+1

Pas avec DISPLAY. EXPORT prend en charge un délimiteur, mais vous perdrez les en-têtes. –

1

Vous pouvez faire ce que vous cherchez après avoir d'abord sorti toutes les étiquettes de champs (ou noms), puis utilisez EXPORT pour sortir le contenu de la table.

Pour modifier le nom du destinataire à la place de l'étiquette: le changement :LABEL ci-dessous pour :NAME

Par exemple:

DEFINE VARIABLE i AS INTEGER  NO-UNDO. 

OUTPUT TO c:\temp\somefile.txt. 

DO i = 1 TO BUFFER Customer:NUM-FIELDS. 

    PUT QUOTER(BUFFER Customer:BUFFER-FIELD(i):LABEL). 

    IF i < BUFFER Customer:NUM-FIELDS THEN 
     PUT UNFORMATTED ";". 
    ELSE IF i = BUFFER Customer:NUM-FIELDS THEN 
     PUT SKIP. 

END. 

FOR EACH Customer NO-LOCK: 
    EXPORT DELIMITER ";" Customer. 
END. 
OUTPUT CLOSE. 

Vous pouvez mettre la partie en-tête dans un programme distinct pour appeler dynamiquement chaque fois que vous voulez faire quelque chose de similaire:

DEFINE STREAM str. 

OUTPUT STREAM str TO c:\temp\somefile.txt. 

RUN putHeaders.p(INPUT BUFFER Customer:HANDLE, INPUT ";", INPUT STREAM str:HANDLE). 

FOR EACH Customer NO-LOCK: 
    EXPORT STREAM str DELIMITER ";" Customer. 
END. 
OUTPUT STREAM str CLOSE. 


putHeaders.p 
============ 
DEFINE INPUT PARAMETER phBufferHandle AS HANDLE  NO-UNDO. 
DEFINE INPUT PARAMETER pcDelimiter AS CHARACTER NO-UNDO. 
DEFINE INPUT PARAMETER phStreamHandle AS HANDLE  NO-UNDO. 

DEFINE VARIABLE i AS INTEGER  NO-UNDO. 

DO i = 1 TO phBufferHandle:NUM-FIELDS. 
    PUT STREAM-HANDLE phStreamHandle UNFORMATTED QUOTER(phBufferHandle:BUFFER-FIELD(i):LABEL). 

    IF i < phBufferHandle:NUM-FIELDS THEN 
     PUT STREAM-HANDLE phStreamHandle UNFORMATTED pcDelimiter. 
    ELSE IF i = phBufferHandle:NUM-FIELDS THEN 
     PUT STREAM-HANDLE phStreamHandle SKIP. 
END.