2016-09-28 57 views
0

我试图删除物理文件PFILE记录它没有密钥的字段,但我不知道为什么,如果条款不工作报表,即使我有ID = 123AS400 RPGLE程序

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 
纪录

这是我PFILE

0001.00     R REC             
0002.00     EMPID   7P 0         
0003.00     EMPNAME  15A         
+1

能否请你换你的代码中的一个代码块,因此更容易阅读?您是否尝试过使用带有删除命令而不是文件名的文件记录格式?最后,如果您给我们一份工作日志消息,至少会告诉我们失败的事情会有所帮助。否则,这篇文章对下一个有此类问题的人没有意义。 –

回答

0

咆哮:

  • 停止使用固定形式AT RPGLE
  • 停止使用DDS

你给我的眼癌。

答:

的%连锁经营代码是由两种“关键”或

你已经在你的表与“RRN”

混淆ID列“RRN”用来访问记录

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

+0

请原谅我的无知,但DDS的替代选择是什么? (生成表的SQL脚本) –

+1

根据Birgitta Hauser ==> BTW所有新的“物理”和“逻辑”文件,相应的表和索引应该用SQL创建,因为DDS是“稳定的”,不会有未来的增强。所有新的开发都在SQL中完成==>请参阅http://www.rpgpgm.com/2015/01/reading-sql-table-in-rpg.html或http://xcasefori.com/modernize.html? utm_source = MC%20Press&utm_medium = article&utm_campaign = online%20publication –

+1

也根据Briggitta ==>从DDS转移到DDL的主要理由是,DDS是稳定的,这意味着不会再增强。 自V4R5发布以来,所有新的开发工作都只针对SQL ==>请参阅http://www.code400.com/forum/forum/iseries-programming-languages/dds/9551-dds-or-ddl –

1

您可以使用“链”来访问一个文件的关键,或记录编号。

fPFILE  UF E    DISK    
DID    S    8P 0   

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

您只能链接第一个64k记录。有了SQL,你可以使用RRN来处理10个数字。 – danny117

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   
0

读取基于物理文件的任何领域的文件中的任何数据,您必须在物理文件密钥或者创建拥有关键领域的逻辑文件。然后你可以使用链和%found()组合。

冰寒 萨迪普

1

我用RRN “链接” 子文件区域经济共同体。如上所述,您可以通过非键控文件使用键创建逻辑。如果您有一个确定要删除的特定值(ID),则还可以设置一个READ循环并测试ID以查找匹配值。如果没有找到,ITER。如果找到,则删除。 这是基本的东西,绿屏定位代码又名老派。 (没有一个逻辑链)。

move *OFF *IN30 

*IN30 DOWEQ *OFF 

READ PFILE 30 

*IN30 IFEQ *ON 

LEAVE 

ENDIF 

fILEid IFNE COMPAREid 

ITER 

ENDIF 

DELET PFILEREC 

LEAVE 

ENDDO 
0

你的F-spec没有说该文件有一个键,所以ID = 123意味着在PFILE中记录#123。如果PFILE不包含至少123条记录,则链将失败。

0

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

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

0

您需要将密钥添加到您的物理文件中。见下面的第6行。如果您希望它具有独特性,请参阅下面的第1行。接下来,在文件规范中告诉你的RPG程序使用“K”来键入文件。

然后,没有nead一个阅读。用键链接文件将直接进入删除记录,无需阅读。最后,我总是把文件名放在函数中,例如%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