CグリッドAPIの例

この例では、基本の取得の実行に必要な手順を説明しています。次のグリッドでは、1つのデータポイントが示された5つの次元テンプレートを示しています。

列にYear、ProductおよびMarketがあり、行にActual、Salesがあるデータ・グリッド。交差点にある1つのデータ値は123.45です。

次のコードは、データ構造体の設定方法と取得操作を実行するために必要な関数呼出しを示しています。

      /* This function allocates the necessary data to send to the server */

ESSG_PPDATA_T AllocTwoDims(ESSG_ULONG_T ulRows, ESSG_ULONG_T ulCols) 
{ 
ESSG_PPDATA_T ppTemp; 
ESSG_ULONG_T  ulIndex; 

if(ulRows) 
ppTemp = (ESSG_PPDATA_T) malloc(sizeof(ESSG_DATA_T*) * ulRows); 
if(ppTemp == NULL) 
return ppTemp; 

memset(ppTemp, 0, (sizeof(ESSG_PDATA_T) * ulRows)); 

for (ulIndex = 0; ulIndex < ulRows; ulIndex++) 
{ 
ppTemp[ulIndex] = (ESSG_PDATA_T)malloc(sizeof(ESSG_DATA_T) * ulCols); 
if(ppTemp[ulIndex]) 
memset(ppTemp[ulIndex], 0, (sizeof(ESSG_DATA_T) * ulCols)); 
} 

return ppTemp; 
}


/* This function frees the memory allocated by AllocTwoDims */
void FreeTwoDim(ESSG_PPDATA_T ppDataToFree, ESS_ULONG_T ulRows)
{
        ESS_ULONG_T ulIndex;

        for (ulIndex = 0; ulIndex < ulRows; ulIndex++)
        {
                if(ppDataToFree[ulIndex]->usType == ESSG_DT_STRING)
                {
                        free(ppDataToFree[ulIndex]->Value.pszStr);
                }
                free(ppDataToFree[ulIndex]);
        }
        free(ppDataToFree);
}

/* This function builds a table based on the above grid. */
/* Note: The items in the grid are hard coded.           */
ESSG_PPDATA_T BuildTable(ESSG_PRANGE_T pRange)
{
        ESSG_PPDATA_T   ppTable;
        ESS_ULONG_T     ulRow, ulCol;

        /* Your code would probably not be hard-coded here... */
        pRange->ulRowStart      = 0;
        pRange->ulColumnStart   = 0;
        pRange->ulNumRows       = 2;
        pRange->ulNumColumns    = 5;
        ppTable = AllocTwoDims(2, 5);

        /* ROW 1 */
        ppTable[0][0].usType = ESSG_DT_BLANK;
        ppTable[0][1].usType = ESSG_DT_BLANK;
        ppTable[0][2].usType = ESSG_DT_STRING;
        /* Some compilers allow you to specify \p to indicate */
        /* the length of the string */
        ppTable[0][2].Value.pszStr = "\pYear";
        ppTable[0][3].usType = ESSG_DT_STRING;
        ppTable[0][3].Value.pszStr = "\pProduct";
        ppTable[0][4].usType = ESSG_DT_STRING;
        ppTable[0][4].Value.pszStr = "\pMarket";

        /* ROW 2 */
        ppTable[1][0].usType = ESSG_DT_STRING;
        ppTable[1][0].Value.pszStr = "\pActual";
        ppTable[1][1].usType = ESSG_DT_STRING;
        ppTable[1][1].Value.pszStr = "\pSales";
        ppTable[1][2].usType = ESSG_DT_DOUBLE;
        ppTable[1][2].dblData = 123.45;
        ppTable[1][3].usType = ESSG_DT_BLANK;
        ppTable[1][4].usType = ESSG_DT_BLANK;

        return (ppTable);
}

/* This function makes the necessary calls to the */
/* EGAPI to perform a basic retrieval.            */
/* NOTE:  This example does not show the                   */
/* initialization of the EGAPI or the grid.       */
/* Also, the hGrid is assumed to be external.    */
void CallEGAPI(void)
{
        ESSG_PPDATA_T   ppDataIn,
        ESSG_PPDATA_T   ppDataOut;
        ESSG_RANGE_T    rRangeDataIn,rRangeDataOut;
        ESSG_STS_T      sts;
        ESSG_ULONG_T    ulRow, ulCol;
        ESSG_USHORT_T   usState;

        /* Connect the grid to a database on the server */
        sts = EssGConnect(hGrid, "Server", "User", "Password",
                                       "App", "Db", ESSG_CONNECT_DEFAULT);
        if (sts == 0)
        {
                ppDataIn = BuildTable(rRangeDatain);
                /* Start the retrieve operation */
                sts = EssGBeginRetrieve(hGrid, ESSG_RET_RETRIEVE);
        }
        if (sts == 0)
        {
                /* Send the entire grid to define the query */
                sts = EssGSendRows(hGrid, rRangeDatain, ppDataIn);
        }
        if (sts == 0)
        {
                /* We're done sending rows, perform the retrieval */
                sts = EssGPerformOperation(hGrid, 0);
        
                /* Free the data we built */
                FreeTwoDim(ppDataIn, rRangeDataIn.ulNumRows);
        }
        if (sts == 0)
        {
                /* Determine the results of the retrieve and how much data
                 * is being returned.
                 */
                sts = EssGGetResults(hGrid, 0, rRangeDataOut, usState);
        }
        if (sts == 0)
        {
                /* Get all of the data */
                sts = EssGGetRows(hGrid,0, rRangeDataOut, 
                        rRangeDateOut, ppDataOut);
        }
        if (sts == 0)
        {
                /* Interate though the data ... */
                /* First the rows */
                for (ulRow = rRangeDataOut.ulRowStart;
                                ulRow < rRangeDataOut.ulNumRows;
                                ulRow++)
                {
                        /* Then the columns */
                        for (ulCol = rRangeDataOut.ulColumnStart;
                                        ulCol < rRangeDataOut.ulNumColumns;
                                        ulCol++)
                        {
                                /* Here's a cell ... just render it. */
                                switch (ppDataOut[ulRow][ulCol].usType)
                                {
                                        case (ESSG_DT_STRING):
                                                DisplayString(ppDataOut[ulRow][ulCol].Value.pszStr);
                                                break;
                                        case (ESSG_DT_LONG):
                                                DisplayValue(ppDataOut[ulRow][ulCol].Value.lData);
                                                break;
                                        case (ESSG_DT_DOUBLE):
                                                DisplayValue(ppDataOut[ulRow][ulCol].Value.dblData);
                                                break;
                                        case (ESSG_DT_BLANK):
                                                DisplayBlank();
                                                break;
                                        case (ESSG_DT_MISSING):
                                                DisplayMissing();
                                                break;
                                        case (ESSG_DT_ZERO):
                                                DisplayValue(0);
                                                break;
                                        case (ESSG_DT_NOACCESS):
                                                DisplayNoAccess();
                                                break;
                                        case (ESSG_DT_MEMBEREX): 
                                                    DisplayString(ppDataOut[ulRow][ulCol].Value.pszStr+1); 
                                                    break;
                                        default:
                                                DisplayOops();
                                                break;
                                }
                        }
                }
                /* Tell the API we don't care about this request any more */
                EssGEndOperation(hGrid, 0);
                /* Free the data returned */
                EssGFreeRows(hGrid, rRangeDataOut, ppDataOut);
        }

        /* Disconnect if you wish */
        EssGDisconnect(hGrid, 0);

}