APIには、サーバーで生成されたエラー・メッセージおよび他のメッセージを遮断するための、また、クライアント・プログラムの画面上に適切なメッセージを自動的に表示するためのメカニズムが含まれます。通常、このメカニズムは、役に立ちますが、必要に応じてオフにできます。APIでは、プログラムが、それらのメッセージが表示されるのを防ぎ、プログラム内で処理するためにそれらをトラップできます。どのメッセージを表示するかを選択し、プログラムの内部メッセージおよびエラー処理と一貫した方法で、メッセージを表示できます。このメカニズムは、Essbaseのプログラムとのシームレスな統合を提供します。
Essbaseにおけるデフォルトのメッセージ・プロセスはプラットフォームに依存しますが、通常はログ情報(アプリケーション名およびデータベース名、ユーザー名、タイムスタンプなど)付きのダイアログ・ボックスと、そのメッセージ・テキストが表示されます。
各Essbaseメッセージには、一意の識別番号、メッセージ・レベル番号および関連するテキスト文字列(必ずしも一意でない)が備わっています。デフォルトでは、Essbaseは、重大なエラーのエラー・メッセージのみを表示し、警告や情報のエラー・メッセージは表示しません。
Cにおけるメッセージ処理
CのAPIでは、カスタム・メッセージ処理関数を定義し、初期化呼出し、EssInit()の間に、ポインタをその関数へ渡せます。APIがサーバーからメッセージを受け取ると、このカスタム関数が呼び出されます。カスタム関数は、関数の戻りコードを調べて、メッセージを内部で処理するか、またはデフォルトのメッセージ処理のためにAPIにメッセージを戻します。詳細は、CのメインAPIメッセージ処理に関する説明を参照してください。
WindowsおよびCのためのメッセージ処理関数の例を次に示します:
/* C Example of a message handling function */ ESS_FUNC_M ErrorHandler (ESS_PVOID_T myCtx, ESS_LONG_T MsgNum, ESS_USHORT_T Level, ESS_STR_T LogStr, ESS_STR_T MsgStr) { ESS_STS_T sts = 0; ESS_STR_T ErrorStr; ESS_USHORT_T len; HANDLE hMem; /* Only display messages of level ERROR or above */ if (Level >= ESS_LEVEL_ERROR) { /* Calculate combined length of Log and Message strings */ len = 3; /* allow for end of line characters + null */ if (LogStr != NULL) len += strlen (LogStr); if (MsgStr != NULL) len += strlen (MsgStr); /* Concatenate the strings */ if ((hMem = GlobalAlloc (GPTR, len)) != 0) { ErrorStr = GlobalLock (hMem); sprintf (ErrorStr, "%s\n%s", LogStr, MsgStr); /* Display message in a Windows message box */ MessageBox ((HWND)NULL, ErrorStr, "Essbase Error", MB_OK); GlobalUnlock (hMem); GlobalFree (hMem); } } return (sts); }
Visual Basicにおけるメッセージ処理
Visual BasicのAPIでは、メッセージ処理メカニズムは多少異なります。ここでも、初期化呼出し、EsbInit()の間に、パラメータをAPIへ渡します。呼出しは、(Essbaseデフォルト処理を抑制して)カスタム・メッセージ処理を始め、メッセージ・スタックを設定します。その後、プログラムでエラーが発生した場合(API関数呼出しからの0以外の戻り値によって示される)、内部エラー処理関数を呼び出す必要があります。その関数は次に、EsbGetMessage()を呼び出して、スタックからメッセージを取得し、ユーザーが選択した方法でメッセージを表示します。詳細は、Visual BasicのAPIメッセージの処理についての説明を参照してください。
Visual Basicにおけるメッセージ処理関数の例を次に示します:
' VB Example of message handler Dim hInst As Long Dim hCtx As Long Dim sts As Long Dim Server As String * ESB_SVRNAMELEN Dim User As String * ESB_USERNAMELEN Dim Password As String * ESB_PASSWORDLEN Dim Appname As String * ESB_APPNAMELEN Dim Dbname As String * ESB_DBNAMELEN Dim Access As Integer Dim Init As ESB_INIT_T ' GetMessage Variables Dim Count As Integer Dim TestApp As String Dim TestDb As String Dim TestFtrName As String Dim ErrMsg As String * 256 Dim ErrNum As Long Dim ErrLev As Integer ESB_TRUE = Chr$(1) ESB_FALSE = Chr$(0) Init.Maxhandles = 10 Init.ClientError = ESB_TRUE Init.ErrorStack = 100 sts = EsbInit(Init, hInst) sts = EsbAutoLogin(hInst, Server, User, Password, Appname, Dbname, ESB_AUTO_NOSELECT, Access, hCtx) If sts <> 0 Then sts = EsbGetMessage(hInst, ErrLev, ErrNum, ErrMsg, 256) MsgBox ErrMsg & Chr(13) & "Program Ending" End If TestApp = "Sample" TestDb = "Basic" TestFtrName = "Anything" 'This function call should return an error and then be picked up by EsbGetMessage sts = EsbGetFilterList(hCtx, TestApp, TestDb, TestFtrName, Count) If sts <> 0 Then sts = EsbGetMessage(hInst, ErrLev, ErrNum, ErrMsg, 256) MsgBox "Program Ending" & Chr(13) & Chr(13) & ErrMsg End If sts = EsbLogout(hCtx) sts = EsbTerm(hInst) End