2016-09-28 56 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