2008年07月28日

I_OI_DOCUMENT_PROXYを試す

I_OI_DOCUMENT_PROXYにドキュメントタイプを渡すといくつかのクライアントアプリを操作できる。その実験。

とりあえずPower PointとAdobe ReaderとWordpadとExcelとWordが動いた。VisioとかAccessとかCOMオブジェクトなら一通りいけそうな気配。

■サンプルソース
*
PARAMETERS p_powpnt RADIOBUTTON GROUP g1.
PARAMETERS p_pdf RADIOBUTTON GROUP g1.
PARAMETERS p_wordpd RADIOBUTTON GROUP g1.
PARAMETERS p_excel RADIOBUTTON GROUP g1.
PARAMETERS p_word RADIOBUTTON GROUP g1.
*
DATA o_ole_controller TYPE REF TO i_oi_container_control.
DATA o_ole_document TYPE REF TO i_oi_document_proxy.
*
DATA l_retcode TYPE soi_ret_string.
*ole controller
CALL METHOD c_oi_container_control_creator=>get_container_control
IMPORTING
control = o_ole_controller
retcode = l_retcode.
*initialize
CALL METHOD o_ole_controller->init_control
EXPORTING
r3_application_name = 'Document'
inplace_enabled = 'X'
parent = cl_gui_container=>default_screen
IMPORTING
retcode = l_retcode.
*
DATA l_document_type TYPE char64.
IF p_powpnt = 'X'.
l_document_type = 'PowerPoint.Show'.
ELSEIF p_pdf = 'X'.
l_document_type = 'AcroExch.Document'.
ELSEIF p_wordpd = 'X'.
l_document_type = 'Wordpad.Document.1'.
ELSEIF p_excel = 'X'.
l_document_type = 'Excel.Sheet'.
ELSEIF p_word = 'X'.
l_document_type = 'Word.Document'.
ENDIF.
*HKEY_CLASSES_ROOTより。
*他にもいろいろあるかも。
*ole document
CALL METHOD o_ole_controller->get_document_proxy
EXPORTING
document_type = l_document_type
document_format = i_oi_container_control=>document_format_compound
IMPORTING
document_proxy = o_ole_document.
*表示
CALL METHOD o_ole_document->create_document
EXPORTING
open_inplace = ''.
*オブジェクトの開放を防ぐ...
WRITE 'complete'.

posted by zabap at 23:30| クライアントPCとの連帯

2008年07月24日

スプールをPDFへ変換してPC上で表示する

変換されたPDFをファイルとしてダウンロードせずに、直接Adobe Readerで表示する。
これを応用するとABAPでファイルサーバーを構築することが可能。そのうち作ってみる予定。

■手法
I_OI_CONTAINER_CONTROLとI_OI_DOCUMENT_PROXYを使用するとWord、Excel、Adobe Readerなどを直接操作することが可能。サンプルでは手続き型プログラミングになっているが、オブジェクト指向プログラミングを用いたほうがいい。

■サンプルソース
*1 WRITEの出力先をスプールにする
*2 SPOOLをPDF変換
*3 READERで直接表示(Adobe Reader 8で確認)
*
DATA g_spono TYPE sy-spono.
DATA o_ole_controller TYPE REF TO i_oi_container_control.
DATA o_ole_document TYPE REF TO i_oi_document_proxy.
*
PERFORM write_to_spool CHANGING g_spono.
PERFORM convert_spool_to_pdf USING g_spono.
*
*&--------------------------------------------------------------------*
*& Form write_to_spool
*&--------------------------------------------------------------------*
FORM write_to_spool CHANGING c_spono TYPE sy-spono.
DATA ltbl_company TYPE STANDARD TABLE OF t001.
DATA lst_company TYPE t001.
*
SELECT *
INTO CORRESPONDING FIELDS OF TABLE ltbl_company
FROM t001.
*
NEW-PAGE PRINT ON
DESTINATION space
COVER TEXT 'document'
IMMEDIATELY space
KEEP IN SPOOL 'X'
NEW LIST IDENTIFICATION 'X'
NO DIALOG.
*
LOOP AT ltbl_company INTO lst_company.
WRITE :/ lst_company-bukrs.
ENDLOOP.
*
NEW-PAGE PRINT OFF.
c_spono = sy-spono.
*
ENDFORM. "write_to_spool
*&--------------------------------------------------------------------*
*& Form convert_spool_to_pdf
*&--------------------------------------------------------------------*
FORM convert_spool_to_pdf USING u_spono TYPE sy-spono.
DATA ltbl_pdf LIKE STANDARD TABLE OF tline.
DATA l_filesize TYPE i.
DATA l_filename TYPE string.
DATA l_rspoid TYPE rspoid.
l_rspoid = u_spono.
l_filename = 'C:\spool.pdf'.
*
CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'
EXPORTING
src_spoolid = l_rspoid
IMPORTING
pdf_bytecount = l_filesize
TABLES
pdf = ltbl_pdf
EXCEPTIONS
err_no_abap_spooljob = 1
err_no_spooljob = 2
err_no_permission = 3
err_conv_not_possible = 4
err_bad_destdevice = 5
user_cancelled = 6
err_spoolerror = 7
err_temseerror = 8
err_btcjob_open_failed = 9
err_btcjob_submit_failed = 10
err_btcjob_close_failed = 11
OTHERS = 12.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

