アウトライン・メンバーの子をソートします。
構文
ESS_FUNC_M
EssOtlSortChildren
(
hOutline, hParent, usType, fpCompare, pUserData
);
| パラメータ | データ型 | 説明 |
|---|---|---|
hOutline |
ESS_HOUTLINE_T |
アウトラインのコンテキスト・ハンドル。 |
hParent |
ESS_HMEMBER_T |
ソートする子の親のハンドル。ESS_NULLが指定されている場合は、次元がソートされます。 |
usType |
ESS_USHORT_T |
ソート・タイプ。次のいずれかを指定できます:
|
fpCompare |
ESS_POTLSORTFUNC_T |
ユーザーが定義した比較関数へのポインタ。usTypeパラメータがESS_SORT_USERDEFINEDの場合にのみ使用されます。次のように定義された関数へのポインタです:
(ESS_INTFUNC_M Compare
ESS_HMEMBER_T mbr1,
ESS_HMEMBER_T mbr2,
ESS_PVOID_T pUserData);
この関数は2つのメンバーのハンドルを受け入れ、次の値を戻します:
|
pUserData |
ESS_PVOID_T |
ユーザーが指定した任意のデータへのポインタ。usTypeパラメータがESS_SORT_USERDEFINEDの場合にのみ使用されます。比較関数を呼び出すたびに、このパラメータの値が比較関数に渡されます。 |
備考
コールバック関数中は、アウトラインを変更する可能性のあるアウトライン関数は呼び出さないでください。EssOtlGetMemberInfo()、EssOtlGetMemberFormula()、およびEssOtlGetMemberAlias()のみ呼び出すことができます。
戻り値
正常終了の場合は0が戻されます。それ以外の場合は、次のいずれかの値が戻されます:
OTLAPI_BAD_SORTTYPE
OTLAPI_BAD_SORTCOMPAREFUNC
OTLAPI_SORT_TOOMANY
例
#include <essapi.h>
#include <essotl.h>
ESS_STS_T sts = 0;
ESS_HOUTLINE_T hOutline;
ESS_HMEMBER_T hMeasures;
FARPROC pfnSort;
ESS_OBJDEF_T Object;
ESS_APPNAME_T szAppName;
ESS_DBNAME_T szDbName;
ESS_OBJNAME_T szFileName;
memset(&Object, '\0', sizeof(Object));
Object.hCtx = hCtx;
Object.ObjType = ESS_OBJTYPE_OUTLINE;
strcpy(szAppName, "Sample");
strcpy(szDbName, "Basic");
strcpy(szFileName, "Basic");
Object.AppName = szAppName;
Object.DbName = szDbName;
Object.FileName = szFileName;
sts = EssOtlOpenOutline(hCtx, &Object, ESS_TRUE,
ESS_TRUE, &hOutline);
if (!sts)
{
sts = EssOtlFindMember(hOutline, "Measures",
&hMeasures);
}
if (!sts)
{
sts = EssOtlSortChildren(hOutline, hMeasures,
ESS_SORT_USERDEFINED,
(ESS_POTLSORTFUNC_T)pfnSort,
(ESS_PVOID_T)hOutline);
}
/***********************************************/
int ESS_INTFUNCT_M SortCompare (
ESS_HMEMBER_T hMember1,
ESS_HMEMBER_T hMember2,
ESS_PVOID_T pData)
{
int nRet = 0;
int nLen1;
int nLen2;
ESS_STS_T sts = 0;
ESS_PMBRINFO_T pMbrInfo1 = ESS_NULL;
ESS_PMBRINFO_T pMbrInfo2 = ESS_NULL;
ESS_HOUTLINE_T hOutline =
(ESS_HOUTLINE_T)pData;
sts = EssOtlGetMemberInfo(hOutline, hMember1,
&pMbrInfo1);
if (!sts && pMbrInfo1)
sts = EssOtlGetMemberInfo(hOutline,
hMember2, &pMbrInfo2);
if (!sts && pMbrInfo2)
{
nLen1 = strlen(pMbrInfo1->szMember);
nLen2 = strlen(pMbrInfo2->szMember);
if (nLen1 < nLen2)
nRet = -1;
else if (nLen1 > nLen2)
nRet = 1;
}
if (pMbrInfo1)
{
EssFree(hInst, pMbrInfo1);
}
if (pMbrInfo2)
{
EssFree(hInst, pMbrInfo2);
}
return (nRet);
}
関連トピック