HR的所有数据都以infotype保存。
每个infotype都和时间紧密相连。
一般使用sap提供的Logic database pnp. 在新建程序时,加上pnp
然后在程序里加上Tables: PERNR. 再加上需要用到的infotype
如個人情報:
TABLES:PERNR.
INFOTYPE:PA0002.
GET PERNR.
PROVIDE*FROM P0001
BETWEENT PN-BEGDA AND PN-ENDDA.
WRITE...
ENDPROVIDE.
HR的数据有一个共同点,所有记录都有开始日和终了日。
可以用Join把多个Infotype放在一起来取数。
履歴管理区分:
1.数据不允许日期存在间隔或重叠。(履歴管理区分1:個人データ情報、氏名や年齢などある時点で空白も重複もあり得ず、すべてを削除することもできないため、履歴管理区分1の情報となります)
2.数据允许存在间隔,但是不允许重叠。(履歴管理区分2: 家族情報(配偶者サブタイプ、重複はしませんが、空白はあり、途中でなくなることもあります。存在しないこともありえるため全削除も可能となり履歴管理区分2の情報となります)
3.数据既允许有间隔也允许有重叠。(履歴管理区分3:資格情報、複数重複することも空白期間もあり、途中でなくなることもあります。存在しないこともありえるため全削除も可能となり管理区分3の情報となります)
A:データとして常に1レコードしかないものです。通常使用しないので知っているのみで良いです。全削除不可。
B:としてデータとして常に1レコードしかないものです。通常使用しないので知っているのみで良いです。全削除可。
T: サブタイプごとに履歴管理区分を管理するためのものになります。(家族情報のように配偶者サブタイプは管理区分2,子どもは管理区分3で重複が許可されないサブタイプと重複があるサブタイプが併存するインフォタイプの場合、サブタイプごとに管理します)
对于取数的时候,某个特定的时间段如果有重复的数据实际是没有意义的,所以用Join的时候只允许针对前两种情况。
如(1)需同时取所属情报和個人情報,
TABLES: PERNR.
INFOTYPE: 0001,0002.
GET PERNR.
PROVIDE* FROM P0001
*FROM P0002
BETWEEN PN-BEGDA AND PN-ENDDA.
WRITE...
ENDPROVIDE.
(2)如果两个数据的时间段不是完全一致
如,入职日2019.1.1
录入系统是2019.1.10
需要输出员工的姓名和地址,那么必须取P0002和P0006两个信息。
在Join的时候,系统会自动按照每个时间点分为多条记录。所以系统会分成
2019.1.1-2018.1.9 和2019.1.10-9999.12.31
如果某个信息记录在某个时间段有数的话,自动生成的变量Pxxxx_VALID 就被赋值'X'.
如果用户屏幕上输入查询日期 2019.1.10-2019.1.31 *BEGDA2019.1.10- ENDDA2019.1.31
那么程序输出的就是2019.1.10-2019.1.31, 姓名,住址
因为在2019.1.10以前没有地址,在2019.1.1-2019.1.10这个时间段p0006_valid为空。
TABLES:PERNR.
INFOTYPE:0002,0006.
GET PERNR.
PROVIDE * FROM P0002
*FROM P0006
BETWEEN PN-BEGDA AND PN-ENDDA.
IF P0006_VALID = 'X'.
WRITE:P0002-BEGDA , P0002-ENDDA, P0002-NACHN, P0002-VORNA , P0006-ORT01.
ENDIF.
ENDPROVIDE.
若要将infotype里的所有数据都取出来用Join,
若只是个别字段用Projection.
如所属情报里员工有两条记录,分别是2019.1.1-1.31,2019.2.1-9999.12.31
这两条记录只有job发生了变化,position没有变化。
如果根据Projection来只取job,会分为两个时间段。
若只取position,由于没有发生变化,系统会将它们合并。