COMPRESS

  COMPRESS [NUMERIC] [FULL]
 

operand1 [(parameter)]
SUBSTRING (operand1,operand3,operand4) [(parameter)]
 
  INTO operand2

 
SUBSTRING (operand2,operand5,operand6)
 
  LEAVING [SPACE]  
LEAVING NO [SPACE]  
WITH [ALL] [DELIMITERS] [operand7]  

Dieses Dokument behandelt folgende Themen:

Eine Erläuterung der in dem Syntax-Diagramm verwendeten Symbole entnehmen Sie dem Abschnitt Syntax-Symbole.

Verwandte Statements: ASSIGN | COMPUTE | EXAMINE | MOVE | MOVE ALL | SEPARATE

Gehört zur Funktionsgruppe: Arithmetische Funktionen und Datenzuweisungen


Funktion

Das Statement COMPRESS dient dazu, den Inhalt eines oder mehrerer Operanden in ein einziges alphanumerisches Feld zu übertragen.

Syntax-Beschreibung

Operanden-Definitionstabelle:

Operand Mögliche Struktur Mögliche Formate Referenzierung erlaubt Dynam. Definition
operand1 C S A G N A U N P I F B D T     G O ja nein
operand2   S       A U         B             ja ja
operand3 C S           N P I   B*             ja nein
operand4 C S           N P I   B*             ja nein
operand5 C S           N P I   B*             ja nein
operand6 C S           N P I   B*             ja nein
operand7 C S       A U         B             ja nein

* Format B von operand3, operand4, operand5 und operand6 kann nur mit einer Länge von kleiner oder gleich 4 benutzt werden.

Syntax-Element-Beschreibung:

Syntax-Element Beschreibung
NUMERIC
Behandlung von Vor- und Dezimalzeichen:

Diese Option bestimmt, wie Vorzeichen und Dezimalzeichen behandelt werden:

Ohne NUMERIC werden Dezimalkommas und Vorzeichen bei numerischen Ursprungswerten unterdrückt, bevor die Werte in das Zielfeld übertragen werden. Zum Beispiel:

COMPRESS -123  1.23 INTO #TARGET WITH DELIMITER '*'
Content of #TARGET is: 123*123

Mit NUMERIC werden Dezimalkommas und Vorzeichen aus numerischen Ursprungswerten ebenfalls mit in das Zielfeld übertragen.

Für Gleitkomma-Ursprungswerte werden Dezimalzeichen und Vorzeichen übertragen, ungeachtet der Tatsache, ob NUMERIC angegeben wurde oder nicht.

Beispiel 1:
COMPRESS NUMERIC -123  1.23 INTO #TARGET WITH DELIMITER '*'
Content of #TARGET is: -123*1.23
Beispiel 2:
COMPRESS NUMERIC 'ABC' -0056.00 -0056.10 -0056.01 INTO #TARGET WITH DELIMITER '*'
Content of #TARGET is: ABC*-56*-56.1*-56.01
Beispiel 3:
COMPRESS NUMERIC FULL 'ABC' -0056.00 -0056.10 -0056.01 INTO #TARGET WITH DELIMITER '*'
Content of #TARGET is: ABC*-0056.00*-0056.10*-0056.01
FULL
Behandlung von Ursprungsfeldwerten:

Ohne FULL werden folgende Zeichen aus den Ursprungsfeldern entfernt, bevor die Werte übertragen werden:

  • vorangestellte Nullen vor dem Komma oder Dezimalpunkt für Felder vom Format N, P oder I,

  • nachfolgende Nullen nach dem Komma oder Dezimalpunkt für Felder vom Format N, P,

  • nachfolgende Leerzeichen für Felder vom Format A

  • und führende binäre Nullen für Felder vom Format B

Enthält ein numerisches Ursprungsfeld lauter Nullen, wird eine Null (0) übertragen. Zum Beispiel:

COMPRESS 'ABC '  001 INTO #TARGET WITH DELIMITER '*'
Content of #TARGET is: ABC*1

Mit FULL werden die Werte der Ursprungsfelder in ihrer tatsächlichen Länge — d.h. inklusive vorangestellter Nullen und nachfolgender Leerzeichen — ins Zielfeld übertragen. Mit anderen Worten werden die folgenden Zeichen wie eingegeben angezeigt:

  • vorangestellte Nullen vor dem Komma oder Dezimalpunkt für Felder vom Format N, P oder I,

  • nachfolgende Nullen nach dem Komma oder Dezimalpunkt für Felder vom Format N, P,

  • nachfolgende Leerzeichen für Felder vom Format A

  • und führende binäre Nullen für Felder vom Format B

Beispiel:

COMPRESS FULL 'ABC '  001 INTO #TARGET WITH DELIMITER '*'
Content of #TARGET is: ABC *001
operand1
Ursprungsfelder:

Mit operand1 geben Sie die Felder an, deren Inhalt übertragen werden soll.

