Calculating PI in ABAP

およそ 4 年振りの SAP ネタです。

つい先日、これまで書き散らしていた諸々のソース コードを整理して、GitHub やら TFS にアップロードしていたのですが、その中に 2009 年に書いた ABAP のコードを見つけました。2009 年と言えば社会人 2 年目。暇つぶしに ABAP で円周率を計算していたとは、舐めた社員ですな。当時、社内のポータル サイトで共有したような記憶がありますが、まあ別にここで公開してもいいでしょう、ということで GitHub にアップロードしました。

https://github.com/msmania/pi

意外にも、GitHub には多くの ABAP のコードがアップロードされていて驚きました。円周率なんて計算してもしょうがないですが、GItHub にはビジネス的に有用なプログラムもあるはずです。

なお、アルゴリズムとしてはマチンの公式を使っています。

もう ABAP については記憶の彼方にいってしまってほとんど覚えていないのですが、aRFC を使って複数ワークプロセスに処理を分散させるぐらいのことまでは実現していました。当時のメモを見ると、今後に向けた改善点として、以下の 3 つが書かれていました。なんかうける。

  • N 型より INT2 型を使う
  • 汎用モジュールからの戻り値を ABAP メモリか SAP メモリに展開してコピーしないようにする
  • 算術幾何平均を使う

といっても、コードを紹介するだけだと面白くないので、久々に NetWeaver の Trial 版をインストールしてみました。4 年前に書いたインストールの記事に関しては、幾つかのブログからリンクして頂けているようで、アクセス数がそれなりにあります。公開資料が少ないこともあって、需要はあるのでしょう。それに ITPro の某特集のように情報がいつまでも古いと申し訳ないですし。

1. まずはダウンロード

かつて SDN (SAP Developer Network) と呼ばれていたサイトは、SCN (SAP Community Network) という名前に変わっていました。開発者以外の人にも見てほしい、ということなんでしょうかね。

その SCN とやらでは、どこのリンクを辿れば ABAP がダウンロードできるのか分かりません。そこで、ダウンロード ページで "ABAP Trial" で検索して、以下のページを見つけました。このページの "Trial Version" というボタンをクリックしてユーザー情報を登録すると、真のダウンロード ページへのリンクを含むメールを受け取ることができます。なんか随分めんどくさくなってるなー。

SAP NetWeaver Application Server ABAP 7.03 64-bit Trial | SAP Store
https://store.sap.com/sap/cpa/ui/sid/0000000218

メールに書いてあったリンクから、↓ のようなページに辿り着きます。NetWeaver 7.03 のダウンロードページなのに、なぜか 7.02 のリンクもあります。とりあえず全部ダウンロードしておきましょう。

image

IE の場合だけかもしれませんが、ここで単純にリンクをクリックすると、rar ファイルをテキストとして開こうとしてブラウザーが大変なことになるので、「右クリック → ファイルを保存」で保存するようにして下さい。

ダウンロードしたファイルは ↓ の 5 つ。全部で 10GB ちょっとです。拡張子は rar、exe、zip とバラバラです。

image

NetWeaver 7.02 と GUI for Java は、成り行きでダウンロードしただけで今回は使いません。使うのは以下の 2 つのファイルです。詳しく調べていませんが、すでに NetWeaver 7.03 ってのも古いのでしょうかね。時代は HANA!クラウド!なのかな。

  • ABAP_7_03_SP04_64_bit_Trial_3_9_2_GB.rar
  • ABAP_SAP_GUI_for_Windows_7_30_PL4_HF1_121_MB.exe

Hyper-V の仮想マシンに入れるので、rar を解凍して、ISO に固めなおしておきます。元の rar と比べて大してサイズはほとんど変わらず・・・。初めから ISO でダウンロードできればいいのに。

2. サーバーの準備

そう言えば、前回の記事でインストールしていたのは 32bit の NetWeaver でした。ブログを見ると、64bit の無償版は提供されていなかったらしく、なんだか時代の変遷を感じます。今回は潤沢なリソースを使って、さくっとインストールを終わらせようと思います。用意したのはこちら ↓

  • OS: Windows Server 2012 R2 (Hyper-V 仮想マシン)
  • 仮想プロセッサー コア数: 4
  • メモリ: 8GB
  • ディスク: 100GB on SSD
  • ネットワーク構成: Windows Server 2012 R2 ドメイン

8GB あれば余裕じゃん、ってことでスワップ領域の設定は特に変えません。VHD は、OS をインストールしたディスクとは別に用意しました。インストール前のディスク構成はこんな感じ。

image

3. sapinst の実行

仮想マシンを起動し、作っておいた ISO をマウントし、以下のパスにある sapinst.exe を起動します。同じフォルダーに PowerShell スクリプトがあってちょっと気になる。名前からしてクラスター環境へのインストール用か。

SAP_NetWeaver_703_Installation_Master\DATA_UNITS\BS2011_IM_WINDOWS_X86_64\sapinst.exe

image

sapinst が起動します。なんか懐かしい!

image

そう言えば SAPinst って Java がないと駄目なんじゃなかったっけ、と思いましたが、今回は特に JRE も JDK も入れていません。プロセス ツリーを見ると、なぜか Java が動いています。どこから来たんだこいつは。

image

どうやら、sapinst.exe の初回実行時に、インストール メディアに入っている SAPJVM4 が自動的に解凍されていたようです。Java.exe は %temp% にコピーされていました。バージョンを見ると、Java1.6 互換になっています。

C:\MSWORK> %temp%\sapinst_exe.2080.1425356341\jre\bin\java -version
java version "1.6.0_21"
Java(TM) SE Runtime Environment (build 6.1.021)
SAP Java Server VM (build 6.1.021, Dec 23 2010 01:45:56 – 61_REL – optU – windows amd64 – 6 – bas2:146884 (mixed mode))

話を sapinst に戻します。sapinst の画面は、前回の記事とほぼ同じです。最初の画面で、インストールシステム ABAP+MaxDB+Central System を選択し、Next をクリックします。

ログオフを求められるので、OK をクリックしてログオフし、再度同じユーザーでログオンします。

image

ライセンス条項を確認し、問題なければ accept を選んで Next をクリックします。

image

マスター パスワードの入力です。今まで通り pswd_NSP を使おうとしたら、なぜか弾かれてしまったので Password1 を使いました。

image

パスワードの要件は以下の通りです。MaxDB と NetWeaver でそれぞれ別の要件があるので面倒です。実はこの 2 つに加えて第三の要件、Windows のパスワード要件もあり、それは sapinst ではチェックしてくれないので要注意です。sapinst が OK でも Active Directory で無効なパスワードだと、インストールの最初のフェーズでエラーになります。そうなっても sapinst をやり直せばいいのですが、確実に一発で通したい場合は、入力するパスワードで Windows のユーザーを作れるかどうかを予め確認しておくのが一つの手です。

image

パスワードが通ると、以下のポップアップが出ました。前提条件を満たしていないようですが、ここは強気の続行です。No をクリックします。

image

何を満たしていなかったかと言うと、OS バージョンとスワップ領域のサイズでした。結果的にはどちらも問題になりませんでした。OS は Server 2012 R2 なので Windows 6.3 のはずですが、なぜか 6.2 と表示されています。

image

次がサマリーのページです。縦に長くなりますが、全部貼り付けます。

image

image

image

image

念のため、全部の設定項目を確認しておいたほうがよいです。特に見るべきなのは、インストール先のドライブでしょうか。ウィザードでは何も聞かれませんでしたが、上記の例だと、基本的には全て S: ドライブにインストールされるように自動的に設定されています。もし全部 C: ドライブに入れたい場合は、該当項目にチェックをつけて、Revise をクリックしてください。

今回はこのまま Next をクリックしてインストールを開始します。

先ほど触れましたが、Active Directory のパスワードの要件を満たしていないと、エラーになります。実際に引っかかりましたので、エラーの画面を紹介します。

image

このエラーの続行は不可能なので、Stop をクリックします。すると、ログ ビューアー的な画面が出てきます。

image

エラーメッセージは以下の通り。IADsUser::SetInfo がエラーになっているので、これは Active Directory で既定で有効になっている、複雑なパスワード ポリシーを満たしていないことが原因と考えられます。

ERROR      2015-03-02 20:41:36.75 [synxcuser.cpp:1883]
           CSyUserImpl::addToOS(PSyUserDataInt data, ISyProgressObserver* )
           lib=syslib module=syslib
FSL-00009  System call failed. Error -2147022651 (The password does not meet the password policy requirements. Check the minimum password length, password complexity and password history requirements.

) in execution of system call ‘IADsUser::SetInfo‘ with parameter (), line (1882) in file (synxcuser.cpp), stack trace: iaxxejsctl.cpp: 146: EJS_ControllerImpl::executeScript()
d:\depot\bas\720_rel\bc_720-2_rel\gen\optu\ntamd64\ins\sapinst\impl\src\ejs\iaxxejsbas.hpp: 461: EJS_Base::dispatchFunctionCall()
iaxxejsexp.cpp: 178: EJS_Installer::invokeModuleCall()
iaxxbaccount.cpp: 66: CIaOsAccount::createUser_impl()
synxcaccmg.cpp: 168: PSyUserInt CSyAccountMgtImpl::createUser(PSyUserDataInt, ISyProgressObserver*) const
syxxccache.cpp: 284: CSyAccountCache::getUserImpl(name="CONTOSO\SAPServiceNSP", sid="", create=true)
syxxccache.cpp: 293: CSyAccountCache::getUserImpl(name="CONTOSO\SAPServiceNSP", sid="", create=true, ISyProgressObserver* )
synxcuser.cpp: 134: CSyUserImpl::CSyUserImpl(PSyUserDataInt, bool)
synxcuser.cpp: 1669: CSyUserImpl::addToOS(PSyUserDataInt data, ISyProgressObserver* )

新たに sapinst をウィザードからやり直すときは、sapinst の生成したログをすべて削除してから sapinst.exe を実行してください。ログが残っていると、入力済みの値を使ってインストールが勝手に始まってしまいます。

Import ABAP 時の様子はこんな感じです ↓

image image

Import ABAP は何の問題もなく通過しましたが、最後から 4 つ前のフェーズ Start instance でインスタンスの起動に失敗して sapinst がエラーになりました。

image

単純に起動に失敗しただけなので、これは続行できる可能性があるエラーです。sapinst の以下のポップアップはそのままにして、とりあえず SAP インスタンスの手動起動を試みます。

image

既にデスクトップに sapmmc ができているのでそれを開いて・・・

image

アイコンが黄色になっているので、まずは止めます。

image

image

止めた後は特に何もせず、そのまま起動を行なったところ、無事起動しました。原因は不明ですが、まあよくあることです。今回は違いましたが、ここでの原因として、メモリ不足で SAP が起動できなかった、ということもあり得ます。SAP インスタンスの起動中は、タスク マネージャーなどでリソースの状態を確認しておく癖をつけておくと何かと役に立つはずです。