*表示
*
DATA l_retcode TYPE soi_ret_string.
*ole controller
CALL METHOD c_oi_container_control_creator=>get_container_control
IMPORTING
control = o_ole_controller
retcode = l_retcode.
*initialize
CALL METHOD o_ole_controller->init_control
EXPORTING
r3_application_name = 'Document'
inplace_enabled = 'X'
parent = cl_gui_container=>default_screen
IMPORTING
retcode = l_retcode.
*
DATA l_reg_value TYPE string.
DATA l_document_type TYPE char64.
*.pdfのドキュメントタイプ取得
CALL METHOD cl_gui_frontend_services=>registry_get_value
EXPORTING
root = cl_gui_frontend_services=>hkey_classes_root
key = '.pdf'
value = space
IMPORTING
reg_value = l_reg_value
EXCEPTIONS
get_regvalue_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5
.
IF sy-subrc <> 0.
l_document_type = 'AcroExch.Document'.
ELSE.
l_document_type = l_reg_value.
ENDIF.
*ole document
CALL METHOD o_ole_controller->get_document_proxy
EXPORTING
document_type = l_document_type
document_format = i_oi_container_control=>document_format_compound
IMPORTING
document_proxy = o_ole_document.
*pdfの表示
CALL METHOD o_ole_document->open_document_from_table
EXPORTING
document_size = l_filesize
document_table = ltbl_pdf
no_flush = ''
open_inplace = ''.
*オブジェクトの開放を防ぐ...
WRITE 'complete'.
ENDFORM. "convert_spool_to_pdf

posted by zabap at 23:30| クライアントPCとの連帯

2008年07月16日

スプールをPDFへ変換してPCへダウンロードする

スプールをPDFに変換することが可能。

■サンプルソース
*1 WRITEの出力先をスプールにする
*2 SPOOLをPDF変換
*3 C:\spool.pdfへダウンロード
* ファイル保存ダイアログとかつけるといいかも。
DATA g_spono TYPE sy-spono.
*
PERFORM write_to_spool CHANGING g_spono.
PERFORM convert_spool_to_pdf USING g_spono.
*
*&--------------------------------------------------------------------*
*& Form write_to_spool
*&--------------------------------------------------------------------*
FORM write_to_spool CHANGING c_spono TYPE sy-spono.
DATA ltbl_company TYPE STANDARD TABLE OF t001.
DATA lst_company TYPE t001.
*
SELECT *
INTO CORRESPONDING FIELDS OF TABLE ltbl_company
FROM t001.
*
NEW-PAGE PRINT ON
DESTINATION space
COVER TEXT 'document'
IMMEDIATELY space
KEEP IN SPOOL 'X'
NEW LIST IDENTIFICATION 'X'
NO DIALOG.
*
LOOP AT ltbl_company INTO lst_company.
WRITE :/ lst_company-bukrs.
ENDLOOP.
*
NEW-PAGE PRINT OFF.
c_spono = sy-spono.
*
ENDFORM. "write_to_spool
*&--------------------------------------------------------------------*
*& Form convert_spool_to_pdf
*&--------------------------------------------------------------------*
FORM convert_spool_to_pdf USING u_spono TYPE sy-spono.
DATA ltbl_pdf LIKE STANDARD TABLE OF tline.
DATA l_filesize TYPE i.
DATA l_filename TYPE string.
DATA l_rspoid TYPE rspoid.
l_rspoid = u_spono.
l_filename = 'C:\spool.pdf'.
*
CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'
EXPORTING
src_spoolid = l_rspoid
IMPORTING
pdf_bytecount = l_filesize
TABLES
pdf = ltbl_pdf
EXCEPTIONS
err_no_abap_spooljob = 1
err_no_spooljob = 2
err_no_permission = 3
err_conv_not_possible = 4
err_bad_destdevice = 5
user_cancelled = 6
err_spoolerror = 7
err_temseerror = 8
err_btcjob_open_failed = 9
err_btcjob_submit_failed = 10
err_btcjob_close_failed = 11
OTHERS = 12.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
*
*
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
bin_filesize = l_filesize
filename = l_filename
filetype = 'BIN'
TABLES
data_tab = ltbl_pdf
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
OTHERS = 22.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. "convert_spool_to_pdf


