|
|
Line 1: |
Line 1: |
− | {{ScoutPage|cat=Tutorial}}
| + | #REDIRECT [[Scout/Tutorial/Minicrm/Reorganize the tree]] |
− | {{note|Scout Tutorial|This page belongs to the {{ScoutLink|Tutorial|minicrm|Minicrm Tutorial}}. }}
| + | |
− | | + | |
− | We started out with an application having two table pages. Notice how the list of persons comes just beneath the list of companies.
| + | |
− | | + | |
− | If we need to add several folders of different types under each company (e.g. persons, activities, offers), we need to insert a '''page with nodes''' (called ''CompanyDetailsNodePage'' in the diagram below) inbetween the ''CompanyTablePage'' and the ''PersonTablePage''.
| + | |
− | | + | |
− | {|
| + | |
− | |
| + | |
− | Standard Outline
| + | |
− | │
| + | |
− | ├─Company Table Page
| + | |
− | │ │
| + | |
− | │ └─Person Table Page
| + | |
− | │
| + | |
− | └─Person Table Page
| + | |
− | |⇒
| + | |
− | |
| + | |
− | Standard Outline
| + | |
− | │
| + | |
− | ├─Company Table Page
| + | |
− | │ │
| + | |
− | │ └─Company Details Node Page ← <font style="background-color: yellow">new</font>
| + | |
− | │ │
| + | |
− | │ └─Person Table Page
| + | |
− | │
| + | |
− | └─Person Table Page
| + | |
− | |}
| + | |
− | | + | |
− | == Add a node page ==
| + | |
− | | + | |
− | In a first step, we need to '''remove PersonTablePage as a child of the CompanyTablePage'''.
| + | |
− | | + | |
− | Standard Outline
| + | |
− | │
| + | |
− | ├─Company Table Page
| + | |
− | │ │
| + | |
− | │ └─Person Table Page ← <font style="background-color: #ff6347">wrong for the purpose of this tutorial!</font>
| + | |
− | │
| + | |
− | └─Person Table Page
| + | |
− | | + | |
− | Return to the '''CompanyTablePage''' and click on the red minus (<span style="font-weight:900;font-size:16pt;color:red">-</span>) next to '''Exec Create Child Page''' in order to delete it.
| + | |
− | | + | |
− | [[Image:Delete Create Child Page Method in Scout Minicrm.png]] | + | |
− | | + | |
− | The result:
| + | |
− | | + | |
− | Standard Outline
| + | |
− | │
| + | |
− | ├─Company Table Page
| + | |
− | │
| + | |
− | └─Person Table Page
| + | |
− | | + | |
− | Once you have deleted the method, you can right-click on the '''Child Page''' folder and pick '''New Page...'''
| + | |
− | | + | |
− | Use '''AbstractTableWithNodes''' as your template. There's ''no need to give it a name''. Use '''CompanyDetailsNodePage''' as the ''type name''.
| + | |
− | | + | |
− | Standard Outline
| + | |
− | │
| + | |
− | ├─Company Table Page
| + | |
− | │ │
| + | |
− | │ └─Company Details Node Page ← <font style="background-color: yellow">new</font>
| + | |
− | │
| + | |
− | └─Person Table Page
| + | |
− | | + | |
− | {{note|No name?|Indeed, this particular ''node page'' does not need a name. That's because the ''name'' of a ''page'' is only shown if its parent is an ''outline'' or a ''page with nodes''. If the parent is a ''page with table'', '''the selected row replaces the name of the child table'''.}}
| + | |
− | | + | |
− | Now go to the newly created '''CompanyDetailsNodePage''', click through to the '''Child Pages''' folder, right-click and pick '''Add Page...''' Pick the '''PersonTablePage''' from the list and click ''Finish''.
| + | |
− | | + | |
− | Standard Outline
| + | |
− | │
| + | |
− | ├─Company Table Page
| + | |
− | │ │
| + | |
− | │ └─Company Details Node Page
| + | |
− | │ │
| + | |
− | │ └─Person Table Page ← <font style="background-color: yellow">back again</font>
| + | |
− | │
| + | |
− | └─Person Table Page
| + | |
− | | + | |
− | {{note|Child Page or Child Pages?|Note how there is ''only child page'' for a '''page with table''' where as there are ''multiple child pages'' for a ''page with nodes''. We'll add a second node in the {{ScoutLink|Tutorial|Use a webservice|next step}}.}}
| + | |
− | | + | |
− | == Fix data flow ==
| + | |
− | | + | |
− | If you attempt to test your application, you'll notice a problem: '''Every person is listed under every company'''!
| + | |
− | | + | |
− | Why is that?
| + | |
− | | + | |
− | We interrupted "the flow of data": When the user picks a company from the ''CompanyTablePage'', the appropriate child page is created. When we created {{ScoutLink|Tutorial|minicrm/Write_The_Second_Page|our second page}}, we made sure to pass the '''value''' of the ''CompanyNrColumn'' along. The newly introduced ''CompanyDetailsNodePage'' needs to be fixed!
| + | |
− | | + | |
− | [[Image:Scout Data Flow CompanyNr.png]]
| + | |
− | | + | |
− | Return to the '''CompanyDetailsNodePage''' and click through to '''Variables'''. Pick '''Create New Property Bean...''' from the context menu, use '''companyNr''' as the ''name'' and '''Long''' as the ''bean type''.
| + | |
− | | + | |
− | Click on the '''Exec Create Child Pages''' link on the ''Properties'' view of the '''CompanyDetailsNodePage'''. Change the code as follows:
| + | |
− | | + | |
− | <source lang="java">
| + | |
− | @Override
| + | |
− | protected void execCreateChildPages(Collection<IPage> pageList) throws ProcessingException {
| + | |
− | PersonTablePage personTablePage = new PersonTablePage();
| + | |
− | personTablePage.setCompanyNr(getCompanyNr());
| + | |
− | pageList.add(personTablePage);
| + | |
− | | + | |
− | }
| + | |
− | </source>
| + | |
− | | + | |
− | Return to the '''CompanyTablePage''' and click on the '''Exec Create Child Page''' link on the ''Properties'' view. Change the code as follows:
| + | |
− | | + | |
− | <source lang="java">
| + | |
− | @Override
| + | |
− | protected IPage execCreateChildPage(ITableRow row) throws ProcessingException {
| + | |
− | CompanyDetailsNodePage childPage=new CompanyDetailsNodePage();
| + | |
− | childPage.setCompanyNr(getTable().getCompanyNrColumn().getValue(row));
| + | |
− | return childPage;
| + | |
− | }
| + | |
− | </source>
| + | |
− | | + | |
− | We reached our goal! This is the new structure, and it works as intended.
| + | |
− | | + | |
− | Standard Outline
| + | |
− | │
| + | |
− | ├─Company Table Page
| + | |
− | │ │
| + | |
− | │ └─Company Details Node Page
| + | |
− | │ │
| + | |
− | │ └─Person Table Page
| + | |
− | │
| + | |
− | └─Person Table Page
| + | |
− | | + | |
− | Let's review how the data flows back and forth:
| + | |
− | | + | |
− | # CompanyTablePage calls execLoadTableData
| + | |
− | # execLoadTableData calls the getCompanyTableData method on the StandardOutlineService
| + | |
− | # StandardOutlineService returns tabular data including the primary key for every row
| + | |
− | # user picks a company and clicks through
| + | |
− | # the CompanyDetailsNodePage is created by execCreateChildPage; the value of the current CompanyNrColumn is copied to the node page's companyNr variable
| + | |
− | # the user picks Persons and clicks through
| + | |
− | # the PersonTablePage is created by execCreateChildPages; the value of the companyNr variable is copied to the table page's companyNr variable
| + | |
− | # PersonTablePage calls execLoadTableData
| + | |
− | # execLoadTableData calls the getPersonTableData method on the StandardOutlineService
| + | |
− | # StandardOutlineService determines that the companyNr is not null, runs a SELECT statement that only selects appropriate persons from the database and returns tabular data
| + | |