Anmerkung:
Wenn operand1 nicht Format A oder B hat, wird sein Inhalt in alphanumerische Darstellung konvertiert, bevor er übertragen wird. Wenn erforderlich, wird die alphanumerische Darstellung abgeschnitten.

Wenn operand1 eine Zeitvariable (Format T) ist, wird nur die Zeitkomponente des Variableninhalts übertragen, aber nicht die Datumskomponente.

operand2
Zielfeld

Mit operand2 geben Sie das Feld an, das die Werte aus den Ursprungsfeldern aufnehmen soll.

Wenn das Zielfeld vom Format U (Unicode) hat, und wenn es sich um ein Ursprungsfeld mit Format B handelt, muss die Länge des sendenden Binärfeldes gleich sein.

LEAVING SPACE
Trennung der Werte im Zielfeld durch Leerzeichen:

Wenn Sie das COMPRESS-Statement ohne weitere Optionen verwenden oder LEAVING SPACE (gilt auch standardmäßig) angeben, so werden die Werte im Zielfeld jeweils durch ein Leerzeichen voneinander getrennt.

LEAVING NO SPACE
Keine Trennung der Werte im Zielfeld durch Leerzeichen:

Wenn Sie LEAVING NO SPACE angeben, werden die Werte im Zielfeld weder durch ein Leerzeichen noch durch ein anderes Zeichen voneinander getrennt.

parameter
Parameter für Druckmodus und Datumsformat:

Als parameter können Sie die Option PM=I oder den Session-Parameter DF angeben:

PM=I

Zur Unterstützung von Sprachen, deren Schreibrichtung von rechts nach links verläuft, können Sie die Option PM=I angeben, um den Wert von operand1 invers (d.h. von rechts nach links) in operand2 zu übertragen.

Zum Beispiel hätte als Ergebnis der folgenden Statements das Feld #B den Inhalt ZYXABC:

MOVE 'XYZ' TO #A
COMPRESS #A (PM=I) 'ABC' INTO #B LEAVING NO SPACE

Nachfolgende Leerzeichen in operand1 werden entfernt (außer wenn FULL angegeben ist), dann wird der Wert Zeichen für Zeichen umgedreht und anschließend in operand2 übertragen.

DF

Wenn operand1 eine Datumsvariable ist, können Sie den Session-Parameter DF als parameter für diese Variable angeben.

SUBSTRING (operand1, operand3, operand4)
SUBSTRING-Option:

Wenn operand1 alphanumerisches (A), Unicode (U) oder binäres Format (B) hat, können Sie die SUBSTRING-Option verwenden, um nur einen Teil des Urspungsfeldes zu übertragen. Hinter dem Feldnamen (operand1) geben Sie zuerst die Startposition (operand3) und dann die Länge (operand4) des zu übertragenden Feldabschnitts ein.

INTO SUBSTRING (operand2, operand5, operand6)
INTO-Klausel:

Sie können die SUBSTRING-Option auch in der INTO-Klausel verwenden, um die Urspungswerte in einen bestimmten Teil des Zielfeldes zu übertragen.

Die Verwendung der SUBSTRING-Option in einem COMPRESS-Statement entspricht in beiden Fällen der in einem MOVE-Statement. Einzelheiten zur SUBSTRING-Option finden Sie beim MOVE-Statement.

WITH DELIMITERS
Trennzeichen bei Werten im Zielfeld:

Möchten Sie, dass die Werte im Zielfeld jeweils durch ein Trennzeichen voneinander getrennt werden, dann verwenden Sie die DELIMITERS-Option.

Wenn Sie WITH DELIMITERS ohne operand7 angeben, werden die Werte durch das (mit der Session-Parameter ID definierte) Input-Delimiter-Zeichen voneinander getrennt.

WITH DELIMITERS operand7
Spezielles Trennzeichen:

Wenn Sie WITH DELIMITERS operand7 angeben, werden die Werte durch das mit operand7 angegebene Zeichen voneinander getrennt. operand7 muss ein einzelnes Zeichen sein.

Wenn operand7 eine Variable ist, muss sie Format/Länge A1 oder B1 haben.

Wenn das Zielfeld vom Format A oder B ist, muss das Format bzw. die Länge des Trennzeichens (A1), (B1) oder (U1) sein.

Wenn das Zielfeld vom Format U (Unicode) ist, muss das Format bzw. die Länge des Trennzeichens (A1), (B2) oder (U1) sein.

WITH ALL
Anwendung der Trennzeichen:

Ohne ALL werden im Zielfeld Delimiter-Zeichen nur zwischen tatsächlich übertragenen Werten gesetzt. Zum Beispiel:

COMPRESS 'A' ' ' 'C' ' ' INTO #TARGET WITH DELIMITERS '*'
Content of #TARGET is: A*C

Mit ALL wird im Zielfeld auch für jeden (nicht übertragenen) Leerwert ein Delimiter-Zeichen gesetzt. Das heisst, die Anzahl der Delimiter-Zeichen im Zielfeld ist gleich der Anzahl der Urspungsfelder minus 1. Dies kann z.B. sinnvoll sein, wenn der Inhalt des Zielfeldes mit einem SEPARATE-Statement anschließend wieder aufgeteilt werden soll. Zum Beispiel:

