2.2.4.12.23 Datasheet::SetReportTree

Description

Report generation function. Automatically generate a results worksheet from an Origin C tree created using report generation macros found in the system header file Report.h.

Syntax

int SetReportTree( TreeNode & tr, int nBegin = 0, DWORD dwOptions = 0 )

Parameters

tr
[input] Tree created using report generation macros in Report.h
nBegin
[input] Beginning row number in the table to generate report. default is -1, that means the first row.
dwOptions
[input] additional options from the SETGRTR_* enumeration.

Return

Returns last row number on successful exit and -1 on failure.

Examples

EX1

// This is a simple sample to show how to report only one table.
// Run Datasheet_SetReportTree_Ex1 1, will transpose the rows and columns of table
void Datasheet_SetReportTree_Ex1(bool bTransposeTable = false)
{
    int nID = 100; // Each node must have node ID and node ID must be unique except the case described in [Note1] below
    int nTableFormat = GETNBRANCH_OPEN | GETNBRANCH_HIDE_COL_HEADINGS| GETNBRANCH_HIDE_ROW_HEADINGS | GETNBRANCH_FIT_COL_WIDTH | GETNBRANCH_FIT_ROW_HEIGHT;
    
    // 1. Create report tree
    Tree tr;
    tr.Report.ID = nID++;
    tr.Report.SetAttribute(STR_LABEL_ATTRIB, "Sample Report Tree"); //Table title
    // TREE_Table attribute is critical in getting the report to work so must be present in every table level. 
    // Can set this attribute as 0 without any format, but many bits GETNBRANCH_* defined in oc_const.h to set table display format.
    tr.Report.SetAttribute(TREE_Table, nTableFormat); 
    
    // 2. Create report table
    tr.Report.Table.ID = nID++;
    tr.Report.Table.SetAttribute(STR_LABEL_ATTRIB, "This is a simple table"); // Table title. If not set this, will show as empty here
    int nSubTableFormat = nTableFormat;
    if(bTransposeTable)
        nSubTableFormat |= GETNBRANCH_TRANSPOSE; // transpose this table
    tr.Report.Table.SetAttribute(TREE_Table, nSubTableFormat); 
    
    // 3 ~ 6 is to add rows and columns to this table. But row and column is not real row and column 
    // since we can transpose table, introduce row and column here in order to easy to understand 
    
    // 3. Add one row to this table
    tr.Report.Table.R1.ID = nID++;
    tr.Report.Table.R1.SetAttribute(STR_LABEL_ATTRIB, "Row 1"); //Row label
    
    // 4. Add two columns to this table
    int nColIDBase = 10000;
    tr.Report.Table.R1.C1.ID = nColIDBase + 1;
    tr.Report.Table.R1.C1.SetAttribute(STR_LABEL_ATTRIB, "Column 1"); // Column label
    tr.Report.Table.R1.C1.dVal = 5;
    
    tr.Report.Table.R1.C2.ID = nColIDBase + 2;
    tr.Report.Table.R1.C2.SetAttribute(STR_LABEL_ATTRIB, "Column 2"); // Column label
    tr.Report.Table.R1.C2.dVal = 10;    
    
    // 5. Add the second row to this table
    tr.Report.Table.R2.ID = nID++;
    tr.Report.Table.R2.SetAttribute(STR_LABEL_ATTRIB, "Row 2"); //Row label
    
    // 6. Fill in values for the two cells in the second row
    tr.Report.Table.R2.C1.ID = nColIDBase + 1; // [Note1] For the same column the differnet row, the node ID should keep same. For example, the ID of node tr.Report.Table.R2.C1 is same as the ID of tr.Report.Table.R1.C1.
    tr.Report.Table.R2.C1.dVal = 15;
    
    tr.Report.Table.R2.C2.ID = nColIDBase + 2;
    tr.Report.Table.R2.C2.dVal = 20;
    
    
    // 7. Prepare worksheet window to report
    WorksheetPage wksPage;
    wksPage.Create();    
    
    DWORD     dwOptions = WP_SHEET_HIERARCHY | CREATE_NO_DEFAULT_TEMPLATE;        
    string    strSheetName = "Report Sheet";
    int        nn = wksPage.AddLayer(strSheetName, dwOptions);
    if( nn < 0 )    
        return;    
    
    Worksheet wksOut = wksPage.Layers(nn);
    wksPage.Layers(0).Delete();    //delete the first default layer    
    
    // 8. Do report
    if( wksOut.SetReportTree(tr.Report) < 0 ) // Returns last row number on successful exit and -1 on failure.
    {
        printf("Fail to set report tree.\n");
        return;
    }        
    wksOut.AutoSize();        
}

EX2

