*&---------------------------------------------------------------------*
*& Report  ZYIDENTIFY_ID
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ZYIDENTIFY_ID.
TABLES: ZYIDPRV,ZYREGION.


DATA CODE(18TYPE C."ID的类型及长度
DATA LENGTH TYPE I."存储长度的值
DATA PRVCODE TYPE STRING."存取×××中省份的字段
DATA REGIONCODE TYPE STRING."存储地区的字段
DATA DATE TYPE D.
DATA YEAR TYPE I.
DATA AGE(4TYPE C.
DATA SEX(2TYPE C.
DATA NUM TYPE I.
DATA MOD TYPE I.


*声明一个内表
DATABEGIN OF ITAB OCCURS 0,
  CODE(18TYPE C,
   DAT TYPE D,
  SE(2TYPE C,
   AG(4)  TYPE C,
  PRV TYPE STRING,
  REG TYPE STRING,
  END OF ITAB.

DATABEGIN OF GT_FINNAL_TEXT OCCURS 0,
   CODE(18TYPE C,
   DAT(4),
  SE(2),
   AG(4),
  PRV(10),
  REG(10),
  END OF  GT_FINNAL_TEXT.

*&---------------------------------------------------------------------*
*  ALV相关变量
*&---------------------------------------------------------------------*
TYPE-POOLS SLIS.
DATA:GS_LAYOUT TYPE SLIS_LAYOUT_ALV,
      G_REPID  TYPE SY-REPID VALUE 'SY-REPID',
     IT_FIELD  TYPE SLIS_T_FIELDCAT_ALV,
     WA_FIELD  TYPE SLIS_FIELDCAT_ALV.


*&---------------------------------------------------------------------*
*&      Form  FRM_FIELDCAT_INIT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM FRM_FIELDCAT_INIT.
*&---------------------------------------------------------------------*
*  宏定义
*&---------------------------------------------------------------------*
  DEFINE ADD_FIELD.
    CLEAR WA_FIELD.
    WA_FIELD-FIELDNAME    = &1.
    WA_FIELD-SELTEXT_S = &2.
    APPEND WA_FIELD TO IT_FIELD.
  END-OF-DEFINITION.
*&---------------------------------------------------------------------*
*  宏调用
*&---------------------------------------------------------------------*

  ADD_FIELD 'CODE' '×××号码'.
  ADD_FIELD 'DAT' '出生日期'.
  ADD_FIELD 'SE' '性别'.
  ADD_FIELD 'AG' '年龄'.
*ADD_FIELD 'AIRPFROM' '号码有效性验证'.
  ADD_FIELD 'PRV' '所属省份'.
  ADD_FIELD 'REG' '所属地区'.

ENDFORM.                    "FRM_FIELDCAT_INIT

SELECT-OPTIONS: ID FOR CODE NO INTERVALS."输入框,×××id

INITIALIZATION.
  PERFORM FRM_FIELDCAT_INIT.

START-OF-SELECTION.

  PERFORM GET_DATA.
  PERFORM FRM_DOWNLOAD_DATA.
  PERFORM DISPLAY.



*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM GET_DATA.
  LOOP AT ID"批量输出,需要用循环
    CONDENSE ID NO-GAPS.
    LENGTH = STRLENID-LOW )."要加low,不然长度增加3.

*a) 判断×××id的长度时候为15偶然8
    IF LENGTH <> 15 AND LENGTH <> 18.
      MESSAGE 'The length of ID number is not valid, please check' TYPE 'I'.
    ENDIF.
    ITAB-CODE = ID-LOW.


*b) 检查省份
    PRVCODE = ID-LOW+0(2)."将×××前两位的值付给prvcode,等同于MOVE ID-LOW+0(2) TO PRVCODE

    SELECT SINGLE * FROM ZYIDPRV WHERE ZYPRVC = PRVCODE.
    IF SY-SUBRC <> 0.
      MESSAGE 'The province code is not valid, please check' TYPE 'I'.
    ENDIF.
    ITAB-PRV = ZYIDPRV-ZPRVCTX.


*c)  检查地区
    REGIONCODE = ID-LOW+0(6).
    SELECT SINGLE * FROM ZYREGION WHERE ZREGION = REGIONCODE.
    IF SY-SUBRC <> 0.
      MESSAGE 'Can not fin region information, please check' TYPE 'I'.
    ENDIF.
    ITAB-REG = ZYREGION-ZREGTX.

*d)  检查出生日期
    IF LENGTH = 15.
      DATE = ID-LOW+6(6).
    ELSE.
      DATE = ID-LOW+6(8).
    ENDIF.
    ITAB-DAT = DATE.


*e)  计算年龄
    IF LENGTH = 15.
      YEAR = ID-LOW+6(4).
    ELSE.
      YEAR = ID-LOW+6(4).
    ENDIF.
    AGE = SY-DATUM+0(4) - YEAR.
    ITAB-AG = AGE.




