AS400 RPGLE计划

时间:2016-09-28 04:44:11

标签: ibm-midrange rpgle

我正在尝试从没有键控字段的物理文件PFILE中删除记录,但我不知道为什么if子句中的语句不起作用,即使我有id = 123的记录

# example values
k <- 3    # dim=c(n1, n2, ..., nk)
n1 <- 5; n2 <- 6;  n3 <- 4; p <- 5
set.seed(1); values <- array(sample(n1*n2*n3*p), dim = c(n1, n2, n3, p))
set.seed(1); indices <- array(sample(p, n1*n2*n3, replace = T), dim = c(n1, n2, n3))

# do +1 to last dim and put indices into it (to enable apply() to get both information).
values2 <- array(values, dim=c(n1, n2, n3, p+1))
values2[,,,p+1] <- indices

   values[1,1,1,]  # [1] 160 477 111  27 569
   indices[1,1,1]  # [1] 2
   values2[1,1,1,] # [1] 160 477 111  27 569   2  # last values is index (value2[1,1,1,p+1])
   values2[1,1,1,][values2[1,1,1,p+1]]  # 477

# using apply(), get the values with all combination of n1, ..., nk
slice2 <- apply(values2, 1:k, function(x) x[x[p+1]])

   # check just to be sure
   slice <- array(NA, dim = c(n1, n2, n3))
   for(a in 1:n1) for(b in 1:n2) for(c in 1:n3) {
     slice[a, b, c] <- values[a, b, c, indices[a, b, c]] }

   identical(slice, slice2)  # [1] TRUE  # no problem

这是我的PFILE

0001.00 fPFILE     UF   E             DISK            
0002.00 DID               S              8P 0         
0003.00 c                   read      rec             
0004.00 c                   eval      ID=123          
0005.00 c     ID            CHAIN     PFILE           
0006.00 C     EMPID         DSPLY                     
0007.00 c                   IF        %FOUND()        
0008.00 C     EMPNAME       DSPLY                     
0009.00 c                   DELETE    REC             
0010.00 C     'DELETED'     DSPLY                     
0011.00 c                   ELSE                      
0012.00 c     'NOTFOUND'    DSPLY                     
0013.00 c                   ENDIF                     
0014.00 C                   SETON

8 个答案:

答案 0 :(得分:1)

您可以使用“chain”来使用密钥或记录编号访问文件。

fPFILE     UF   E             DISK            
DID               S              8P 0         

 /free
   id = 123;
   chain id rec;
   if %found;
      delete rec;
   endif;
   *inlr = '1';
   return;
 /end-free

答案 1 :(得分:1)

要链接到文件,您必须告诉编译器它是键控的。文件规范中应该有一个K.

0001.00 fPFILE     UF   E             DISK            
0002.00 DID               S              8P 0         
0003.00 c                   read      rec             
0004.00 c                   eval      ID=123          

答案 2 :(得分:1)

我已经使用RRN来“链接”子文件recs。如上所述,您可以使用非键控文件上的键创建逻辑。如果您具有要删除的特定值(ID),则还可以设置READ循环并测试ID以匹配值。如果没有找到,ITER。如果找到,请删除。 这是基本的东西,绿屏固定位置代码又名旧学校。 (没有链到逻辑)。

import java.util.*;
 public class Duplicates {
  public static void main(String[] args)
    {
    Integer[] array = {12, 23, -22, 0, 43, 545, -4, -55, 43, 12, 0, -999, -87, 12};
    mergeSort(array);
    for(Integer x : array)
    {
        System.out.println(x);
    }
    Map<Integer,Integer> duplicates = new HashMap<Integer,Integer>();
    int count = 1;
    for(int i = 0;i < array.length-1;i++)
    {
        if(array[i].equals(array[i+1]))
        {
            count++;
        }
        else
        {
            duplicates.put(array[i],count);
            count=1;
        }
    }
    for ( Integer key : duplicates.keySet() ) 
    {
       System.out.println("Number: " + key + " occuars " + duplicates.get(key) + " times" );
    }        
    }
    public static void mergeSort(Integer[] a)
    {
       if(a.length>1)
       {
       int i,mid = a.length/2;
       Integer[] half1 = new Integer[mid];
       Integer[] half2 = new Integer[a.length-mid];
       for(i=0; i<mid; i++)
       half1[i]=a[i];
       for(; i<a.length; i++)
       half2[i-mid]=a[i];
       mergeSort(half1);
       mergeSort(half2);
       int j=0, k=0;
       for(i=0; j<half1.length&&k<half2.length; i++)
       if(half1[j].compareTo(half2[k])<0)
       {
         a[i]=half1[j];
         j++;
       }
       else
       {
         a[i]=half2[k];
         k++;
       }
       for(; j<half1.length; i++, j++)
       a[i]=half1[j];
       for(; k<half2.length; i++, k++)
       a[i]=half2[k];
 }
 }
}

答案 3 :(得分:0)

<强>咆哮:

  • 停止使用固定格式RPGLE
  • 停止使用DDS

你正在给我眼癌。

<强>答案:

%chain操作代码用于通过“Key”或“RRN”

访问记录

您已将表格中的ID列与“RRN”相混淆

IBM Knowledge Center - CHAIN (Random Retrieval from a File)

答案 4 :(得分:0)

要从基于物理文件的任何字段的文件中读取任何数据,您必须拥有物理文件中的密钥或使用密钥字段创建逻辑文件。然后你可以使用chain和%found()组合。

冷藏 萨迪普

答案 5 :(得分:0)

您的F-spec没有说该文件有密钥,因此ID = 123表示PFILE中的记录#123。如果PFILE不包含至少123条记录,则链将失败。

答案 6 :(得分:0)

我很惊讶这甚至编译。我会重命名(rec:arec),然后删除arec。

如果这不起作用,您是否有FA或其他方式来访问物理文件?如果是,请查找记录并在紧急情况下手动将其删除。

答案 7 :(得分:0)

您需要在物理文件中添加密钥。见下文第6行。如果您想要它的独特之处,请参阅下面的第1行。接下来,使用&#34; K&#34;在文件规范中告诉您的RPG程序文件是否已键入。

然后,没有阅读。使用密钥链接文件将直接进入删除记录,无需阅读。最后,我总是将文件名放在函数中,例如%found(file)。你当然可以省略它,但有时我不会包含它时会产生奇怪的结果,主要是在子文件上处理readc时。

//文件

.....A..........T.Name++++++RLen++TDpB......Functions++++++++++++++++++
0000.01      A                                      UNIQUE                     
0000.02      A          R PFILEREC                                             
0000.03      A            EMPID          7P 0                                  
0000.04      A            EMPNAME       15A                                    
0000.05       * SET A KEY FOR THE FILE                                         
0000.06      A          K EMPID                                                

// the program

     FMT FX FFilename++IPEASF.....L.....A.Device+.Keywords
0000.03 fpFile     uf   e           k disk            
0000.04 f                                             
0000.05 d id              s              8p 0 Inz(123)
0000.06 d                                             
0000.07 c     key           klist                     
0000.08 c                   kfld                    id
0000.09 c                                             
0000.10 c     key           chain     pFile           
0000.11 c                   if        %found(pFile)   
0000.12 c                   delete    pFileRec        
0000.13 c                   endif                     
0000.14 c                                             
0000.15 c                   eval      *inlr = *on     
0000.16 c