// The following example reports two tables. The first table shows result from one struct and the second table shows values got from vector.
void Datasheet_SetReportTree_Ex2()
{
    int nID = 100; // Each node must have node ID and node ID must be unique    
    int nTableFormat = GETNBRANCH_OPEN | GETNBRANCH_HIDE_COL_HEADINGS| GETNBRANCH_HIDE_ROW_HEADINGS | GETNBRANCH_FIT_COL_WIDTH | GETNBRANCH_FIT_ROW_HEIGHT;
    
    // 1. Create report tree
    Tree tr;
    tr.Report.ID = nID++; 
    tr.Report.SetAttribute(STR_LABEL_ATTRIB, "Dest Stats Report"); //Table title
    // TREE_Table attribute is critical in getting the report to work so must be present in every table level. 
    // Can set this attribute as 0 without any format, but many bits GETNBRANCH_* defined in oc_const.h to set table display format.
    tr.Report.SetAttribute(TREE_Table, nTableFormat); 

    
    // 2. Prepare the 1st table Descriptive Statistics and show values got from one structure
    tr.Report.Table1.ID = nID++;
    tr.Report.Table1.SetAttribute(STR_LABEL_ATTRIB, "Descriptive Statistics"); // Table title. If not set this, will show as empty here
    tr.Report.Table1.SetAttribute(TREE_Table, nTableFormat); 
    
    tr.Report.Table1.C1.ID = nID++;
    tr.Report.Table1.C1.SetAttribute(STR_LABEL_ATTRIB, "Result");
    
    tagtTestDescStats stRes; 
    stRes.N = 100;
    stRes.Mean = 604.72;
    stRes.SD = 760.19;
    stRes.SEM = 76.02;    
    
    // Add nodes with values and IDs from structure to tree
    tr.Report.Table1.C1 += stRes;
    
    // !! Please some details of tagtTestDescStats in stats_types.h, already define ID when declaration this structure
    // If stRes is a user defined structure without ID, here need to assign node ID for each child nodes of trCol, for example:
    //foreach(TreeNode trN in tr.Report.Table1.C1.Children)
    //{
        //trN.ID = nID++;
    //}
    
    // Set label for each row
    tr.Report.Table1.C1.N.SetAttribute(STR_LABEL_ATTRIB, "N total");
    tr.Report.Table1.C1.Mean.SetAttribute(STR_LABEL_ATTRIB, "Mean");
    tr.Report.Table1.C1.SD.SetAttribute(STR_LABEL_ATTRIB, "Standard Deviation");
    tr.Report.Table1.C1.SEM.SetAttribute(STR_LABEL_ATTRIB, "SE of Mean");    

    
    // 3. Prepare the 2nd table and show values got from vectors
    tr.Report.Table2.ID = nID++;
    tr.Report.Table2.SetAttribute(STR_LABEL_ATTRIB, "Extreme Values"); //Table tile
    tr.Report.Table2.SetAttribute(TREE_Table, nTableFormat | GETNBRANCH_TRANSPOSE); 
    
    tr.Report.Table2.C1.ID = nID++;
    tr.Report.Table2.C1.SetAttribute(STR_LABEL_ATTRIB, "Max Values"); // Column label
    
    tr.Report.Table2.C2.ID = nID++;
    tr.Report.Table2.C2.SetAttribute(STR_LABEL_ATTRIB, "Min Values"); // Column label        
    
    // Put data from vector to table columns
    vector vMaxDatas = {100, 98, 95, 92, 84};
    vector vMinDatas = {5, 9, 13, 18, 21};
    tr.Report.Table2.C1.dVals = vMaxDatas; 
    tr.Report.Table2.C2.dVals = vMinDatas;    
    
    
    // 4. Prepare worksheet window to report
    WorksheetPage wksPage;
    wksPage.Create();    
    
    DWORD     dwOptions = WP_SHEET_HIERARCHY | CREATE_NO_DEFAULT_TEMPLATE;        
    string    strSheetName = "Report Sheet";
    int        nn = wksPage.AddLayer(strSheetName, dwOptions);
    if( nn < 0 )    
        return;    
    
    Worksheet wksOut = wksPage.Layers(nn);
    wksPage.Layers(0).Delete();    //delete the first default layer    
    
    
    // 5. Do report
    if( wksOut.SetReportTree(tr.Report) < 0 ) // Returns last row number on successful exit and -1 on failure.
    {
        printf("Fail to set report tree.\n");
        return;
    }        
    wksOut.AutoSize();    
}

EX3

