2016-03-30 28 views
0

ws-var1, pic x(3) adresindeki Alfasayısal verileri işleme. ws-var2 ayrıca pic x(3)'dur.Kopyalama

Tablo ws-var1 = "1 "'da bir alanım var ve değerininumaralı başka bir alana taşımak istiyorum; bu değer " 1" değerini içermelidir. Hem ws-var1 hem de ws-var2, alfasayısal alanlardır. Bunu başarmak için lütfen uygun yöntemi öneriniz. genellikle bir dizi (ara boşluk içerir) sağ haklı istediğiniz varsayarsak

+0

Öyle kaynak verileri için tek olasılık? Sadece "1"? Tek bir sayısal rakam mı? Ya da iki ya da üç basamak olabilir mi? –

cevap

1

, kullanabilirsiniz:

INSPECT ws-var1 TALLYING num-chars FOR CHARACTERS BEFORE SPACE 
MOVE ws-var1 (1:num-chars) TO ws-var2 (3 - num-chars + 1:) 

num-chars başlangıç ​​değeri 0

ile, bir sayısal veri öğesi (burada Alternatif olarak, TRIM intrinsic ile bir derleyici kullanmak için şanslı iseniz, ws-var2 JUSTIFIED RIGHT ve sadece MOVE FUNCTION TRIM(ws-var1) TO ws-var2 bildirebilir.)

+0

Ws-var2'yi referans modifikasyon örneğinizde de en iyi şekilde başlatırsınız, aksi takdirde bir sonraki veri parçası bir öncekinden daha kısadır. OP tarafından seçilen veri isimlerinin referans-modifikasyonu hak ettiğini varsayalım, çünkü bu durumda kodu daha az net yapmaz :-) –

0

Tabii ki bir döngü ile yapabilirsiniz. Mesele şu ki, sadece üç baytınız var. Üç bayt uzunluğunda bir şeyle, temel şeylerden başka bir şey yapmak, makul olanın ötesinde tüketilen kaynaklar kadar üstündür. Kaynakların ödenmediği ve günlük kullanılan birçok programda verimsiz kodun yayılmasının kimseyi endişelendirmediği durumlarda, bunu yapmanın başka yolları da vardır.

01 A-MEANINGFUL-NAME. 
     88 AMN-NO-ACTUAL-DATA    VALUE SPACE. 
     05 AMN-FIRST-TWO-BYTES-OF-DATA. 
      10 AMN-FIRST-BYTE    PIC X. 
      10 FILLER      PIC X. 
       88 AMN-ONE-BYTE-OF-DATA VALUE SPACE. 
     05 FILLER       PIC X. 
      88 AMN-TWO-BYTES-OF-DATA  VALUE SPACE. 

    01 B-MEANINGFUL-NAME. 
     05 BMN-FIRST-BYTE     PIC X. 
     05 BMN-SECOND-TWO-BYTES. 
      10 FILLER      PIC X. 
      10 BMN-THIRD-BYTE    PIC X. 

     MOVE SPACE     TO B-MEANINGFUL-NAME 
     EVALUATE TRUE 
     WHEN AMN-NO-ACTUAL-DATA 
      CONTINUE 
     WHEN AMN-ONE-BYTE-OF-DATA 
      MOVE AMN-FIRST-BYTE  TO BMN-THIRD-BYTE 
     WHEN AMN-TWO-BYTES-OF-DATA 
      MOVE AMN-FIRST-TWO-BYTES-OF-DATA 
            TO BMN-SECOND-TWO-BYTES 
     WHEN OTHER 
      MOVE A-MEANINGFUL-NAME TO B-MEANINGFUL-NAME 
     END-EVALUATE 

Bunu yapmanın verimli ve açık bir yolu budur. Muhtemelen pek çok insan için çok fazla yazıyor, ama bunlar bir programın kolayca anlaşılması ve kolayca muhafaza edilmesi gereğini düşünmeyen insanlar. İhtiyaç duyulan varış noktasında sadece baytları boşlaştırarak daha verimli hale getirilebilir, ancak bunu kendiniz deneyebilirsiniz.

Yerleşik bir alanla "olduğu gibi" çalışmayacak, ancak bunu yapmak için kolayca değiştirilebilir.

Ayrıca, editörünüzün gücünü kullandığınız için, gerçekten çok fazla yazmıyor.

Ya

01 A-MEANINGFUL-NAME     PIC XXX. 
    01 B-MEANINGFUL-NAME     PIC XXX. 
    01 FILLER 
     REDEFINES B-MEANINGFUL-NAME. 
     05 C-MEANINGFUL-NAME    PIC XXX JUST RIGHT. 

     UNSTRING A-MEANINGFUL-NAME 
     DELIMITED BY SPACE 
     INTO      C-MEANINGFUL-NAME 

O kadar çok yazım

