Programming/ABAP/Tips

Last-modified: 2007-03-01 (木) 14:02:02

Code Tips

文字列の比較

DATA: str1 TYPE string,
str2 TYPE string.

str1 = 'ABAP Objects'.
str2 = 'Objects'.

IF str1 CS str2.
WRITE: / str2, 'is contained from position', sy-fdpos, 'in', str1.
ENDIF.

通貨データ内部形式⇔外部形式変換

REPORT  ysz_currency_test01.

* bseg-wrbtr : 会計伝票明細-伝票通貨額(CURR 13.2)
DATA : int_price TYPE bseg-wrbtr.         " 内部形式用変数
DATA : ext_price TYPE bapicurr-bapicurr.  " 外部形式用変数
DATA : ret TYPE bapireturn.

* 内部形式 : 100,000円
int_price = '1000.00'.

* 内部形式 ⇒ 外部形式
CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_EXTERNAL'
  EXPORTING
    currency        = 'JPY'
    amount_internal = int_price
  IMPORTING
    amount_external = ext_price.
WRITE: / int_price, ' => ', ext_price.    " 1,000.00   =>  100,000.0000

* 外部形式 ⇒ 内部形式
CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_INTERNAL'
  EXPORTING
    currency             = 'JPY'
    amount_external      = ext_price
    max_number_of_digits = '13'
  IMPORTING
    amount_internal      = int_price
    return               = ret.
WRITE: / ext_price, ' => ', int_price.    " 100,000.0000   =>  1,000.00

ファイルからの読み込み

DATA f TYPE string.
DATA l TYPE string.
f = '/usr/test.txt'.

OPEN DATASET f FOR INPUT
IN TEXT MODE.
DO.
READ DATASET f INTO l.
IF sy-subrc NE 0.
EXIT.
ENDIF.
WRITE / l.
ENDDO.

CLOSE DATASET f.

millisecondまで含むタイムスタンプの出力

DATA:
* 長形式(長さ11の小数点以下桁数7のデータタイプp)
l_st TYPE timestampl.
DATA: time_char(32) TYPE c.

GET TIME STAMP FIELD l_st.
MOVE l_st TO time_char.
* 頭のスペースを取り除く
CONDENSE time_char.

WRITE:/ 'TIME STAMP : ' , time_char.
WRITE:/ 'YYYYMMDD : ', time_char+0(8). " show date
WRITE:/ 'HHMMSS : ', time_char+8(6). " show time
WRITE:/ 'mmm : ', time_char+15(3). " show milliseconds

結果

TIME STAMP : 20061127024720.6008920
YYYYMMDD : 20061127
HHMMSS : 024720
mmm : 600

Lock Object利用によるロック

PARAMETER param TYPE c LENGTH 10 LOWER CASE DEFAULT 'test'.
PARAMETER p1 TYPE YSZTEST01-MANDT DEFAULT '200'.

START-OF-SELECTION.
  CALL FUNCTION 'ENQUEUE_EZ_YSZTEST01'
      EXPORTING
           mode_ysztest01 = 'E'
           mandt          = p1
           col1           = 'TEST'
*         X_KEYFIELD1            = ' '
*         X_KEYFIELD2            = ' '
*         X_KEYFIELD3            = ' '
         _SCOPE             = '2'
*         _WAIT              = ' '
*         _COLLECT           = ' '
*   If exceptions are not used, message is displayed within FM
    EXCEPTIONS
         foreign_lock       = 1
         system_failure     = 2
         OTHERS             = 3.

  IF sy-subrc <> 0.
*   Retrieve message displayed within Function Module
    MESSAGE ID     sy-msgid
              TYPE   'I'
              NUMBER sy-msgno
              WITH   sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    EXIT.
  else.
    write:/ 'ロックかけちゃいました。SM12で確認してください。'.
  ENDIF.

Application Log出力サンプル

REPORT  ysz_aplog01.
*----- ローカル変数定義
DATA : lds_islog TYPE bal_s_log,       "BAL_LOG_CREATE用
       lds_ismsg TYPE bal_s_msg,       "BAL_LOG_MSG_ADD用