//The following example shows how to embed graphs into a report tables. 
void Datasheet_SetReportTree_Ex3(string strGraphName = "Graph1")
{
    GraphPage gp(strGraphName);
    if(!gp)
    {
        printf("No graph named %s in project\n", strGraphName);
        return;
    }
    
    int nID = 100; // Each node must have node ID and node ID must be unique    
    int nTableFormat = GETNBRANCH_OPEN | GETNBRANCH_HIDE_COL_HEADINGS| GETNBRANCH_HIDE_ROW_HEADINGS | GETNBRANCH_FIT_COL_WIDTH | GETNBRANCH_FIT_ROW_HEIGHT;
    
    // 1. Create report tree
    Tree tr;
    tr.Report.ID = nID++; 
    tr.Report.SetAttribute(STR_LABEL_ATTRIB, "Report with Embeddem Graph"); //Table title
    // TREE_Table attribute is critical in getting the report to work so must be present in every table level. 
    // Can set this attribute as 0 without any format, but many bits GETNBRANCH_* defined in oc_const.h to set table display format.
    tr.Report.SetAttribute(TREE_Table, nTableFormat); 
    
    // 2. Prepare table to show report graph
    tr.Report.Table1.ID = nID++;
    tr.Report.Table1.SetAttribute(STR_LABEL_ATTRIB, "Example Table"); // Table title. If not set this, will show as empty here
    tr.Report.Table1.SetAttribute(TREE_Table, nTableFormat|GETNBRANCH_HIDE_ROW_LABELS);
    

    // 3. Put graph page inside report table
    PictureHolder pictHolder;
    if( !page_get_picture(gp, pictHolder, "EMF", 72, false) )
    {
        printf("failed to create EMF from graph\n");
        return;
    }
    tr.Report.Table1.Graph1.ID = nID++;
    tr.Report.Table1.Graph1.pict = pictHolder;    

    // 4. Prepare worksheet window to report
    WorksheetPage wksPage;
    wksPage.Create("origin", CREATE_EMPTY);    
    wksPage.SetShow();    
    
    DWORD     dwOptions = WP_SHEET_HIERARCHY | CREATE_NO_DEFAULT_TEMPLATE;        
    string    strSheetName = "Report Sheet";
    int        nn = wksPage.AddLayer(strSheetName, dwOptions);
    if( nn < 0 )    
        return;        
    
    // 5. Do report
    Worksheet wksOut = wksPage.Layers(nn);
    if( wksOut.SetReportTree(tr.Report) < 0 ) // Returns last row number on successful exit and -1 on failure.
    {
        printf("Fail to set report tree.\n");
        return;
    }        
    wksPage.Rename("ReportSample");
    wksOut.AutoSize();        
}

EX4

//Reports vector numeric data and text from tree to flat sheet.
void Datasheet_SetReportTree_Ex4()
{
    int nID = 100; // Each node must have node ID and node ID must be unique    
    int nTableFormat = GETNBRANCH_FIT_COL_WIDTH | GETNBRANCH_FIT_ROW_HEIGHT;

    // 1. Create report tree
    Tree tr;
    tr.Report.ID = nID++; 
    tr.Report.SetAttribute(STR_LABEL_ATTRIB, "Dest Stats Report"); //Table title
    // TREE_Table attribute is critical in getting the report to work so must be present in every table level. 
    // Can set this attribute as 0 without any format, but many bits GETNBRANCH_* defined in oc_const.h to set table display format.
    tr.Report.SetAttribute(TREE_Table, nTableFormat);
    
    
    // 2. Prepare the table and show values got from vectors
    tr.Report.Table.ID = nID++;
    TreeNode trTable = tr.Report.Table;
    trTable.SetAttribute(STR_LABEL_ATTRIB, "Extreme Values"); //Table tile
    trTable.SetAttribute(TREE_Table, nTableFormat | GETNBRANCH_TRANSPOSE); 
    
    // setup column 1
    trTable.C1.ID = nID++;
    trTable.C1.SetAttribute(STR_LABEL_ATTRIB, "Description"); // Column label
    trTable.C1.SetAttribute(STR_COL_DESIGNATION_ATTRIB, OKDATAOBJ_DESIGNATION_NONE); // Set column type to None
    
    // setup column 2
    trTable.C2.ID = nID++;
    trTable.C2.SetAttribute(STR_LABEL_ATTRIB, "Max Values"); // Column label
    trTable.C2.SetAttribute(STR_COL_DESIGNATION_ATTRIB, OKDATAOBJ_DESIGNATION_Y); // Set column type to Y
    
    // setup column 3
    trTable.C3.ID = nID++;
    trTable.C3.SetAttribute(STR_LABEL_ATTRIB, "Min Values"); // Column label    
    trTable.C3.SetAttribute(STR_COL_DESIGNATION_ATTRIB, OKDATAOBJ_DESIGNATION_Y); // Set column type to Y
    
    
    // Put data from vector to table columns
    vector<string> vsDesc = {"Data1", "Data2", "Data3", "Data4", "Data5"};
    vector vMaxDatas = {100, 98, 95, 92, 84};
    vector vMinDatas = {5, 9, 13, 18, 21};
    trTable.C1.strVals = vsDesc;    
    trTable.C2.dVals = vMaxDatas; 
    trTable.C3.dVals = vMinDatas;    
    
    
    // 4. Prepare worksheet window to report
    WorksheetPage wksPage;
    wksPage.Create();    
    
    
    string    strSheetName = "Report Sheet";
    int nn = wksPage.AddLayer(strSheetName);
    if( nn < 0 )    
        return;    
    
    Worksheet wksOut = wksPage.Layers(nn);
    wksPage.Layers(0).Delete();    //delete the first default layer    
    
    
    // 5. Do report
    if( wksOut.SetReportTree(tr.Report) < 0 ) // Returns last row number on successful exit and -1 on failure.
    {
        printf("Fail to set report tree.\n");
        return;
    }        
    wksOut.AutoSize();    
}

Remark

See Also

Header to Include

origin.h