COMPRESS 'A' ' ' 'C' ' ' INTO #TARGET WITH ALL DELIMITERS '*'
Content of #TARGET is: A**C*

Verarbeitung

Ein Zielfeld vom Format B wird wie ein Zielfeld vom Format A behandelt.

Die COMPRESS-Operation wird beendet, sobald entweder alle Operanden übertragen sind oder das Zielfeld (operand2) voll ist.

Ist das Zielfeld länger als alle übertragenen Werte zusammen, so werden die verbleibenden Stellen von operand2 mit Leerzeichen gefüllt. Ist das Zielfeld kürzer, wird der Wert abgeschnitten.

Falls operand2 eine dynamische Variable ist, wird die COMPRESS-Operation beendet, wenn alle Ursprungsoperanden verarbeitet worden sind. Es werden keine Zeichen abgeschnitten. Die Länge von operand2 nach der COMPRESS-Operation entspricht dann der gemeinsamen Länge der Ursprungsoperanden. Die aktuelle Länge einer dynamischen Variable kann durch die Systemvariable *LENGTH bestimmt werden.

Beispiele

Beispiel 1 — COMPRESS-Statement

** Example 'CMPEX1': COMPRESS                                           
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPLOY-VIEW VIEW OF EMPLOYEES                                         
  2 NAME                                                                
  2 FIRST-NAME                                                          
  2 MIDDLE-I                                                            
*                                                                       
1 #COMPRESSED-NAME (A20)                                                
END-DEFINE                                                              
*                                                                       
LIMIT 4                                                                 
READ EMPLOY-VIEW BY NAME                                                
  COMPRESS FIRST-NAME MIDDLE-I NAME INTO #COMPRESSED-NAME     
  DISPLAY NOTITLE                                                       
          FIRST-NAME MIDDLE-I NAME 5X #COMPRESSED-NAME                  
END-READ                                                                
*                                                                       
END

Ausgabe des Programms CMPEX1:

     FIRST-NAME      MIDDLE-I         NAME               #COMPRESSED-NAME  
-------------------- -------- --------------------     --------------------
                                                                           
KEPA                          ABELLAN                  KEPA ABELLAN        
ROBERT               W        ACHIESON                 ROBERT W ACHIESON   
SIMONE                        ADAM                     SIMONE ADAM         
JEFF                 H        ADKINSON                 JEFF H ADKINSON

Beispiel 2 — COMPRESS-Statement mit LEAVING NO SPACE

** Example 'CMPEX2': COMPRESS (with LEAVING NO SPACE)                   
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPL-VIEW VIEW OF EMPLOYEES                                           
  2 NAME                                                                
  2 CURR-CODE (1)                                                       
  2 SALARY    (1)                                                       
*                                                                       
1 #CCSALARY   (A20)                                                     
END-DEFINE                                                              
*                                                                       
LIMIT 4                                                                 
READ EMPL-VIEW BY NAME                                                  
 
  COMPRESS CURR-CODE (1) SALARY (1) INTO #CCSALARY                      
           LEAVING NO SPACE                                            
  DISPLAY NOTITLE                                                       
          NAME CURR-CODE (1) SALARY (1) 5X #CCSALARY                    
END-READ                                                                
*
END

Ausgabe des Programms CMPEX2:

        NAME         CURRENCY   ANNUAL            #CCSALARY      
                       CODE     SALARY                           
-------------------- -------- ----------     --------------------
                                                                 
ABELLAN              PTA         1450000     PTA1450000          
ACHIESON             UKL           11300     UKL11300            
ADAM                 FRA          159980     FRA159980           
ADKINSON             USD           34500     USD34500           

Beispiel 3 — COMPRESS-Statement mit WITH DELIMITER

** Example 'CMPEX3': COMPRESS (with delimiter)                          
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPL-VIEW VIEW OF EMPLOYEES                                           
  2 NAME                                                                
  2 CURR-CODE (1)                                                       
  2 SALARY    (1)                                                       
*                                                                       
1 #CCSALARY   (A20)                                                     
END-DEFINE                                                              
*                                                                       
LIMIT 4                                                                 
READ EMPL-VIEW BY NAME                                                  
  COMPRESS CURR-CODE (1) SALARY (1) INTO #CCSALARY                      
           WITH DELIMITER '*'
  DISPLAY NOTITLE NAME CURR-CODE (1) SALARY (1) 5X #CCSALARY            
END-READ                                                                
*                                                                       
END

Ausgabe des Programms CMPEX3:

        NAME         CURRENCY   ANNUAL            #CCSALARY      
                       CODE     SALARY                           
-------------------- -------- ----------     --------------------
                                                                 
ABELLAN              PTA         1450000     PTA*1450000         
ACHIESON             UKL           11300     UKL*11300           
ADAM                 FRA          159980     FRA*159980          
ADKINSON             USD           34500     USD*34500