*f)  检查性别
    IF LENGTH = 18.
      NUM = ID-LOW+14(4).
      MOD = NUM MOD 2.
      IF MOD = 0.
        SEX = '男'.
      ELSE.
        SEX = '女'.
      ENDIF.
    ENDIF.
    ITAB-SE = SEX.
    APPEND ITAB.
  ENDLOOP.
ENDFORM.                    "GET_DATA

*&---------------------------------------------------------------------*
*&      Form  DISPLAY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM DISPLAY.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM = G_REPID
      IT_FIELDCAT        = IT_FIELD
      IS_LAYOUT          = GS_LAYOUT
      I_SAVE             = 'A'
    TABLES
      T_OUTTAB           = ITAB.  "输出的内表
ENDFORM.                    "DISPLAY





*&---------------------------------------------------------------------*
*&      Form  FRM_DOWNLOAD_TITLE
*&---------------------------------------------------------------------*
*       下载数据的表头
*----------------------------------------------------------------------*
FORM FRM_DOWNLOAD_TITLE.

  PERFORM FRM_CLEAR_TITLE.
*  CLEAR  GT_FINNAL_TEXT.

  CALL FUNCTION 'WS_DOWNLOAD'
    EXPORTING
      FILENAME                = 'd:\chensx\saptest.xls'
      FILETYPE                = 'DAT'
      MODE                    = 'A'
    TABLES
      DATA_TAB                = GT_FINNAL_TEXT
    EXCEPTIONS
      FILE_OPEN_ERROR         = 1
      FILE_WRITE_ERROR        = 2
      INVALID_FILESIZE        = 3
      INVALID_TABLE_WIDTH     = 4
      INVALID_TYPE            = 5
      NO_BATCH                = 6
      UNKNOWN_ERROR           = 7
      GUI_REFUSE_FILETRANSFER = 8
      OTHERS                  = 9.
ENDFORM.                  "frm_download_title

*&---------------------------------------------------------------------*
*&      Form  CLEAR_TITLE
*&---------------------------------------------------------------------*
*       清空原有的表头,再从新加载
*----------------------------------------------------------------------*
FORM FRM_CLEAR_TITLE.
  CLEAR  GT_FINNAL_TEXT.
  GT_FINNAL_TEXT-CODE      = '×××号码'.
  GT_FINNAL_TEXT-DAT   = '出生年月日'.
  GT_FINNAL_TEXT-SE   = '性别'.
  GT_FINNAL_TEXT-AG   = '年龄'.
  GT_FINNAL_TEXT-PRV  =  '省份'.
  GT_FINNAL_TEXT-REG  = '区域'.
  APPEND GT_FINNAL_TEXT.
  CLEAR GT_FINNAL_TEXT.
ENDFORM.                    "FRM_CLEAR_TITLE

*&---------------------------------------------------------------------*
*&      Form  FRM_DOWNLOAD_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM FRM_DOWNLOAD_DATA.
  PERFORM FRM_DOWNLOAD_TITLE.
  DATA: LT_FINNAL_DATA LIKE ITAB OCCURS 0 WITH HEADER LINE.
  LOOP AT ITAB.
    MOVE-CORRESPONDING ITAB TO LT_FINNAL_DATA.
    APPEND LT_FINNAL_DATA.
    CLEAR  :LT_FINNAL_DATA,ITAB.
  ENDLOOP.
  CALL FUNCTION 'WS_DOWNLOAD'
    EXPORTING
      FILENAME                = 'd:\chensx\saptest.xls'
      FILETYPE                = 'DAT'
      MODE                    = 'A'
    TABLES
      DATA_TAB                = LT_FINNAL_DATA
    EXCEPTIONS
      FILE_OPEN_ERROR         = 1
      FILE_WRITE_ERROR        = 2
      INVALID_FILESIZE        = 3
      INVALID_TABLE_WIDTH     = 4
      INVALID_TYPE            = 5
      NO_BATCH                = 6
      UNKNOWN_ERROR           = 7
      GUI_REFUSE_FILETRANSFER = 8
      OTHERS                  = 9.
ENDFORM.                    "FRM_DOWNLOAD_DATA