image

このあと SAPinst の画面で Retry をクリックし、無事インストールが終了しました。エラー対応も含めて 1 時間くらい。速い!

image

おまじないとして、この後 OS を再起動してから SAP インスタンスを起動します。起動後でもメモリ消費量は 4GB 弱だったので、仮想マシンへのメモリの割り当てを 5GB に減らしておきました。

4. SAP GUI のインストール

ABAP を使うためには、SAP GUI もインストールしないといけません。クライアント用に別の Hyper-V 仮想マシンを用意します。

無償版のパッケージに入っているインストーラーでは、いきなり SAP GUI 7.30 をインストールできないので、最初に SAP GUI 7.20 をインストールし、その後に 7.30 へのアップグレードを行ないます。7.20 だけなら Java は要らないのですが、7.30 にアップグレードするには 32bit JRE 6 か 7 が必要になります。最新の JRE 8 ではインストールできませんでした。sapinst と違って、SAPJVM はフロントエンド コンポーネント向きではないのでしょうかね。

SAP GUI 7.20 のインストーラーは ↓ のパスにあります。

Frontend&tools\SAP_GUI_for_Windows_7.20_Patchlevel_7_SDN_version_20110701_1428.exe

7.20 のインストール後、別途ダウンロードした ABAP_SAP_GUI_for_Windows_7_30_PL4_HF1_121_MB.exe を実行してアップグレードを行います。

これで SAP GUI 7.30 がインストールできました。

image

先ほどインストールした NetWeaver への接続を作ります。SID は NSP、インスタンス番号は 00 です。

image

作業用には、ユーザー名 bcuser、パスワード minisap のアカウントを使います。クライアントは 001 で。

minisap 環境で使う機会はほとんどなさそうですが、sap* と ddic ユーザーのパスワードは、インストール時に入力したマスター パスワードになっています。

ログオンできました。SAP GUI 7.30 といえど、見た目に大きな変更はないようです。それにしても懐かしい。

image

5. ABAP プログラムを書く

さて、ここからの手順はかなり記憶があやふやです。何はともあれ、トランザクション SE80 を実行します。ドロップダウンでは Local Objects を選んでおきます。シングルシステムで、移送の予定がないからです。移送とか懐かしい・・・

image

まずはクラスから作るので、メニューからクラスライブラリ – クラスを選びます。

image

適当に名前や説明を入れて保存します。

image

ローカル オブジェクトには $TMP というパッケージが自動的に割り当てられる、ということをトレーニングで覚えた気がします。フロッピーのボタンをクリックして保存します。

image

こんな画面になりました。

image

画面上でいちいちインターフェースを作っていくのは面倒なので、Source Code-Based というボタンを押してコード モードに移ります。ここでは、GitHub のリポジトリから z_longint.abap をコピペします。コードを保存したら Ctrl+F2 で文法チェックし、問題なければ Ctrl+F3 で有効化します。

image

多倍長演算を行うクラスができたので、このクラスを使って円周率を計算するプログラムを作ります。幾つかのバージョンを用意していますが、ここでは一番シンプルな奴を使います。

コンテキスト メニューからプログラムの新規作成を選びます。

image

名前を入れてチェックのアイコンをクリックします。

image

タイトルを適当に入力して Save をクリックします。

image

$TMP パッケージが選ばれていることを確認し、フロッピー アイコンをクリックします。

image

コード入力の画面が表示されるので、今度は GitHub から zcalc_pi.abap をコピペして保存します。先ほどと同様に Ctrl+F2 で文法チェックし、問題なければ Ctrl+F3 で有効化します。

image

特に意味はないですが、プログラムの実行は別トランザクションでやってみます。トランザクション SE38 を実行し、プログラム名に先ほど入力した名前 zcalc_pi を入力して F8 キーを押します。

image

無事、結果が表示されました。計算時間は 1 秒ちょっとになっています。さすが ABAP。遅い。

image

というわけで、久々の SAP ネタでした。

