NetWeaverとは
NetWeaverとは、SAP社のソリューションであり、従来のABAP技術を活かしながら、J2EE技術を土台として全面的に取り込み、人・情報・ビジネスを統合する「次世代統合プラットホーム」として、SAP社からERPを含めた全てのビジネススイートのアプリケーション基盤という位置づけをしております。
NetWeave ABAPは、SAP ERP Central Component(SAP ECC、従来のR/3部分)の稼働基盤であり、R/3までの時代ではBasis(ベーシス)と呼ばれてきました。
NetWeaverの利用タイプ
NetWeaver Platformは、完全にコンポーネントベースのアーキテクチャ構成を実現できています。NetWeaver Platformを構成する機能は、利用タイプとして分けており、インストール時に必要に応じてインストール単位として選ぶことができます。
以下の表でバージョン毎の製品名およびその利用タイプを説明します。あくまでも筆者の認識で整理した内容ですので、間違いがあれば、有識者達にご指摘していただきたいです。
バージョン | 製品名 | 利用タイプ | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
AsABAP | AsJAVA | BW | CE | DI | EPC | EP | MI | PI | ||
7.0 | NetWeaver Platform | ○ | ○ | - | ○ | ○ | ○ | ○ | ○ | ○ |
7.1 | Netweaver CE | ○ | ○ | - | ○ | ○ | ○ | ○ | - | ○ |
NetWeaver PI | - | ○ | - | - | - | - | - | - | ○ | |
NetWeaver Mobile | - | ○ | - | - | - | - | - | ○ | - | |
7.2 | Netweaver CE | ○ | ○ | - | ○ | ○ | ○ | - | - | ○ |
7.3 | NetWeaver Platform | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
7.4 | NetWeaver Platform | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
NetWeaverの開発環境
NetWeaverの開発環境は、ABAPとJAVAによって分かれております。
- ABAP
ABAPワークベンチ(SapGUI利用) - JAVA
NWDS(Eclipseベース)
Eclipse基盤が提供した機能はとくに説明しません。
概述
Composite Application
Composite Designer
Desgin Time Repository
Development Infrastructure
Dictionary
Enterprise Portal
Process Development
Process Modeling
SAP Management
Virtual Composer
WebDynpro
Deployment
このトピックでは、Eclipseの概要を取り上げて説明します。
画面構成
画面イメージ
ワークベンチ
Eclipseを起動すると、1つの作業台が起動します。この作業台のことを「ワークベンチ」と呼びます。
ワークベンチは、次に説明するパースペクティブやエディター、ビューの土台となっている部分のことで、ワークベンチそのものが画面上に表示されることはありません。
パースペクティブ
パースペクティブは視角、視野といういみをもっています。
ワークベンチには、たくさんの機能があります。しかし、ある1つの作業をする際には、その一部の機能しか使いません。そのため、Eclipseでは必要な機能だけを選んで画面上に表示するようにしています。
どの機能を表示するかを選んだもの、さらに選んだ機能をどのように配置するかを決めたものを、「パースペクティブ」と呼びます。
Eclipseを起動すると、1つのパースペクティブが選択されて画面に表示されます。
エディタ
パースペクティブは、エディターとビューで構成されています。
エディターは、プログラムなどのデータの作成、編集、保存を行う機能です。
ビュー
ビューは、さまざまな情報を表示し、かつそれらに対して操作を行うことのできるウィンドウです。
このトピックでは、エラーハンドリング処理のプログラミング方法を取り上げて説明します。
概述
エラーハンドリング (英:error handling)とは、、プログラムの処理中に処理が妨げられる事象が発生した際、その処理をエラーとして対処する処理のことです、例外処理とも呼ばれます。
エラーハンドリングの処理内容は、プログラム内にあらかじめ用意しておく必要がありますので、このトピックでは、WDJ開発におけるエラーハンドリング処理の方法や手順を取り上げて説明します。
エラーハンドリング処理を行う必要がある。
Webdynproでは、エラーハンドリング処理は以下の手順で行う。
エラーハンドリング処理の概要手順
① Message Poolの定義追加
② Message Poolへのアクセス
③ UIへの出力領域の定義
④ エラーハンドリング処理
メッセージの定義
メッセージはメッセージプールに定義されます。メッセージプールはWebdynproコンポーネント毎に一つのみが存在します。
メッセージはプログラムが格納されたDCのメッセージプールに定義すること以外、共通的なDCを一つ用意して、そのなかのメッセージプールでメッセージを纏めて定義することによりメッセージの共通化を図ることができます。
メッセージ文言はパラメータをつけることができます。
メッセージの取得
Webdynproでは、Message PoolへのアクセスやMessage Poolからメッセージの取得に、以下の手順で行う。
IWDTextAccessor APIを利用し、Message Poolへの接続を作成する。
Message Poolへの接続を用い、MessageKeyをもとに、メッセージを取得する。
Object[] parameters = new Object[1]; parameters[0] = parameter;IWDTextAccessor textAccessor = wdComponentAPI.getTextAccessor();
String msg = textAccessor.getText('dbupderror'), parameters);
メッセージ領域の定義
エラーハンドリング処理
Webdynproでは、エラーハンドリング処理により、アプリケーション例外を発生させ、予め定義されるエラーメッセージ内容をします。
具体的な手順やコード例は以下のように示します。
if (!wdThis.check()){
//MessageManagerを取得
IWDMessageManager msgmgr = wdThis.wdGetAPI().getComponent().getMessageManager();
//メッセージを出力
msgmgr.reportContextAttributeMessage(
wdThis.wdContext.currentMyDataElement(), // エラーメッセージにリンクしているUIエレメント
wdThis.wdContext.nodeMyData().getNodeInfo().getAttribute("Name"), // チェック項目
IMessageUIComp.DBUPDERROR, // MessagePoolに登録されるメッセージキー
null,
true);
}
このトピックでは、WebdynproでのRFCモデル作成方法及び手順を取り上げて説明します。
Model作成
Webdynproでは、RFCの呼出にはaRFC用のModelを作成する必要がある。またModel作成の際に、
モデルデータとメタデータオブジェクトをセットで定義する必要がある。
aRFC呼出Modelの作成イメージを下図に示す。
データバインド
概要イメージ
Webdynproでは、RFCのモデルデータをWebdynpro内で利用するには、Webdynpro のCustom Controllerへバインドする必要があります
また、モデルデータをUIに表示するには、さらにView Controllerへバインドする必要があります
RFCモデルデータのバインドイメージを下図に示す。
RFC I/F呼出
// 通貨単位取得 String waers = wdThis.getWaers(); // ex: USD // 通貨単位の小数桁数を取得 BAPI_CURRENCY_GETDECIMALSModel model = new BAPI_CURRENCY_GETDECIMALSModel(); Bapi_Currency_Getdecimals_Input input = new Bapi_Currency_Getdecimals_Input(model); input.setCurrency(waers); wdContext.nodeBapi_Currency_Getdecimals_Input().bind(input); input.execute();String type = wdContext.currentReturnElement().getType();
if (type.equals(MSGTYP_ERROR)) {
IWDMessageManager msgMgr = wdComponentAPI.getMessageManager();
sgMgr.reportException(wdContext.currentReturnElement().getMessage());
}
int curdecimals = wdContext.currentCurrency_DecimalsElement().getCurdecimals();
※wdContext.nodeOutput().invalidate()の呼出により、RFCの処理結果はWebdynproで取得可能になる
このトピックでは、ポップアップ処理を取り上げて、そのプログラミング方法を説明します。
Confirmation Dialog
Confirmation DialogはWDJ標準ライブラリに組み込まれていますので、そのまま利用可能です。
プログラムの構造は主にいかのようになります。
- Yes, Noに該当するevent handler処理を記述しておく
- Confirmation Dialogを作成
- Yes, Noに該当するevent handlerを定義す
- Confirmation Dialogを表示
サンプルソースは以下です。
// 追加されたイベント(Yesボタンがクリックされたときの動き) public void Yes(com.sap.tc.webdynpro.progmodel.api.IWDCustomEvent wdEvent ) { //@@begin Yes(ServerEvent) logger.infoT("Yes button is clicked."); //@@end } //@@begin createConfDialogWindow() IWDWindowManager winMan = wdComponentAPI.getWindowManager(); IWDControllerInfo viewCtrlInfo = wdComponentAPI.getComponentInfo(). findInViews("WelcomeView").getViewController(); IWDEventHandlerInfo evtHndlr = viewCtrlInfo.findInEventHandlers("Yes"); IWDConfirmationDialog confDialog = winMan.createConfirmationWindow( "本当にいいですか?", evtHndlr, "はい"); evtHndlr = viewCtrlInfo.findInEventHandlers("No"); confDialog.addChoice(evtHndlr, "いいえ"); confDialog.show(); //@@end
画面付きモーダルダイアログ
画面付きポップアップウィンドウとはWDJ部品の中でウィンドウをポップアップとして表示することを指します。
ポップアップウィンドウの制御はコンポーネントコントローラーまたはカスタムコントローラーのに定義すします。
サンプルソースは以下です。
public void openPopup( ) { //@@begin openPopup() if (popup == null) { // ウィンドウ取得 IWDWindowInfo windowInfo = wdComponentAPI.getComponentInfo().findInWindows("PopupWin"); // モダルウィンドウ生成 popup = wdComponentAPI.getWindowManager().createModalWindow(windowInfo); } // ポップアップウィンドウを開く popup.show(); //@@end } ... public void closePopup( ) { //@@begin closePopup() // ポップアップウィンドウを閉じる popup.hide(); //@@end } ... //@@begin others // ローカルウィンドウオブジェクト private IWDWindow popup; //@@end
別画面表示
別画面表示はURLを元に別ブラウザーを開くことを指します。
他のWDJアプリケーションを起動する「IWDDeployableObject」と「WDURLGenerator」を利用して実装します。
サンプルソースは以下です。
// アプリケーションからIWDDeployableObjectを取得 IWDDeployableObject dObject = wdComponentAPI.getApplication().getDeployableObjectPart().getDeployableObject(); // 実行するWDJアプリケーション名を指定 String url = WDURLGenerator.getApplicationURL(dObject.getApplication("Contract00601App")); // 外部ブラウザーで開く IWDWindow window = wdComponentAPI.getWindowManager().createNonModalExternalWindow(url); window.show();
他のWEBアプリケーション起動
同一サーバで存在するServlet等の場合、相対パースでURLを指定し、対象URLにPOST/GETでパラメータを渡す必要がある場合は「WDURLGenerator」を利用してパラメータを渡します。
サンプルソースは以下です。
// Mapでパラメータ値設定 Map<String, Object> urlParameters = new HashMap<String, Object>(); urlParamaters.put("id","1234");// パラメータ生成、文字コードがnullの場合、UTF-8変換
String query = WDURLGenerator.getQueryString(urlParamaters, "Shift-JIS");
// 外部ブラウザーで開く, URL, パラメータ, POST(true)/GET(false)をパラメータ設定
// 想定パースは「/【DCのVendor名】~【DC名】/実行対象」で構成され、DC名に「/」が存在する場合、「~」に変換する。
IWDWindow window = wdComponentAPI.getWindowManager().createNonModalExternalWindow(
"/jp.co.asahikasei~yvw~jee~wm_excel_0001/download", query, true);
window.show();
// 別ウィンドウで開く
IWDWindow window = wdComponentAPI.getWindowManager()
.createNonModalExternalWindow(urlToTargetApp);
// ウィンドウプロパティの設定
window.setWindowSize(800, 480);
window.setWindowPosition(100, 50);
// アドレスバーの削除
window.removeWindowFeature(WDWindowFeature.ADDRESS_BAR);
window.show();
(このトピックは編集中です)
ファイルアップロード
Resource attributeを定義
Contextにタイプcom.sap.ide.webdynpro.uielementdefinitions.ResourceのValue Attributeを追加します。
FileUpload UIを追加する
アップロード後の情報を取得
IWDResource iwdr = (IWDResource)wdContext.getCurrentElement().getAttributeValue("Resource"); logger.infoT(iwdr.getResourceName()); logger.infoT(iwdr.getResourceType().getFileExtension()); logger.infoT(iwdr.getResourceType().getHtmlMime());
ファイルダウンロード
Resource attributeを定義
Contextにタイプcom.sap.ide.webdynpro.uielementdefinitions.ResourceのValue Attributeを追加します。
FileDownload UIを追加
FileDownload UIを追加し、resourceプロパティにResource attribute valueを指定すす
入力補助機能として検索ヘルプまたは入力値提案を実装することができます。
単純型検索ヘルプ
UIエレメント「DropDownByKey」を利用して実装する。標準設定によって項目数が50を超える場合、ポップアップ検索ヘルプとして表示されます。
該当設定方法は「RadioButtonGroupByKey」も同一です。
静的設定
固定値で項目一覧を設定する場合のみ使用します。
UIエレメント「DropDownByKey」のプロパティ「selectedKey」にマッピングされているコンテキストアトリビュートのタイプにシンプルタイプを設定して、「Enumeration」項目に項目一覧を追加する。
動的設定
値を動的に設定する場合、使用する。
UIエレメント「DropDownByKey」のプロパティ「selectedKey」にマッピングされているコンテキストアトリビュートに対してコーディング処理を行う。
該当ロジックはコンテキストを定義したコントローラーに実装する。
※コンテキストを参照しているコントローラーに実装した場合、「must not modify the datatype of a mapped attribute」エラーが発生する。
// コンテキストからModifiableSimpleValueSet オブジェクトを取得 com.sap.typeservices.IModifiableSimpleValueSet<String> valueSet = wdContext.currentHeader01Element().getAttributePointer(IPublicContract006Comp.IHeaderElement.CATEGORY). getAttributeInfo().getModifiableSimpleType().getSVServices().getModifiableSimpleValueSet();// ESまたはBAPIのドロップダウンを設定
List<Category> list = zprocessInit.getT_Category();
for(Category category : list ) {
valueSet.put(category.getKey(), category.getText());
}
// ドロップダウンの初期値を設定する場合
wdContext.currentHeaderElement().setCATEGORY(list.get(0));
複合機能型検索ヘルプ
検索条件付きの検索機能を表す。複合機能型検索ヘルプはWDJのObject Value Selector(OVS)機能を利用した共通部品として実装され、
各業務画面から利用します。
検索用のヘルプ標準部品を利用
OVSは検索で使用するノードと処理ロジックだけ追加することで簡単に検索ヘルプを追加することができます。
自動生成されるOVSで使用する検索条件用ノードと検索結果用ノードは用意する必要があります。
・OVS設定処理ロジック
OVS用のノードとOVSリスナーを利用してOVSを設定します。
// 検索ヘルプを設定するコンテキスト
com.sap.tc.webdynpro.progmodel.api.IWDAttributeInfo[] ovsStartUpAttributes
= {wdContext.nodeHead().getNodeInfo().getAttribute(IPrivateOVSView.IHeadElement.PROCESS_TYPE)};
// OVSの処理リスナー (クラス定義必要)
com.sap.tc.webdynpro.progmodel.api.IWDOVSContextNotificationListener listener
= new TestOVSContextNotificationListener ();
// OVSの設定処理
com.sap.tc.webdynpro.progmodel.api.WDValueServices.addOVSExtension(
"TestOVS", // OVS名称ー任意
ovsStartUpAttributes, // 検索ヘルプ設定対象
wdContext.nodeInput(), // 検索条件ノード
wdContext.nodeOutput(), // 検索結果ノード
listener // リスナーオブジェクト
);
・OVSリスナークラス定義
インタフェースIWDOVSContextNotificationListenerを実装してOVSの実行時呼び出されるクラスを定義し、OVSの設定で利用される。
private class TestOVSContextNotificationListener implements
com.sap.tc.webdynpro.progmodel.api.IWDOVSContextNotificationListener{
// OVSの初期検索条件の値設定ロジック
public void applyInputValues(com.sap.tc.webdynpro.progmodel.api.IWDNodeElement applicationNodeElement,
com.sap.tc.webdynpro.progmodel.api.IWDNodeElement queryInputNodeElement) {
queryInputNodeElement.setAttributeValue(
IPublicTest04Comp.IInputElement.PROCESS_TYPE,
applicationNodeElement.getAttributeValue(IPrivateOVSView.IHeadElement.PROCESS_TYPE));
}
// 検索処理の実装
public void onQuery(com.sap.tc.webdynpro.progmodel.api.IWDNodeElement queryInputNodeElement,
com.sap.tc.webdynpro.progmodel.api.IWDNode queryOutputNode) {
// 検索ロジック
for(int i = 10; i < 20; i++) {
IWDNodeElement element = queryOutputNode.createAndAddElement();
element.setAttributeValue(
IPublicTest04Comp.IOutputElement.PROCESS_TYPE, "11" + i);
element.setAttributeValue(
IPublicTest04Comp.IOutputElement.PROCESS_TYPE_NAME, "テストタイプ1111" + i);
}
}
// 検索結果の行を選択した後の処理
public void applyResult(com.sap.tc.webdynpro.progmodel.api.IWDNodeElement applicationNodeElement,
com.sap.tc.webdynpro.progmodel.api.IWDNodeElement queryOutputNodeElement) {
// start copying the attributes
applicationNodeElement.setAttributeValue(
IPrivateOVSView.IHeadElement.PROCESS_TYPE,
queryOutputNodeElement.getAttributeValue(IPublicTest04Comp.IInputElement.PROCESS_TYPE));
}
検索用のヘルプカスタム部品を作成
IWDOVSProviderとIWDOVSDialogを実装したクラスを利用して別ウィンドウとビューを持つOVS画面を作成できます。
・OVS設定処理ロジック
カスタム部品は別のウィンドウとビューを保持するので、OVS用のノードとOVSリスナーの代わりにOVSプロバイダ及びOVSダイアログを利用する。
設定ロジックは一般的にコンポーネントコントローラーまたはカスタムコントローラーのwdDoInitに実装します。
// 検索ヘルプを設定するコンテキスト
com.sap.tc.webdynpro.progmodel.api.IWDAttributeInfo[] ovsStartUpAttributes
= {wdContext.nodeHead().getNodeInfo().getAttribute(IPrivateOVSView.IHeadElement.PROCESS_TYPE)};
// OVSプロバイダ (クラス定義必要)
com.sap.tc.webdynpro.progmodel.api.IWDOVSProvider provider = new TestOVSProvider();
// OVSの設定処理
com.sap.tc.webdynpro.progmodel.api.WDValueServices.addOVSExtension(
"TestOVS", // OVS名称ー任意
ovsStartUpAttributes, // 検索ヘルプ設定対象
provider, // OVSプロバイダ
null
);
・OVSプロバイダ及びOVSダイアログクラス定義
インタフェースIWDOVSProviderを実装したOVSプロバイダはOVSダイアログ情報を保持しています。
private class TestOVSProvider implements IWDOVSProvider {OVSDialg dialog;
IWDOVSControl ovsControl;// OVSウィンドウを生成して返す
@Override
public IWDOVSDialog createOVSDialog(IWDOVSControl ovsControl) {
dialog = new OVSDialg();
this.ovsControl = ovsControl;
return dialog;
}
// 明示的にウィンドウを閉じる場合、使用
public void closeWindow() {
dialog.closeWindow();
}
// OVSコントロール情報が必要な場合、使用
// OVSを呼び出したアトリビュート情報等
public IWDOVSControl getControl() {
return this.ovsControl;
}}
インタフェースIWDOVSDialogを実装したOVSダイアログはOVSウィンドウのオブジェクトを持っている。
private class OVSDialg implements IWDOVSDialog {
IWDWindow window;
// ウィンドウを「閉じる」ボタンを押すタイミングで呼び出される
@Override
public void exit() {
// TODO Auto-generated method stub
}
// OVSヘルプとして使用するウィンドウを返す
@Override
public IWDWindow getWindow() {
IWDWindowInfo windowInfo =
(IWDWindowInfo)wdComponentAPI.getComponentInfo().findInWindows("TestCompWindow");
window = wdComponentAPI.getWindowManager().createModalWindow(windowInfo);
return window;
}
// ウィンドウを閉じる処理として明示的にウィンドウを閉じる場合、使用
public void closeWindow() {
window.destroyInstance();
}
}
入力値提案
データの一部を入力すると入力値にヒットするデータが一覧として表示されます。
UIエレメント「InputField」の「suggestValues」を「true」に設定してマッピングしたコンテキストアトリビュートには「単純型検索ヘルプ」と同一のコディングまたはシンプルタイプマッピングを行います。
このトピックでは、WDJ開発における各基本UIエレメントを取り上げて説明します。(このトピックは編集中です。)
Label
用途
他のUIエレメントのラベルとして表示される。
関連付けのUIエレメントのプロパティ「state」が「required」になっている場合、必須マークが表示される。
主要プロパティ
プロパティ | 設定可能値 | 説明 |
---|---|---|
labelFor | UIエレメントID | 関連付けUIエレメントのIDを設定 |
design | emphasized light standard | 強調表示に設定 「:」なしに設定 基本表示 |
text | テキスト | 関連付けUIエレメントのIDを設定 |
Value Help
Web DynproのValue Help
① Simple Value Selector(SVS)
② Extended Value Selector(EVS)
③ Object Value Selector(OVS)
help.sap.com - Value Help Tutorials
外部リンク
このトピックでは、例を取り上げて手順に従ってポータルロールの作成方法を説明します。
ポータルロールの作成
1.ロールを新規作成
2.ロールの属性を入力
3.ロールの作成を完了
ポータルロールの編集
4.ロールを編集
5.ワークセットをロールに追加
6.もう一つのワークセットを追加しておく
7.EntryPointをTrueにしておく
ポータルロールの割当
ポータルロールの表示
このトピックでは、例を取り上げて手順に従ってiViewの作成方法を説明します。
1.iViewを新規作成
2.iViewの作成方法を選択
3.アプリケーションサーバを指定
4.アプリケーションを指定
4.iViewの属性を入力
5.iViewの作成を完了
6.その他のiViewを作成しておく
このトピックでは、 UWLサービスのアクセス方法を取り上げて説明します。
UWLサービスの取得
Portal利用
IUWLService uwlService = (IUWLService) WDPortalUtils.getServiceReference(IUWLService.ALIAS_KEY); PortalRuntime.getRuntimeResources().getService(IUWLService.ALIAS_KEY);
JNDI利用
// look up UWL service private IUWLService findService() throws NamingException { Properties env = new Properties(); env.put(InitialContext.INITIAL_CONTEXT_FACTORY, "com.sapportals.portal.prt.registry.PortalRegistryFactory"); // create initial context InitialContext ctx = new InitialContext(env); // retrieve UWL service IUWLService uwlService = (IUWLService) ctx.lookup("/broker/services/" + IUWLService.ALIAS_KEY); return uwlService; }
ワークアイテムの走査
public void retriveItems() {try {
// look up UWL service
IUWLService uwlService = findService();
// define session timeout period
final int sessionIdleTimeout = 60;
// create context
UWLContext uwlContext = new UWLContext();
// find logged in user.
IUser user = //TODO Get the user for whom the items are to be retrieved.
uwlContext.setUser(user);
uwlContext.setLocale(Locale.getDefault());
// begin session IUWLSession uwlSession;
uwlSession = uwlService.beginSession(uwlContext, sessionIdleTimeout);
uwlContext.setSession(uwlSession);
IUWLItemManager itemManager = uwlService.getItemManager(uwlContext);
QueryResult result = itemManager.getItems(uwlContext, null, null);
ItemCollection items = result.getItems();
Item item = null;
for (int i = 0; i < items.size(); i++) {
item = items.get(i);
// item.getSubject() can give you Task's Subject string
// item.getAttribute("taskId").getStringValue() gives you taskId
// (a check for null should be added also to avoid NullPointerException).
Map params = new HashMap();
params.put("taskId", item.getExternalId());
String executionURL = WDURLGenerator.getApplicationURL("sap.com/tc~bpem~wdui~taskinstance", "ATaskExecution", params);
//TODO Add code send mail which contains above URL.
}
} catch (UWLException e) {
e.printStackTrace();
} catch (NamingException e) {
e.printStackTrace();
}
}