Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "Scout/Tutorial/3.7/Minicrm/Code Types"

< Scout‎ | Tutorial‎ | 3.7
m (How to Create Code Types)
m
(7 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{ScoutPage|cat=Tutorial}} {{note|Scout Tutorial|This page belongs to the {{ScoutLink|Tutorial|Minicrm Step-by-Step|Minicrm Step-by-Step Tutorial}}. It explains how to add and use Code Types. You need to finish at least step {{ScoutLink|Tutorial|Add a form|Add a form}} in order to continue.}}  
+
{{ScoutPage|cat=Tutorial 3.7}}
 +
{{note|Scout Tutorial|This page belongs to the [[{{BASEPAGENAME}}_Step-by-Step|Minicrm Step-by-Step Tutorial]]. It explains how to add and use Code Types. You need to finish at least step [[{{BASEPAGENAME}}/Add a form to edit the data|Add a form]] in order to continue.}}  
  
 
== How to Create Code Types  ==
 
== How to Create Code Types  ==
Line 5: Line 6:
 
Code Types always contain of an ID and a list of values.  
 
Code Types always contain of an ID and a list of values.  
  
Open the shared node in Eclipse Scout and expand the tree until you reach the Enumerations node. Right-click on the node and choose "New Codetype…" menu.  
+
Open the shared node in Eclipse Scout and expand the tree until you reach the Enumerations node. Right-click on the node and choose ''New Codetype…'' menu.  
  
 
[[Image:Scout new company type codetype.jpg]]  
 
[[Image:Scout new company type codetype.jpg]]  
  
The Code ID needs to be an unique number, which helps to identify the values belonging to the Code Type. Always leave enough space between the Code Type's IDs, because the Code Type's values need IDs as well.  
+
The Code ID needs to be an unique number, which helps to identify the values belonging to the Code Type.
  
Idea is that the IDs of Code Types and their values are close together (e.g. Code Type 10000 and Values from 10001 to 10099, next Code Type 10100).  
+
The convention usually followed is that we always leave enough space between the Code Type's IDs, because the Code Type's ''values'' need IDs as well. The idea is that the IDs of Code Types and their values are close together (e.g. Code Type has the number 10000 and its values range from 10001 to 10099; the next Code Type has the number 10100).
  
 
<br>  
 
<br>  
Line 21: Line 22:
 
<br>  
 
<br>  
  
Right-click on the newly created Code Type and choose New Code…  
+
Right-click on the newly created Code Type and choose ''New Code… ''
  
 
[[Image:Scout company type codetype new childcode.jpg]]  
 
[[Image:Scout company type codetype new childcode.jpg]]  
Line 27: Line 28:
 
<br>  
 
<br>  
  