posted by zabap at 23:30| クライアントPCとの連帯

2008年07月14日

日付の形式チェック

日付の形式チェックサンプル。
他アプリからの転送ファイルをチェックするときなどに使用する。
うるう年にも対応してる模様。

■サンプルソース
PARAMETERS p_y4mmdd TYPE dats.
*
CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
EXPORTING
date = p_y4mmdd
EXCEPTIONS
plausibility_check_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
WRITE p_y4mmdd.
ENDIF.


posted by zabap at 23:30| 日付と時刻の処理

2008年07月09日

ロングテキストの利用

品目テキスト(長)や購買発注テキスト(長)などのロングテキストは共通フレームワークで管理されている。汎用モジュールSAVE_TEXTやREAD_TEXTを使用すると、ABAPでロングテキストを制御することが可能。

バッチインプットの後にロングテキストを登録したり、オリジナルのテキストオブジェクトを作成してアドオンで使用するなど用途の幅は広い。

■サンプルソース
***テーブルとビューの説明
*STXH ヘッダ
*STXL 明細。テキストはバイナリで保存される。
*TTXOB オブジェクトのマスタ
*V_TTXOBI オブジェクトのメンテナンス。SM30を使用して更新する。
* 自分で作成してオリジナルのテキストオブジェクトを作成可能。
*
PARAMETERS p_tline TYPE tdline.
PARAMETERS p_save RADIOBUTTON GROUP g1.
PARAMETERS p_show RADIOBUTTON GROUP g1.
*
DATA lst_txtheader TYPE thead.
DATA lst_txtline TYPE tline.
DATA ltbl_txtline TYPE STANDARD TABLE OF tline.
*キー値
*ここでは品目マスタの基本テキスト
DATA item_code TYPE tdobname VALUE 'ITEM'.
DATA id TYPE tdid VALUE 'GRUN'.
DATA object TYPE tdobject VALUE 'MATERIAL'.
*他のオブジェクトやIDなどの情報はテーブルSTXLを調べればだいたいわかる。
*
START-OF-SELECTION.
IF p_save = 'X'.
*ロングテキストを保存する。
lst_txtheader-tdobject = object.
lst_txtheader-tdname = item_code .
lst_txtheader-tdid = id.
lst_txtheader-tdspras = sy-langu.
lst_txtline-tdline = p_tline .
*
APPEND lst_txtline TO ltbl_txtline.
CALL FUNCTION 'SAVE_TEXT'
EXPORTING
header = lst_txtheader
savemode_direct = 'X'
TABLES
lines = ltbl_txtline
EXCEPTIONS
id = 1
language = 2
name = 3
object = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ELSEIF p_show = 'X'.
*ロングテキストを読み込む
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = id
language = sy-langu
name = item_code
object = object
TABLES
lines = ltbl_txtline
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
LOOP AT ltbl_txtline INTO lst_txtline.
WRITE / lst_txtline-tdline.
ENDLOOP.
ENDIF.

posted by zabap at 23:30| 小技