. Daha az verimli. Hala temiz.

Katıştırılmış bir boşlukla çalışmaz, ancak kod bunu yapmak için kolayca dahil edilebilir (yalnızca koşullu olarak kullanın). belki biraz daha az net ve iyi biçimlenmiş sayısal olma kaynağına dayanır muhtemelen daha da az verimli

Ya

01 A-MEANINGFUL-NAME     PIC XXX. 
    01 B-MEANINGFUL-NAME     PIC XXX. 

    01 C-MEANINGFUL-NAME 
     REDEFINES B-MEANINGFUL-NAME   PIC ZZ9. 

     COMPUTE C-MEANINGFUL-NAME = FUNCTION NUMVAL 
             (A-MEANINGFUL-NAME) 

O kadar çok tipleme

,.

Gömülü bir alanla çalışmaz, çünkü iyi biçimlendirilmiş bir sayısal olmaz.

Edward H'nin cevabı gösterdiği gibi, referans değiştirme kullanılabilir.böylece, (olmalıdır)

 MOVE SPACE TO B-MEANINGFUL-NAME 
     EVALUATE TRUE 
     WHEN A-MEANINGFUL-NAME = SPACES 
      CONTINUE 
     WHEN A-MEANINGFUL-NAME (2:1) = SPACES 
      MOVE A-MEANINGFUL-NAME (1:1) 
      TO B-MEANINGFUL-NAME (3:1) 
     WHEN A-MEANINGFUL-NAME (3:1) = SPACES 
      MOVE A-MEANINGFUL-NAME (1:2) 
      TO B-MEANINGFUL-NAME (2:) 
     WHEN OTHER 
      MOVE A-MEANINGFUL-NAME TO B-MEANINGFUL-NAME 
     END-EVALUATE 

bunun için oluşturulan çalıştırılabilir kod olacak orijinal örnekle aynıdır: Burada yapmak için yeniden ilk örnek referans tadilatı yoluyla kaybolabilir ne berraklık bir göstergesi olarak, bu Verimli, ama umarım okumak daha zor olduğu kabul edilir. (Tabii ki, bunu kodlamak için, farklı bir şekilde biçimlendiririm, en azından okumayı biraz daha kolaylaştırırdım, ama bir "VAR1" sözcüğü bile boşluklardan daha fazla yazamayacağımı sanıyorum).

0
01 WS-VAR-1. 
    88 FL-VAR1-999   VALUE SPACES. 
    03 WS-VAR1-999   PIC 9(03). 
01 FILLER 
     REDEFINES WS-VAR-1. 
    03 WS-VAR1-99   PIC 9(02). 
    03 FILLER    PIC X(01). 
     88 FL-VAR1-99  VALUE SPACES. 
01 FILLER 
     REDEFINES WS-VAR-1. 
    03 WS-VAR1-9   PIC 9(01). 
    03 FILLER    PIC X(02). 
     88 FL-VAR1-9   VALUE SPACES. 

01 WS-VAR-2. 
    03 WS-VAR1-ZZ9   PIC Z(02)9(01). 



    IF FL-VAR1-999   MOVE ZERO  TO WS-VAR1-ZZ9 
     ELSE 
     IF FL-VAR1-9   MOVE WS-VAR1-99 TO WS-VAR1-ZZ9 
     ELSE 
     IF FL-VAR1-99  MOVE WS-VAR1-9 TO WS-VAR1-ZZ9 
      ELSE    MOVE WS-VAR1 TO WS-VAR2. 

O ... yeniden tanımlanmasının bütün meselesi

+0

Neden WS-VAR1-ZZ9 WS-VAR-2'ye bağlı bir alanınız var? VAR maddeleri yeterince kafa karıştırıcı değil mi? Hatalı verileri iyi duruma getirmekte olan sayısal kullanımda bir riskiniz var. –

+0

@BillWoodger: Ben alphameric alanları ve sayısal alanları ayrı ve ayrı tutmak için tercihim var. Bunun kötü verileri nasıl iyi hale getirebileceğinden emin değilim - AFAICS, bu, sondaki tüm boşluklar ve diğer tüm kombinasyonlarla birlikte görünen tüm sayısal kombinasyonların bir SOC4 oluşturması gerekir. – Magoo

+0

İşaret tespiti. X'F1F100 'X'F1F1F0' olabilir. Eğer PIC X (n) 'yi PIC X (n)' ye yaparsanız, işaret yoktur. S0C7 (veri istisnası) S0C4 (adresleme istisnası) demek istemediğini düşünüyorum. Bu, insanların hayal ettiği kadar olmaz. NUMERIC testi geçmeyen birçok şey kullanımda S0C7 almaz. Sadece USAGE DISPLAY PIC 9'u (n) benzer bir şeye taşımak için S0C7'yi alamazsınız. –