Increase the CompanyType Code Type's ID by 1 and assign it to the Code ID field. Give it a name like Customer.
+
Increase the CompanyType Code Type's ID by 1 and assign it to the Code ID field. Give it a name like '''Customer'''.  
 
+
Repeat these last two steps for another code called Supplier (Code ID: 10002).  
+
  
 
[[Image:Scout company type codetype new childcode form.jpg]]  
 
[[Image:Scout company type codetype new childcode form.jpg]]  
 +
 +
Repeat these last two steps for two other codes called '''Supplier''' (Code ID: 10002), and '''Other''' (Code ID: 10003).
  
 
<br>
 
<br>
  
== How to Use Code Types  ==
+
== How to Use a Code Type in a Dialog (Radio Button Group) ==
  
 
So let's use the code type inside the Company Form: we are going to add a Radio Button Group containing those two values.  
 
So let's use the code type inside the Company Form: we are going to add a Radio Button Group containing those two values.  
Line 59: Line 60:
 
<br>  
 
<br>  
  
To write and read the values provided by the Radio Button from the database, we need to adjust the CompanyProcessService:
+
== Update the Database Model ==
  
<br> <source lang="java">
+
{{note|Access Derby database|Check the following link for [http://wiki.eclipse.org/Scout/Tutorial/Database_Development_Perspective#Access_the_Derby_database_on_the_Command_Line Derby command line access]
 +
}}
 +
 
 +
If you want to add a new code type to your application, you probably need a new column in the database model as well. For our example you may use
 +
 
 +
<code lang="sql">ALTER TABLE minicrm.company ADD COLUMN type_uid int;</code>
 +
 
 +
== Update the Form's Process Service ==
 +
 
 +
To read and write the values for the new Radio Button Field on the company dialog from and to the database, we need to adjust the CompanyProcessService:
 +
 
 +
<source lang="java">
 
public CompanyFormData create(CompanyFormData formData) throws ProcessingException {
 
public CompanyFormData create(CompanyFormData formData) throws ProcessingException {
 
     if (!ACCESS.check(new CreateCompanyPermission())) {
 
     if (!ACCESS.check(new CreateCompanyPermission())) {
Line 128: Line 140:
 
</source>  
 
</source>  
  
== Conditional Dependencies Between Fields  ==
+
== Add a Company Rating Field to the Company Dialog (Smart Field) ==
  
As already mentioned before, we need a Smart Field to choose a rating between A and D on the Company Form. This Smart Field must only be visible, when the company is type of Customer.  
+
Repeat the steps above for a new code type '''CompanyRatingCodeType''' with the values A, B, C, D for both the database and the new enumeration on the shared node in the Scout Explorer.
  
<br>
+
The result should look similar to
 
+
First we have to create another Code Type called CompanyRatingCodeType and add four Codes A, B, C and D to it.
+
 
+
Go to [[#How_to_create_Code_Types]] if you're lost.
+
  
 
[[Image:Scout company rating codetype overview.jpg]]  
 
[[Image:Scout company rating codetype overview.jpg]]  
  
<br>
+
Back in Scout Explorer expand the tree: client &gt; Forms &gt; CompanyForm &gt; MainBox, right-click on ''MainBox'' and use context menu ''New Form Field… ''
 
+
Add a new form field of type ''SmartField'' with the name '''Company Rating''' and select '''CompanyRatingCodeType''' as the code type.
After creating the Code Type, we add another field to the Company Form:
+
 
+
<br>
+
 
+
Back in Scout Explorer expand the tree like: client &gt; Forms &gt; CompanyForm &gt; MainBox, right-click on MainBox and choose New Form Field…  
+
 
+
The field's type is Smart Field. Enter the information provided by the picture in the wizard's next form.  
+
  
 
[[Image:Scout company rating new smartfield.jpg]]  
 
[[Image:Scout company rating new smartfield.jpg]]  
  
{{tip|Edit code directly|have a look at the properties and make sure that there is a Code Type assigned to the Code Type's field
+
As in the case abovee for the code type '''Company Type''' you will need to update the database model.
 
+
For reading and writing from and to the database we need to update the methods of the '''CompanyProcessService''' once more
We could also edit the code directly:
+
# open the Company Form class, go to the inner class CompanyRatingField, which represents the Smart Field.
+
# Type getConfiguredCodeType and press ctrl + space what automatically creates the method according to the super class' ones.
+
# Change the return value to CompanyRatingCodeType.class or whatever your Code Type's name is.}}
+
 
+
<br>
+
 
+
As there is a dependency between fields, we have to define a master – slave – relation. This happens by telling the slave who's its master.
+
 
+
Expand the tree in the Scout Explorer like: client &gt; Forms &gt; CompanyForm &gt; MainBox &gt; CompanyRatingField. Set the Master Field and Master Required (see picture) and click on Exec Changed Master Value.
+
 
+
[[Image:Scout company rating codetype smartfield master.jpg]]
+
 
+
<br>
+
 
+
Open the CompanyForm class and go to the inner class CompanyRatingField. We need to adjust the execChangedMasterValue method, which is called whenever something happens in the CompanyTypeGroup Field, this because of the master – slave – relation.
+
 
+
When execChangedMasterValue is called, we check if the customer type value equals the Customer code. If so, the fields is set visible and enabled. In all other cases the field has to be invisible and disabled, as well as set to null  nothing must be written to the database.  
+
 
+
Code Type and Code IDs can get accessed very easily because they are defined as static.
+
 
+
<source lang="java">
+
      @Override
+
      protected void execChangedMasterValue(Object newMasterValue) throws
+
ProcessingException {
+
 
+
        if (CompareUtility.equals(getCompanyTypeGroup().getValue(),
+
            CompanyTypeCodeType.CustomerCode.ID)) {
+
          setEnabled(true);
+
          setVisible(true);
+
        }
+
        else {
+
          setEnabled(false);
+
          setVisible(false);
+
          setValue(null);
+
        }
+
      }
+
</source>
+
 
+
{{tip|Scout Utility Classes|calling a member means to make sure that the object is not null. Standard operations like comparisons etc. always follow the same pattern: first check for null values, second call the actual operation. To prevent the programmer from coding the same thing all over again, Scout often provides so called Utility classes, which make sure that no unnecessary Exceptions will be thrown.
+
 
+
Have a look at those Utility classes by pressing ctrl + alt + T and type *Utility. It's highly recommended to use these classes whenever possible.}}
+
 
+
Now that the Form works, we have to make sure that the rating value can be read and written from and to the database. So let's change the CompanyProcessService once more.
+
  
 
<source lang="java">
 
<source lang="java">
Line 267: Line 224:
 
     return formData;
 
     return formData;
 
   }
 
   }
 +
</source>
 +
 +
== Conditional Dependencies Between Fields and Controlling Field Visibility ==
 +
 +
In the Example above we added a Smart Field to choose a rating between A and D on the Company Form. To improve the usability of the company form, the rating field should only become visible, when the users selects '''Customer'' as the company type.
 +
 +
