HR开发(个人总结 有点乱哦)

业务需求:

完成一张员工绩效考评的明细表,其样子大致为:

成本中心成本中心名称部门名称岗位描述员工子组员工编号姓名入职日期异动本岗位日期XXXX年XX月份XXXX年XX月份XXXX年XX月份XXXX年XX月份XXXX年XX月份XXXX年XX月份XXXX年XX月份XXXX年XX月份XXXX年XX月份XXXX年XX月份XXXX年XX月份XXXX年XX月份合计
C007101410八角北里店服务台员工6652XX199811012013010192939390999910290858793751098
C007101410八角北里店长病人员6655XX1998110190919378352

涉及关键技术:

1、动态表的创建

2、HR相关开发技术

3、逻辑数据库技术


首先从第二点 HR相关开发技术讲解:

(HR报告类)新建程序的时候:添加逻辑数据库 且在程序中引用相关的结构【TABLES PERNR 】,会出现自动的查询界面。下面两个图中自动展示。此可以成为HR  报告类技术,也是逻辑数据库的一大优势。




2. 怎么获取动态列和动态表格

a.获取列数

通过期间之间的差值,可以获取期间的数量,结合其他的固定列可以算出列数。涉及函数FIMA_DAYS_AND_MONTHS_AND_YEARS

代码如下:

CALL FUNCTION 'FIMA_DAYS_AND_MONTHS_AND_YEARS'
  EXPORTING
    I_DATE_FROM          PN-BEGPS
*   I_KEY_DAY_FROM       = I_KEY_DAY_FROM
    I_DATE_TO            PN-ENDPS
*   I_KEY_DAY_TO         = I_KEY_DAY_TO
*   I_FLG_SEPARATE       = ' '
 IMPORTING
*   E_DAYS               = E_DAYS
   E_MONTHS             G_NUMB
*   E_YEARS              = E_YEARS

B:创建动态内表

大致步骤:1.首先创建一个存储表列信息的内表,暂定为A内表,之后给内表赋值。

2、通过内表,创建出一个以此内表的行数据为列信息的内表,定义为B内表, 那么此时动态内表已经创建完整

具体代码如下:

FORM SUB_DY_TABLE .
DATAI_FIELDCAT LIKE TABLE OF LVC_S_FCAT,   "表字段表
      W_FIELDCAT LIKE LINE OF I_FIELDCAT.    "表字段工作区   此为 创建A内表和对应的工作区 
DATA NUM1  TYPE VALUE  0,
       NUM2  TYPE VALUE  0.
DEFINE  MARCO_ADDDYitab.
  W_FIELDCAT-FIELDNAME &1.
  W_FIELDCAT-DATATYPE  &2.
  W_FIELDCAT-INTLEN    &3.
  W_FIELDCAT-DECIMALS  &4.
  W_FIELDCAT-JUST      &5.
  APPEND W_FIELDCAT TO  I_FIELDCAT.
END-OF-DEFINITION .

MARCO_ADDDYitab :   "  给A内表赋值,作为B内表的列
           'KOSTL' 'CHAR' '10' '' 'L',         "成本中心
           'KTEXT' 'CHAR' '20' '' 'L',         "成本中心描述
           'STEXT' 'CHAR' '40' '' 'L',         "组织单位描述
"           'ORGID' 'NUMC' '8' '' 'L',          "单位
"           'PLANS' 'NUMC' '8' '' 'L',          "岗位
           'PLSTX' 'CHAR' '25' '' 'L',         "岗位描述
           'PTEXT' 'CHAR' '20' '' 'L',          "子组描述
           'PERNR' 'NUMC' '8' '' 'L',          "员工编号
           'ENAME' 'CHAR' '40' '' 'L',         "员工姓名
           'LZRQ' 'DATS' '8' '' 'L',           "入职日期
           'DAYPS' 'DATS' '8' '' 'L'.           "异动日期