[SAP] [C#] SAP GUI Scripting from .NET

SAP GUI Scripting という機能があります。eCATT (まともに使ったことはない) のように、SAP GUI を外部から操作できる機能です。テスト シナリオの実行やテスト データ入力などを大量処理する場合に使えそうです。HP Quality Center やら HP Load Runner はこの機能を利用しているんでしょうかね。

これはあくまでも SAP GUI を操作する機能ですので、アプリケーション サーバーを直接操作する BAPI や Enterprise Services とは全く別の機能です。

この SAP GUI Scripting、実際どのぐらい使われているかどうかは不明です。古くからある機能なので、公開されている情報も古いものが多い気がします。VBScript やネイティブ アプリ、.NET からも操作できるような記述がありますが、SAP Note に添付されているサンプルが VB6 で書かれたとおぼしきものだったり。いいサンプルなんですけど。

そんなわけで、.NET で SAP GUI Scripting を操作してみました。

まず、SAP GUI Scripting の実体は単なる ActiveX コントロールです。VBA から SAP にアクセスするときに、SAP GUI の ActiveX コントロールを使っている人はそこそこいるような、いないような。ファイルは sapfewse.ocx です。SAP GUI をインストールすると以下のパスに作成されます。

C:\Program Files (x86)\SAP\FrontEnd\SAPgui\sapfewse.ocx

image

それさえ分かれば、あとは普通に使えます。手順は以下の通り。

  1. TypeLib を使って OCX ファイルから IDL ファイルを作成
  2. IDL をコンパイルして TLB ファイルを作成
  3. TLBIMP を使って TLB ファイルから .NET アセンブリを作成
  4. .NET アプリを書く

環境はこんな感じ。SDK は新しいの入れておかないと駄目だなー。

OS: Windows 7 SP1
IDE: Visual Studio 2010 SP1
SDK: Windows SDK  v7.0A (まずい 7.1 入れてない・・・)
SAP GUI: 720 PL3

1. TypeLib を使って OCX ファイルから IDL ファイルを作成

Windows SDK に付属している OLE-COM Object Viewer を管理者特権で開いて下さい。Visual Studio をインストールすると勝手にインストールされると思います。

image

メニューから File > View TypeLib を選んで下さい。

image

[ファイルを開く] ダイアログが表示されるので、前述の sapfewse.ocx を開いて下さい。

image

メニューから File > Save As… を選択し、適当なところに IDL ファイルを保存して下さい。ファイルの末尾が切れる場合は、右ペインのテキストをコピペしてテキスト ファイルとして保存して下さい。

image

ファイルはこんな感じです。以前の記事で RPC サーバー / クライアントを作ったときにも IDL ファイルは出てきました。あのときは手で書きましたが、このように既存のオブジェクトから自動生成することもできます。

image

 

2. IDL をコンパイルして TLB ファイルを作成

ネイティブだったら IDL ファイルを使ってそのまま RPC クライアントを作ればいいのですが、.NET の場合はもう数ステップ必要です。

次に IDL ファイルをコンパイルして TLB ファイルを作る必要があります。Windows SDK に含まれている midl.exe を使います。これも RPC のときに使いました。Visual Studio Command Prompt を管理者特権で開き、以下のコマンドを実行します。

> midl sapfewse.IDL

image

が、エラーとなります。おーん。

.\sapfewse.IDL(601) : error MIDL2025 : syntax error : expecting a type specification near "GuiComponent"

.\sapfewse.IDL(601) : error MIDL2026 : cannot recover from earlier syntax errors; aborting compilation

syntax error とか・・・自動生成したものをそのまま使ってるんですがね。
エラーとなっている 601 行付近はこんな感じです。

    [
      uuid(93A37525-9118-4731-92A7-B93DF1E34455)
    ]
    dispinterface _Dsapfewse {
        properties:
            [id(0x00007d01), readonly           
]
            BSTR Name;
            [id(0x00007d0f), readonly           
]
            BSTR Type;
            [id(0x00007d20), readonly           
]
            long TypeAsNumber;
            [id(0x00007d21), readonly           
]
            VARIANT_BOOL ContainerType;
            [id(0x00007d19), readonly           
]
            BSTR Id;
            [id(0x00007d26), readonly           
]
            GuiComponent* Parent;
            [id(0x00007d13), readonly      ← 601 行目     
]

インターフェース _Dsapfewse のメンバーを定義しているところです。GuiComponent というキーワードが認識されていないようなので、定義を探してみます。すると、701 行目に定義が見つかります。原因はこれですね。物事には順番ってものがあります。

[
  uuid(ABCC907C-3AB1-45D9-BF20-D3F647377B06),
  noncreatable
]
coclass GuiComponent {
    [default] dispinterface ISapComponentTarget;
};

GuiComponent の定義を _Dsapfewse の定義の上に移動させます。こんな感じ。

[
  uuid(ABCC907C-3AB1-45D9-BF20-D3F647377B06),
  noncreatable
]
coclass GuiComponent {
    [default] dispinterface ISapComponentTarget;
};

[
  uuid(93A37525-9118-4731-92A7-B93DF1E34455)
]
dispinterface _Dsapfewse {
    properties:
        [id(0x00007d01), readonly           

さて、再チャレンジ。またエラーでございます。

image

.\sapfewse.IDL(612) : error MIDL2025 : syntax error : expecting a type specification near "GuiComponentCollection"
.\sapfewse.IDL(612) : error MIDL2026 : cannot recover from earlier syntax errors; aborting compilation

今度は GuiComponentCollection か。というわけで、今度は GuiComponentCollection の定義を _Dsapfewse の上に移動します。で、また違う箇所でエラ・・・。

試行錯誤の上、以下のような修正をしてコンパイル エラーがクリアされました。やれやれ手間のかかる・・・。でもまあ、定義の順番を入れ替えるだけでよかったから幸運なのかも。

  • GuiComponent の定義を _Dsapfewse の前に移動
  • GuiComponentCollection の定義を _Dsapfewse の前に移動
  • GuiUtils の定義を _Dsapfewse の前に移動
  • GuiCollection の定義を _Dsapfewse の前に移動
  • GuiConnection の定義を _Dsapfewse の前に移動
  • GuiSession の定義を _DsapfewseEvents の前に移動
  • GuiFrameWindow の定義を ISapSessionTarget の前に移動
  • GuiSessionInfo の定義を ISapSessionTarget の前に移動
  • GuiVComponent の定義を ISapWindowTarget の前に移動
  • GuiScrollbar の定義を ISapScreenTarget の前に移動
  • GuiContextMenu の定義を ISapScreenTarget の前に移動
  • GuiComboBoxEntry の定義を ISapComboBoxTarget の前に移動
  • GuiTab の定義を ISapTabbedPane の前に移動

image

コンパイルが通ると、sapfewse.tlb というファイルが生成されます。これはバイナリ ファイルです。

image

 

3. TLBIMP を使って TLB ファイルから .NET アセンブリを作成

TLB ファイルができたら、同じく Windows SDK に含まれる tlbimp を使うと .NET アセンブリを生成してくれます。

以下のコマンドを実行します。ここはノー エラーで通った。

e:\dropbox\sapfewse> tlbimp sapfewse.tlb  /out:sapfewse.dll
Microsoft (R) .NET Framework Type Library to Assembly Converter 4.0.30319.1
Copyright (C) Microsoft Corporation.  All rights reserved.

TlbImp : Type library imported to e:\dropbox\sapfewse\sapfewse.dll

e:\dropbox\sapfewse>

無事、アセンブリである sapfewse.dll をゲットすることができました。

image

 

4. .NET アプリを書く

ここまでが事前準備です。では Visual Studio を起動して .NET アプリを書きます。例によって言語は C# を使いますが、VB でも F# でも動くはずです。

普通に C# の Window Forms Application プロジェクトを作成して下さい。
ソリューションのフォルダーに、.NET アセンブリを作ったときの作業用フォルダーを丸ごとコピーしておくとよいです。

image

Solution Explorer の References を右クリックし、Add Referene… を選択して下さい。
Add Reference ダイアログボックスの Browse タブから、先の手順で作った sapfewse.dll を選んで OK をクリックして下さい。をや、TLB ファイルはそのまま使えるのか。これは知らなかった。

image

名前空間 sapfewse が追加されました。Object Explorer で開いてみると、GuiApplication などのクラスが確認できます。

image

ボタンとテキスト ボックスを配置します。

image

ボタンをクリックしたときのイベント ハンドラーに、以下の 2 行を追加します。ええ、2 行だけです。
GuiApplication のインスタンスを作って、OpenConnection を呼ぶだけです。

sapfewse.GuiApplication SapGuiApp = new sapfewse.GuiApplication();
SapGuiApp.OpenConnection(textBox1.Text);

ソースはこんな感じになります。上の 2 行以外は何もいじっていません。

image

SAP GUI がインストールされている PC 上でプログラムを起動します。
テキスト ボックスに SAP GUI の接続エントリの名称を入力し、Logon をクリックすると接続できます。

この環境では、下記のように "NetWeaver 7.02" という名前のエントリを作ってあるので、"NetWeaver 7.02" と入力します。

image

image

Logon をクリックすると、"A script is opening a connection to system NetWeaver 7.02" という確認のポップアップが表示されます。もちろん OK をクリックします。

image

やけにクラシックな SAP GUI の画面が起動してきました。スキンの設定が変えられるかどうかは試していません。

image

何はともあれ、ログオンはできます。ツールバーとか変ですけど。

image

以上が C# から SAP GUI Scripting を操作するサンプルでした。SAP GUI を起動するサンプルでしたが、既存の SAP GUI セッションにアタッチして値の入力やトランザクションの実行を操作することもできます。むしろそういう使われ方をするほうが多いかもしれません。

オブジェクトのリファレンスは SDN で公開されています。以下のページから SAP GUI Scripting API をダウンロードして下さい。

SAP GUI Scripting
http://www.sdn.sap.com/irj/sdn/index?rid=/webcontent/uuid/007084d7-41f4-2a10-9695-d6bce1673c2f

例えば、サンプルで使った GuiApplication::OpenConnection はこんな感じです。

image

[SAP] 新製品やトレンドの備忘録的まとめ

軽い気持ちで SAP の最新技術を調べていたら、かなり興味深かった。せっかくなので記事としてまとめてみます。本業として関わっていた頃はトレンドを追いかける余裕もなく、それほど興味も持っていなかったけど、外部から SAP 技術を眺める立場になると、逆に最新技術に興味がシフトしている。今の時代は、ちょっと指先を動かすだけで誰でもある程度の最新情報を得られるので便利な反面、当事者には厳しい時代になってきました。

斜め読みが多いので、間違いを見つけたらご指摘いただけると助かります。

BI 製品への注力

インメモリー コンピューティング エンジン SAP HANA 1.0 リリース (Dec. 2010)

やっぱりこれが一番ホットなんじゃないかと。残念ながら実物を見たことがないので、実際のところどうなのかは知らない。Intel Xeon 7500 に最適化されているということなので、プロセッサとしては微妙に古い。

後述の EIM 4.0 とか NetWeaver 7.3 が出てきたので、SAP は ERP より BI よりになっていくのだろうか。BI といえば、SAS とか MicroStrategy というイメージもあるが。

http://www.sap.com/press.epx?PressID=14464
http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/21904

SAP BI4.0, EIM 4.0 リリース (Mar. 2011)

Business Object 側の製品で新バージョンが出て、HANA との連携を謳っている。元のバージョンを知らないだけに、これもよく分からない。日本に来るのはまだ先の話なのかね。

http://www.sdn.sap.com/irj/boc/bi
http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/24307

NetWeaver 7.3 リリース (Nov. 2010)

本丸の登場です。7.2 っていつ出たっけ、という間に NetWeaver 7.3 がリリース。7.2 は BPM 専用ということか。
下のリンクの 2 番目のスライドが面白い。”The first version of BW 7.30X running on HANA (coming soon)” では BWA と NetWeaver BW の演算部分を HANA に置き換えて、ついにはデータベースが不要になるようです。

話は逸れますが、BWA は SAP のインデックス サーバーである TREX の技術をベースにして作られています。NetWeaver 6.4  の認定を取った時から 「こいつは来る」 と睨んでいたので、予想が当たって結構嬉しい。だがその割に TREX をまともに触ることはなかった・・・。

BW 以外の新機能は後述。

http://www.sap.com/japan/about/press/press.epx?pressid=14449
http://www.sdn.sap.com/irj/sdn/edw?rid=/library/uuid/300347b5-9bcf-2d10-efa9-8cc8d89ee72c

SaaS – SAP Business ByDesign

実は 2007 年から中堅市場向けに SaaS を提供しています。要するに、従量課金方式の業務アプリケーションです。ただ、独、米、英、仏、印、中の 6 ヶ国のみで日本では提供していないらしい。そろそろ日本でも機が熟してきたと思うんですけどね。各企業も SaaS に抵抗がなくなってきてそう。で、最近の動きがこちら。

Business ByDesign Feature Pack 2.6 リリース (Feb. 2011)

iPad, Blackberry 向けの SDK が含まれています。営業向けに、出先で CRM にささっとアクセスできるというのがわかりやすいイメージだと思う。iPhone は確か 2.5 でサポートされていたような。Windows Phone 7 と Android は夏に出るらしい 3.0 で対応予定。

ただ、開発環境が Visual Studio で、言語がどうやら C# らしい。このへんが賛否両論を巻き起こしそうなところ。確かに、モバイル向けのアプリ開発者って Visual Studio を使ってるイメージがあまりない。

http://www.sap.com/press.epx?PressID=14707

クラウド開発基盤 – SAP River (Jun. 2010)

いつのまにかこんなものが始まっていて驚いた。REALTECH のブログで取り上げられていたのが凄い。彼らのブログを読んでいれば、SAP のトレンドはばっちりなのではないかと思う。たぶん多くの分野で本家より詳しいと思います。

サーバーサイド JavaScript をベースにした技術らしいです。データ駆動開発で、要件がマッチすれば本当に簡単にアプリケーションを作れそうな感じ。ByDesign が C# になってしまったが、確かに JavaScript ならニュートラルですね。

既に稼働済みのサイトは 2 つ。iApprove は分からないが、Carbon Impact は Amazon EC2 で動いています。OS とか Web サーバーは何でもいいのだろうか。もう少し追いかけてみないと分からない。買収した Coghead の技術をベースにしているらしいです。

http://wiki.sdn.sap.com/wiki/display/EmTech/River
http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/22784
http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/23695
http://solution.realtech.jp/2011/03/sap-river-sdn.html

Duet Enterprise リリース (Feb. 2011)

Duet 1.0 が世界的にもイマイチな評価だった印象がある中、Duet Enterprise リリース開始。Office 2010 との連携製品で、今回は SharePoint Server 2010 との連携がメインのようです。

製品としては面白いけど敷居が高そう。SharePoint のシェアってどのぐらいなんだろう。便利は便利だけど、市場はそこまで求めてないような気もする。売り方次第では行けるのかな。でもSharePoint も SAP も高いし・・。

http://www.sap.com/japan/press.epx?pressid=14789
http://technet.microsoft.com/ja-jp/library/ff972433(d=lightweight).aspx

仮想化

Citrix XenServer のサポート開始 (Nov. 2010)

これで、ユーザーの選択肢は ESX, Hyper-V, Xen の 3 択になりました。どれかが勝つというよりかは、シェアを分け合いそうな気もします。ただ、サポートの手厚さという意味では、やはり Hyper-V だろうか。でも技術的には VMware はやっぱり強い。Xen は使ったことがないから分からない。一番安いのはどれだろう。

SAP GUI の仮想化

今後は、サーバーだけじゃなくて、クライアントの仮想化も進むと思われます。現在サポートされているのは、VMware View 4.5 と VMware ThinApp ですが、そのうち Microsoft App-V もサポートされるでしょう。でも結局は、仮想デスクトップが主流になるかも。

その他

Silverlight Islands

EhP2 から WebDynpro for ABAP, Java で Silverlight との統合が行われました。特に ABAP で Silverlight が統合されたのは画期的。標準のサンプル アプリケーションで体感できるので、これは環境があれば是非見てほしい。以下 3 つの WebDynpro Component が用意されています。

  • DEMO_SILVERLIGHT_FLIGHTS
  • DEMO_SILVERLIGHT_SEATS
  • WDR_TEST_SILVERLIGHT

image ← パズル

image

2 枚目の画面は従来の WebDynpro コントロールと Silverlight との比較ができるページですが、SIlverlight いいです。さくさく動きます。技術的には、MIME リポジトリの SAP/PUBLIC/BC/UR/nw7/SilverlightIslands 下に SIlverlight Islands エンジンに XAP と DLL が入っています。他のものも MIME に強引に入れれば統合できたり?Windows 以外でもちゃんと動くのかどうかも気になる。これは今度時間を作ってアプリを作ってみたい。ちょうど Silverlight に手を出そうとしていたし。

http://help.sap.com/saphelp_nw70ehp2/helpdata/en/54/07ec96bd5a4764be4996fff231b4de/frameset.htm
http://help.sap.com/saphelp_nw70ehp2/helpdata/en/61/bdfa1563a64a188ec95d2280fbb98e/frameset.htm

SAP NetWeaver 7.3 の新機能

ヘルプ ポータルにリリース ノートが出ていたので、AS ABAP の部分をざっと見て気になったところを箇条書きで。これは 7.0 EhP2 とも被る部分が多い。
http://help.sap.com/saphelp_nw73/helpdata/en/a2/fc644eb17e43b3a6442c5c522ad55e/frameset.htm

# 久々にブログ記事を書いたら、時間がかかるかかる。3時間以上もかかった気がする。継続しないとダメですね。

[SAP] 無償版 NetWeaver に SAP Web Dispatcher を導入する

SAP GUI による DIAG 接続は、SAProuter というプロキシ プログラムを使って中継させることができました。しかし HTTP 接続には対応していません。HTTP の場合は、適当なプロキシ ソフトを拾ってきて使えばできそうですが、SAP 謹製の SAP Web Dispatcher というプログラムを使って実現することもできます。もちろん、これも Trial 版の NetWeaver に含まれています。ありがたいですね。

SAP Web Dispatcher の本来の用途は名前の通り、複数のウェブ サーバー インスタンスを負荷分散することです。CISCO などが作っているハードウェア ロードバランサーの代わりとして(実際は併用したりしますが)使うことができます。そんな背景もあり、SAProuter と違って高機能で、設定も複雑です。今回は負荷分散することが目的ではなく、単純に中継させるだけを目的として構築してみます。

SAProuter のように経路の両端に設置する必要はなく、中継サーバー上でプログラムを実行するだけで動きます。今回は、VMware のホスト サーバーを SAP Web Dispatcher サーバーとして、ゲスト OS のサブネットと、ホスト側のサブネットを中継させます。環境は SAProuter のときと同じです。

<SAP サーバー>

  • VMware ゲスト OS
  • Windows Server 2008 x86
  • SAP NetWeaver 7.02
  • IP: 192.168.2.10 (固定 IP)
  • VMware の NIC で HostOny を指定し、ホスト OS とのみ通信できるようにしてある

<SAP Web Dispatcher サーバー>

  • VMware ホスト OS
  • Windows Server 2008 R2  SP1
  • IP (VMnet1): 192.168.2.1 (Manage Virtual Networks で設定しています)
  • IP (物理NIC): 192.168.1.3 (ただし DHCP 設定)

<SAP クライアント>

  • IP: 192.168.1.4
  • ブラウザー: IE 9.0 /  Chrome9.0
  • OS: WIndows 7 SP1 x86
  • ホスト名: adenosine (ワークグループ構成)

SAP Web Dispatcher の実体はフォルダー usr\sap\NSP\SYS\exe\uc\NTI386 に入っている sapwebdisp.exe ですが、他のモジュールとの連携もあり、以下のファイル全てを SAP Web DIspatcher サーバーの適当なフォルダーにコピーします。今回は F:\usr\sap\WD720 というフォルダーを作って、それを使います。

sapwebdisp.exe   – SAP Web Dispatcher 本体
sapwebdisp.pdb   – SAP Web Dispatcher デバッグ シンボル
sapcsa.dll       – ユーザー入力フィルタリング用のライブラリ
sapcpp47.dll     – SAP製 IO ストリームライブラリ (sapcsa.dll が使う)
wdispadmin.SAR   – 管理ツール アーカイブ
sapcar.exe       – SAR ファイル解凍プログラム
icmon.exe        – 管理ユーザーをメンテナンスするためのツール

全部 usr\sap\NSP\SYS\exe\uc\NTI386  に入っていますのでご安心を。デバッグ シンボルが入っているのは嬉しいですね。実は主要な SAP カーネル プログラムは、常にデバッグ シンボルとともに提供されています。素晴らしいです。SAP のデバッグについてはそのうち触れます。

ログ出力用に log フォルダーを作っておき、次のような構成となりました。

image

ちなみに、sapwebdisp.exe のバージョンは 7200.70.18.23869 でした。NetWeaver 7.01 に付属の sapwebdisp.exe を使っても設定手順は変わりませんが、SAProuter と同じように ICU 関連 DLL もコピーして下さい。

image

次に作るのは起動用のバッチ ファイルです。SAProuter と同じように ntscmgr.exe を使えばサービス化できますが、今回はサービス化せず、バッチファイルで起動します。

REM
REM startWebDisp.bat
REM

echo off
cls
echo SAP Web Dispatcher starting…
set WEBDISP=F:\usr\sap\WD720
sapwebdisp pf="%WEBDISP%\wd_10.pfl" -f "%WEBDISP%\log\dev_webdisp.log" -t 1

パラメーターで指定しているのは、SAP Web Dispatcher のインスタンス プロファイルとトレース ファイル、そしてトレース レベルです。そうです、SAP Web Dispatcher はそれ自身がインスタンス プロファイルを持ちます。

その他の起動オプションは以下のページをご覧ください。
http://help.sap.com/saphelp_nw70ehp1/helpdata/ja/de/89023c59698908e10000000a11402f/frameset.htm

次にインスタンス プロファイルを作ります。試行錯誤の結果、こんな感じでまとまりました。全部に意味があります。

#
# wd_10.pfl
#

# SAPSYSTEM must be set so that the shared memory areas can be created.
# The number must be different from the other SAP instances on the host.

SAPSYSTEM = 10
INSTANCE_NAME = WD720

DIR_ROOT = F:\usr\sap\$(INSTANCE_NAME)
DIR_GLOBAL =     $(DIR_ROOT)
DIR_EXECUTABLE = $(DIR_ROOT)
DIR_LOGGING =    $(DIR_ROOT)\log
DIR_ICMAN_ROOT = $(DIR_ROOT)\icmandir

# Message Server Description
# SAP Web Dispatcher connects NetWeaver Message Server

rdisp/mshost = 192.168.2.10
ms/http_port = 8100

# ICM settings

icm/security_log = LOGFILE=$(DIR_LOGGING)\dev_icm_sec.log,MAXSIZEKB=500
icm/server_port_0 = PROT=HTTP,PORT=7778,TIMEOUT=3600,PROCTIMEOUT=3600
icm/authfile = $(DIR_ROOT)\icmauth.txt
icm/HTTPS/trust_client_with_issuer = *
icm/HTTPS/trust_client_with_subject = *

コメントにも書いてあるように、SAP Web Dispatcher にはインスタンス番号が必要です。どうやら共有メモリを確保するために使われるようです。

インスタンス プロファイルをロードする処理は、ABAP インスタンスと共通のコードが使われているようで、特有の「癖」がけっこうあります。例えば、DIR_* 系のプロファイル パラメーターを暗黙的に持っていて、何も設定していないとログファイルなどを適当に usr\sap\D## などのパスに吐き出したりします。そんなわけで、DIR_* 系のパラメーターや、インスタンス名を明示的に指定しています。

今回はインスタンス番号は 10、インスタンス名は WD720 にしました。まあ・・・なんでも構いません。

SAP Web Dispatcher と NetWeaver との接点は、メッセージ サーバーの HTTP ポート 8100 と、ICM のポート 8000 ですが、プロファイル パラメーターとして指定するのはメッセージ サーバーの情報だけで十分です。必要なインスタンス情報は、メッセージサーバーから自動的に取得してくれます。

反対側の、ユーザーが接続する側のポートを icm/server_port_0 というパラメーターで 7778 に設定しています。SAProuter を 7777 にしたからというだけの理由です。ICM を設定したのと同じパラメーター名ですが、このパラメーター自体は ICM とは直接関係ありません。単にパラメーター名が同じだけです。このへんも実装が使いまわされているのでしょうかね。タイムアウト値を、SAP Web Dispatcher 側で独自に指定できることに注意してください。ここを指定しないと、確かデフォルト値が 10 秒ぐらいになるので、ICM 側のタイムアウト値が十分に長くても、Web Dispatcher 側でタイムアウトが発生してしまいます。

icm/authfile というパラメーターで icmauth.txt というファイルを指定していますが、これはまだ作っていませんね。icmauth.txt は、Web DIspatcher の管理ユーザーが記載されたテキストファイルで、最初にコピーした icmon.exe で作成します。が、摩訶不思議なことに icmon.exe にはファイルを新規作成する力がありません。権限不足でしょうか。そんなわけで、先に空ファイルを作っておきます。icmon の シンボルがあればデバッグできるのに。

エクスプローラーで新規の空ファイル F:\usr\sap\WD720\icmauth.txt  を作成し、コマンド プロンプトから以下のコマンドを実行してください。ユーザーは Administrator で実行しています。

f:\usr\sap\WD720>icmon pf=wd_10.pfl -a
icmon=>sapparam: SAPSYSTEMNAME neither in Profile nor in Commandline
Maintain authentication file
============================

Filename (F:\usr\sap\WD720\icmauth.txt): (何も入力せずエンター)
Maintain authentication file: F:\usr\sap\WD720\icmauth.txt
======================================

    a – add user to set
    c – change passwd of existing user in set
    g – change group of existing user in set
    x – change client cert data of existing user in set
    d – delete user from set
    l – list users of set
    s – save changes of set to file
    q – quit (without saving)

–>

コマンドを実行するときに、先ほど作ったプロファイル ファイルを指定します。-a オプションが管理ユーザーをメンテナンスするためのオプションです。icmon については以下のページを参考にしてください。

http://help.sap.com/saphelp_nw70ehp1/helpdata/ja/0b/6aedff404d6b4a8cac8f1359e1b47c/frameset.htm

今回はユーザーを新たに作るので、上のメニューで “a – add user to set” を選択し、必要事項を入力していくだけです。やっていることは、次のページに書かれていることそのままです。

http://help.sap.com/saphelp_nw70ehp1/helpdata/ja/82/9e98d786f040209e6a9e8145153939/frameset.htm

Filename (F:\usr\sap\WD720\icmauth.txt):
Maintain authentication file: F:\usr\sap\WD720\icmauth.txt
======================================

    a – add user to set
    c – change passwd of existing user in set
    g – change group of existing user in set
    x – change client cert data of existing user in set
    d – delete user from set
    l – list users of set
    s – save changes of set to file
    q – quit (without saving)

–> a
User name: icmadm
Enter new password: ********
Re-enter password: ********
Group name: admin
Subject value of client cert: CN=template,*
new entry locally created

Press <RETURN> to continue (何も入力せずエンター)
Maintain authentication file: F:\usr\sap\WD720\icmauth.txt
======================================

    a – add user to set
    c – change passwd of existing user in set
    g – change group of existing user in set
    x – change client cert data of existing user in set
    d – delete user from set
    l – list users of set
    s – save changes of set to file
    q – quit (without saving)

–> s

old file renamed to F:\usr\sap\WD720\icmauth.txt.bak
changes saved to file F:\usr\sap\WD720\icmauth.txt

Press <RETURN> to continue (何も入力せずエンター)
Maintain authentication file: F:\usr\sap\WD720\icmauth.txt
======================================

    a – add user to set
    c – change passwd of existing user in set
    g – change group of existing user in set
    x – change client cert data of existing user in set
    d – delete user from set
    l – list users of set
    s – save changes of set to file
    q – quit (without saving)

–> q

f:\usr\sap\WD720>

アカウントは何でも OK なので、icmadm / pswd_ICM と入力しました。忘れても、icmon で再登録できます。ちなみに icmauth.txt の内容は、こんな感じになっていました。

# Authentication file for ICM and SAP Web Dispatcher authentication
icmadm:$apr1$lfzz6v4.$ZYlfRGerjhM.dwX4Lokfo0:admin:CN=template,*:noflags

単純な構造ですね。”pswd_ICM “ という文字列が、何らかのハッシュ アルゴリズムで赤字の文字列に変換されているだけです。これは SAP の常套手段です。

そんなこんなで、フォルダーの中がこんな感じになりました。
icmon.exe を実行したときに、トレースファイル dev_icmon とバックアップファイル icmauth.txt.bak が勝手にできました。
image

ではいよいよ実行ですが、その前に、SAP サーバー側でファイアー ウォールの設定をします。開けるポートは、8100 と 8100 です。どちらか片方でも欠けるとエラーになるので、気を付けてください。

0007

いよいよ実行です。コンソールはこんな出力になるはずです。
image

起動すると、log フォルダーの中に以下の 3 種類のログが出力されるはずです。それぞれ確認し、エラーや警告が出力されていないことを確認してください。
image

SAP Web Dispatcher 701 と 720 の大きな違いは、720 になって ABAP システムログ (トランザクション SM21) 形式のログ ファイルを出力するようになったことでしょうか。それが SLOG<インスタンス番号>.LOG というファイルです。ただし、テキストエディタで見てもよく分かりません。

初回起動時、プロファイル パラメーター DIR_ICMAN_ROOT で指定したフォルダーに wdispadmin.SAR が解凍されます。SAR ファイルというのは、SAP 独自形式の圧縮ファイルです。なぜ JAR のように ZIP 形式を採用しなかったのは、SAP のプライドなんでしょうか。圧縮/解凍は、予めコピーしておいた sapcar.exe を使って自動的に行われます。

image

この icmandir フォルダーに解凍されたファイル群は、SAP Web Dispatcher の管理コンソールの Web アプリケーションです。この管理コンソールにログオンするときに、先ほど icmon.exe で作ったアカウント icmadm を使います。この Web アプリケーションは ICP というファイル形式になっていて、C のような文法で書かれています。SAP 独自のエンジンと思いますが、他では見たことがありません。ITS 時代の Business HTML とも違う。

何はともあれ、無事起動したようです。最後に、SAP Web Dispatcher サーバーのファイアウォール設定で、7778 ポートを開けておきます。

image

ようやく舞台が整いました。では、ブラウザーでアクセスします。

前回の記事にも書きましたが、クッキー生成の関係で、ホスト名の文字列はピリオドを 2 以上含んでいなければなりません。ここでもそのルールが適用され、ピリオドを 2 つ含めた文字列でSAP Web Dispatcher サーバーにアクセスしなければなりません。今回、SAP Web Dispatcher サーバーはワークグループ構成なので、前回と同様に、クライアント PC の hosts エイリアスで対応します。hosts ファイルに以下の行を追加します。

192.168.1.3    adenosine    adenosine.sap.local

まずは管理コンソールにアクセスします。URL は以下です。
http://adenosine.sap.local:7778/sap/admin

ログオン認証が必要になるので、ここで icmon.exe で作成した icmadm アカウントを入力します。

image

無事表示されました!

image

この管理ツールを使うと、設定されているパラメーターの確認や、ログの表示、管理ユーザーのメンテナンス、ワーカースレッドやメモリの状態など、多様な表示/編集することができます。

次は NetWeaver にログオンしてみましょう。前回の記事では、SOA Manager と Webgui に以下の URL でログオンしました。
http://win2008-nw702.sap.local:8000/sap/bc/gui/sap/its/webgui
http://win2008-nw702.sap.local:8000/sap/bc/webdynpro/sap/appl_soap_management

SAP Web Dispatcher は接続先をディスパッチするだけでアクセス パスは変更しないので、今回の場合は ”win2008-nw702.sap.local:8000” をそのまま “adenosine.sap.local:7778” で置き換えるだけです。すなわち、

http://adenosine.sap.local:7778/sap/bc/webdynpro/sap/appl_soap_management
http://adenosine.sap.local:7778/sap/bc/gui/sap/its/webgui

にアクセスします。

まずは SOA Manager。ログオン画面が出てくるので、SAP ユーザーでログオンします。

image

image

無事表示されました。

image

webgui も同様に問題なくアクセスできます。

image

これで、SAP GUI、ブラウザーを使って、ともに外部のサブネットから NetWeaver へアクセスできるようになりました。簡単な図を作りましたので、参考までに。

topology

[SAP] HTTP を使って NetWeaver に接続する

多くの場合、NetWeaver ABAP には SAP GUI という SAP 独自のクライアント アプリケーションを使ってログオン、及び、各操作を行います。一方、NetWeaver Java の場合はもちろん、ブラウザーがクライアント アプリケーションとなります。逆に SAP GUI を使うことはできません。

以前にも触れたことがありますが、SAP GUI と NetWeaver との通信に使われるプロトコルは、DIAG と呼ばれる(おそらく)仕様が非公開のプロトコルが使われています。しかしながら NetWeaver ABAP も Java と同じように、ブラウザからアクセスすることもできます。Java でいう JSP のような技術は ABAP にも存在し、名前は BSP = Business Server Page といいます。ASP という名前にしなかったのは、マイクロソフトの Active Server Page に対する配慮でしょうか。

現在の NetWeaver 7.x では、HTTP を処理するコンポーネントは ICM (Internet Communication Manager) に統合されています。NetWeaver 7.1x 系では確か Java でも ICM が HTTP 要求を処理しているはずです。プロセスでいうと icman です。こいつが HTTP ポートを開けています。

話を ABAP に絞ります。HTTP 通信は ICM が担当しますが、中のロジックはもちろん ABAP 側で処理します。ブラウザから来た HTTP リクエストを ICM がうまいこと処理して、最終的にはABAP プログラムであるイベント ハンドラにリクエストが届き、ワークプロセスでそれを処理します。で、HTTP 応答を ICM 経由で返します。じゃあ、ICM と ワークプロセスの通信はどうなってるの、という疑問が出てきます。このへんはちゃんと確かめていませんが、おそらくメッセージ サーバーを使って HTTP で通信しています。メッセージサーバーにも HTTP ポート (39##) があります。SAP 公式手順はないですが、ICM を別サーバーで構築することもできる気がします。スタンドアロン ICM みたいな。

ちょっと知っている人は、じゃあ、ICF とか ITS ってのは何よ、と思いますね。ICF は Internet Communication Framework という名前で、ICM に統合されているかのような印象を受けます。が、こいつは ABAP です。フレームワークという名の通り、ABAP プログラムが HTTP を処理するためのフレームワークのことです。

http://help.sap.com/saphelp_nw70ehp1/helpdata/en/72/c730ddc06511d4ad310000e83539c3/frameset.htm

ICF というのはけっこう大きな実装で、全体を見るのはけっこう難しいです。というか見たことないですすみません。例えば、ABAP の HTTP リクエスト ハンドラーは ABAP クラスとして IF_HTTP_EXTENSION というインターフェースを実装しなければなりませんが、IF_HTTP_EXTENSION は ICF の一部と言えるでしょう。自分で実装したクラスは、ICF サービスとして、ICF の一部に登録することになります。細かいことは、自分で ABAP プログラムを見たり、上のヘルプ ポータルを参考にして下さい。(丸投げ)

で、次は ITS (Internet Transaction Server) ですね。結論から言うと、ITS というコンポーネントは既に存在しません。ICF サービスとして、標準の NetWeaver ABAP に含まれています。そのためか統合 ITS と呼ばれたりもします。でもこれは ICF サービスに過ぎません。その昔、SAP のアプリケーション サーバー (NetWeaver と呼ばれる前) に HTTP の機能がなかった時代に、HTTP を処理するコンポーネントが新たに作られました。これが ITS です。HTTP 要求を受け取る W-Gate と ABAP と通信する A-Gate に分かれていて、W-Gate のほうは確か IIS や Apache でも代用できたような記憶があります。このときは、まだ普通のウェブ サーバーの体をなしていて、HTML などはファイル システム上にデプロイする仕組みになっていました。現在の ICF では、ファイル システムは使わず、データベース内に独自のリポジトリを作って、それを ABAP が処理しています。そもそもスタティックな HTML はほとんど使いません。ITS 時代には、BSP の前身である HTMLBusiness という素敵な技術があって、これがまたけっこう面白いです。

現在 ITS を覚える意味はあまりないかもしれませんが、ヘルプはこれです。
http://help.sap.com/saphelp_470/helpdata/en/0d/654d356560054ce10000009b38f889/frameset.htm

統合 ITS についてはこれです。
http://help.sap.com/saphelp_nw70ehp1/helpdata/en/6c/d30ea76d444ee3b1ea48026fe0fbb6/frameset.htm

実際に動かしてみましょうか。環境はいつものこれです。

ホスト名: win2008-nw702 (ワークグループ構成)
IP: 192.168.1.3
OS: Windows Server 2008 x86 (VMware ゲスト)
RAM: 2GB (VMware による割り当て)
NetWeaver: SAP NetWeaver 7.0 EhP2 SP6
SID: NSP
インスタンス番号: 00
インストール ドライブ: C:

まずはインスタンス プロファイルに以下のパラメーターを設定し、NetWeaver を再起動します。この環境では、インスタンス プロファイルは C:\usr\sap\NSP\SYS\profile\NSP_DVEBMGS00_win2008-nw702 です、念のため。

SAPLOCALHOSTFULL = win2008-nw702.sap.local
icm/host_name_full = $(SAPLOCALHOSTFULL)
icm/server_port_0 = PROT=HTTP,PORT=80$$
icm/min_threads = 5
icm/max_threads = 10
icm/max_conn = 20
icm/keep_alive_timeout = 3600
icm/conn_timeout = 100000

ちなみにファイル全体はこんな感じ。

#
# NSP_DVEBMGS00_win2008-nw702
#

#
# basic parameters
#
SAPSYSTEMNAME = NSP
SAPSYSTEM = 00
INSTANCE_NAME = DVEBMGS00
SAPGLOBALHOST = win2008-nw702
SAPLOCALHOSTFULL = win2008-nw702.sap.local
DIR_CT_RUN = $(DIR_EXE_ROOT)\$(OS_UNICODE)\NTI386
DIR_EXECUTABLE = $(DIR_INSTANCE)\exe
dbs/ada/schema = SAPNSP

ms/server_port_0 = PROT=HTTP,PORT=81$$
rdisp/wp_no_dia = 5
rdisp/wp_no_btc = 2
rdisp/wp_no_enq = 1
rdisp/wp_no_vb = 1
rdisp/wp_no_vb2 = 1
rdisp/wp_no_spo = 1

#
# memory management
#
PHYS_MEMSIZE = 1536
em/max_size_MB = 20000
alert/MONI_SEGM_SIZE = 0
enque/table_size = 2000

rspo/local_print/method = 2
rsdb/ntab/entrycount = 5000
rsdb/ntab/ftabsize = 3000
rsdb/ntab/sntabsize = 1000
rsdb/ntab/irbdsize = 1000

abap/buffersize = 100000
rsdb/cua/buffersize = 2000
zcsa/presentation_buffer_area = 1000000
sap/bufdir_entries = 500

zcsa/table_buffer_area = 9000000
zcsa/db_max_buftab = 500
rtbb/buffer_length = 500
rtbb/max_tables = 50

#
# ICM parameters
#
icm/host_name_full = $(SAPLOCALHOSTFULL)
icm/server_port_0 = PROT=HTTP,PORT=80$$
icm/server_port_1 = PROT=SMTP,PORT=2500,TIMEOUT=120,PROCTIMEOUT=120
icm/min_threads = 5
icm/max_threads = 10
icm/max_conn = 20
icm/keep_alive_timeout = 3600
icm/conn_timeout = 100000

#
# additional parameters
#

mpi/total_size_MB = 10

注意点が 1 点あります。SAPLOCALHOSTFULL = win2008-nw702.sap.local のところで指定するホスト名です。奇妙なルールですが、後の手順を実行するためにはこの値は必ずピリオドを 2 つ以上含んだ文字列にしなければなりません。最終的にブラウザーでアクセスするときに使うホスト名になるのですが、クッキーを生成する関係でこのようなルールが生まれてしまいました。

ドメインに参加していれば FQDN がありますが、ドメインに参加していなくても、要はクライアント側でピリオドを付けたホスト名で名前解決できればいいので、hosts (%systemroot%\system32\drivers\etc\hosts) のエイリアスでアドホックに対応可能です。このサーバーはワークグループ設定なので正式な FQDN が存在せず、サーバーとクライアントの hosts ファイルに以下のようなエントリを追加する方法で対処しています。NetWeaver は、SAPLOCALHOSTFULL に指定されたホスト名が名前解決できなかった場合は起動に失敗するのでサーバー側にも必ず hosts を設定します。

192.168.2.10    win2008-nw702    win2008-nw702.sap.local

再起動が終わったら、SAP GUI でログオンし、トランザクション SMICM を実行して ICM の状況を確認します。トランザクション実行後、メニューから Goto > Services を選択して、こんな感じになってれば OK。 HTTP サービスが有効になっています。SMTP は今回は使いません。SAP からメールを送れるようになってけっこう面白いので、これもいつか紹介します。
image

次に利用する SICF サービスを有効します。通常であればトランザクション SICF から1 つずつやっていくところですが、まずは SICF_INST を実行します。
image

F4 押すと、選択肢が表示されます。 いわゆる 「F4 ヘルプ」 ですね。
image

ここでは以下の 5 つをそれぞれ選択して、有効化します。複数選択はできないので、5 回繰り返します。

  • BSPBASIS
  • WEB DYNPRO ABAP
  • WEB DYNPRO ABAP DESIGN TIME
  • WEB DYNPRO ABAP TEST APPS
  • WEB DYNPRO DBA COCKPIT

それぞれの Technical Name と ICF サービスは 1:N で結びついています。対応はテーブル ICFINSTACT の内容から見ることができます。
image

次に、SICF_INST には含まれない ICF を個別に有効化します。トランザクション SICF を実行し、最初の画面ではそのまま F8 キーを押してください。

こんな画面になります。
image

ツリー構造になっているのが SICF サービス群です。ツリーを開いて以下のサービスを見つけ、右クリックして [Activate Service] を選択してください。

  • default_host/sap/public/bc/its/mimes
  • default_host/sap/bc/gui/sap/its/webgui
  • default_host/sap/bc/webdynpro/sap/APPL_SOAP_MANAGEMENT

こんなダイアログが出てくるので、左から 2 番目の [Yes] をクリックしてください。左端の [Yes] との違いは、サブツリーのサービス全てを有効化してくれることです。分かりにくいですね。
image

次に、トランザクション SE38 を実行し、ABAP プログラム W3_PUBLISH_SERVICES を実行してください。
image

このまま F8 を押します。
image

F5 を押して全選択してから、F7 を押して Publish します。
image

このプログラム W3_PUBLISH_SERVICES では、ITS コンポーネントのパブリッシュ(デプロイ)を行ないます。GUI for HTML (webgui) を使うための準備です。webgui は、ITS の時代からある技術で、SAP GUI の画面を HTML の画面に 1:1 対応させるなかなか凄い技術です。webgui はまだ ITS サービスとしての一面が残っていて、一部の機能を使うためには、画像ファイルなどを統合 ITS 上にデプロイしなければいけません。先にも述べましたが、統合 ITS はデータベース上の特殊なリポジトリからファイルを読み込みます。それが MIME リポジトリというもので、上で有効化した default_host/sap/public/bc/its/mimes が MIME リポジトリにあたります。これを使うことで、HTTP 経由で MIME リポジトリから画像データなどを読み込めるようになります。

統合 ITS については、以下のページも参考になります。
http://help.sap.com/saphelp_nw70ehp1/helpdata/en/a6/cf3d4050d89523e10000000a1550b0/frameset.htm

これで準備は完了です。

まずは、WebDynpro for ABAP の標準的な画面として、SOA Manager の画面を見てみます。SAP GUI からトランザクション SOAMANAGER を実行してください。自動的にブラウザが起動してきます。ホスト名が SAPLOCALHOSTFULL で指定したホスト名になっていて、ポート番号は 8000 になっていることを確認して下さい。[Log On] をクリックします。
image

ログオン画面が出てきます。ここでは SAP ユーザー アカウントを入力します。ログオン対象のクライアントは、前のログオンの画面に表示されていた通り、001 です。
image

こんな画面が出れば OK です。
image

SOAMANAGER というトランザクションは、Web サービスのパブリッシュなどを行なう比較的新しいトランザクションで、SAP GUI からは操作することができず、ブラウザから操作するようになっています。全てというわけではありませんが、新しいトランザクションはウェブベースで、というのがトレンドです。

この画面は WebDynpro for ABAP という、SAP 独自のフレームワークで書かれています。画面に表示されるボタンなどのコントロールや、ABAP とのデータの連携などを簡単に作れる技術です。

試しに Google Chrome で開いたら、プロパティシートの他のタブにはコントロールが描画されませんでした。ちなみにさっきのブラウザは IE8 です。時代と逆の対応を見せる SAP は素敵です。

image

話題の IE9 で開いてみました。こちらは問題なし。

image

エンタープライズ ユーザーは、やはり IE なんですかね。

WebDynpro for ABAP の標準的な画面の次に、GUI for HTML を見てみます。次の URL に直接アクセスして下さい。
http://<SAPLOCALHOSTFULL で指定したホスト名>:8000/sap/bc/gui/sap/its/webgui

image

どうでもいい話ですが、このログオン画面に出てくる人が、ジョージ・クルーニーか、髪が生えているときのスタンリー・トゥッチに似ているとしか考えられません。絶対似てる。

それはさておき、さきほどと同様に [Log On] をクリックしてログオンします。

これが GUI for HTML です。

image

NetWeaver 7.02 になって、さらに見た目が綺麗になりました。昔は全然使えない代物でしたが、これならけっこうありです。しかしよくもまあ GUI の画面をここまで再現したものです。

比較的複雑なトランザクション SE80 を実行して、適当なプログラムを開いてみました。この程度なら普通に動く。

image

SE80 は Chrome でも動きます。プロパティ シート コントロールがダメなのでしょう。

image

もちろん IE9 でも余裕。

image

[SAP] 無償版 NetWeaver に SAProuter を設定してみた

SAP とサポート契約を結ぶと、OSS (Online Service System) と呼ばれるリモートサービスを受けることできます。このサービスを使うと、SAP 側のサポート担当者は、インターネットや専用回線越しにカスタマーシステムにログオンすることが可能になっています。この回線のことを OSS 回線と呼んだり呼ばなかったりします。

この OSS 回線の両端には、必ず SAP ルーターという小さなソフトウェアがいます。すなわち SAP のサポート側と、カスタマー側です。OSS 用途以外ではほとんど脚光を浴びることのない SAP ルーターですが、実は OSS 回線の門番以外としても当然使うことができます。しかも、この SAP ルーター、例の無償版 NetWeaver にも含まれていて、好きなように使うことができます。仮想マシンのように、閉じた環境で SAP を使いたい場合など、別のサブネットから排他的に SAP GUI でログオンできるように環境を作れるのはかなり便利だと思います。手順もけっこう簡単です。

SAP ルーターについては、本家の以下のページをお読みください。けっこう分かりやすく書かれています。この中で触れられている SNC (セキュアネットワークコミュニケーション) という暗号化通信がけっこう面白いのですが、無償版には含まれていないので試せません。残念です。

http://help.sap.com/saphelp_nw70ehp1/helpdata/ja/4f/992d39446d11d189700000e8322d00/frameset.htm

今回は、以前の記事で VMware 仮想マシン (Windows Server 2008 x86) 上に入れた NetWeaver 7.02 を使います。ネットワークなどの構成は以下のようになっています。

<SAP サーバー>

  • VMware ゲスト OS
  • Windows Server 2008 x86
  • SAP NetWeaver 7.02
  • IP: 192.168.2.10 (固定 IP)
  • VMware の NIC で HostOny を指定し、ホスト OS とのみ通信できるようにしてある

<SAProuter サーバー>

  • VMware ホスト OS
  • Windows Server 2008 R2
  • IP (VMnet1): 192.168.2.1 (Manage Virtual Networks で設定しています)
  • IP (物理NIC): 192.168.1.3 (ただし DHCP 設定)

<SAP クライアント>

  • Windows 7 x86
  • SAP GUI 7.20
  • IP: 192.168.1.4 (ただし DHCP 設定)

こんな感じです。

異なるサブネットに属している SAP クライアントと SAP サーバーは、直接通信できませんが、間に SAProuter を介入させることで可能になります。これが、「ルーター」 と呼ばれる所以でしょう。また、ポート番号を絞ることができるので、ファイアウォールによる防御効果を高めることができます。

SAProuter は、無償版 NetWeaver をインストールしたときに自動的に展開されています。NetWeaver を C: ドライブにインストールした場合は、以下のファイルがあるはずです。まさにこれが SAProuter です。

C:\usr\sap\NSP\SYS\exe\uc\NTI386\saprouter.exe

Windows エクスプローラーのプロパティから、プログラムのバージョンを見ることができます。同じ無償版でも、NetWeaver 7.01 と NetWeaver 7.02 に含まれている SAProuter のバージョンは異なります。

参考までに、手元にあるファイルはこうなっていました。

NetWeaver 7.01  – 7010.29.15.58313 (リリース 701 のパッチレベル 29 ということです)

image

NetWeaver 7.02 – 7200.70.18.23869 (リリース 720 のパッチレベル 70 ということです)

image

58313 や 23869 といった細かいビルド番号は無視して構いません。

基本的には新しいバージョンほどバグが修正されていたり、新しいオプションが増えているので、今回であれば 7200.70 を使うべきでしょう。SAProuter が扱う SAP プロトコルが変わっているわけではないので、NetWeaver 7.01 にログオンするのに SAProuter 7200 を使っても問題ありません。R/3 でも問題なく動くはずです。逆に、混在させても動きますが、オプションによっては古い SAProuter が対応していなかったりします。

今回の 2 つのファイルの間には大きな違いがあり、7200.70 が単体で動作するのに対して、7010.29 の動作には以下の DLL が必要になります。

icudt30.dll
icuin30.dll
icuuc30.dll

これらの DLL も、saprouter.exe と同じフォルダーに入っているので、コピーするファイルが複数になるだけですが。この ICU*** という DLL は、SAP のものではなく、IBM の DLL です。ICU というのは、正式には IBM International Components for Unicode の略です。エクスポートされた関数名をざっと見たところ、標準 C ランタイムの IBM 版といったところでしょうか。Windows 環境であれば wchar_t 使えば終わりですが、SAP は UNIX, Linux や z/OS といったマルチ プラットフォームで動作する製品なので、このような外部ライブラリを使うことで、コード移植の手間を少なくしているのだと思われます。

具体的な手順を紹介していきます。

SAP サーバーの設定

SAProuter 用に適当なフォルダーを作り、saprouter.exe をコピーします。今回は NetWeaver の入っている usr\sap に SAProuter というフォルダーを作りました。こんな感じ。

image

niping.exe というのは、ICMP ではなく SAP プロトコルを使った ping コマンドのようなものです。saprouter.exe と同じところに入っています。今回は使いませんが、疎通確認の時よく使うので、まとめてコピーしておくと楽です。

次に、起動用のバッチファイルを作ります。こんな感じです。

REM
REM startRouter.bat
REM

echo off
cls
echo SAProuter starting…
set ROUTER=C:\usr\sap\SAProuter
saprouter -r -S 7777 -R "%ROUTER%\saprouttab" -G "%ROUTER%\saprouter.log" -J 10000000 -T "%ROUTER%\dev_saprouter" -V1 -E

ここで設定しているのは以下の通りです。

  • ポート番号: 7777
  • ルート許可テーブル ファイルの指定
  • ログファイルの指定、最大サイズ指定
  • トレース ファイルの指定、及び、トレース レベルの設定

これ以外のオプションについては、以下のページをご覧ください。

http://help.sap.com/saphelp_nw70ehp1/helpdata/ja/4f/992e1d446d11d189700000e8322d00/frameset.htm

次にルート許可テーブル ファイルを作ります。接続を許可/却下するホストや、TCP ポート番号、接続パスワードの指定を行うことができます。単なるテキストファイルです。

#
# saprouttab
#

# allow connections
# P    <source>      <dest>          <port>    <password>

P      192.168.2.1   192.168.2.10    3200      sapsap

 

上記の場合、192.168.2.1 (SAProuter サーバー) から 192.168.2.10 (自分: SAP サーバー) への TCP ポート 3200 を使った接続を許可しています。ただし接続パスワードとして sapsap という文字列が必要になります。ポート 3200 というのは、SAP GUI が SAP インスタンスへ接続するときのポートの 1 つです。

ルート許可テーブルの書き方は以下のページを見てください。中継する SAProuter の数を制限する仕様が新しく追加されたようですね。

http://help.sap.com/saphelp_nw70ehp1/helpdata/ja/4f/992dfe446d11d189700000e8322d00/content.htm

フォルダの中身がこんな感じになります。

image

ここで、startRouter.bat を実行すると、以下のウィンドウが表示されて接続の待機が始まりますので、このまま放置しておきます。起動したタイミングで、ログファイル、トレースファイルが自動的に作成されます。

image

コンソールが邪魔な場合は、以下のページに書いてあるように、saprouter.exe がもともと入っていたディレクトリにある ntscmgr.exe というユーティリティ プログラムを使って、SAProuter を Windows サービスとして登録することができます。サービスにすることで、ユーザーがログオンしなくても SAProuter を起動できるようになります。興味があれば試してみてください。普通に sc.exe でもできると思います。

http://help.sap.com/saphelp_nw70ehp1/helpdata/ja/4f/992dab446d11d189700000e8322d00/content.htm

最後に、SAP サーバーのファイアーウォール設定で、忘れずにポート 7777 を開いてください。

image

 

SAProuter サーバーの設定

SAP サーバーでの設定を使い回します。SAP サーバーで作った SAProuter フォルダーを丸ごと SAProuter サーバーの適当な場所にコピーして下さい。今回は F:\usr\sap\SAProuter としてコピーしました。

image

ドライブ名が C: から F: に変わったので、起動バッチファイルのドライブ名だけを変更します。環境に合わせて設定して下さい。

REM
REM startRouter.bat
REM

echo off
cls
echo SAProuter starting…
set ROUTER=F:\usr\saps\SAProuter
saprouter -r -S 7777 -R "%ROUTER%\saprouttab" -G "%ROUTER%\saprouter.log" -J 10000000 -T "%ROUTER%\dev_saprouter" -V1 –E

ルート許可テーブルを以下のように編集します。任意のホストから、TCP ポート 7777 への接続を許可するように設定しています。接続パスワードは password です。

#
# saprouttab
#

# allow connections
# P    <source>    <dest>        <port>    <password>

P      *           192.168.2.10  7777      password

startRouter.bat を起動し、最後に SAProuter サーバーのファイアーウォール設定で、ポート 7777 を開けておきます。

image

image

2 つの SAProuter の設定は以上です。

 

SAP クライアントの設定

環境は整ったので、SAP クライアントから SAP GUI を使ってログオンします。SAP NetWeaver と 2 つの SAProuter が起動していることを再度確認してください。

SAProuter を介してログオンするためには、SAP GUI のログオン エントリーにおいて、SAProuter ストリングというものを指定する必要があります。

SAProuter ストリングとは、中継すべき SAProuter のサーバー名やパスワードを連続して書き連ねたものです。パスワードは直書きします。そういう意味では、パスワードというよりは、チェック サムのようなものと捉えていたほうがいいかもしれません。パケット キャプチャをすると分かりますが、なんとこのパスワードは平文でネットワーク上を流れていきます。せめてハッシュぐらい使えよ、と。

http://help.sap.com/saphelp_nw70ehp1/helpdata/ja/4f/992df1446d11d189700000e8322d00/content.htm

今回の場合は以下のように入力します。構成を正しく把握していないと間違いやすいので、気を付けてください。私もよく混乱します。

/H/192.168.1.3/S/7777/W/password/H/192.168.2.10/S/7777/W/sapsap

image

あとは、いつも通りログオン可能です。

ログオン セッションの確立や切断時には、指定したログ ファイルに接続元やポート番号が時刻とともに記録されます。また、ルート許可テーブルによって許可されていない接続の要求があった場合も、ログファイルやトレースファイルに記録されます。便利です。

なお、ログオン セッション確立中に SAProuter が落ちると、SAP GUI が次のようなダイアログを表示して、セッションが切れます。つまり、SAProuter も SPOF になるので注意が必要です。

image image

[SAP on Windows] パスワードを忘れたときは

日々のパスワード管理は大変です。NetWeaver に至っては、OS, RDBMS, SAP ユーザーと、ユーザーアカウントも多様なので、覚えるのが大変です。”sap password forgot” で検索をかけると、国を問わず、人々はパスワードを忘れているようです。忘れる以外にありがちなのは、インストール時に想定外の文字列を入力してしまった場合など。SAPinst のパスワード入力欄はコピー アンド ペーストが可能なので、ひたすらコピーでインストールを進めると、コピー元の文字列が違っていたらアウト、一発退場です。

運用環境であれば、パスワードはきっちり管理されているので問題ないとは思いますが、NSP のように軽い気持ちでインストールする場合は要注意です。大昔にインストールして、久々に使おうとしたらパスワードを忘れていた、ということも多いでしょう。さて、パスワードを忘れてしまった場合は一体どこまで復旧可能なのでしょうか。

実は、Windows の Administrator のパスワードさえ分かれば、以下全てのユーザーの復旧が可能です。といっても、パスワードをリセットすることができるだけで、元のパスワードは神のみぞ知る、です。

  • Windows ユーザー (<sid>adm, SAPService<SID>)
  • 全クライアントの SAP ユーザー
  • MaxDB ユーザー (DBM Operator, Database User)
    以下、順番に手順を紹介します。なお、例によって SAP がサポートしているかどうかは不明なやり方ですし、私としてもログオンできることぐらいしか検証していないので、自己責任で参考にしてください。また、Windows + MaxDB + NetWeaver 7.0 EhP1 の環境限定です。特に EhP2 以降での動作確認は未実施です。

Windows ユーザーのパスワードを忘れた!!

Windows パスワードは単純です。NetWeaver 側で管理されているわけではないので、Administrator などでログオンして Windows ユーザーのパスワードを再設定し、サービス起動アカウントを再入力するだけです。お馴染みの以下のダイアログにパスワードを入れ直して終了です。
WS002

SAP ユーザーのパスワードを忘れた!!

他の管理者アカウントが生きていれば、SU01 からリセットするだけで済む話ですが、クライアントの全ユーザーのパスワードが分からなくなった場合は、そもそもログオンできません。こんなときは、SAP* ユーザーのパスワードをリセットしてログオンすることができます。クライアント コピーを実行したことがある人にはお馴染みの方法です。

まずは、以下のプロファイル パラメーターをデフォルト プロファイルかインスタンス プロファイルに設定します。デフォルト値は 1 なので、明示的に設定しましょう。このプロファイルを有効にするためにはインスタンス再起動が必要なので、再起動して下さい。

login/no_automatic_user_sapstar = 0

次に、以下の SQL クエリを実行して下さい。MaxDB には SQL Studio という GUI 形式の SQL クライアントがあり、NSP にも付属しているので、それを使うと便利です。Database Studio でもよいです。

update usr02 set bname=’SAPSTAR’ where bname=’SAP*’ and mandt=’<該当するクライアント>’

例えば、クライアント 000 と 001 で同コマンドを実行した場合です。SAP* という行が SAPSTAR に変わっています。
WS000

これにより SAP* のパスワードがリセットされ、パスワードは pass になります。クライアント 000 や 001 でも pass になります。SAP* でログオンできれば、SU01 が使えます。DDIC などの管理者アカウントでログオンできるようになったら、上記の UPDATE 文で退避しておいた SAP* の行を元に戻し、SU01 でパスワードを再設定すれば完了です。インターネット検索でも、USR02 を編集する方法は数多く紹介されていますが、DELETE 文で SAP* の行を消してしまう荒業が紹介されていたりします。もちろん同じ結果にはなりますが、SAP* アカウントを新規作成するのは微妙です。UPDATE で退避する方法をお勧めします。

テーブル USR02 には、SAP ユーザー パスワードのハッシュキーが記録されています。SAP ユーザーは、このテーブルのハッシュを照合することで認証されます。しかし、プロファイル login/no_automatic_user_sapstar が 0 に設定されている場合は、 キーが存在しないときの SAP* ユーザーにはデフォルトの pass というパスワードが設定されます。クライアント コピーではお馴染みの知識ですが、実はクライアント 000 でも同様のことが可能です。ただしこれは、NetWeaver 7.0 EhP1 で、バージョンによって仕様が変化する可能性が高い部分です。なお、USR01 などの他のテーブルは一切変更しません。

MaxDB のアカウントを忘れた!!

一番厄介なケースです。そもそも MaxDB の知名度が低いですね。まあ私も大して知りません。そもそも MaxDB にはどんなユーザーがいるかご存知でしょうか。アカウントは 2 種類あり、NSP インストール直後は以下のようになっています。

      • DBM Operator: SUPERDBA, CONTROL
  • Database User: SUPERDBA, SAPNSP
    DBM Operator とは、データベースの起動/停止など、データベースそのものを管理する操作をするときに必要になるアカウントです。Database User は、いわゆるスキーマ ユーザーで、データベース内のオブジェクトを管理するときに必要になるアカウントです。SUPERDBA というアカウントは、一つのアカウントで、両方の役割を兼ねています。同一アカウントなので、パスワードは一つしか持っていません。つまり、インストール直後の NSP の MaxDB には 3 つのアカウントが存在します。そして、これら全部のパスワードを忘れたとしても何とかなります。

MaxDB には xuser という仕組みがあり、インストールしたときのアカウント情報がレジストリに保存され、パスワードを入力しなくても管理コンソールにログオンすることができます。Oracle の conn / as SYSDBA と同じような仕組みです。<sid>adm ユーザーでログオンして、コマンド xuser list を入力すると以下のような出力を得ます。

> xuser list

—————————————————————–
XUSER Entry  1
————–
Key         : DEFAULT          
Username    :SAPNSP
UsernameUCS2:S.A.P.N.S.P. . . . . . . . . . . . . . . . . . . . . . . . . . .
Password    : ?????????
PasswordUCS2:?????????
Dbname      :NSP 
Nodename    :win2008-nw701                    
Sqlmode     :SAPR3  
Cachelimit  :-1
Timeout     :0
Isolation   :0
Charset     :<unspecified>    
—————————————————————–
XUSER Entry  2
————–
Key         :c    
Username    :CONTROL  
UsernameUCS2:C.O.N.T.R.O.L. . . . . . . . . . . . . . . . . . . . . . . . . .
Password    : ?????????
PasswordUCS2:?????????
Dbname      :NSP 
Nodename    :win2008-nw701        
Sqlmode     :SAPR3  
Cachelimit  :-1
Timeout     :0
Isolation   :0
Charset     :<unspecified>    
—————————————————————–
XUSER Entry  3
————–
Key         :c_J2EE    
Username    :CONTROL    
UsernameUCS2:C.O.N.T.R.O.L. . . . . . . . . . . . . . . . . . . . . . . . . .
Password    : ?????????
PasswordUCS2:?????????
Dbname      :NSP   
Nodename    :win2008-nw701   

Sqlmode     :SAPR3  
Cachelimit  :-1
Timeout     :0
Isolation   :0
Charset     :<unspecified>    
—————————————————————–
XUSER Entry  4
————–
Key         :w  
Username    :SUPERDBA          
UsernameUCS2:S.U.P.E.R.D.B.A. . . . . . . . . . . . . . . . . . . . . . . . .
Password    : ?????????
PasswordUCS2:?????????
Dbname      :NSP   
Nodename    :win2008-nw701  
Sqlmode     :SAPR3  
Cachelimit  :-1
Timeout     :0
Isolation   :0
Charset     :<unspecified>    

これがレジストリに保存されているアカウント情報です。SAPNSP, CONTROL, SUPERDBA という 3 つのアカウントが全て保存されていることが分かります。これらのアカウントは key という文字列で管理/識別されます。DEFAULT, c, c_J2EE, w という値です。アカウントのパスワードを忘れても、これらの xuser エントリを使って CUI の管理ツールにログオンし、パスワードを変更することができます。

CONTROL アカウントは純粋な DBM Operator なので、データベースが起動していなくてもパスワードの変更が可能です。しかし、SUPERDBA や SAPNSP は、Database User なので、データベースが起動していないとパスワードを変更することができません。しかし Windows の場合は、MaxDB インスタンスはサービスとして 起動できるので、起動停止時に MaxDB アカウントは不要です。

WS009

パスワードを忘れてしまった場合は、サービス起動によりデータベースを起動してから、以下のようにコマンドを実行します。

>dbmcli -U c -n localhost
dbmcli on localhost : NSP>user_getall
OK
CONTROL
SUPERDBA


dbmcli on localhost : NSP>user_put control set password=新パスワード
OK


dbmcli on localhost : NSP>user_put superdba set password=新パスワード
OK


dbmcli on localhost : NSP>exit
OK

>

dbmcli というのが MaxDB の CUI 管理ツールです。MaxDB をインストールすると、自動的にインストールされます。これで superdba と control ユーザーのパスワードがリセットできました。SAPNSP ユーザーは、この方法では変更できないので、今回は Database Manager の GUI で変更します。コマンドもありそうですが、方法を知りません。

Database Manager を起動し、[Configuration] > [Database User…] をクリックします。
WS005

データベース管理者アカウントを聞かれるので、SUPERDBA アカウントを入力して [Next] をクリックします。CONTROL アカウントは、管理者ではないのでここでは使えません。
WS006

SAPNSP をダブルクリックします。
WS007

[Change] ボタンをクリックすると、パスワード変更画面が表示されます。
WS008

これで MaxDB アカウントのパスワードは全てリセットできました。が、これだけだとダメです。先にちらっと書きましたが、パスワード情報が xuser エントリとしてレジストリに保存されていて、それも変更しないと後々困ります。特に、SAPNSP に該当する xuser エントリは NetWeaver が MaxDB に接続するときに使っているので、SAPNSP のパスワードを変更しただけだと NetWeaver が起動しなくなります。NetWeaver が MaxDB に接続するときはワーク プロセスの実体である disp+work.exe が SAPNSP アカウントを使ってアクセスしに行きます。xuser エントリが間違っている場合は、メッセージ サーバーの起動の後、disp+work の起動でコけます。

WS003

ワーク プロセスの開発者トレースに以下のようなログが出力されます。dev_disp ではなく dev_w0 などに出力されるので注意。

C  Loading SQLDBC client runtime …
C  SQLDBC SDK Version : SQLDBC.H  7.6.0    BUILD 002-121-083-965
C  SQLDBC Library Version : libSQLDBC 7.6.5    BUILD 011-123-196-300
C  SQLDBC client runtime is MaxDB 7.6.5.011 CL 196300
C  SQLDBC supports new DECIMAL interface : 0
C  SQLDBC supports VARIABLE INPUT data   : 1
C  SQLDBC supports keepAlive indicator   : 0
C  INFO : SQLOPT= -I 0 -t 0 -S SAPR3
C  Try to connect (DEFAULT) on connection 0 …

C Wed Dec 29 13:36:40 2010
C  *** ERROR => Connect to database failed, rc = -4008 (POS(1) Unknown user name/password combination)
[dbsdbsql.cpp 137]
B  ***LOG BY2=> sql error -4008  performing CON [dbsh#2 @ 1208] [dbsh    1208 ]
B  ***LOG BY0=> POS(1) Unknown user name/password combination [dbsh#2 @ 1208] [dbsh    1208 ]
B  ***LOG BY2=> sql error -4008  performing CON [dblink#2 @ 431] [dblink  0431 ]
B  ***LOG BY0=> POS(1) Unknown user name/password combination [dblink#2 @ 431] [dblink  0431 ]
M  ***LOG R19=> ThInit, db_connect ( DB-Connect 000256) [thxxhead.c   1449]
M  in_ThErrHandle: 1
M  *** ERROR => ThInit: db_connect (step 1, th_errno 13, action 3, level 1) [thxxhead.c   10563]

NetWeaver の起動に関連するのは SAP<SID> だけなので、SUPERDBA, CONTROL のパスワードをリセットするだけであれば、xuser エントリを更新しなくても NetWeaver の起動には問題ありません。が、そのままにしておくと、次回パスワードを忘れたときに手も足も出なくなります。

xuser エントリの一覧コマンドは xuser list でした。そして、xuser キーと MaxDB アカウントとの対比は以下のようになっていました。

  • DEFAULT –> SAPNSP
  • c –> CONTROL
  • c_J2EE –> CONTROL
  • w –> SUPERDBA
    これもバージョンによって変わる可能性があるので、必ず自分の環境で確認しましょう。基本的にはキーとアカウントの対が合っていればいいのですが、一覧に表示される他のパラメーター(タイムアウトなど)も合わせた方がいいので、必ず変更前の xuser 一覧を記録しておきましょう。
    xuser エントリの変更も xuser コマンドを使います。一度削除してから再設定する場合のコマンドは以下の通りです。

xuser -U DEFAULT clear
xuser -U c clear
xuser -U c_J2EE clear
xuser -U w clear

xuser -u SAPNSP,パスワード -U DEFAULT -d NSP -n ホスト名 -S SAPR3 -t 0 -I 0 set
xuser -u CONTROL,パスワード -U c -d NSP -n ホスト名 -S SAPR3 -t 0 -I 0 set
xuser -u CONTROL,パスワード -U c_J2EE -d NSP -n ホスト名 -S SAPR3 -t 0 -I 0 set
xuser -u SUPERDBA,パスワード -U w -d NSP -n ホスト名 -S SAPR3 -t 0 -I 0 set

    なお、このコマンドはレジストリを書き換えるので、管理者特権で実行する必要があります。特権がない場合もエラーは出ませんが、操作は中断されているので注意が必要です。
    これで NetWeaver も無事起動するようになったはずです。

最後に、パスワードのリセット方法を表にまとめました。

Windows ユーザー Administrator でパスワードを変更
サービス起動アカウントを変更
SAP ユーザー プロファイル パラメータを設定
インスタンス再起動
UPDATE 文を実行して SAP* のパスワードを pass にリセット
MaxDB ユーザー Windows サービスから MaxDB インスタンスを起動
xuser エントリを利用して、CUI 管理コンソールでログオン (dbmcli -U c)
user_put コマンドでパスワードを変更
xuser エントリを更新