As there is a dependency between fields, we have to define a ''Master – Slave'' relation between the company type and the company rating field. For this we specify the master field on the (slave) form field.
 +
 +
Expand the tree in the Scout Explorer like: client &gt; Forms &gt; CompanyForm &gt; MainBox &gt; CompanyRatingField. Set the ''Master Field'' and ''Master Required'' as shown in the picture below.
 +
 +
[[Image:Scout company rating codetype smartfield master.jpg]]
 +
 +
Clicking on the green plus right of method ''Exec Changed Master Value'' adds the method ''execChangedMasterValue'' to the (slave) company rating field. Now we can control the fields visibility depending on the selected company type as follows
 +
 +
<source lang="java">
 +
      @Override
 +
      protected void execChangedMasterValue(Object newMasterValue) throws
 +
ProcessingException {
 +
 +
        if (CompareUtility.equals(getCompanyTypeGroup().getValue(),
 +
            CompanyTypeCodeType.CustomerCode.ID)) {
 +
          setEnabled(true);
 +
          setVisible(true);
 +
        }
 +
        else {
 +
          setEnabled(false);
 +
          setVisible(false);
 +
          setValue(null);
 +
        }
 +
      }
 
</source>  
 
</source>  
 +
<br>
 +
 +
When execChangedMasterValue is called, we check if the customer type value equals the Customer code. If so, the fields is set visible and enabled. In all other cases the field has to be invisible and disabled, as well as set to null  nothing must be written to the database.
 +
 +