CLEAR NUM1,NUM2 .
DO G_NUMB  TIMES.
  NUM2 NUM1 + PN-BEGDA+4(2.
  IF NUM1  0.
    G_WA_PERD-YEAR PN-BEGDA+0(4).
    G_WA_PERD-MONTH PN-BEGDA+4(2).
    APPEND G_WA_PERD TO G_IT_PERD.
  ELSEIF NUM1 <> AND NUM2 <= 12  .
     G_WA_PERD-YEAR PN-BEGDA+0(4).
     G_WA_PERD-MONTH PN-BEGDA+4(2+ NUM1 .
         APPEND G_WA_PERD TO G_IT_PERD.
   ELSE .
      G_WA_PERD-YEAR PN-BEGDA+0(41.
     G_WA_PERD-MONTH PN-BEGDA+4(2+ NUM1 12 .
         APPEND G_WA_PERD TO G_IT_PERD.
  ENDIF.
  CONCATENATE   C_NAME   G_WA_PERD-YEAR  G_WA_PERD-MONTH INTO T_NAME.
MARCO_ADDDYitab T_NAME  'CURR' '13' '2' 'L'.
NUM1 NUM1 + 1.
ENDDO.

MARCO_ADDDYitab :'SUM'  'CURR' '13' '2' 'L',
                'PJZ' 'CURR' '13' '2' 'L'.
***创建动态表
  CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE  “函数,创建内表 不过此处得到的为一个引用对象,我们必须给这个引用

对象进行解除(就是把它的数据地址分配给另外的数)  才能够应用
    EXPORTING
      IT_FIELDCATALOG I_FIELDCAT
    IMPORTING
      EP_TABLE        EP_TABLE.
ASSIGN EP_TABLE->TO <T_DYNTABLE>.  ”解除数据对象,到指针<T_DYNTABLE>中,此时<T_DYNTABLE>就是代表一个内表,且为动态的内表
CREATE DATA  W_TABLE   LIKE LINE OF  <T_DYNTABLE>.
ASSIGN W_TABLE->TO <FS_DYNTABLE>.
两个指针的定义
FIELD-SYMBOLS<T_DYNTABLE> TYPE STANDARD TABLE,"Dynamic internal table name
 ”              <FS_DYNTABLE> TYPE ANY,

ENDFORM.                    " SUB_DY_TABLE

3.获取动态表头

这个简单:就是通过最先求得的列数,给fieldcat进行添加行

DATAG_IT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV ,
      G_WA_FIELDCAT TYPE SLIS_FIELDCAT_ALV ,

FORM SUB_DY_FIELD .
DEFINE MARCO_ADDFIELD .
  G_WA_FIELDCAT-FIELDNAME  &1.
  G_WA_FIELDCAT-TABNAME    &2.
  G_WA_FIELDCAT-SELTEXT_M  &3.
  APPEND G_WA_FIELDCAT TO G_IT_FIELDCAT.
END-OF-DEFINITION .

MARCO_ADDFIELD :  'KOSTL'  '<T_DYNTABLE>' TEXT-001 ,
                   'KTEXT'  '<T_DYNTABLE>' TEXT-002 ,
                    'STEXT'  '<T_DYNTABLE>' TEXT-003 ,
                     'PLSTX'  '<T_DYNTABLE>' TEXT-004 ,
                      'PTEXT'  '<T_DYNTABLE>' TEXT-005 ,
                       'PERNR'  '<T_DYNTABLE>' TEXT-006 ,
                        'ENAME'  '<T_DYNTABLE>' TEXT-007 ,
                        'LZRQ'  '<T_DYNTABLE>' TEXT-008
      "                  ,'DAYPS'  '<T_DYNTABLE>' TEXT-009
                        .

  SORT G_IT_PERD BY YEAR MONTH ASCENDING.
  LOOP AT G_IT_PERD INTO G_WA_PERD.
    CONCATENATE G_WA_PERD-YEAR '年' G_WA_PERD-MONTH '月' INTO T_STRING.
    CONCATENATE C_NAME G_WA_PERD-YEAR G_WA_PERD-MONTH INTO T_NAME.
MARCO_ADDFIELD T_NAME  '<T_DYNTABLE>' T_STRING.
  ENDLOOP.
  MARCO_ADDFIELD :  'SUM'  '<T_DYNTABLE>' TEXT-011 ,
                   'PJZ'  '<T_DYNTABLE>' TEXT-012 .
ENDFORM

3:逻辑数据库技术

START-OF-SELECTION .之后跟GET. 即:循环技术

START-OF-SELECTION .

  RP-SET-NAME-FORMAT.
PERFORM  SUB_SUMCOUNT.  "计算期间的个人
PERFORM  SUB_DY_table.  "创建动态内表
PERFORM  SUB_DY_FIELD.  "创建动态列
get  pernr .
PERFORM  GETDATA.

4.下面进行的是 赋值

此处用到的技术是 给 <FS_DYNTABLE>(动态表的工作区) 进行分解到 <I_FIELD>,对分解的部分 <I_FIELD>进行赋值,做到最工作区的赋值

相关代码如下:

LOOP AT G_IT_PERD INTO G_WA_PERD.

    CONCATENATE C_NAME G_WA_PERD-YEAR G_WA_PERD-MONTH INTO T_NAME.

    ASSIGN COMPONENT T_NAME OF STRUCTURE <FS_DYNTABLE> TO <I_FIELD>.  "将<FS_DYNTABLE> 的 t_name 组件分配给 <I_FIELD>

CONCATENATE G_WA_PERD-YEAR G_WA_PERD-MONTH INTO L_BEG.
*      CALL FUNCTION 'SLS_MISC_GET_LAST_DAY_OF_MONTH'
*        EXPORTING
*          DAY_IN            = L_BEG
*        IMPORTING
*          LAST_DAY_OF_MONTH = L_END
*        EXCEPTIONS
*          DAY_IN_NOT_VALID  = 1
*          OTHERS            = 2.
SORT P9011 DESCENDING .
READ TABLE P9011 WITH KEY  BEGDA+0(6L_BEG   .
IF sy-SUBRC .
<I_FIELD> P9011-ZZHR_MKHF.
wa_jixiao-col1 P9011-ZZHR_MKHF.
APPEND wa_jixiao  to i_jixiao .
ENDIF.
  ENDLOOP.

5.当然还有HR中怎么取数

此处涉及技术: infotype   PXXXX表 等问题,相关具体文档 看看 我上传的(HR学习资料),大致的代码如下:

"员工姓名
  SORT  P0001  DESCENDING  .
  SORT  p0000  DESCENDING .
  clear P0001 .
  CLEAR p0000.

 " RP_PROVIDE_FROM_last p0000 space pn-begda pn-endda .


  LOOP AT  p0000 where  massn 'ZD'.
    exit .
  ENDLOOP.

  IF  p0000-begda is INITIAL.

 LOOP AT  P0001 WHERE  begda <= pn-endda and endda >= pn-endda  .
  G_WA_OUTTAB-ENAME P0001-ENAME.
  G_WA_OUTTAB-KOSTL P0001-KOSTL.  "成本中心
  G_WA_OUTTAB-ORGEH P0001-ORGEH.   "组织单位
  G_WA_OUTTAB-PLANS P0001-PLANS.   "岗位
  G_WA_OUTTAB-PERSK P0001-PERSK.  "员工子组
  G_WA_OUTTAB-PERNR  P0001-PERNR .  "员工编号
  G_WA_OUTTAB-DAYPS  P0001-BEGDA.
 EXIT .

ENDLOOP.

ELSE.

LOOP AT  P0001 WHERE  BEGDA P0000-BEGDA AND ENDDA p0000-endDA  .

  G_WA_OUTTAB-ENAME P0001-ENAME.
  G_WA_OUTTAB-KOSTL P0001-KOSTL.  "成本中心
  G_WA_OUTTAB-ORGEH P0001-ORGEH.   "组织单位
  G_WA_OUTTAB-PLANS P0001-PLANS.   "岗位
  G_WA_OUTTAB-PERSK P0001-PERSK.  "员工子组
  G_WA_OUTTAB-PERNR  P0001-PERNR .  "员工编号
  G_WA_OUTTAB-DAYPS  P0001-BEGDA.
 EXIT .
ENDLOOP.

  ENDIF.

***信息类型0001组织分配****"
"  RP_PROVIDE_FROM_LAST P0001 SPACE PN-BEGDA PN-BEGDA .
"  IF PNP-SW-FOUND = '1' .
***员工子组描述***
  IF g_wa_outtab-PERSK IS NOT INITIAL.
    SELECT SINGLE PTEXT INTO g_wa_outtab-PTEXT FROM T503T
                                       WHERE SPRSL SY-LANGU
                                        AND  PERSK g_wa_outtab-PERSK .
  ENDIF.
***员工组织***
    IF g_wa_outtab-orgeh IS NOT INITIAL.
      SELECT SINGLE orgtx INTO g_wa_outtab-STEXT
        FROM t527x  WHERE orgeh g_wa_outtab-orgeh
         AND  sprsl sy-langu
          AND begda < pn-BEGDA
         AND endda >  pn-BEGDA.
    ENDIF.
***员工岗位***
    IF g_wa_outtab-plans IS NOT INITIAL.
      SELECT SINGLE plstx INTO g_wa_outtab-plstx
        FROM t528t  WHERE plans g_wa_outtab-plans
         AND otype  'S'
         AND sprsl sy-langu
                  AND begda <=  pn-BEGDA
         AND endda >= pn-BEGDA.

    ENDIF.
***成本中心***
    IF g_wa_outtab-kostl IS NOT INITIAL.
      SELECT SINGLE ktext INTO  g_wa_outtab-ktext FROM cskt
                                WHERE spras sy-langu
                                AND kokrs 'COWM'
                                AND kostl g_wa_outtab-kostl.
    ENDIF.

"  ENDIF.

***信息类型0041
***入司时间***
  PROVIDE dar01 dat01 FROM p0041 BETWEEN pn-begda and pn-endda
                                       WHERE p0041-dar01  =  'Z1'.
    g_wa_outtab-LZRQ p0041-dat01.
  ENDPROVIDE.

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值