*         LDF_IINUPDATETASK TYPE BOOLEAN, "BAL_DB_SAVE用
       ldt_loghandle TYPE bal_t_logh,  "BAL_DB_SAVE用(ログハンドルテーブル)
       ldf_save_all TYPE boolean,      "BAL_DB_SAVE用
       ldf_loghandle TYPE balloghndl,  "ログハンドル
       ldf_text(100) TYPE c.

*----- OBJECT, SUBOBJECT定義:SLG0にて定義済みの値
CONSTANTS : lcf_object(4)    TYPE c VALUE 'Z_SZ',
            lcf_subobject(4) TYPE c VALUE 'Z_SZ'.

*----- ローカル変数初期化
CLEAR: lds_islog,
       lds_ismsg,
       ldf_save_all,
       ldf_loghandle.

*----- ログヘッダ作成
* ログヘッダ情報設定
lds_islog-object    = lcf_object.
lds_islog-subobject = lcf_subobject.
lds_islog-aluser    = sy-uname.
lds_islog-alprog    = sy-repid.
* ログヘッダ作成
CALL FUNCTION 'BAL_LOG_CREATE'
  EXPORTING
    i_s_log                 = lds_islog
  IMPORTING
    e_log_handle            = ldf_loghandle
  EXCEPTIONS
    log_header_inconsistent = 1
    OTHERS                  = 2.

* 出力するメッセージ
ldf_text = 'テストメッセージ'.

lds_ismsg-msgty = 'I'.
lds_ismsg-msgid = 'YMAZ02'.
lds_ismsg-msgno = '001'.
lds_ismsg-msgv1 = ldf_text.
lds_ismsg-probclass = '4'.

CALL FUNCTION 'BAL_LOG_MSG_ADD'
  EXPORTING
    i_log_handle              = ldf_loghandle
    i_s_msg                   = lds_ismsg
*   IMPORTING
*     E_S_MSG_HANDLE            =
*     E_MSG_WAS_LOGGED          =
*     E_MSG_WAS_DISPLAYED       =
  EXCEPTIONS
    log_not_found             = 1
    msg_inconsistent          = 2
    log_is_full               = 3
    OTHERS                    = 4.

* ログハンドルをログハンドルテーブルに追加
APPEND ldf_loghandle TO ldt_loghandle.

*----- アプリケーションログを保存
CALL FUNCTION 'BAL_DB_SAVE'
  EXPORTING
    i_save_all       = 'X'
    i_t_log_handle   = ldt_loghandle
  EXCEPTIONS
    log_not_found    = 1
    save_not_allowed = 2
    numbering_error  = 3
    OTHERS           = 4.

WRITE:/ 'Finished'.

ABAP Classサンプル

ABAP Object作成例


REPORT zz_cl_employee.
*---------------------------------------------------------------------*
* CLASS employee DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS zz_employee DEFINITION.
PUBLIC SECTION.
METHODS: constructor IMPORTING pernr1 TYPE persno,
display_name.

PRIVATE SECTION.
DATA: pernr TYPE persno.
ENDCLASS. "employee DEFINITION

*---------------------------------------------------------------------*
* CLASS employee IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS zz_employee IMPLEMENTATION.
METHOD constructor.
me->pernr = pernr1.
ENDMETHOD. "constructor

METHOD display_name.
DATA: firstname TYPE vorna,
lastname TYPE nachn.
SELECT SINGLE vorna nachn
INTO (firstname, lastname)
FROM pa0002 WHERE pernr EQ me->pernr.
WRITE:/ me->pernr, firstname, lastname.
ENDMETHOD. "display_name
ENDCLASS. "employee IMPLEMENTATION

*---------------------------------------------------------------------*
* CLASS zz_employeeを利用
*---------------------------------------------------------------------*
DATA: emp1 TYPE REF TO zz_employee.

PARAMETERS empno TYPE persno.

START-OF-SELECTION.
CREATE OBJECT emp1 EXPORTING pernr1 = empno.
CALL METHOD emp1->display_name.
END-OF-SELECTION.