This method ''execChangedMasterValue'' is called whenever the value in the defined master field (the company type field in this example) of the slave field (company rating field here) is changed. 
 +
 +
{{tip|Scout Utility Classes|calling a member means to make sure that the object is not null. Standard operations like comparisons etc. always follow the same pattern: first check for null values, second call the actual operation. To prevent the programmer from coding the same thing all over again, Scout often provides so called Utility classes, which make sure that no unnecessary Exceptions will be thrown.
 +
 +
Have a look at those Utility classes by pressing ctrl + shift + T and type *Utility. It's highly recommended to use these classes whenever possible.}}
 +
 +
Now that the Form works, we have to make sure that the rating value can be read and written from and to the database. So let's change the CompanyProcessService once more.
  
 
== Display Code Types in Tables  ==
 
== Display Code Types in Tables  ==

Revision as of 10:59, 8 June 2012

The Scout documentation has been moved to https://eclipsescout.github.io/.

Note.png
Scout Tutorial
This page belongs to the Minicrm Step-by-Step Tutorial. It explains how to add and use Code Types. You need to finish at least step Add a form in order to continue.


How to Create Code Types

Code Types always contain of an ID and a list of values.

Open the shared node in Eclipse Scout and expand the tree until you reach the Enumerations node. Right-click on the node and choose New Codetype… menu.

Scout new company type codetype.jpg

The Code ID needs to be an unique number, which helps to identify the values belonging to the Code Type.

The convention usually followed is that we always leave enough space between the Code Type's IDs, because the Code Type's values need IDs as well. The idea is that the IDs of Code Types and their values are close together (e.g. Code Type has the number 10000 and its values range from 10001 to 10099; the next Code Type has the number 10100).


Enter the information into the Code Type form according to the picture:

Scout company type codetype form.jpg


Right-click on the newly created Code Type and choose New Code…

Scout company type codetype new childcode.jpg


Increase the CompanyType Code Type's ID by 1 and assign it to the Code ID field. Give it a name like Customer.

Scout company type codetype new childcode form.jpg

Repeat these last two steps for two other codes called Supplier (Code ID: 10002), and Other (Code ID: 10003).


How to Use a Code Type in a Dialog (Radio Button Group)

So let's use the code type inside the Company Form: we are going to add a Radio Button Group containing those two values.

In a Radio Button Group only one item can be selected at a time. This is exactly what we need here, as we don't like a company being both, customer and supplier.

Back in Scout Explorer we expand the tree like: client > Forms > CompanyForm and right-click on MainBox to choose New Form Field…

Choose Radio Button Group as Type, give it a name like CompanyType and press Finish.

Scout company type codetype new radiobutton group.jpg


In the properties editor go to the property Code Type and choose the Code Type CompanyTypeCodeType we have previously created. That’s all we need to do to fill the Code Type's values into the Radio Button Group.

Scout company type codetype radiobutton group add codetype.jpg


After adding this additional field, don't forget to update the form data: right-click on the CompanyForm and choose "Update Form Data"


Update the Database Model

Note.png
Access Derby database
Check the following link for Derby command line access


If you want to add a new code type to your application, you probably need a new column in the database model as well. For our example you may use

ALTER TABLE minicrm.company ADD COLUMN type_uid int;

Update the Form's Process Service

To read and write the values for the new Radio Button Field on the company dialog from and to the database, we need to adjust the CompanyProcessService:

public CompanyFormData create(CompanyFormData formData) throws ProcessingException {
    if (!ACCESS.check(new CreateCompanyPermission())) {
      throw new VetoException(Texts.get("AuthorizationFailed"));
    }
    SQL.selectInto("" +
        "SELECT MAX(COMPANY_NR)+1 " +
        "FROM   COMPANY " +
        "INTO   :companyNr"
        , formData);
 
    /*
     * NEW: TYPE_UID behind INSERT INTO
     * NEW: :companyTypeGroup in VALUES, field is named according to the inner class CompanyTypeGroup
     *      of CompanyForm
     */
    SQL.insert("" +
        "INSERT INTO COMPANY (COMPANY_NR, SHORT_NAME, NAME, TYPE_UID) " +
        "VALUES (:companyNr, :shortName, :name, :companyTypeGroup)"
        , formData);
    return formData;
  }
 
  public CompanyFormData load(CompanyFormData formData) throws ProcessingException {
    if (!ACCESS.check(new ReadCompanyPermission())) {
      throw new VetoException(Texts.get("AuthorizationFailed"));
    }
 
    /*
     * NEW: TYPE_UID in SELECT
     * NEW: :companyTypeGroup behind INTO, field is named according to the inner class CompanyTypeGroup
     *      of CompanyForm
     */
    SQL.selectInto("" +
        "SELECT SHORT_NAME, " +
        "       NAME," +
        "       TYPE_UID " +
        "FROM   COMPANY " +
        "WHERE  COMPANY_NR = :companyNr " +
        "INTO   :shortName," +
        "       :name, " +
        "       :companyTypeGroup"
          , formData);
    return formData;
  }
 
  public CompanyFormData store(CompanyFormData formData) throws ProcessingException {
    if (!ACCESS.check(new UpdateCompanyPermission())) {
      throw new VetoException(Texts.get("AuthorizationFailed"));
    }
 
    /*
     * NEW: TYPE_UID = :companyTypeGroup in SET, field is named according to
     *      the inner class CompanyTypeGroup of CompanyForm
     */
    SQL.update("" +
        "UPDATE COMPANY " +
        " SET SHORT_NAME = :shortName, " +
        "     NAME = :name, " +
        "     TYPE_UID = :companyTypeGroup " +
        "WHERE  COMPANY_NR = :companyNr "
        , formData);
 
    return formData;
  }

Add a Company Rating Field to the Company Dialog (Smart Field)

Repeat the steps above for a new code type CompanyRatingCodeType with the values A, B, C, D for both the database and the new enumeration on the shared node in the Scout Explorer.

The result should look similar to

Scout company rating codetype overview.jpg

Back in Scout Explorer expand the tree: client > Forms > CompanyForm > MainBox, right-click on MainBox and use context menu New Form Field… Add a new form field of type SmartField with the name Company Rating and select CompanyRatingCodeType as the code type.

Scout company rating new smartfield.jpg

As in the case abovee for the code type Company Type you will need to update the database model. For reading and writing from and to the database we need to update the methods of the CompanyProcessService once more

public CompanyFormData create(CompanyFormData formData) throws ProcessingException {
    if (!ACCESS.check(new CreateCompanyPermission())) {
      throw new VetoException(Texts.get("AuthorizationFailed"));
    }
    SQL.selectInto("" +
        "SELECT MAX(COMPANY_NR)+1 " +
        "FROM   COMPANY " +
        "INTO   :companyNr"
        , formData);
 
    /*
     * NEW: RATING_UID behind INSERT INTO
     * NEW: :companyRating in VALUES, field is named according to the inner class CompanyRating
     *      of CompanyForm
     */
    SQL.insert("" +
        "INSERT INTO COMPANY (COMPANY_NR, SHORT_NAME, NAME, TYPE_UID, RATING_UID) " +
        "VALUES (:companyNr, :shortName, :name, :companyTypeGroup, :companyRating)"
        , formData);
    return formData;
  }
 
  public CompanyFormData load(CompanyFormData formData) throws ProcessingException {
    if (!ACCESS.check(new ReadCompanyPermission())) {
      throw new VetoException(Texts.get("AuthorizationFailed"));
    }
 
    /*
     * NEW: RATING_UID in SELECT
     * NEW: :companyRating behind INTO, field is named according to the inner class CompanyRating
     *      of CompanyForm
     */
    SQL.selectInto("" +
        "SELECT SHORT_NAME, " +
        "       NAME," +
        "       TYPE_UID, " +
        "       RATING_UID " +
        "FROM   COMPANY " +
        "WHERE  COMPANY_NR = :companyNr " +
        "INTO   :shortName," +
        "       :name, " +
        "       :companyTypeGroup, " +
        "       :companyRating "
          , formData);
    return formData;
  }
 
  public CompanyFormData store(CompanyFormData formData) throws ProcessingException {
    if (!ACCESS.check(new UpdateCompanyPermission())) {
      throw new VetoException(Texts.get("AuthorizationFailed"));
    }
 
    /*
     * NEW: RATING_UID = :companyRating in SET, field is named according to
     * the inner class CompanyRating of CompanyForm
     */
    SQL.update("" +
        "UPDATE COMPANY " +
        " SET SHORT_NAME = :shortName, " +
        "     NAME = :name, " +
        "     TYPE_UID = :companyTypeGroup, " +
        "     RATING_UID = :companyRating " +
        "WHERE  COMPANY_NR = :companyNr "
        , formData);
 
    return formData;
  }

Conditional Dependencies Between Fields and Controlling Field Visibility

In the Example above we added a Smart Field to choose a rating between A and D on the Company Form. To improve the usability of the company form, the rating field should only become visible, when the users selects 'Customer as the company type.

As there is a dependency between fields, we have to define a Master – Slave relation between the company type and the company rating field. For this we specify the master field on the (slave) form field.

Expand the tree in the Scout Explorer like: client > Forms > CompanyForm > MainBox > CompanyRatingField. Set the Master Field and Master Required as shown in the picture below.

Scout company rating codetype smartfield master.jpg

Clicking on the green plus right of method Exec Changed Master Value adds the method execChangedMasterValue to the (slave) company rating field. Now we can control the fields visibility depending on the selected company type as follows

      @Override
      protected void execChangedMasterValue(Object newMasterValue) throws
ProcessingException {
 
        if (CompareUtility.equals(getCompanyTypeGroup().getValue(), 
            CompanyTypeCodeType.CustomerCode.ID)) {
          setEnabled(true);
          setVisible(true);
        }
        else {
          setEnabled(false);
          setVisible(false);
          setValue(null);
        }
      }


When execChangedMasterValue is called, we check if the customer type value equals the Customer code. If so, the fields is set visible and enabled. In all other cases the field has to be invisible and disabled, as well as set to null  nothing must be written to the database.

This method execChangedMasterValue is called whenever the value in the defined master field (the company type field in this example) of the slave field (company rating field here) is changed.

Idea.png
Scout Utility Classes
calling a member means to make sure that the object is not null. Standard operations like comparisons etc. always follow the same pattern: first check for null values, second call the actual operation. To prevent the programmer from coding the same thing all over again, Scout often provides so called Utility classes, which make sure that no unnecessary Exceptions will be thrown. Have a look at those Utility classes by pressing ctrl + shift + T and type *Utility. It's highly recommended to use these classes whenever possible.


Now that the Form works, we have to make sure that the rating value can be read and written from and to the database. So let's change the CompanyProcessService once more.

Display Code Types in Tables

Whenever we want to display a Code Type in a table, we cannot just use the value returned by the database query. This out of the reason that Code Types IDs are stored and displaying IDs would mean nothing to a user.

Instead we use a Smart Column, tell it which Code Type will be returned and let it translate the ID into a name. So let's add a new column to the CompanyTablePage and extend the StandardOutlineService.

Expand the tree in Scout Explorer like: client > All pages and right-click on CompanyTablePage > Table > Columns and choose New Column…

Idea.png
All roads lead to Rome
Wherever CompanyTablePage has been linked to, we'll find it (e.g. client > Desktop > StandardOutline > Child Pages > CompanyTablePage). Nevertheless, all pages, no matter where they are linked to, are situated in: client > All pages.


Choose type Smart Column and fill in the information according to the picture.

Scout company rating codetype smartcolumn.jpg


Adjust the getCompanyTableData method in the StandardOutlineService (server > Outline Services > StandardOutlineService):

/*
 * NEW: TYPE_UID behind SELECT
 */
 statement.append(
 "SELECT COMPANY_NR, " +
 "       SHORT_NAME, " +
 "       NAME, " +
 "       TYPE_UID " +
 " FROM COMPANY " +
 " WHERE 1 = 1 ");

Scout company type rating codetype table.jpg

Back to the top