如何在as400中创建连接逻辑文件

时间:2015-05-16 16:41:05

标签: ibm-midrange

我有一个包含偶数(2,4,6,8,10)的物理文件和另一个包含奇数(1,3,5,7,9)的PF。我们是否可以创建连接逻辑文件,我必须在RPGLE pgm中使用它来按顺序显示数字(1到10)。

如何为此方案创建连接逻辑文件?

3 个答案:

答案 0 :(得分:2)

FWiW,在相同容量中使用UNION VIEW的示例,而不是[n隐式]多格式逻辑文件(MFLF),它们不被认为是“关系”数据库:

设定:

create table even_nbrs
( nbr     dec     not null with default
, nbrtext char(2) not null with default
)
;
create table odd_nbrs
( nbr     dec     not null with default
, nbrtext char(2) not null with default
)
;
insert into  even_nbrs values      
(2, 2), (4, 4), (6, 6), (8, 8), (10, 10)
; -- 5 rows inserted in EVEN_NBRS
insert into  odd_nbrs  values           
(1, 1), (3, 3), (5, 5), (7, 7), ( 9,  9)
; -- 5 rows inserted in ODD_NBRS

从前两个文件创建生成UNION数据记录的文件:

create view  evens_odds as      
( select nbr, nbrtext from even_nbrs
 union all                          
  select nbr, nbrtext from odd_nbrs 
)
;

将VIEW作为共享开放数据路径(ODP)提供给RPG程序,其订单由编号\ sequence (NBR)列完成,用于运行时CL处理:

ovrdbf     the_File tofile(evens_odds) mbr(*first) share(*yes)    
opnqryf    the_File keyfld((nbr))
/* optionally, the next three commands to test and review results: */
cpyfrmqryf the_File *print
dspsplf    qsysprt splnbr(*last)
posdbf     the_File *start
/* call the RPG program that could read by key or sequentially */
call       the_RPGpgm

并且,对于[非关系型] DDS LF,MFLF将具有以下DDS:

                R ODDS_EVENS                PFILE(ODD_NBRS EVEN_NBRS)
                  NBR                                                
                  NBRTEXT                                            
                K NBR                                                

使用该DDS源创建逻辑文件(CRTLF)创建名为ODDS_EVENS的文件后,以下CL请求可以验证结果:

cpyf ODDS_EVENS *print fromrcd(*start)
dspsplf qsysprt splnbr(*last)

<强> [编辑:18May2015]

以下DDS LF源是明确定义的MFLF,但第一格式 [第一个R-spec]是重复的[即在CRTLF与第一个复制之后在DSPFD TYPE(* RCDFMT)中看到的第二种格式,并在PFILE()上指定的两个文件中实现数据的UNION。而第三和第四种格式[第二和第三种R-spec]是明确定义的,与第一种格式明显不同;第三个和第四个之间的差异以及每个和第一个之间的差异应该被视为显着不同,以便表明它们不是UNION,而是有效地区分封装在单个* FILE对象中的各种数据的逻辑视图。 / p>

查看数据[虽然不一定反映顺序]的最简单的界面是使用Query / 400交互式WRKQRY功能在指定文件选择中选择不同的格式,并在每次连续选择后使用F5 =运行功能。要么是该实用程序的选择和序列字段,要么只显示文件字段描述(DSPFFD)以查看每种格式的布局。

此示例不会尝试执行任何有用的操作,只是尝试强调为该联合生成的联合和多种格式,并显示如何将其他多种格式显式编码为不同的VIEW类实体。
另外,除非运行以下SQL语句[在先前文件\数据设置活动的设置之后],否则对RcdFmt(ODDS_ONLY)中的数据的引用将导致十进制数据映射错误,因为最初作为字符值[从整数值映射]输入的单位数值:update odd_nbrs set nbrtext = right(digits(nbr), 2)

                R ODDS_EVENS                PFILE(ODD_NBRS EVEN_NBRS)           
                                            TEXT('NBR fld only; 1-digit values')
                  NBR  
                K NBR  
                K *NONE
                K *NONE
                S NBR                       COMP(LT 10)    
                R ODDS_ONLY                 PFILE(ODD_NBRS)
                                            TEXT('NBR,NBRTEXT mapped to zoned')
                  NBR                
                  NBRTEXT        2S00
                K NBR    
                K NBRTEXT
                K *NONE
                R EVENS_ONLY                PFILE(EVEN_NBRS)                    
                                            TEXT('NBR to alpha and more zoned')
                  NBR
                  NBR2S00        2S00       RENAME(NBR) COLHDG('NBR2S00')
                  NBR2A          2A  I      SST(NBR2S00 1 2) COLHDG('NBR2A')
                  NBRTEXT
                K *NONE  
                K *NONE  
                K NBR2S00

<强> [/编辑:18May2015]

答案 1 :(得分:1)

您没有描述连接逻辑,它将一个表中的记录连接到另一个表中的一个或多个记录。

相反,您正在描述所谓的multi-format logical DDS源代码(假设文件之间的记录格式相同):

A          R RECFMT                    PFILE(ODDFILE EVENFILE)
A            RECNO
A            FLD1
A            FLD2
A          K RECNO 

但是,如果这两个文件具有不同的记录格式,并且您希望每个文件都有不同的字段......那么它看起来就像这样:

A          R ODDFILER                  PFILE(ODDFILE)
A            RECNO
A            FLD1
A            FLD3
A          K RECNO
A 
A          R EVENFILER                 PFILE(EVENFILE)
A            RECNO
A            FLD2
A            FLD4
A          K RECNO 

这是一篇关于使用连接和多格式逻辑的好文章。 http://www.mcpressonline.com/programming/general/multi-format-and-join-logicals.html

正如CRPence的回答所提到的,MFLF类似于SQL UNION ALL视图。

不同之处在于,在我的第二个例子中,MFLF将允许FLD1为alpha,FLD2为数字。 SQL联合视图不允许这样做;在SQL中选择的列必须是相同(或兼容)类型。

答案 2 :(得分:0)

将每个物理文件视为网格或表格,其中文件中的记录是行,文件中的字段是列。 (这些也是SQL中使用的术语。)想象一下将两个表并排放置。连接将连接&amp;将行组合在一起,以匹配键,以构建新的结果行,每行包含两个表中的值。

但那不是你所描述的场景。你想要将两个表垂直组合,更像是将两堆卡片按照所需的顺序排列成一堆。