<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.idempiere.org/w-en/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Soundbytes</id>
	<title>iDempiere en - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.idempiere.org/w-en/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Soundbytes"/>
	<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/en/Special:Contributions/Soundbytes"/>
	<updated>2026-09-30T13:28:25Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.2</generator>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Multiple_instances_of_iDempiere&amp;diff=19211</id>
		<title>Multiple instances of iDempiere</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Multiple_instances_of_iDempiere&amp;diff=19211"/>
		<updated>2021-07-29T15:24:11Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Running multiple instances of iDempiere on a single server is not too difficult. Here is a checklist of things to take care of:&lt;br /&gt;
&lt;br /&gt;
# Install the instances into different directories. The instances do not need to share any common files. So you are just fine making a full installation for each instance.&lt;br /&gt;
# Make sure the iDempiere server instances use different TCP ports.&lt;br /&gt;
# If you really should need to use a single port to access all of the instances you could use an HTTP server like Apache or Ngnix to define virtual hosts. Proxying or use of rewrite rules will then allow you to manage the desired redirections. I recommend using subdomains to do the job.&lt;br /&gt;
# With an HTTP server in front of iDempiere, you will also be able to offload the ssh encryption (HTTPS) onto the HTTP server.&lt;br /&gt;
# There is another benefit to using subdomains for browser access: If all your server instances use the same hostname the client browser will sometimes not be able to keep cookies from different instances apart. This can lead to a blocked session as discussed [https://groups.google.com/g/idempiere/c/kBefSKYsq0o here] in the iDempiere google group.&lt;br /&gt;
# Make sure each instance uses its own database. Use different names for the instance databases.&lt;br /&gt;
# Use different DB user names. The docs advise not to change the default user name Adempiere and this is ok for a single instance installation. However, if you use a single DB user for all of your instances you will run into trouble once you need to restore a database from a backup file. The RUN_DBRestore.sh will attempt to delete and recreate the DB user which will throw an error when the user owns more than one DB.&lt;br /&gt;
# Multiple database Clusters under Postgresql:  If a Postgresql database server is used it might make sense to use a dedicated database cluster for each iDempiere instance to avoid any side effects of having multiple iDempiere databases side by side. Firewalling the iDempiere instances through database clusters allows to use the recommended configuration for database and database user names in each cluster (You can ignore points 6. and 7. then).  Note that using dedicated database clusters requires some additional steps in database server setup. Also server hardware requirements might be a bit higher because of the added overhead.&lt;br /&gt;
# You can run all of your instances as services in parallel. Before the installation of another instance rename the service script:  &amp;lt;code&amp;gt;sudo mv /etc/init.d/iDempiere /etc/init.d/iDempiere-theInstance.&amp;lt;/code&amp;gt; Of course, you will need to do some book keeping work with the service controller of your OS to ensure that the renamed services are started as desired.&lt;br /&gt;
# The service controller talks to the iDempiere server via the OSGI console. For this to work without problems in a multi-instance environment you need to assign a different telnet port number to each of the instances: in the editor of your choice open the file &amp;lt;code&amp;gt;/etc/init.d/iDempiere&amp;lt;/code&amp;gt;. Find the line &amp;lt;code&amp;gt;export TELNET_PORT=12612&amp;lt;/code&amp;gt; and change the port number to something else.&lt;br /&gt;
&lt;br /&gt;
Please Note:&lt;br /&gt;
&lt;br /&gt;
* OS specific descriptions in this guide are for Ubuntu 16/18/20 or Debian, if on another OS you might need to do some further research.&lt;br /&gt;
* I have been using the described approach to host iDempiere since version 5 for some time now and did not have any problems so far. Still make sure you do your own thorough tests if you want to go that route.&lt;br /&gt;
* If you run into any problems (and maybe even manage to solve them) please report back to the community. (You can edit this page or post to the iDempiere [https://groups.google.com/g/idempiere Google group]) Thanks!&lt;br /&gt;
[[Category:HowTo-Technical]]&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Multiple_instances_of_iDempiere&amp;diff=19210</id>
		<title>Multiple instances of iDempiere</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Multiple_instances_of_iDempiere&amp;diff=19210"/>
		<updated>2021-07-29T15:22:35Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Running multiple instances of iDempiere on a single server is not too difficult. Here is a checklist of things to take care of:&lt;br /&gt;
&lt;br /&gt;
# Install the instances into different directories. The instances do not need to share any common files. So you are just fine making a full installation for each instance.&lt;br /&gt;
# Make sure the iDempiere server instances use different TCP ports.&lt;br /&gt;
# If you really should need to use a single port to access all of the instances you could use an HTTP server like Apache or Ngnix to define virtual hosts. Proxying or use of rewrite rules will then allow you to manage the desired redirections. I recommend using subdomains to do the job.&lt;br /&gt;
# With an HTTP server in front of iDempiere, you will also be able to offload the ssh encryption (HTTPS) onto the HTTP server.&lt;br /&gt;
# There is another benefit to using subdomains for browser access: If all your server instances use the same hostname the client browser will sometimes not be able to keep cookies from different instances apart. This can lead to a blocked session as discussed [https://groups.google.com/g/idempiere/c/kBefSKYsq0o here] in the iDempiere google group.&lt;br /&gt;
# Make sure each instance uses its own database. Use different names for the instance databases.&lt;br /&gt;
# Use different DB user names. The docs advise not to change the default user name Adempiere and this is ok for a single instance installation. However, if you use a single DB user for all of your instances you will run into trouble once you need to restore a database from a backup file. The RUN_DBRestore.sh will attempt to delete and recreate the DB user which will throw an error when the user owns more than one DB.&lt;br /&gt;
# Multiple database Clusters under Postgresql: If a Postgres Database server is used it might make sense to use a dedicated database cluster for each iDempiere instance to avoid any side effects of having multiple iDempiere databases side by side. Firewalling the idempiere instances with database clusters allows to use the recommended configuration for database and database user names in each cluster (You can ignore points 6. and 7. then).  Note that using dedicated database clusters requires some additional steps in database server setup. Also server hardware requirements might be a bit higher because of the added overhead.&lt;br /&gt;
# You can run all of your instances as services in parallel. Before the installation of another instance rename the service script:  &amp;lt;code&amp;gt;sudo mv /etc/init.d/iDempiere /etc/init.d/iDempiere-theInstance.&amp;lt;/code&amp;gt; Of course, you will need to do some book keeping work with the service controller of your OS to ensure that the renamed services are started as desired.&lt;br /&gt;
# The service controller talks to the iDempiere server via the OSGI console. For this to work without problems in a multi-instance environment you need to assign a different telnet port number to each of the instances: in the editor of your choice open the file &amp;lt;code&amp;gt;/etc/init.d/iDempiere&amp;lt;/code&amp;gt;. Find the line &amp;lt;code&amp;gt;export TELNET_PORT=12612&amp;lt;/code&amp;gt; and change the port number to something else.&lt;br /&gt;
&lt;br /&gt;
Please Note:&lt;br /&gt;
&lt;br /&gt;
* OS specific descriptions in this guide are for Ubuntu 16/18/20 or Debian, if on another OS you might need to do some further research.&lt;br /&gt;
* I have been using the described approach to host iDempiere since version 5 for some time now and did not have any problems so far. Still make sure you do your own thorough tests if you want to go that route.&lt;br /&gt;
* If you run into any problems (and maybe even manage to solve them) please report back to the community. (You can edit this page or post to the iDempiere [https://groups.google.com/g/idempiere Google group]) Thanks!&lt;br /&gt;
[[Category:HowTo-Technical]]&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Multiple_instances_of_iDempiere&amp;diff=19209</id>
		<title>Multiple instances of iDempiere</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Multiple_instances_of_iDempiere&amp;diff=19209"/>
		<updated>2021-07-29T09:19:08Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: typos fixed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Running multiple instances of iDempiere on a single server is not too difficult. Here is a checklist of things to take care of:&lt;br /&gt;
&lt;br /&gt;
# Install the instances into different directories. The instances do not need to share any common files. So you are just fine making a full installation for each instance.&lt;br /&gt;
# Make sure the iDempiere server instances use different TCP ports.&lt;br /&gt;
# If you really should need to use a single port to access all of the instances you could use an HTTP server like Apache or Ngnix to define virtual hosts. Proxying or use of rewrite rules will then allow you to manage the desired redirections. I recommend using subdomains to do the job.&lt;br /&gt;
# With an HTTP server in front of iDempiere, you will also be able to offload the ssh encryption (HTTPS) onto the HTTP server.&lt;br /&gt;
# There is another benefit to using subdomains for browser access: If all your server instances use the same hostname the client browser will sometimes not be able to keep cookies from different instances apart. This can lead to a blocked session as discussed [https://groups.google.com/g/idempiere/c/kBefSKYsq0o here] in the iDempiere google group.&lt;br /&gt;
# Make sure each instance uses its own database. Use different names for the instance databases.&lt;br /&gt;
# Use different DB user names. The docs advise not to change the default user name Adempiere and this is ok for a single instance installation. However, if you use a single DB user for all of your instances you will run into trouble once you need to restore a database from a backup file. The RUN_DBRestore.sh will attempt to delete and recreate the DB user which will throw an error when the user owns more than one DB.&lt;br /&gt;
# Multiple database Clusters on Postgresql: If a Postgres Database server is used it might make sense to use a dedicated database cluster for each iDempiere instance to avoid any side effects of having multiple iDempiere databases side by side. Firewalling the idempiere instances with database clusters allows to use the recommended configuration for database and database user names in each cluster (You can ignore points 6. and 7. then).  Note that using dedicated database clusters requires some additional steps in database server setup. Also server hardware requirements might be a bit higher because of the added overhead.&lt;br /&gt;
# You can run all of your instances as services in parallel. Before the installation of another instance rename the service script:  &amp;lt;code&amp;gt;sudo mv /etc/init.d/iDempiere /etc/init.d/iDempiere-theInstance.&amp;lt;/code&amp;gt; Of course, you will need to do some book keeping work with the service controller of your OS to ensure that the renamed services are started as desired.&lt;br /&gt;
# The service controller talks to the iDempiere server via the OSGI console. For this to work without problems in a multi-instance environment you need to assign a different telnet port number to each of the instances: in the editor of your choice open the file &amp;lt;code&amp;gt;/etc/init.d/iDempiere&amp;lt;/code&amp;gt;. Find the line &amp;lt;code&amp;gt;export TELNET_PORT=12612&amp;lt;/code&amp;gt; and change the port number to something else.&lt;br /&gt;
&lt;br /&gt;
Please Note:&lt;br /&gt;
&lt;br /&gt;
* OS specific descriptions in this guide are for Ubuntu 16/18/20 or Debian, if on another OS you might need to do some further research.&lt;br /&gt;
* I have been using the described approach to host iDempiere since version 5 for some time now and did not have any problems so far. Still make sure you do your own thorough tests if you want to go that route.&lt;br /&gt;
* If you run into any problems (and maybe even manage to solve them) please report back to the community. (You can edit this page or post to the iDempiere [https://groups.google.com/g/idempiere Google group]) Thanks!&lt;br /&gt;
[[Category:HowTo-Technical]]&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Multiple_instances_of_iDempiere&amp;diff=19202</id>
		<title>Multiple instances of iDempiere</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Multiple_instances_of_iDempiere&amp;diff=19202"/>
		<updated>2021-07-28T10:30:00Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: added paragraph on postgresql DB clusters&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Running multiple instances of iDempiere on a single server is not too difficult. Here is a checklist of things to take care of:&lt;br /&gt;
&lt;br /&gt;
# Install the instances into different directories. The instances do not need to share any common files. So you are just fine making a full installation for each instance.&lt;br /&gt;
# Make sure the iDempiere server instances use different TCP ports.&lt;br /&gt;
# If you really should need to use a single port to access all of the instances you could use an HTTP server like Apache or Ngnix to do define virtual hosts. Proxying or use of rewrite rules will then allow you to do the desired redirections. I recommend using subdomains to do the job.&lt;br /&gt;
# With an HTTP server in front of iDempiere, you will also be able to offload the ssh encryption (HTTPS) onto the HTTP server.&lt;br /&gt;
# There is another benefit to using subdomains for browser access: If all your server instances use the same hostname the client browser will sometimes not be able to keep cookies from different instances apart. This can lead to a blocked session as discussed [https://groups.google.com/g/idempiere/c/kBefSKYsq0o here] in the iDempiere google group.&lt;br /&gt;
# Make sure each instance uses its own database. Use different names for the instance databases.&lt;br /&gt;
# Use different DB user names. The docs advise not to change the default user name Adempiere and this is ok for a single instance installation. However, if you use a single DB user for all of your instances you will run into trouble once you need to restore a database from a backup file. The RUN_DBRestore.sh will attempt to delete and recreate the DB user which will throw an error when the user owns more than one DB.&lt;br /&gt;
# Multiple database Clusters on Postgresql: If a Postgres Database server is used it might make sense to use a dedicated database cluster for each iDempiere instance to avoid any side effects of having multiple iDempiere databases side by side. Firewalling the idempiere instances with database clusters allows to use the recommended configuration for database and database user names in each cluster (You can ignore points 6. and 7. then).  Note that using dedicated database clusters requires some additional steps in database server setup. Also server hardware requirements might be a bit higher because of the added overhead.&lt;br /&gt;
# You can run all of your instances as services in parallel. Before the installation of another instance rename the service script:  &amp;lt;code&amp;gt;sudo mv /etc/init.d/iDempiere /etc/init.d/iDempiere-theInstance.&amp;lt;/code&amp;gt; Of course, you will need to do some book keeping work with the service controller of your OS to ensure that the renamed services are started as desired.&lt;br /&gt;
# The service controller talks to the iDempiere server via the OSGI console. For this to work without problems in a multi-instance environment you need to assign a different telnet port number to each of the instances: in the editor of your choice open the file &amp;lt;code&amp;gt;/etc/init.d/iDempiere&amp;lt;/code&amp;gt;. Find the line &amp;lt;code&amp;gt;export TELNET_PORT=12612&amp;lt;/code&amp;gt; and change the port number to something else.&lt;br /&gt;
&lt;br /&gt;
Please Note:&lt;br /&gt;
&lt;br /&gt;
* OS specific descriptions in this guide are for Ubuntu 16/18/20 or Debian, if on another OS you might need to do some further research.&lt;br /&gt;
* I have been using the described approach to host iDempiere since version 5 for some time now and did not have any problems so far. Still make sure you do your own thorough tests if you want to go that route.&lt;br /&gt;
* If you run into any problems (and maybe even manage to solve them) please report back to the community. (You can edit this page or post to the iDempiere [https://groups.google.com/g/idempiere Google group]) Thanks!&lt;br /&gt;
[[Category:HowTo-Technical]]&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Multiple_instances_of_iDempiere&amp;diff=19150</id>
		<title>Multiple instances of iDempiere</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Multiple_instances_of_iDempiere&amp;diff=19150"/>
		<updated>2021-07-27T11:19:49Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Running multiple instances of iDempiere on a single server is not too difficult. Here is a checklist of things to take care of:&lt;br /&gt;
&lt;br /&gt;
* Install the instances into different directories. The instances do not need to share any common files. So you are just fine making a full installation for each instance.&lt;br /&gt;
* Make sure each instance uses its own data base. Use different names for the instance data bases.&lt;br /&gt;
* Make sure the iDempiere server instances use different tcp ports.&lt;br /&gt;
* If you really should need to use a single port to access all of the instances you could use a http server like apache or ngnix to do define virtual hosts. Proxying or use of rewrite rules will then allow you to do the desired redirections. I recommend using subdomains to do the job.&lt;br /&gt;
* With a http server in front of iDempiere you will also be able to offload the ssh encryption (https) onto the http server.&lt;br /&gt;
* There is another benefit to using subdomains for browser access: If all your server instances use the same host name the client browser will sometimes not be able to keep cookies from different instances apart. This can lead to a blocked session as discussed [https://groups.google.com/g/idempiere/c/kBefSKYsq0o here] in the iDempiere google group.&lt;br /&gt;
* Use different DB user names. The docs advise not to change the default user name Adempiere and this is ok for a single instance installation. Still if you use a single DB user for all of your instances you will run into trouble once you need to restore a database from a backup file. The RUN_DBRestore.sh will attempt to delete and recreate the DB user which will throw an error when the user owns more than one DB.&lt;br /&gt;
* You can run all of your instances as services in parallel. Before the installation of another instance rename the service script:  &amp;lt;code&amp;gt;sudo mv /etc/init.d/iDempiere /etc/init.d/iDempiere-theInstance.&amp;lt;/code&amp;gt; Of course you will need to do some book keeping work with the service controller of your OS to ensure that the renamed services are started as desired.&lt;br /&gt;
&lt;br /&gt;
* The service controller talks to the iDempiere server via the OSGI console. For this to work without problems in a multi instance environment you need to assign a different telnet port number to each of the instances: in the editor of your choice open the file &amp;lt;code&amp;gt;/etc/init.d/iDempiere&amp;lt;/code&amp;gt;. Find the line &amp;lt;code&amp;gt;export TELNET_PORT=12612&amp;lt;/code&amp;gt; and change the port number to something else.&lt;br /&gt;
&lt;br /&gt;
Please Note:&lt;br /&gt;
&lt;br /&gt;
* OS specific descriptions in this guide are for Ubuntu 16/18/20 or Debian, if on another OS you might need to do some further research.&lt;br /&gt;
* I have been using the described approach to host iDempiere since versions 5 for some time now and did not have any problems so far. Still make sure you do your own thorough tests if you want to go that route.&lt;br /&gt;
* If you run into any problems (and maybe even manage to solve them) please report back to the community. (You can edit this page or post to the iDempiere [https://groups.google.com/g/idempiere Google group]) Thanks!&lt;br /&gt;
[[Category:HowTo-Technical]]&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Multiple_instances_of_iDempiere&amp;diff=19149</id>
		<title>Multiple instances of iDempiere</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Multiple_instances_of_iDempiere&amp;diff=19149"/>
		<updated>2021-07-27T11:14:51Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Running multiple instances of idempiere on a single server is not too difficult. Here is a checklist of things to take care of:&lt;br /&gt;
&lt;br /&gt;
* Install the instances into different directories. The instances do not need to share any common files. So you are just fine making a full installation for each instance.&lt;br /&gt;
* Make sure each instance uses its own data base. Use different names for the instance data bases.&lt;br /&gt;
* Make sure the idempiere server instances use different tcp ports.&lt;br /&gt;
* If you really should need to use a single port to access all of the instances you could use a http server like apache or ngnix to do define virtual hosts. Proxying or use of rewrite rules will then allow you to do the desired redirections. I recommend using subdomains to do the job.&lt;br /&gt;
* With a http server in front of iDempiere you will also be able to offload the ssh encryption (https) onto the http server.&lt;br /&gt;
* There is another benefit to using subdomains for browser access: If all your server instances use the same host name the client browser will sometimes not be able to keep cookies from different instances apart. This can lead to a blocked session as discussed [https://groups.google.com/g/idempiere/c/kBefSKYsq0o here] in the iDempiere google group.&lt;br /&gt;
* Use different DB user names. The docs advise not to change the default user name Adempiere and this is ok for a single instance installation. Still if you use a single DB user for all of your instances you will run into trouble once you need to restore a database from a backup file. The RUN_DBRestore.sh will attempt to delete and recreate the DB user which will throw an error when the user owns more than one DB.&lt;br /&gt;
* You can run all of your instances as services in parallel. Before the installation of another instance rename the service script: 'sudo mv /etc/init.d/idempiere /etc/init.d/idempiere-theInstance.' &lt;br /&gt;
Of course you will need to do some book keeping work with the service controller of your OS to ensure that the renamed services are started as desired.&lt;br /&gt;
* The service controller talks to the iDempiere server via the OSGI console. For this to work without problems in a multi instance environment you need to assign a different telnet port number to each of the instances: in the editor of your choice open /etc/init.d/idempiere. Find the line 'export TELNET_PORT=12612' and change the port number to something else.&lt;br /&gt;
&lt;br /&gt;
Please Note:&lt;br /&gt;
&lt;br /&gt;
* OS specific descriptions in this guide are for Ubuntu 16/18/20 or Debian, if on another OS you need to do some research.&lt;br /&gt;
* I have been using the described approach to host idempiere versions 5 and 6 for some time now and did not have any problems so far. Still make sure you do your own thorough tests if you want to go that route.&lt;br /&gt;
* If you run into any problems (and maybe even manage to solve them) please report back to the community. (You can edit this page or post to the iDempiere google group) Thanks!&lt;br /&gt;
[[Category:HowTo-Technical]]&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Multiple_instances_of_iDempiere&amp;diff=19148</id>
		<title>Multiple instances of iDempiere</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Multiple_instances_of_iDempiere&amp;diff=19148"/>
		<updated>2021-07-27T11:10:19Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: added category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Running multiple instances of idempiere on a single server is not too difficult. Here is a checklist of things to take care of:&lt;br /&gt;
&lt;br /&gt;
* Install the instances into different directories. The instances do not need to share any common files. So you are just fine making a full installation for each instance.&lt;br /&gt;
* Make sure each instance uses its own data base. Use different names for the instance data bases.&lt;br /&gt;
* Make sure the idempiere server instances use different tcp ports.&lt;br /&gt;
* If you really should need to use a single port to access all of the instances you could use a http server like apache or ngnix to do define virtual hosts. Proxying or use of rewrite rules will then allow you to do the desired redirections. I recommend using subdomains to do the job.&lt;br /&gt;
* With a http server in front of iDempiere you will also be able to offload the ssh encryption (https) onto the http server.&lt;br /&gt;
* There is another benefit to using subdomains for browser access: If all your server instances use the same host name the client browser will sometimes not be able to keep cookies from different instances apart. This can lead to a blocked session as discussed [https://groups.google.com/g/idempiere/c/kBefSKYsq0o here] in the iDempiere google group.&lt;br /&gt;
* Use different DB user names. The docs advise not to change the default user name Adempiere and this is ok for a single instance installation. Still if you use a single DB user for all of your instances you will run into trouble once you need to restore a database from a backup file. The RUN_DBRestore.sh will attempt to delete and recreate the DB user which will throw an error when the user owns more than one DB.&lt;br /&gt;
* You can run all of your instances as services in parallel. Before the installation of another instance rename the service script: &lt;br /&gt;
 sudo mv /etc/init.d/idempiere /etc/init.d/idempiere-theInstance. &lt;br /&gt;
Of course you will need to do some book keeping work with the service controller of your OS to ensure that the renamed services are started as desired.&lt;br /&gt;
* The service controller talks to the iDempiere server via the OSGI console. For this to work without problems in a multi instance environment you need to assign a different telnet port number to each of the instances: in the editor of your choice open /etc/init.d/idempiere. Find the line &lt;br /&gt;
export TELNET_PORT=12612 and change the port number to something else.&lt;br /&gt;
&lt;br /&gt;
Please Note:&lt;br /&gt;
&lt;br /&gt;
* OS specific descriptions in this guide are for Ubuntu 16/18/20 or Debian, if on another OS you need to do some research.&lt;br /&gt;
* I have been using the described approach to host idempiere versions 5 and 6 for some time now and did not have any problems so far. Still make sure you do your own thorough tests if you want to go that route.&lt;br /&gt;
* If you run into any problems (and maybe even manage to solve them) please report back to the community. (You can edit this page or post to the iDempiere google group) Thanks!&lt;br /&gt;
[[Category:HowTo-Technical]]&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Multiple_instances_of_iDempiere&amp;diff=19147</id>
		<title>Multiple instances of iDempiere</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Multiple_instances_of_iDempiere&amp;diff=19147"/>
		<updated>2021-07-27T11:06:40Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: added a note on ssh rencryption via http server&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Running multiple instances of idempiere on a single server is not too difficult. Here is a checklist of things to take care of:&lt;br /&gt;
&lt;br /&gt;
* Install the instances into different directories. The instances do not need to share any common files. So you are just fine making a full installation for each instance.&lt;br /&gt;
* Make sure each instance uses its own data base. Use different names for the instance data bases.&lt;br /&gt;
* Make sure the idempiere server instances use different tcp ports.&lt;br /&gt;
* If you really should need to use a single port to access all of the instances you could use a http server like apache or ngnix to do define virtual hosts. Proxying or use of rewrite rules will then allow you to do the desired redirections. I recommend using subdomains to do the job.&lt;br /&gt;
* With a http server in front of iDempiere you will also be able to offload the ssh encryption (https) onto the http server.&lt;br /&gt;
* There is another benefit to using subdomains for browser access: If all your server instances use the same host name the client browser will sometimes not be able to keep cookies from different instances apart. This can lead to a blocked session as discussed [https://groups.google.com/g/idempiere/c/kBefSKYsq0o here] in the iDempiere google group.&lt;br /&gt;
* Use different DB user names. The docs advise not to change the default user name Adempiere and this is ok for a single instance installation. Still if you use a single DB user for all of your instances you will run into trouble once you need to restore a database from a backup file. The RUN_DBRestore.sh will attempt to delete and recreate the DB user which will throw an error when the user owns more than one DB.&lt;br /&gt;
* You can run all of your instances as services in parallel. Before the installation of another instance rename the service script: &lt;br /&gt;
 sudo mv /etc/init.d/idempiere /etc/init.d/idempiere-theInstance. &lt;br /&gt;
Of course you will need to do some book keeping work with the service controller of your OS to ensure that the renamed services are started as desired.&lt;br /&gt;
* The service controller talks to the iDempiere server via the OSGI console. For this to work without problems in a multi instance environment you need to assign a different telnet port number to each of the instances: in the editor of your choice open /etc/init.d/idempiere. Find the line &lt;br /&gt;
export TELNET_PORT=12612 and change the port number to something else.&lt;br /&gt;
&lt;br /&gt;
Please Note:&lt;br /&gt;
&lt;br /&gt;
* OS specific descriptions in this guide are for Ubuntu 16/18/20 or Debian, if on another OS you need to do some research.&lt;br /&gt;
* I have been using the described approach to host idempiere versions 5 and 6 for some time now and did not have any problems so far. Still make sure you do your own thorough tests if you want to go that route.&lt;br /&gt;
* If you run into any problems (and maybe even manage to solve them) please report back to the community. (You can edit this page or post to the iDempiere google group) Thanks!&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Multiple_instances_of_iDempiere&amp;diff=19146</id>
		<title>Multiple instances of iDempiere</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Multiple_instances_of_iDempiere&amp;diff=19146"/>
		<updated>2021-07-27T10:58:32Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: Created page with &amp;quot;Running multiple instances of idempiere on a single server is not too difficult. Here is a checklist of things to take to take care of:  * Install the instances into different...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Running multiple instances of idempiere on a single server is not too difficult. Here is a checklist of things to take to take care of:&lt;br /&gt;
&lt;br /&gt;
* Install the instances into different directories. The instances do not need to share any common files. So you are just fine making a full installation for each instance.&lt;br /&gt;
* Make sure each instance uses its own data base. Use different names for the instance data bases.&lt;br /&gt;
* Make sure the idempiere server instances use different tcp ports.&lt;br /&gt;
* If you really should need to use a single port to access all of the instances you could use a http server like apache or ngnix to do define virtual hosts. Proxying or use of rewrite rules will then allow you to do the desired redirections. (I am using subdomains and apache mod_proxy to do the job)&lt;br /&gt;
* There is another benefit to using subdomains for browser access: If all your server instances use the same host name the client browser will sometimes not be able to keep cookies from different instances apart, which can lead to a blocked session as discussed here in the idempiere google group.&lt;br /&gt;
* Use different DB user names. The docs advise not to change the default user name Adempiere and this is ok for a single instance installation. Still if you use a single DB user for all of your instances you will run into trouble once you need to restore a database from a backup file. The RUN_DBRestore.sh will delete and recreate the DB user which will throw an error when the user owns more than one DB.&lt;br /&gt;
* You can run all of your instances as services in parallel. Before the installation of another instance rename the service script: &lt;br /&gt;
 sudo mv /etc/init.d/idempiere /etc/init.d/idempiere-theInstance. &lt;br /&gt;
Of course you will need to do some book keeping work with the service controller of your OS to ensure that the renamed services are started as desired.&lt;br /&gt;
* The service controller talks to the iDempiere server via the OSGI console. For this to work without problems in a multi instance environment you need to assign a different telnet port number to each of the instances: in the editor of your choice open /etc/init.d/idempiere. Find the line &lt;br /&gt;
export TELNET_PORT=12612 and change the port number to something else.&lt;br /&gt;
&lt;br /&gt;
Please Note:&lt;br /&gt;
&lt;br /&gt;
* OS specific descriptions in this guide are for Ubuntu 16/18/20 or Debian, if on another OS you need to do some research.&lt;br /&gt;
* I have been using the described approach to host idempiere versions 5 and 6 for some time now and did not have any problems so far. Still make sure you do your own thorough tests if you want to go that route.&lt;br /&gt;
* If you run into any problems (and maybe even manage to solve them) please report back to the community. (You can edit this page or post to the iDempiere google group) Thanks!&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Add_Data_Relations_and_Configure_the_Quick_Entry_Dialog&amp;diff=18949</id>
		<title>Application Dictionary - Add Data Relations and Configure the Quick Entry Dialog</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Add_Data_Relations_and_Configure_the_Quick_Entry_Dialog&amp;diff=18949"/>
		<updated>2021-05-26T10:15:50Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: just more screenshots&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Application Dictionary|P]]&lt;br /&gt;
&lt;br /&gt;
__INDEX__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
This tutorial is brought to you by Andreas Sumerauer. If you have any questions, criticism or suggestions for improvement, feel free to join the discussion in the [https://groups.google.com/g/idempiere iDempiere google group.] &lt;br /&gt;
&lt;br /&gt;
==Goal of this tutorial==&lt;br /&gt;
After finishing this tutorial you will have learned how to add Columns to existing tables. &lt;br /&gt;
You will be able to connect records from different tables in a useful way. This is done using data relations.  &lt;br /&gt;
Finally you will learn how to create sophisticated user interface elements to manage these relations within iDempiere.&lt;br /&gt;
As in the previous tutorial we will again only use the iDempiere system user interface to create the additions to the database and the user interface. &lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
This tutorial builds on [[Application_Dictionary_-_Create_a_Custom_Table_and_Window|Create a Custom Table and Window]].&lt;br /&gt;
Before you start you should have successfully completed that first tutorial.&lt;br /&gt;
* Some knowledge of the basic concepts of relational data bases will be beneficial but is not required. &lt;br /&gt;
* You can greatly improve your learning experience through actively reproducing the steps given here. &amp;lt;br&amp;gt;The customizations added during the course of the previous lesson are required for doing that. &lt;br /&gt;
&lt;br /&gt;
==Example Specification==&lt;br /&gt;
&lt;br /&gt;
To complete the example specification from the last tutorial we still need to create a data relation between the new ''Office&amp;amp;nbsp;Room'' table and the factory provided ''Business&amp;amp;nbsp;Partner'' table. This table holds the data of all the persons that our client's organizations are interacting with. &lt;br /&gt;
* That relation will be built through a new ''Office&amp;amp;nbsp;Room'' column that we are going to add to the ''Business&amp;amp;nbsp;Partner'' table together with a so called foreign key constraint that serves to keep the data consistent through any data changes that concern the newly defined relation. &amp;lt;br/&amp;gt;(Note that in iDempiere also an employee of the organization is a Business Partner.)&lt;br /&gt;
* On the user interface side we are going to add a new ''Office&amp;amp;nbsp;Room'' field to the ''Business&amp;amp;nbsp;Partner'' window. &lt;br /&gt;
* As a last step we are going to configure iDempiere's ''QuickEdit'' dialog.  This will allow us to add or modify an employee's office room without having to switch away from the ''Business&amp;amp;nbsp;Partner'' window to the ''Office&amp;amp;nbsp;Room'' window. &lt;br /&gt;
&lt;br /&gt;
==Conventions==&lt;br /&gt;
&lt;br /&gt;
* This tutorial uses a numbered list whenever there are steps that need to be executed to implement the specified requirements. &lt;br /&gt;
* A bulleted list will be used for hints, explanations and background information.&lt;br /&gt;
&lt;br /&gt;
=Steps=&lt;br /&gt;
&lt;br /&gt;
==Add Database Elements==&lt;br /&gt;
[[File:Tutorial add Reference 08.png|border|right|349x349px]]&lt;br /&gt;
&lt;br /&gt;
===Add a new Column to the Business&amp;amp;nbsp;Partner Table===&lt;br /&gt;
&lt;br /&gt;
Now it is time to create the relation from the existing database to the new ''Office&amp;amp;nbsp;Room'' table.&lt;br /&gt;
# Open the Table &amp;amp; Columnn window and load the AD_User table.&lt;br /&gt;
# Click the ''Create&amp;amp;nbsp;New'' Button ('+' icon) in the ''Column'' tab tool bar to open  the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Column'' window with a new record.&lt;br /&gt;
# In the ''Element'' field enter ''SB_OfficeRoomID''. Remember that this Element was generated when we created the ''Office&amp;amp;nbsp;Room'' table in the previous tutorial. &lt;br /&gt;
You will find that a number of fields have been autofilled.&lt;br /&gt;
&lt;br /&gt;
Note that the System has entered the value ''Table&amp;amp;nbsp;Direct'' into the ''Relation'' field. &amp;lt;br /&amp;gt;Idempiere comes with a number of predefined relations to choose from. You can scroll through the ''Reference'' dropdown list to see all of them. The selected reference lets iDempiere know how to handle the data stored in the table column. &amp;lt;br /&amp;gt;It will determine:&lt;br /&gt;
* [[File:Tutorial add Reference 07.png|border|right|386x386px]]The column's data type in the database and in the application&lt;br /&gt;
* How the Data is presented to the user.&lt;br /&gt;
* The UI elements that are presented to the user for manipulation and management of the stored data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol start=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;You can try and explore some different reference types by selecting them from the dropdown. You will find that the layout of the ''Column'' window adapts to show special properties that are relevant to the selection.&lt;br /&gt;
&amp;lt;li&amp;gt;Now return to the initial selection of ''Table&amp;amp;nbsp;Direct''.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
===Configure the Data Relation established by the new Column===&lt;br /&gt;
&lt;br /&gt;
# Let's have a closer look at the ''Constraint&amp;amp;nbsp;Type'' field. Check out the choices presented through the dropdown list.&lt;br /&gt;
&lt;br /&gt;
The constraint type determines how the database will behave when a the record referenced by the field is deleted:&lt;br /&gt;
If the user or some process tries to delete an ''Office&amp;amp;nbsp;room'' that is still referenced by some ''Business&amp;amp;nbsp;Partner'' record we need to take some action to preserve the consistency of our data. Otherwise we might end up with a dangling reference in the ''Business&amp;amp;nbsp;Partner'' record. &lt;br /&gt;
&lt;br /&gt;
* [[File:Tutorial add Reference 06.png|border|right]]'''''No Action''''': This is the default. If there are any child records (i .e. any users referencing a room) then the database engine will not delete the record. Instead an error message will be produced whenever the user tries to delete that room.&lt;br /&gt;
* '''''Do Not Create''''': No constraint is created for this column. This is not recommended! Going without a constraint can lead to data errors, the parent can be deleted without any notice leaving orphan children in the database.&lt;br /&gt;
* '''''Cascade''''': When the parent record is deleted then the child records on this constraint will be deleted too (if possible) - this constraint is executed in the database, consequently the business model rules are not triggered (workflows, changelog, etc)&lt;br /&gt;
* '''''Model Cascade''''': When the parent record is deleted then the child records on this constraint will be deleted too (if possible) - this constraint is executed within iDempiere, so all business model rules are applied.&lt;br /&gt;
* '''''Set Null''''': When the parent record is deleted then the child records on this constraint will set to null (if possible)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol start=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Set the ''Constraint&amp;amp;nbsp;Type'' field back to the default value ''No&amp;amp;nbsp;Action'' and save the new record.&lt;br /&gt;
&amp;lt;li&amp;gt;Hit the Synchronize Button and confirm the process dialog with OK to generate the new column in the database.&lt;br /&gt;
[[File:Tutorial add Reference 05.png|border|341x341px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
[[File:Tutorial add Reference 04.png|border|right|397x397px]]&lt;br /&gt;
A confirmation dialog will appear when the process has been completed. In the upper section of the dialog you will find the SQL commands that the application has sent to the database engine. The lower section shows the response from the database which should basically be just an exact echo of the commands given above. This indicates that the commands were executed without  errors. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol start=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hit OK to close the dialog and you are done. &lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Add the User Interface Elements==&lt;br /&gt;
&lt;br /&gt;
===Add a new field to a factory provided window.===&lt;br /&gt;
&lt;br /&gt;
We are now going to add a new ''Office&amp;amp;nbsp;Room'' field to the 'Business&amp;amp;nbsp;Partner&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Business&amp;amp;nbsp;Partner' window tab.&lt;br /&gt;
&lt;br /&gt;
# Go up one tab level to the ''Table'' view. To do that click ''Table'' in the breadcrumbs bar or hit ''ALT''&amp;amp;nbsp;+&amp;amp;nbsp;''Arrow&amp;amp;nbsp;UP'' on the keyboard.  &lt;br /&gt;
# Now click the Label of the ''Window'' field to zoom over to that window.&lt;br /&gt;
# In the business partner window switch to the ''Business&amp;amp;nbsp;Partner'' subtab by hitting the ''Edit Record'' button in the subtab row. (Or hit ''ALT''&amp;amp;nbsp;+&amp;amp;nbsp;''Arrow&amp;amp;nbsp;Down'' on the keyboard.)&lt;br /&gt;
# [[File:Tutorial add Reference 02.png|border|right|472x472px]]Now click the ''Process'' button in the icon bar and select ''Create&amp;amp;nbsp;Fields'' from the context menu. The ''Create&amp;amp;nbsp;Fields'' process dialog will appear. [[File:Tutorial add Reference 03.png|border]]&lt;br /&gt;
&lt;br /&gt;
When adding fields to a factory provided window it is always a good idea to restrict the number of fields that are created by the process. Many tables include columns that purposefully do not have a corresponding field in the edit window. We need to ensure that we do not generate fields for these columns too.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol start=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;We will avoid inadvertently creating fields for those columns by entering today's date in the date field. This will exclude any columns from the process that have been created earlier by somebody else.&lt;br /&gt;
&amp;lt;li&amp;gt;Now hit OK. A confirmation dialog will appear that lists the newly created fields. &lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Configure the Window Layout===&lt;br /&gt;
&lt;br /&gt;
# We are again using the Tab editor to adapt the window layout. Open the editor through the context menu of the ''Process'' button.&lt;br /&gt;
# In the editor you will find the new ''Office&amp;amp;nbsp;Room'' editor field at the bottom of the page. Drag and drop it to a more convenient position.&lt;br /&gt;
&lt;br /&gt;
With regards to our specification it does not make sense to assign a room to a business partner that is not also an employee. We can guide our users by only showing the new field when the ''Employee'' checkbox is ticked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol start=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[File:Tutorial add Reference 01.png|border|right|487x487px]]With the focus still on the ''Office&amp;amp;nbsp;Room'' field enter '@IsEmployee@=Y' into the '''Display Logic''' field in the ''Property'' sidebar to the right of the edit area.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Side Note - The iDempiere Context===&lt;br /&gt;
&lt;br /&gt;
What actually have we done here? To understand the meaning of the arcane text we have just entered it is necessary to dig a bit deeper and learn a bit about the iDempiere context. &lt;br /&gt;
* iDempiere makes all field values of the current window (among many other things) available as so called context variables. Each time the user enters a new value into field its corresponding variable in the iDempiere context will be updated immediately.&lt;br /&gt;
* The iDempiere context is just a long list of values. Each of these values is paired with a key that is needed to identify that value.&lt;br /&gt;
* To access a context value from the '''Display Logic''' field we just have to surround its key name with @ symbols.&lt;br /&gt;
The application will then replace the codified key name with the respective context value and then check wether the resulting statement is true or not. &lt;br /&gt;
The value of the '''Display Logic''' checkbox is 'Y' when it is ticked and 'N' when not.&lt;br /&gt;
So when we write '@IsEmployee@=Y' iDempiere will replace the '@IsEmployee@' part with a 'Y' when the checkbox is ticked.&lt;br /&gt;
The statement will then be 'Y=Y'. This is obviously true and because of that the ''Office&amp;amp;nbsp;Room'' field will be shown. Unticking the box changes the statement to 'N=Y' which is false and the field will be hidden.&lt;br /&gt;
&lt;br /&gt;
===Configure the Office Room Identifier String===&lt;br /&gt;
&lt;br /&gt;
ToDo&lt;br /&gt;
&lt;br /&gt;
===Make selected Fields available to the Quick Entry Dialog===&lt;br /&gt;
&lt;br /&gt;
As a last step we are now going to make a few of the fields in the ''Office Room'' window available to the ''Quick Entry'' dialog. &lt;br /&gt;
We have already used that dialog in the previous tutorial when we created the entity types for our custom columns. &lt;br /&gt;
Remember that we did not switch to the entity type window to do that. Instead we opened the context menu of the ''Entity Type'' field and selected ''New'' to bring up the quick entry dialog. We then were able to create the new types using that dialog.  &lt;br /&gt;
# ToDo:Switch to Window, Tab and Field: Office Room&lt;br /&gt;
# In the Field subtab select the ''Room&amp;amp;nbsp;Number'' row and click the ''Edit&amp;amp;nbsp;Record'' button. &lt;br /&gt;
# Tick the ''Quick&amp;amp;nbsp;Entry'' checkbox in ''the Window&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Tab&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Field'' view that the window that has switched to. This makes the field available to the QuickEntry dialog. &lt;br /&gt;
&lt;br /&gt;
Repeat that last step for both the ''Floor&amp;amp;nbsp;Number'' and ''Building&amp;amp;nbsp;Wing'' fields.&lt;br /&gt;
&lt;br /&gt;
Hint: Do not forget to save your last edit. iDempiere will autosave any of your changes when you load another record into the active window or switch to a parent tab or subtab. &amp;lt;br/&amp;gt;Manual saving is required in all other cases. That is when you change the focus to any other tab in the hierarchy that is not a parent or child of the previous one.&lt;br /&gt;
&lt;br /&gt;
==Conclusion==&lt;br /&gt;
&lt;br /&gt;
Todo: List UI customization elements: new field in existing Window, QuickEntry Dialog enabled for new Element. &lt;br /&gt;
Todo: Login as client admin or user&lt;br /&gt;
Todo: Description Office Room Field in Business&amp;amp;nbsp;Partner Window&lt;br /&gt;
Todo: Usage QuickEntry&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_add_Reference_08.png&amp;diff=18948</id>
		<title>File:Tutorial add Reference 08.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_add_Reference_08.png&amp;diff=18948"/>
		<updated>2021-05-26T10:13:37Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Table &amp;gt; Column window&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_add_Reference_07.png&amp;diff=18947</id>
		<title>File:Tutorial add Reference 07.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_add_Reference_07.png&amp;diff=18947"/>
		<updated>2021-05-26T10:09:18Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Reference dropdown list&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_add_Reference_06.png&amp;diff=18946</id>
		<title>File:Tutorial add Reference 06.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_add_Reference_06.png&amp;diff=18946"/>
		<updated>2021-05-26T10:07:35Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Constraint Type dropdown list&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_add_Reference_05.png&amp;diff=18945</id>
		<title>File:Tutorial add Reference 05.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_add_Reference_05.png&amp;diff=18945"/>
		<updated>2021-05-26T10:05:51Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Synchronize Column button&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_add_Reference_04.png&amp;diff=18944</id>
		<title>File:Tutorial add Reference 04.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_add_Reference_04.png&amp;diff=18944"/>
		<updated>2021-05-26T10:02:55Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Synchronize Column - Confirmation Dialog&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Add_Data_Relations_and_Configure_the_Quick_Entry_Dialog&amp;diff=18943</id>
		<title>Application Dictionary - Add Data Relations and Configure the Quick Entry Dialog</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Add_Data_Relations_and_Configure_the_Quick_Entry_Dialog&amp;diff=18943"/>
		<updated>2021-05-26T10:00:35Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: more screenshots&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Application Dictionary|P]]&lt;br /&gt;
&lt;br /&gt;
__INDEX__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
This tutorial is brought to you by Andreas Sumerauer. If you have any questions, criticism or suggestions for improvement, feel free to join the discussion in the [https://groups.google.com/g/idempiere iDempiere google group.] &lt;br /&gt;
&lt;br /&gt;
==Goal of this tutorial==&lt;br /&gt;
After finishing this tutorial you will have learned how to add Columns to existing tables. &lt;br /&gt;
You will be able to connect records from different tables in a useful way. This is done using data relations.  &lt;br /&gt;
Finally you will learn how to create sophisticated user interface elements to manage these relations within iDempiere.&lt;br /&gt;
As in the previous tutorial we will again only use the iDempiere system user interface to create the additions to the database and the user interface. &lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
This tutorial builds on [[Application_Dictionary_-_Create_a_Custom_Table_and_Window|Create a Custom Table and Window]].&lt;br /&gt;
Before you start you should have successfully completed that first tutorial.&lt;br /&gt;
* Some knowledge of the basic concepts of relational data bases will be beneficial but is not required. &lt;br /&gt;
* You can greatly improve your learning experience through actively reproducing the steps given here. &amp;lt;br&amp;gt;The customizations added during the course of the previous lesson are required for doing that. &lt;br /&gt;
&lt;br /&gt;
==Example Specification==&lt;br /&gt;
&lt;br /&gt;
To complete the example specification from the last tutorial we still need to create a data relation between the new ''Office&amp;amp;nbsp;Room'' table and the factory provided ''Business&amp;amp;nbsp;Partner'' table. This table holds the data of all the persons that our client's organizations are interacting with. &lt;br /&gt;
* That relation will be built through a new ''Office&amp;amp;nbsp;Room'' column that we are going to add to the ''Business&amp;amp;nbsp;Partner'' table together with a so called foreign key constraint that serves to keep the data consistent through any data changes that concern the newly defined relation. &amp;lt;br/&amp;gt;(Note that in iDempiere also an employee of the organization is a Business Partner.)&lt;br /&gt;
* On the user interface side we are going to add a new ''Office&amp;amp;nbsp;Room'' field to the ''Business&amp;amp;nbsp;Partner'' window. &lt;br /&gt;
* As a last step we are going to configure iDempiere's ''QuickEdit'' dialog.  This will allow us to add or modify an employee's office room without having to switch away from the ''Business&amp;amp;nbsp;Partner'' window to the ''Office&amp;amp;nbsp;Room'' window. &lt;br /&gt;
&lt;br /&gt;
==Conventions==&lt;br /&gt;
&lt;br /&gt;
* This tutorial uses a numbered list whenever there are steps that need to be executed to implement the specified requirements. &lt;br /&gt;
* A bulleted list will be used for hints, explanations and background information.&lt;br /&gt;
&lt;br /&gt;
=Steps=&lt;br /&gt;
&lt;br /&gt;
==Add Database Elements==&lt;br /&gt;
&lt;br /&gt;
===Add a new Column to the Business&amp;amp;nbsp;Partner Table===&lt;br /&gt;
&lt;br /&gt;
Now it is time to create the relation from the existing database to the new ''Office&amp;amp;nbsp;Room'' table.&lt;br /&gt;
# Open the Table &amp;amp; Columnn window and load the AD_User table.&lt;br /&gt;
# Click the ''Create&amp;amp;nbsp;New'' Button ('+' icon) in the ''Column'' tab tool bar to open  the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Column'' window with a new record.&lt;br /&gt;
# In the ''Element'' field enter ''SB_OfficeRoomID''. Remember that this Element was generated when we created the ''Office&amp;amp;nbsp;Room'' table in the previous tutorial.&amp;lt;br/&amp;gt; You will find that a number of fields will be autofilled.&lt;br /&gt;
Note that the System has entered the value ''Table&amp;amp;nbsp;Direct'' into the ''Relation'' field. &amp;lt;br/&amp;gt;Idempiere comes with a number of predefined relations to choose from. You can scroll through the ''Reference'' dropdown list to see all of them. The selected reference lets iDempiere know how to handle the data stored in the table column. &amp;lt;br/&amp;gt;It will determine:&lt;br /&gt;
* The data type in the data base and in the application&lt;br /&gt;
* How the Data is presented to the user.&lt;br /&gt;
* The UI elements that are presented to the user for manipulation and management of the stored data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol start=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;You can try and explore some different reference types by selecting them from the dropdown. You will find that the layout of the ''Column'' window adapts to show special properties that are relevant to the selection.&lt;br /&gt;
&amp;lt;li&amp;gt;Now return to the initial selection of ''Table&amp;amp;nbsp;Direct''.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
===Configure the Data Relation established by the new Column===&lt;br /&gt;
&lt;br /&gt;
# Let's have a closer look at the ''Constraint&amp;amp;nbsp;Type'' field. Check out the choices presented through the dropdown list.&lt;br /&gt;
&lt;br /&gt;
The constraint type determines how the database will behave when a the record referenced by the field is deleted:&lt;br /&gt;
If the user or some process tries to delete an ''Office&amp;amp;nbsp;room'' that is still referenced by some ''Business&amp;amp;nbsp;Partner'' record we need to take some action to preserve the consistency of our data. Otherwise we might end up with a dangling reference in the ''Business&amp;amp;nbsp;Partner'' record. &lt;br /&gt;
&lt;br /&gt;
* '''''No Action''''': This is the default. If there are any child records (i .e. any users referencing a room) then the database engine will not delete the record. Instead an error message will be produced whenever the user tries to delete that room. &lt;br /&gt;
* '''''Do Not Create''''': No constraint is created for this column. This is not recommended! Going without a constraint can lead to data errors, the parent can be deleted without any notice leaving orphan children in the database.&lt;br /&gt;
* '''''Cascade''''': When the parent record is deleted then the child records on this constraint will be deleted too (if possible) - this constraint is executed in the database, consequently the business model rules are not triggered (workflows, changelog, etc)&lt;br /&gt;
* '''''Model Cascade''''': When the parent record is deleted then the child records on this constraint will be deleted too (if possible) - this constraint is executed within iDempiere, so all business model rules are applied.&lt;br /&gt;
* '''''Set Null''''': When the parent record is deleted then the child records on this constraint will set to null (if possible)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol start=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Set the ''Constraint&amp;amp;nbsp;Type'' field back to the default value ''No&amp;amp;nbsp;Action'' and save the new record.&lt;br /&gt;
&amp;lt;li&amp;gt;Hit the Synchronize Button and confirm the process dialog with OK to generate the new column in the database.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
A confirmation dialog will appear when the process has been completed. In the upper section it shows the SQL commands that the application has sent to the database engine. The lower section shows the response from the database which should basically be just an exact echo of the commands given above. This indicates that the commands were executed without  errors. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol start=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hit OK to close the dialog and you are done. &lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Add the User Interface Elements==&lt;br /&gt;
&lt;br /&gt;
===Add a new field to a factory provided window.===&lt;br /&gt;
&lt;br /&gt;
We are now going to add a new ''Office&amp;amp;nbsp;Room'' field to the 'Business&amp;amp;nbsp;Partner&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Business&amp;amp;nbsp;Partner' window tab.&lt;br /&gt;
&lt;br /&gt;
# Go up one tab level to the ''Table'' view. To do that click ''Table'' in the breadcrumbs bar or hit ''ALT''&amp;amp;nbsp;+&amp;amp;nbsp;''Arrow&amp;amp;nbsp;UP'' on the keyboard.  &lt;br /&gt;
# Now click the Label of the ''Window'' field to zoom over to that window.&lt;br /&gt;
# In the business partner window switch to the ''Business&amp;amp;nbsp;Partner'' subtab by hitting the ''Edit Record'' button in the subtab row. (Or hit ''ALT''&amp;amp;nbsp;+&amp;amp;nbsp;''Arrow&amp;amp;nbsp;Down'' on the keyboard.)&lt;br /&gt;
# [[File:Tutorial add Reference 02.png|border|right|472x472px]]Now click the ''Process'' button in the icon bar and select ''Create&amp;amp;nbsp;Fields'' from the context menu. The ''Create&amp;amp;nbsp;Fields'' process dialog will appear. [[File:Tutorial add Reference 03.png|border]]&lt;br /&gt;
&lt;br /&gt;
When adding fields to a factory provided window it is always a good idea to restrict the number of fields that are created by the process. Many tables include columns that purposefully do not have a corresponding field in the edit window. We need to ensure that we do not generate fields for these columns too.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol start=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;We will avoid inadvertently creating fields for those columns by entering today's date in the date field. This will exclude any columns from the process that have been created earlier by somebody else.&lt;br /&gt;
&amp;lt;li&amp;gt;Now hit OK. A confirmation dialog will appear that lists the newly created fields. &lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Configure the Window Layout===&lt;br /&gt;
&lt;br /&gt;
# We are again using the Tab editor to adapt the window layout. Open the editor through the context menu of the ''Process'' button.&lt;br /&gt;
# In the editor you will find the new ''Office&amp;amp;nbsp;Room'' editor field at the bottom of the page. Drag and drop it to a more convenient position.&lt;br /&gt;
&lt;br /&gt;
With regards to our specification it does not make sense to assign a room to a business partner that is not also an employee. We can guide our users by only showing the new field when the ''Employee'' checkbox is ticked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol start=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[File:Tutorial add Reference 01.png|border|right|487x487px]]With the focus still on the ''Office&amp;amp;nbsp;Room'' field enter '@IsEmployee@=Y' into the '''Display Logic''' field in the ''Property'' sidebar to the right of the edit area.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Side Note - The iDempiere Context===&lt;br /&gt;
&lt;br /&gt;
What actually have we done here? To understand the meaning of the arcane text we have just entered it is necessary to dig a bit deeper and learn a bit about the iDempiere context. &lt;br /&gt;
* iDempiere makes all field values of the current window (among many other things) available as so called context variables. Each time the user enters a new value into field its corresponding variable in the iDempiere context will be updated immediately.&lt;br /&gt;
* The iDempiere context is just a long list of values. Each of these values is paired with a key that is needed to identify that value.&lt;br /&gt;
* To access a context value from the '''Display Logic''' field we just have to surround its key name with @ symbols.&lt;br /&gt;
The application will then replace the codified key name with the respective context value and then check wether the resulting statement is true or not. &lt;br /&gt;
The value of the '''Display Logic''' checkbox is 'Y' when it is ticked and 'N' when not.&lt;br /&gt;
So when we write '@IsEmployee@=Y' iDempiere will replace the '@IsEmployee@' part with a 'Y' when the checkbox is ticked.&lt;br /&gt;
The statement will then be 'Y=Y'. This is obviously true and because of that the ''Office&amp;amp;nbsp;Room'' field will be shown. Unticking the box changes the statement to 'N=Y' which is false and the field will be hidden.&lt;br /&gt;
&lt;br /&gt;
===Configure the Office Room Identifier String===&lt;br /&gt;
&lt;br /&gt;
ToDo&lt;br /&gt;
&lt;br /&gt;
===Make selected Fields available to the Quick Entry Dialog===&lt;br /&gt;
&lt;br /&gt;
As a last step we are now going to make a few of the fields in the ''Office Room'' window available to the ''Quick Entry'' dialog. &lt;br /&gt;
We have already used that dialog in the previous tutorial when we created the entity types for our custom columns. &lt;br /&gt;
Remember that we did not switch to the entity type window to do that. Instead we opened the context menu of the ''Entity Type'' field and selected ''New'' to bring up the quick entry dialog. We then were able to create the new types using that dialog.  &lt;br /&gt;
# ToDo:Switch to Window, Tab and Field: Office Room&lt;br /&gt;
# In the Field subtab select the ''Room&amp;amp;nbsp;Number'' row and click the ''Edit&amp;amp;nbsp;Record'' button. &lt;br /&gt;
# Tick the ''Quick&amp;amp;nbsp;Entry'' checkbox in ''the Window&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Tab&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Field'' view that the window that has switched to. This makes the field available to the QuickEntry dialog. &lt;br /&gt;
&lt;br /&gt;
Repeat that last step for both the ''Floor&amp;amp;nbsp;Number'' and ''Building&amp;amp;nbsp;Wing'' fields.&lt;br /&gt;
&lt;br /&gt;
Hint: Do not forget to save your last edit. iDempiere will autosave any of your changes when you load another record into the active window or switch to a parent tab or subtab. &amp;lt;br/&amp;gt;Manual saving is required in all other cases. That is when you change the focus to any other tab in the hierarchy that is not a parent or child of the previous one.&lt;br /&gt;
&lt;br /&gt;
==Conclusion==&lt;br /&gt;
&lt;br /&gt;
Todo: List UI customization elements: new field in existing Window, QuickEntry Dialog enabled for new Element. &lt;br /&gt;
Todo: Login as client admin or user&lt;br /&gt;
Todo: Description Office Room Field in Business&amp;amp;nbsp;Partner Window&lt;br /&gt;
Todo: Usage QuickEntry&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_add_Reference_03.png&amp;diff=18942</id>
		<title>File:Tutorial add Reference 03.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_add_Reference_03.png&amp;diff=18942"/>
		<updated>2021-05-26T09:59:36Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Process Menu - Create Fields&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_add_Reference_02.png&amp;diff=18941</id>
		<title>File:Tutorial add Reference 02.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_add_Reference_02.png&amp;diff=18941"/>
		<updated>2021-05-26T09:57:21Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Create FIelds Dialog - insert date&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Add_Data_Relations_and_Configure_the_Quick_Entry_Dialog&amp;diff=18940</id>
		<title>Application Dictionary - Add Data Relations and Configure the Quick Entry Dialog</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Add_Data_Relations_and_Configure_the_Quick_Entry_Dialog&amp;diff=18940"/>
		<updated>2021-05-26T09:54:40Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: screenshot added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Application Dictionary|P]]&lt;br /&gt;
&lt;br /&gt;
__INDEX__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
This tutorial is brought to you by Andreas Sumerauer. If you have any questions, criticism or suggestions for improvement, feel free to join the discussion in the [https://groups.google.com/g/idempiere iDempiere google group.] &lt;br /&gt;
&lt;br /&gt;
==Goal of this tutorial==&lt;br /&gt;
After finishing this tutorial you will have learned how to add Columns to existing tables. &lt;br /&gt;
You will be able to connect records from different tables in a useful way. This is done using data relations.  &lt;br /&gt;
Finally you will learn how to create sophisticated user interface elements to manage these relations within iDempiere.&lt;br /&gt;
As in the previous tutorial we will again only use the iDempiere system user interface to create the additions to the database and the user interface. &lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
This tutorial builds on [[Application_Dictionary_-_Create_a_Custom_Table_and_Window|Create a Custom Table and Window]].&lt;br /&gt;
Before you start you should have successfully completed that first tutorial.&lt;br /&gt;
* Some knowledge of the basic concepts of relational data bases will be beneficial but is not required. &lt;br /&gt;
* You can greatly improve your learning experience through actively reproducing the steps given here. &amp;lt;br&amp;gt;The customizations added during the course of the previous lesson are required for doing that. &lt;br /&gt;
&lt;br /&gt;
==Example Specification==&lt;br /&gt;
&lt;br /&gt;
To complete the example specification from the last tutorial we still need to create a data relation between the new ''Office&amp;amp;nbsp;Room'' table and the factory provided ''Business&amp;amp;nbsp;Partner'' table. This table holds the data of all the persons that our client's organizations are interacting with. &lt;br /&gt;
* That relation will be built through a new ''Office&amp;amp;nbsp;Room'' column that we are going to add to the ''Business&amp;amp;nbsp;Partner'' table together with a so called foreign key constraint that serves to keep the data consistent through any data changes that concern the newly defined relation. &amp;lt;br/&amp;gt;(Note that in iDempiere also an employee of the organization is a Business Partner.)&lt;br /&gt;
* On the user interface side we are going to add a new ''Office&amp;amp;nbsp;Room'' field to the ''Business&amp;amp;nbsp;Partner'' window. &lt;br /&gt;
* As a last step we are going to configure iDempiere's ''QuickEdit'' dialog.  This will allow us to add or modify an employee's office room without having to switch away from the ''Business&amp;amp;nbsp;Partner'' window to the ''Office&amp;amp;nbsp;Room'' window. &lt;br /&gt;
&lt;br /&gt;
==Conventions==&lt;br /&gt;
&lt;br /&gt;
* This tutorial uses a numbered list whenever there are steps that need to be executed to implement the specified requirements. &lt;br /&gt;
* A bulleted list will be used for hints, explanations and background information.&lt;br /&gt;
&lt;br /&gt;
=Steps=&lt;br /&gt;
&lt;br /&gt;
==Add Database Elements==&lt;br /&gt;
&lt;br /&gt;
===Add a new Column to the Business&amp;amp;nbsp;Partner Table===&lt;br /&gt;
&lt;br /&gt;
Now it is time to create the relation from the existing database to the new ''Office&amp;amp;nbsp;Room'' table.&lt;br /&gt;
# Open the Table &amp;amp; Columnn window and load the AD_User table.&lt;br /&gt;
# Click the ''Create&amp;amp;nbsp;New'' Button ('+' icon) in the ''Column'' tab tool bar to open  the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Column'' window with a new record.&lt;br /&gt;
# In the ''Element'' field enter ''SB_OfficeRoomID''. Remember that this Element was generated when we created the ''Office&amp;amp;nbsp;Room'' table in the previous tutorial.&amp;lt;br/&amp;gt; You will find that a number of fields will be autofilled.&lt;br /&gt;
Note that the System has entered the value ''Table&amp;amp;nbsp;Direct'' into the ''Relation'' field. &amp;lt;br/&amp;gt;Idempiere comes with a number of predefined relations to choose from. You can scroll through the ''Reference'' dropdown list to see all of them. The selected reference lets iDempiere know how to handle the data stored in the table column. &amp;lt;br/&amp;gt;It will determine:&lt;br /&gt;
* The data type in the data base and in the application&lt;br /&gt;
* How the Data is presented to the user.&lt;br /&gt;
* The UI elements that are presented to the user for manipulation and management of the stored data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol start=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;You can try and explore some different reference types by selecting them from the dropdown. You will find that the layout of the ''Column'' window adapts to show special properties that are relevant to the selection.&lt;br /&gt;
&amp;lt;li&amp;gt;Now return to the initial selection of ''Table&amp;amp;nbsp;Direct''.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
===Configure the Data Relation established by the new Column===&lt;br /&gt;
&lt;br /&gt;
# Let's have a closer look at the ''Constraint&amp;amp;nbsp;Type'' field. Check out the choices presented through the dropdown list.&lt;br /&gt;
&lt;br /&gt;
The constraint type determines how the database will behave when a the record referenced by the field is deleted:&lt;br /&gt;
If the user or some process tries to delete an ''Office&amp;amp;nbsp;room'' that is still referenced by some ''Business&amp;amp;nbsp;Partner'' record we need to take some action to preserve the consistency of our data. Otherwise we might end up with a dangling reference in the ''Business&amp;amp;nbsp;Partner'' record. &lt;br /&gt;
&lt;br /&gt;
* '''''No Action''''': This is the default. If there are any child records (i .e. any users referencing a room) then the database engine will not delete the record. Instead an error message will be produced whenever the user tries to delete that room. &lt;br /&gt;
* '''''Do Not Create''''': No constraint is created for this column. This is not recommended! Going without a constraint can lead to data errors, the parent can be deleted without any notice leaving orphan children in the database.&lt;br /&gt;
* '''''Cascade''''': When the parent record is deleted then the child records on this constraint will be deleted too (if possible) - this constraint is executed in the database, consequently the business model rules are not triggered (workflows, changelog, etc)&lt;br /&gt;
* '''''Model Cascade''''': When the parent record is deleted then the child records on this constraint will be deleted too (if possible) - this constraint is executed within iDempiere, so all business model rules are applied.&lt;br /&gt;
* '''''Set Null''''': When the parent record is deleted then the child records on this constraint will set to null (if possible)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol start=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Set the ''Constraint&amp;amp;nbsp;Type'' field back to the default value ''No&amp;amp;nbsp;Action'' and save the new record.&lt;br /&gt;
&amp;lt;li&amp;gt;Hit the Synchronize Button and confirm the process dialog with OK to generate the new column in the database.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
A confirmation dialog will appear when the process has been completed. In the upper section it shows the SQL commands that the application has sent to the database engine. The lower section shows the response from the database which should basically be just an exact echo of the commands given above. This indicates that the commands were executed without  errors. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol start=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hit OK to close the dialog and you are done. &lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Add the User Interface Elements==&lt;br /&gt;
&lt;br /&gt;
===Add a new field to a factory provided window.===&lt;br /&gt;
&lt;br /&gt;
We are now going to add a new ''Office&amp;amp;nbsp;Room'' field to the 'Business&amp;amp;nbsp;Partner&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Business&amp;amp;nbsp;Partner' window tab.&lt;br /&gt;
&lt;br /&gt;
# Go up one tab level to the ''Table'' view. To do that click ''Table'' in the breadcrumbs bar or hit ''ALT''&amp;amp;nbsp;+&amp;amp;nbsp;''Arrow&amp;amp;nbsp;UP'' on the keyboard.  &lt;br /&gt;
# Now click the Label of the ''Window'' field to zoom over to that window.&lt;br /&gt;
# In the business partner window switch to the ''Business&amp;amp;nbsp;Partner'' subtab by hitting the ''Edit Record'' button in the subtab row. (Or hit ''ALT''&amp;amp;nbsp;+&amp;amp;nbsp;''Arrow&amp;amp;nbsp;Down'' on the keyboard.)&lt;br /&gt;
# Now click the ''Process'' button in the icon bar and select ''Create&amp;amp;nbsp;Fields'' from the context menu. The ''Create&amp;amp;nbsp;Fields'' process dialog will appear. &lt;br /&gt;
&lt;br /&gt;
When adding fields to a factory provided window it is always a good idea to restrict the number of fields that are created by the process. Many tables include columns that purposefully do not have a corresponding field in the edit window. We need to ensure that we do not generate fields for these columns too.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol start=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;We will avoid inadvertently creating fields for those columns by entering today's date in the date field. This will exclude any columns from the process that have been created earlier by somebody else.&lt;br /&gt;
&amp;lt;li&amp;gt;Now hit OK. A confirmation dialog will appear that lists the newly created fields. &lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Configure the Window Layout===&lt;br /&gt;
&lt;br /&gt;
# We are again using the Tab editor to adapt the window layout. Open the editor through the context menu of the ''Process'' button.&lt;br /&gt;
# In the editor you will find the new ''Office&amp;amp;nbsp;Room'' editor field at the bottom of the page. Drag and drop it to a more convenient position.&lt;br /&gt;
&lt;br /&gt;
With regards to our specification it does not make sense to assign a room to a business partner that is not also an employee. We can guide our users by only showing the new field when the ''Employee'' checkbox is ticked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol start=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[File:Tutorial add Reference 01.png|border|right|466x466px]]With the focus still on the ''Office&amp;amp;nbsp;Room'' field enter '@IsEmployee@=Y' into the '''Display Logic''' field in the ''Property'' sidebar to the right of the edit area.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Side Note - The iDempiere Context===&lt;br /&gt;
&lt;br /&gt;
What actually have we done here? To understand the meaning of the arcane text we have just entered it is necessary to dig a bit deeper and learn a bit about the iDempiere context. &lt;br /&gt;
* iDempiere makes all field values of the current window (among many other things) available as so called context variables. Each time the user enters a new value into field its corresponding variable in the iDempiere context will be updated immediately.&lt;br /&gt;
* The iDempiere context is just a long list of values. Each of these values is paired with a key that is needed to identify that value.&lt;br /&gt;
* To access a context value from the '''Display Logic''' field we just have to surround its key name with @ symbols.&lt;br /&gt;
The application will then replace the codified key name with the respective context value and then check wether the resulting statement is true or not. &lt;br /&gt;
The value of the '''Display Logic''' checkbox is 'Y' when it is ticked and 'N' when not.&lt;br /&gt;
So when we write '@IsEmployee@=Y' iDempiere will replace the '@IsEmployee@' part with a 'Y' when the checkbox is ticked.&lt;br /&gt;
The statement will then be 'Y=Y'. This is obviously true and because of that the ''Office&amp;amp;nbsp;Room'' field will be shown. Unticking the box changes the statement to 'N=Y' which is false and the field will be hidden.&lt;br /&gt;
&lt;br /&gt;
===Configure the Office Room Identifier String===&lt;br /&gt;
&lt;br /&gt;
ToDo&lt;br /&gt;
&lt;br /&gt;
===Make selected Fields available to the Quick Entry Dialog===&lt;br /&gt;
&lt;br /&gt;
As a last step we are now going to make a few of the fields in the ''Office Room'' window available to the ''Quick Entry'' dialog. &lt;br /&gt;
We have already used that dialog in the previous tutorial when we created the entity types for our custom columns. &lt;br /&gt;
Remember that we did not switch to the entity type window to do that. Instead we opened the context menu of the ''Entity Type'' field and selected ''New'' to bring up the quick entry dialog. We then were able to create the new types using that dialog.  &lt;br /&gt;
# ToDo:Switch to Window, Tab and Field: Office Room&lt;br /&gt;
# In the Field subtab select the ''Room&amp;amp;nbsp;Number'' row and click the ''Edit&amp;amp;nbsp;Record'' button. &lt;br /&gt;
# Tick the ''Quick&amp;amp;nbsp;Entry'' checkbox in ''the Window&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Tab&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Field'' view that the window that has switched to. This makes the field available to the QuickEntry dialog. &lt;br /&gt;
&lt;br /&gt;
Repeat that last step for both the ''Floor&amp;amp;nbsp;Number'' and ''Building&amp;amp;nbsp;Wing'' fields.&lt;br /&gt;
&lt;br /&gt;
Hint: Do not forget to save your last edit. iDempiere will autosave any of your changes when you load another record into the active window or switch to a parent tab or subtab. &amp;lt;br/&amp;gt;Manual saving is required in all other cases. That is when you change the focus to any other tab in the hierarchy that is not a parent or child of the previous one.&lt;br /&gt;
&lt;br /&gt;
==Conclusion==&lt;br /&gt;
&lt;br /&gt;
Todo: List UI customization elements: new field in existing Window, QuickEntry Dialog enabled for new Element. &lt;br /&gt;
Todo: Login as client admin or user&lt;br /&gt;
Todo: Description Office Room Field in Business&amp;amp;nbsp;Partner Window&lt;br /&gt;
Todo: Usage QuickEntry&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_add_Reference_01.png&amp;diff=18939</id>
		<title>File:Tutorial add Reference 01.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_add_Reference_01.png&amp;diff=18939"/>
		<updated>2021-05-26T09:53:31Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tab Editor - Display Logic&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Add_Data_Relations_and_Configure_the_Quick_Entry_Dialog&amp;diff=18938</id>
		<title>Application Dictionary - Add Data Relations and Configure the Quick Entry Dialog</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Add_Data_Relations_and_Configure_the_Quick_Entry_Dialog&amp;diff=18938"/>
		<updated>2021-05-25T23:22:32Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: Created page with &amp;quot;P  __INDEX__  =Introduction= This tutorial is brought to you by Andreas Sumerauer. If you have any questions, criticism or suggestions for...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Application Dictionary|P]]&lt;br /&gt;
&lt;br /&gt;
__INDEX__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
This tutorial is brought to you by Andreas Sumerauer. If you have any questions, criticism or suggestions for improvement, feel free to join the discussion in the [https://groups.google.com/g/idempiere iDempiere google group.] &lt;br /&gt;
&lt;br /&gt;
==Goal of this tutorial==&lt;br /&gt;
After finishing this tutorial you will have learned how to add Columns to existing tables. &lt;br /&gt;
You will be able to connect records from different tables in a useful way. This is done using data relations.  &lt;br /&gt;
Finally you will learn how to create sophisticated user interface elements to manage these relations within iDempiere.&lt;br /&gt;
As in the previous tutorial we will again only use the iDempiere system user interface to create the additions to the database and the user interface. &lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
This tutorial builds on [[Application_Dictionary_-_Create_a_Custom_Table_and_Window|Create a Custom Table and Window]].&lt;br /&gt;
Before you start you should have successfully completed that first tutorial.&lt;br /&gt;
* Some knowledge of the basic concepts of relational data bases will be beneficial but is not required. &lt;br /&gt;
* You can greatly improve your learning experience through actively reproducing the steps given here. &amp;lt;br&amp;gt;The customizations added during the course of the previous lesson are required for doing that. &lt;br /&gt;
&lt;br /&gt;
==Example Specification==&lt;br /&gt;
&lt;br /&gt;
To complete the example specification from the last tutorial we still need to create a data relation between the new ''Office&amp;amp;nbsp;Room'' table and the factory provided ''Business&amp;amp;nbsp;Partner'' table. This table holds the data of all the persons that our client's organizations are interacting with. &lt;br /&gt;
* That relation will be built through a new ''Office&amp;amp;nbsp;Room'' column that we are going to add to the ''Business&amp;amp;nbsp;Partner'' table together with a so called foreign key constraint that serves to keep the data consistent through any data changes that concern the newly defined relation. &amp;lt;br/&amp;gt;(Note that in iDempiere also an employee of the organization is a Business Partner.)&lt;br /&gt;
* On the user interface side we are going to add a new ''Office&amp;amp;nbsp;Room'' field to the ''Business&amp;amp;nbsp;Partner'' window. &lt;br /&gt;
* As a last step we are going to configure iDempiere's ''QuickEdit'' dialog.  This will allow us to add or modify an employee's office room without having to switch away from the ''Business&amp;amp;nbsp;Partner'' window to the ''Office&amp;amp;nbsp;Room'' window. &lt;br /&gt;
&lt;br /&gt;
==Conventions==&lt;br /&gt;
&lt;br /&gt;
* This tutorial uses a numbered list whenever there are steps that need to be executed to implement the specified requirements. &lt;br /&gt;
* A bulleted list will be used for hints, explanations and background information.&lt;br /&gt;
&lt;br /&gt;
=Steps=&lt;br /&gt;
&lt;br /&gt;
==Add Database Elements==&lt;br /&gt;
&lt;br /&gt;
===Add a new Column to the Business&amp;amp;nbsp;Partner Table===&lt;br /&gt;
&lt;br /&gt;
Now it is time to create the relation from the existing database to the new ''Office&amp;amp;nbsp;Room'' table.&lt;br /&gt;
# Open the Table &amp;amp; Columnn window and load the AD_User table.&lt;br /&gt;
# Click the ''Create&amp;amp;nbsp;New'' Button ('+' icon) in the ''Column'' tab tool bar to open  the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Column'' window with a new record.&lt;br /&gt;
# In the ''Element'' field enter ''SB_OfficeRoomID''. Remember that this Element was generated when we created the ''Office&amp;amp;nbsp;Room'' table in the previous tutorial.&amp;lt;br/&amp;gt; You will find that a number of fields will be autofilled.&lt;br /&gt;
Note that the System has entered the value ''Table&amp;amp;nbsp;Direct'' into the ''Relation'' field. &amp;lt;br/&amp;gt;Idempiere comes with a number of predefined relations to choose from. You can scroll through the ''Reference'' dropdown list to see all of them. The selected reference lets iDempiere know how to handle the data stored in the table column. &amp;lt;br/&amp;gt;It will determine:&lt;br /&gt;
* The data type in the data base and in the application&lt;br /&gt;
* How the Data is presented to the user.&lt;br /&gt;
* The UI elements that are presented to the user for manipulation and management of the stored data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol start=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;You can try and explore some different reference types by selecting them from the dropdown. You will find that the layout of the ''Column'' window adapts to show special properties that are relevant to the selection.&lt;br /&gt;
&amp;lt;li&amp;gt;Now return to the initial selection of ''Table&amp;amp;nbsp;Direct''.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
===Configure the Data Relation established by the new Column===&lt;br /&gt;
&lt;br /&gt;
# Let's have a closer look at the ''Constraint&amp;amp;nbsp;Type'' field. Check out the choices presented through the dropdown list.&lt;br /&gt;
&lt;br /&gt;
The constraint type determines how the database will behave when a the record referenced by the field is deleted:&lt;br /&gt;
If the user or some process tries to delete an ''Office&amp;amp;nbsp;room'' that is still referenced by some ''Business&amp;amp;nbsp;Partner'' record we need to take some action to preserve the consistency of our data. Otherwise we might end up with a dangling reference in the ''Business&amp;amp;nbsp;Partner'' record. &lt;br /&gt;
&lt;br /&gt;
* '''''No Action''''': This is the default. If there are any child records (i .e. any users referencing a room) then the database engine will not delete the record. Instead an error message will be produced whenever the user tries to delete that room. &lt;br /&gt;
* '''''Do Not Create''''': No constraint is created for this column. This is not recommended! Going without a constraint can lead to data errors, the parent can be deleted without any notice leaving orphan children in the database.&lt;br /&gt;
* '''''Cascade''''': When the parent record is deleted then the child records on this constraint will be deleted too (if possible) - this constraint is executed in the database, consequently the business model rules are not triggered (workflows, changelog, etc)&lt;br /&gt;
* '''''Model Cascade''''': When the parent record is deleted then the child records on this constraint will be deleted too (if possible) - this constraint is executed within iDempiere, so all business model rules are applied.&lt;br /&gt;
* '''''Set Null''''': When the parent record is deleted then the child records on this constraint will set to null (if possible)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol start=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Set the ''Constraint&amp;amp;nbsp;Type'' field back to the default value ''No&amp;amp;nbsp;Action'' and save the new record.&lt;br /&gt;
&amp;lt;li&amp;gt;Hit the Synchronize Button and confirm the process dialog with OK to generate the new column in the database.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
A confirmation dialog will appear when the process has been completed. In the upper section it shows the SQL commands that the application has sent to the database engine. The lower section shows the response from the database which should basically be just an exact echo of the commands given above. This indicates that the commands were executed without  errors. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol start=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Hit OK to close the dialog and you are done. &lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Add the User Interface Elements==&lt;br /&gt;
&lt;br /&gt;
===Add a new field to a factory provided window.===&lt;br /&gt;
&lt;br /&gt;
We are now going to add a new ''Office&amp;amp;nbsp;Room'' field to the 'Business&amp;amp;nbsp;Partner&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Business&amp;amp;nbsp;Partner' window tab.&lt;br /&gt;
&lt;br /&gt;
# Go up one tab level to the ''Table'' view. To do that click ''Table'' in the breadcrumbs bar or hit ''ALT''&amp;amp;nbsp;+&amp;amp;nbsp;''Arrow&amp;amp;nbsp;UP'' on the keyboard.  &lt;br /&gt;
# Now click the Label of the ''Window'' field to zoom over to that window.&lt;br /&gt;
# In the business partner window switch to the ''Business&amp;amp;nbsp;Partner'' subtab by hitting the ''Edit Record'' button in the subtab row. (Or hit ''ALT''&amp;amp;nbsp;+&amp;amp;nbsp;''Arrow&amp;amp;nbsp;Down'' on the keyboard.)&lt;br /&gt;
# Now click the ''Process'' button in the icon bar and select ''Create&amp;amp;nbsp;Fields'' from the context menu. The ''Create&amp;amp;nbsp;Fields'' process dialog will appear. &lt;br /&gt;
&lt;br /&gt;
When adding fields to a factory provided window it is always a good idea to restrict the number of fields that are created by the process. Many tables include columns that purposefully do not have a corresponding field in the edit window. We need to ensure that we do not generate fields for these columns too.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol start=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;We will avoid inadvertently creating fields for those columns by entering today's date in the date field. This will exclude any columns from the process that have been created earlier by somebody else.&lt;br /&gt;
&amp;lt;li&amp;gt;Now hit OK. A confirmation dialog will appear that lists the newly created fields. &lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Configure the Window Layout===&lt;br /&gt;
&lt;br /&gt;
# We are again using the Tab editor to adapt the window layout. Open the editor through the context menu of the ''Process'' button.&lt;br /&gt;
# In the editor you will find the new ''Office&amp;amp;nbsp;Room'' editor field at the bottom of the page. Drag and drop it to a more convenient position.&lt;br /&gt;
&lt;br /&gt;
With regards to our specification it does not make sense to assign a room to a business partner that is not also an employee. We can guide our users by only showing the new field when the ''Employee'' checkbox is ticked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol start=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;With the focus still on the ''Office&amp;amp;nbsp;Room'' field enter '@IsEmployee@=Y' into the '''Display Logic''' field in the ''Property'' sidebar to the right of the edit area.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Side Note - The iDempiere Context===&lt;br /&gt;
&lt;br /&gt;
What actually have we done here? To understand the meaning of the arcane text we have just entered it is necessary to dig a bit deeper and learn a bit about the iDempiere context. &lt;br /&gt;
* iDempiere makes all field values of the current window (among many other things) available as so called context variables. Each time the user enters a new value into field its corresponding variable in the iDempiere context will be updated immediately.&lt;br /&gt;
* The iDempiere context is just a long list of values. Each of these values is paired with a key that is needed to identify that value.&lt;br /&gt;
* To access a context value from the '''Display Logic''' field we just have to surround its key name with @ symbols.&lt;br /&gt;
The application will then replace the codified key name with the respective context value and then check wether the resulting statement is true or not. &lt;br /&gt;
The value of the '''Display Logic''' checkbox is 'Y' when it is ticked and 'N' when not.&lt;br /&gt;
So when we write '@IsEmployee@=Y' iDempiere will replace the '@IsEmployee@' part with a 'Y' when the checkbox is ticked.&lt;br /&gt;
The statement will then be 'Y=Y'. This is obviously true and because of that the ''Office&amp;amp;nbsp;Room'' field will be shown. Unticking the box changes the statement to 'N=Y' which is false and the field will be hidden.&lt;br /&gt;
&lt;br /&gt;
===Configure the Office Room Identifier String===&lt;br /&gt;
&lt;br /&gt;
ToDo&lt;br /&gt;
&lt;br /&gt;
===Make selected Fields available to the Quick Entry Dialog===&lt;br /&gt;
&lt;br /&gt;
As a last step we are now going to make a few of the fields in the ''Office Room'' window available to the ''Quick Entry'' dialog. &lt;br /&gt;
We have already used that dialog in the previous tutorial when we created the entity types for our custom columns. &lt;br /&gt;
Remember that we did not switch to the entity type window to do that. Instead we opened the context menu of the ''Entity Type'' field and selected ''New'' to bring up the quick entry dialog. We then were able to create the new types using that dialog.  &lt;br /&gt;
# ToDo:Switch to Window, Tab and Field: Office Room&lt;br /&gt;
# In the Field subtab select the ''Room&amp;amp;nbsp;Number'' row and click the ''Edit&amp;amp;nbsp;Record'' button. &lt;br /&gt;
# Tick the ''Quick&amp;amp;nbsp;Entry'' checkbox in ''the Window&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Tab&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Field'' view that the window that has switched to. This makes the field available to the QuickEntry dialog. &lt;br /&gt;
&lt;br /&gt;
Repeat that last step for both the ''Floor&amp;amp;nbsp;Number'' and ''Building&amp;amp;nbsp;Wing'' fields.&lt;br /&gt;
&lt;br /&gt;
Hint: Do not forget to save your last edit. iDempiere will autosave any of your changes when you load another record into the active window or switch to a parent tab or subtab. &amp;lt;br/&amp;gt;Manual saving is required in all other cases. That is when you change the focus to any other tab in the hierarchy that is not a parent or child of the previous one.&lt;br /&gt;
&lt;br /&gt;
==Conclusion==&lt;br /&gt;
&lt;br /&gt;
Todo: List UI customization elements: new field in existing Window, QuickEntry Dialog enabled for new Element. &lt;br /&gt;
Todo: Login as client admin or user&lt;br /&gt;
Todo: Description Office Room Field in Business&amp;amp;nbsp;Partner Window&lt;br /&gt;
Todo: Usage QuickEntry&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Create_a_Custom_Table_and_Window&amp;diff=18936</id>
		<title>Application Dictionary - Create a Custom Table and Window</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Create_a_Custom_Table_and_Window&amp;diff=18936"/>
		<updated>2021-05-24T12:30:32Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Application Dictionary|P]]&lt;br /&gt;
&lt;br /&gt;
__INDEX__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
This tutorial is brought to you by Andreas Sumerauer. If you have any questions, criticism or suggestions for improvement, feel free to join the discussion in the [https://groups.google.com/g/idempiere iDempiere google group.] &lt;br /&gt;
&lt;br /&gt;
==Goal of this tutorial==&lt;br /&gt;
This tutorial will enable you to create your own custom Data Tables that are fully integrated within the iDempiere application framework. &lt;br /&gt;
You will be able to do that without writing a single line of SQL or Java code. Instead you will be introduced to the iDempiere Application Dictionary that provides the tools for the creation of wide ranging customizations and extensions to the iDempiere application. &lt;br /&gt;
&lt;br /&gt;
==Example Specification==&lt;br /&gt;
Let's say we want iDempiere to tell us in which office room each employee's workspace is.&lt;br /&gt;
In the course of this tutorial we are going to lay the groundwork for this example specification by adding a new table to hold our office room data and a window to manage the data stored within that table.&lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
To get the most out of this tutorial it is highly recommended that before you start you have made yourself familiar with the idempiere user interface.&lt;br /&gt;
&amp;lt;br/&amp;gt;Some basic understanding of the concept of the iDempiere application dictionary will be helpful but is not strictly required. &lt;br /&gt;
&amp;lt;br&amp;gt;You can greatly improve your learning experience through actively reproducing the Steps. For that you will need to have System administrator access to a sandbox iDempiere installation.&lt;br /&gt;
&lt;br /&gt;
=Steps=&lt;br /&gt;
&lt;br /&gt;
==Add Database Elements==&lt;br /&gt;
[[File:Tutorial TableWindowCreation 01.png|alt=Table and Column window|border|right|386x386px]]&lt;br /&gt;
&lt;br /&gt;
===Create a new Table Definition===&lt;br /&gt;
We will start by adding the Office Room table to our data base. &lt;br /&gt;
Log in as the SuperUser. Then open the Table &amp;amp; Column window and add a new table. &lt;br /&gt;
Now fill in the following fields:&lt;br /&gt;
* DB Table Name: ''SB_OfficeRoom''&lt;br /&gt;
* Name: ''Office&amp;amp;nbsp;Room''&lt;br /&gt;
* Data Access Level: ''Client&amp;amp;nbsp;+&amp;amp;nbsp;Organization'' &lt;br /&gt;
* Save the new record. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Tutorial TableWindowCreation 02.png.png|border|right|325x325px]]&lt;br /&gt;
[[File:Tutorial TableWindowCreation 03.png.png|thumb|379x379px]]&lt;br /&gt;
&lt;br /&gt;
====Generate Mandatory Columns====&lt;br /&gt;
&lt;br /&gt;
We will now add a number of columns to the new table. A table that has a window is required to have a number of mandatory columns that are used by iDemiere for house keeping purposes. &lt;br /&gt;
These columns can be generated very easily by copying the table schema from another existing table that meets those requirements: &lt;br /&gt;
* Click the process button  (gear icon) in the tool bar.&lt;br /&gt;
* Select Copy Columns from Table. A good candidate to be used as a template would be ''C_Subscription_Delivery''.&amp;lt;br /&amp;gt;Enter that name into the dialog that pops up and hit OK. The newly generated columns will appear in the Column sub tab right under the main edit area.&lt;br /&gt;
* We are going to need all of these columns except for ''C_Subscription_ID''. &amp;lt;br/&amp;gt;To remove it tick the checkbox at the left side of the column's row and hit the ''Delete&amp;amp;nbsp;Record'' button ('-' icon).&lt;br /&gt;
&lt;br /&gt;
====Add Custom Columns to the Table====&lt;br /&gt;
&lt;br /&gt;
Now add the ''RoomNo'' column: &lt;br /&gt;
* Click the ''Create&amp;amp;nbsp;New'' Button ('+' icon) in the ''Column'' tab tool bar. The ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Column'' window is opened with the new record loaded.&lt;br /&gt;
* [[File:Tutorial TableWindowCreation 04.png.png|right|239x239px]]Rightclick the Entity Type field and select new from the context menu.&lt;br /&gt;
* Fill in the required fields in the QuickEntry dialog then hit OK:&lt;br /&gt;
** DB Column Name: ''RoomNo''&lt;br /&gt;
** Name: ''Room&amp;amp;nbsp;Number''&lt;br /&gt;
** Print Text: ''Room&amp;amp;nbsp;Number''&lt;br /&gt;
* Back in the Column window fill in these fiels then save the new record:&lt;br /&gt;
** Reference: ''String''&lt;br /&gt;
** Length: ''30''&lt;br /&gt;
&lt;br /&gt;
Obviously it does not make sense to have a room without a number. So let's make the Room Number field mandatory:&lt;br /&gt;
&lt;br /&gt;
:* Tick the ''Mandatory'' checkbox. A new ''Office&amp;amp;nbsp;Room'' record can now only be saved when the ''Room&amp;amp;nbsp;Number'' field is not empty.  &lt;br /&gt;
&lt;br /&gt;
Repeat the above steps to create two more new columns: ''FloorNo'' (''Floor&amp;amp;nbsp;Number'') and ''BuildingWing'' (''Building&amp;amp;nbsp;Wing''). &amp;lt;br/&amp;gt;Leave the ''Mandatory'' checkbox unticked for these two columns.&lt;br /&gt;
&lt;br /&gt;
[[File:Tutorial TableWindowCreation 05.png.png|border]]&lt;br /&gt;
&lt;br /&gt;
===Generate the Table within the Database===&lt;br /&gt;
&lt;br /&gt;
The new table and its columns are now defined as part of the iDempiere application dictionary.&lt;br /&gt;
To create all of them in the database hit the ''Synchronize&amp;amp;nbsp;Column'' button in the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Column'' window.&lt;br /&gt;
Note that this button works a bit differently for a table that already exists in the database. &lt;br /&gt;
It will then only create or update the currently edited column.&lt;br /&gt;
&lt;br /&gt;
===Add a Unique Constraint===&lt;br /&gt;
&lt;br /&gt;
Since our customization only manages a single building we can safely assume that room numbers will be unique.&lt;br /&gt;
To avoid user errors we are going to create a UNIQUE constraint on that column. We have to make sure that different tenants can still have rooms with the same number. Because of that the constraint has to include the ''AD_Client_ID'' column as well.  &lt;br /&gt;
* In the subtab bar click the ''Table&amp;amp;nbsp;Index'' tab and then the ''Create&amp;amp;nbsp;New'' button of that tab. [[File:Tutorial TableWindowCreation 06.png.png|border]]&lt;br /&gt;
* Enter ''Unique_RoomNo_per_Tenant'' into the Name field of the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Table Index'' window that has just opened.&lt;br /&gt;
* Tick both the ''Create Constraint'' and the ''Unique'' checkboxes. &lt;br /&gt;
* Save the new record.&lt;br /&gt;
* Now we need to add the index columns. Hit the ''Create&amp;amp;nbsp;New'' button of the ''Index Column'' subtab. [[File:Tutorial TableWindowCreation 07.png|border]]&lt;br /&gt;
* The edit view will switch to ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Table Index&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Index Column''. Here enter ''RoomNo'' into the ''Column'' field.&lt;br /&gt;
* Save the new record and create another one for the ''AD_Client_ID'' column. &lt;br /&gt;
* Now switch back to the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Table Index'' view and click the ''Index Validate'' button. This will generate the constraint within the database.  [[File:Tutorial TableWindowCreation 08.png|border]]&lt;br /&gt;
&lt;br /&gt;
==Add the User Interface Elements==&lt;br /&gt;
&lt;br /&gt;
===Generate Window, Tab and Fields as well as a Menu Entry for the new Table===&lt;br /&gt;
[[File:Tutorial TableWindowCreation 09.png|border|right]]&lt;br /&gt;
We now go back to the ''Table'' window. Rightclick ''Table'' in the breadcrumb row or hit ''ALT+Arrow Up'' on the keyboard. &lt;br /&gt;
&lt;br /&gt;
Click the Process button in the tool bar and select ''Create Window, Tab and Field from Table'' from the context menu. &lt;br /&gt;
&lt;br /&gt;
In the dialog that appears tick the ''Create Menu'' checkbox and hit OK. &lt;br /&gt;
&lt;br /&gt;
[[File:Tutorial TableWindowCreation 10.png|border|511x511px]] &lt;br /&gt;
&lt;br /&gt;
After the successfull completion of the process a confirmation dialog will pop up.&lt;br /&gt;
In that dialog click on ''Tab:&amp;amp;nbsp;Office Room''. This will open a new ''Window&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Tab'' window. &lt;br /&gt;
&lt;br /&gt;
[[File:Tutorial TableWindowCreation 11.png|border|375x375px]] &lt;br /&gt;
&lt;br /&gt;
===Improve the Tab Layout===&lt;br /&gt;
&lt;br /&gt;
The new Tab's layout has been generated using some default settings. Let's see if we can improve it a bit.&lt;br /&gt;
* hit the ''Process'' button in the toolbar of the new window and select ''Tab&amp;amp;nbsp;Editor''. [[File:Tutorial TableWindowCreation 12.png|border]]&lt;br /&gt;
* This opens the ''Tab&amp;amp;nbsp;Editor'' dialog. [[File:Tutorial TableWindowCreation 13.png|border|897x897px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Tab editor is a very powerful tool that can't be fully covered in the course of this tutorial. We will now just reposition some of the layout elemnts.&amp;lt;br /&amp;gt;Rightclick and hold the label of the ''Building Wing'' field then move the mouse to the right of the ''Room&amp;amp;nbsp;Number'' field and release the mouse button. You have just dragged and dropped the ''Building&amp;amp;nbsp;Wing'' field to a new position.&lt;br /&gt;
* Now drag and drop the ''Active'' checkbox to the right of the ''Floor&amp;amp;nbsp;Number'' field.&lt;br /&gt;
* We want the checkbox to be vertically aligned with the editor fields in the layout column. If you find that the checkbox has landed too close to the ''Floor&amp;amp;nbsp;Number'' field change the X-Position value in the Property sidebar to the right from 4 to 5 and hit ''Enter''. This will move he checkbox to the desired position. [[File:Tutorial TableWindowCreation 14.png|border|838x838px]]&lt;br /&gt;
* Finally hit the ''OK'' button to save your edits and close the dialog.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
Now lets view the results. &lt;br /&gt;
* log in to the Application as GardenAdmin. You might have to log out before in case you are still loged in as the system user&lt;br /&gt;
* Type ''Office&amp;amp;nbsp;Room'' into the menu filter field.  [[File:Tutorial TableWindowCreation 15.png|border]]&amp;lt;br /&amp;gt;The Menu will pop up with only the ''Office&amp;amp;nbsp;Room'' entry visible.&lt;br /&gt;
* Click the menu entry to open the ''Office&amp;amp;nbsp;Room'' window. Note that the mandatory ''Room&amp;amp;nbsp;Number'' field is lined red while it is empty. [[File:Tutorial TableWindowCreation 16.png|border]]&lt;br /&gt;
&lt;br /&gt;
Congregulations! You have finished this tutorial. You are now able to create your own custom tables complete with its own window and menu entry within iDempiere.&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Create_a_Custom_Table_and_Window&amp;diff=18935</id>
		<title>Application Dictionary - Create a Custom Table and Window</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Create_a_Custom_Table_and_Window&amp;diff=18935"/>
		<updated>2021-05-24T12:29:13Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Application Dictionary|P]]&lt;br /&gt;
&lt;br /&gt;
__INDEX__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
This tutorial is brought to you by Andreas Sumerauer. If you have any questions, criticism or suggestions for improvement, feel free to join the discussion in the [https://groups.google.com/g/idempiere iDempiere google group.] &lt;br /&gt;
&lt;br /&gt;
==Goal of this tutorial==&lt;br /&gt;
This tutorial will enable you to create your own custom Data Tables that are fully integrated within the iDempiere application framework. &lt;br /&gt;
You will be able to do that without writing a single line of SQL or Java code. Instead you will be introduced to the iDempiere Application Dictionary that provides the tools for the creation of wide ranging customizations and extensions to the iDempiere application. &lt;br /&gt;
&lt;br /&gt;
==Example Specification==&lt;br /&gt;
Let's say we want iDempiere to tell us in which office room each employee's workspace is.&lt;br /&gt;
In the course of this tutorial we are going to lay the groundwork for this example specification by adding a new table to hold our office room data and a window to manage the data stored within that table.&lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
To get the most out of this tutorial it is highly recommended that before you start you have made yourself familiar with the idempiere user interface.&lt;br /&gt;
&amp;lt;br/&amp;gt;Some basic understanding of the concept of the iDempiere application dictionary will be helpful but is not strictly required. &lt;br /&gt;
&amp;lt;br&amp;gt;You can greatly improve your learning experience through actively reproducing the Steps. For that you will need to have System administrator access to a sandbox iDempiere installation.&lt;br /&gt;
&lt;br /&gt;
=Steps=&lt;br /&gt;
&lt;br /&gt;
==Add Database Elements==&lt;br /&gt;
[[File:Tutorial TableWindowCreation 01.png|alt=Table and Column window|border|right|386x386px]]&lt;br /&gt;
&lt;br /&gt;
===Create a new Table Definition===&lt;br /&gt;
We will start by adding the Office Room table to our data base. &lt;br /&gt;
Log in as the SuperUser. Then open the Table &amp;amp; Column window and add a new table. &lt;br /&gt;
Now fill in the following fields:&lt;br /&gt;
* DB Table Name: ''SB_OfficeRoom''&lt;br /&gt;
* Name: ''Office&amp;amp;nbsp;Room''&lt;br /&gt;
* Data Access Level: ''Client&amp;amp;nbsp;+&amp;amp;nbsp;Organization'' &lt;br /&gt;
* Save the new record. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Tutorial TableWindowCreation 02.png.png|border|right|325x325px]]&lt;br /&gt;
[[File:Tutorial TableWindowCreation 03.png.png|thumb|379x379px]]&lt;br /&gt;
&lt;br /&gt;
====Generate Mandatory Columns====&lt;br /&gt;
&lt;br /&gt;
We will now add a number of columns to the new table. A table that has a window is required to have a number of mandatory columns that are used by iDemiere for house keeping purposes. &lt;br /&gt;
These columns can be generated very easily by copying the table schema from another existing table that meets those requirements: &lt;br /&gt;
* Click the process button  (gear icon) in the tool bar.&lt;br /&gt;
* Select Copy Columns from Table. A good candidate to be used as a template would be ''C_Subscription_Delivery''.&amp;lt;br /&amp;gt;Enter that name into the dialog that pops up and hit OK. The newly generated columns will appear in the Column sub tab right under the main edit area.&lt;br /&gt;
* We are going to need all of these columns except for ''C_Subscription_ID''. &amp;lt;br/&amp;gt;To remove it tick the checkbox at the left side of the column's row and hit the ''Delete&amp;amp;nbsp;Record'' button ('-' icon).&lt;br /&gt;
&lt;br /&gt;
====Add Custom Columns to the Table====&lt;br /&gt;
&lt;br /&gt;
Now add the ''RoomNo'' column: &lt;br /&gt;
* Click the ''Create&amp;amp;nbsp;New'' Button ('+' icon) in the ''Column'' tab tool bar. The ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Column'' window is opened with the new record loaded.&lt;br /&gt;
* [[File:Tutorial TableWindowCreation 04.png.png|right|239x239px]]Rightclick the Entity Type field and select new from the context menu.&lt;br /&gt;
* Fill in the required fields in the QuickEntry dialog then hit OK:&lt;br /&gt;
** DB Column Name: ''RoomNo''&lt;br /&gt;
** Name: ''Room&amp;amp;nbsp;Number''&lt;br /&gt;
** Print Text: ''Room&amp;amp;nbsp;Number''&lt;br /&gt;
* Back in the Column window fill in these fiels then save the new record:&lt;br /&gt;
** Reference: ''String''&lt;br /&gt;
** Length: ''30''&lt;br /&gt;
&lt;br /&gt;
Obviously it does not make sense to have a room without a number. So let's make the Room Number field mandatory:&lt;br /&gt;
&lt;br /&gt;
:* Tick the ''Mandatory'' checkbox. A new ''Office&amp;amp;nbsp;Room'' record can now only be saved when the ''Room&amp;amp;nbsp;Number'' field is not empty.  &lt;br /&gt;
&lt;br /&gt;
Repeat the above steps to create two more new columns: ''FloorNo'' (''Floor&amp;amp;nbsp;Number'') and ''BuildingWing'' (''Building&amp;amp;nbsp;Wing''). &amp;lt;br/&amp;gt;Leave the ''Mandatory'' checkbox unticked for these two columns.&lt;br /&gt;
&lt;br /&gt;
[[File:Tutorial TableWindowCreation 05.png.png|border]]&lt;br /&gt;
&lt;br /&gt;
===Generate the Table within the Database===&lt;br /&gt;
&lt;br /&gt;
The new table and its columns are now defined as part of the iDempiere application dictionary.&lt;br /&gt;
To create all of them in the database hit the ''Synchronize&amp;amp;nbsp;Column'' button in the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Column'' window.&lt;br /&gt;
Note that this button works a bit differently for a table that already exists in the database. &lt;br /&gt;
It will then only create or update the currently edited column.&lt;br /&gt;
&lt;br /&gt;
===Add a Unique Constraint===&lt;br /&gt;
&lt;br /&gt;
Since our customization only manages a single building we can safely assume that room numbers will be unique.&lt;br /&gt;
To avoid user errors we are going to create a UNIQUE constraint on that column. We have to make sure that different tenants can still have rooms with the same number. Because of that the constraint has to include the ''AD_Client_ID'' column as well.  &lt;br /&gt;
* In the subtab bar click the ''Table&amp;amp;nbsp;Index'' tab and then the ''Create&amp;amp;nbsp;New'' button of that tab. [[File:Tutorial TableWindowCreation 06.png.png|border]]&lt;br /&gt;
* Enter ''Unique_RoomNo_per_Tenant'' into the Name field of the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Table Index'' window that has just opened.&lt;br /&gt;
* Tick both the ''Create Constraint'' and the ''Unique'' checkboxes. &lt;br /&gt;
* Save the new record.&lt;br /&gt;
* Now we need to add the index columns. Hit the ''Create&amp;amp;nbsp;New'' button of the ''Index Column'' subtab. [[File:Tutorial TableWindowCreation 07.png|border]]&lt;br /&gt;
* The edit view will switch to ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Table Index&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Index Column''. Here enter ''RoomNo'' into the ''Column'' field.&lt;br /&gt;
* Save the new record and create another one for the ''AD_Client_ID'' column. &lt;br /&gt;
* Now switch back to the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Table Index'' view and click the ''Index Validate'' button. This will generate the constraint within the database.  [[File:Tutorial TableWindowCreation 08.png|border]]&lt;br /&gt;
&lt;br /&gt;
==Add the User Interface Elements==&lt;br /&gt;
&lt;br /&gt;
===Generate Window, Tab and Fields as well as a Menu Entry for the new Table===&lt;br /&gt;
[[File:Tutorial TableWindowCreation 09.png|border|right]]&lt;br /&gt;
We now go back to the ''Table'' window. Rightclick ''Table'' in the breadcrumb row or hit ''ALT+Arrow Up'' on the keyboard. &lt;br /&gt;
&lt;br /&gt;
Click the Process button in the tool bar and select ''Create Window, Tab and Field from Table'' from the context menu. &lt;br /&gt;
&lt;br /&gt;
In the dialog that appears tick the ''Create Menu'' checkbox and hit OK. &lt;br /&gt;
&lt;br /&gt;
[[File:Tutorial TableWindowCreation 10.png|border|511x511px]] &lt;br /&gt;
&lt;br /&gt;
After the successfull completion of the process a confirmation dialog will pop up.&lt;br /&gt;
In that dialog click on ''Tab:&amp;amp;nbsp;Office Room''. This will open a new ''Window&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Tab'' window. &lt;br /&gt;
&lt;br /&gt;
[[File:Tutorial TableWindowCreation 11.png|border|375x375px]] &lt;br /&gt;
&lt;br /&gt;
===Improve the Tab Layout===&lt;br /&gt;
&lt;br /&gt;
The new Tab's layout has been generated using some default settings. Let's see if we can improve it a bit.&lt;br /&gt;
* hit the ''Process'' button in the toolbar of the new window and select ''Tab&amp;amp;nbsp;Editor''. [[File:Tutorial TableWindowCreation 12.png|border]]&lt;br /&gt;
* This opens the ''Tab&amp;amp;nbsp;Editor'' dialog. [[File:Tutorial TableWindowCreation 13.png|border|897x897px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Tab editor is a very powerful tool that can't be fully covered in the course of this tutorial. We will now just reposition some of the layout elemnts.&amp;lt;br /&amp;gt;Rightclick and hold the label of the ''Building Wing'' field then move the mouse to the right of the ''Room&amp;amp;nbsp;Number'' field and release the mouse button. You have just dragged and dropped the ''Building&amp;amp;nbsp;Wing'' field to a new position.&lt;br /&gt;
* Now drag and drop the ''Active'' checkbox to the right of the ''Floor&amp;amp;nbsp;Number'' field.&lt;br /&gt;
* We want the checkbox to be vertically aligned with the editor fields in the layout column. If you find that the checkbox has landed too close to the ''Floor&amp;amp;nbsp;Number'' field change the X-Position value in the Property sidebar to the right from 4 to 5 and hit ''Enter''. This will move he checkbox to the desired position. [[File:Tutorial TableWindowCreation 14.png|border|838x838px]]&lt;br /&gt;
* Finally hit the ''OK'' button to save your edits and close the dialog.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
Now lets view the results. &lt;br /&gt;
* log in to the Application as GardenAdmin. You might have to log out before in case you are still loged in as the system user&lt;br /&gt;
* Type ''Office&amp;amp;nbsp;Room'' into the menu filter field.  [[File:Tutorial TableWindowCreation 15.png|border]]&amp;lt;br /&amp;gt;The Menu will pop up with only the ''Office&amp;amp;nbsp;Room'' entry visible.&lt;br /&gt;
* Click the entry to open the ''Office&amp;amp;nbsp;Room'' window. Note that the mandatory ''Room&amp;amp;nbsp;Number'' field is lined red while it is empty. [[File:Tutorial TableWindowCreation 16.png|border]]&lt;br /&gt;
&lt;br /&gt;
Congregulations! You have finished this tutorial. You are now able to create your own custom tables complete with its own window and menu entry within iDempiere.&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Create_a_Custom_Table_and_Window&amp;diff=18934</id>
		<title>Application Dictionary - Create a Custom Table and Window</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Create_a_Custom_Table_and_Window&amp;diff=18934"/>
		<updated>2021-05-24T12:27:51Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: even more screenshots added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Application Dictionary|P]]&lt;br /&gt;
&lt;br /&gt;
__INDEX__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
This tutorial is brought to you by Andreas Sumerauer. If you have any questions, criticism or suggestions for improvement, feel free to join the discussion in the [https://groups.google.com/g/idempiere iDempiere google group.] &lt;br /&gt;
&lt;br /&gt;
==Goal of this tutorial==&lt;br /&gt;
This tutorial will enable you to create your own custom Data Tables that are fully integrated within the iDempiere application framework. &lt;br /&gt;
You will be able to do that without writing a single line of SQL or Java code. Instead you will be introduced to the iDempiere Application Dictionary that provides the tools for the creation of wide ranging customizations and extensions to the iDempiere application. &lt;br /&gt;
&lt;br /&gt;
==Example Specification==&lt;br /&gt;
Let's say we want iDempiere to tell us in which office room each employee's workspace is.&lt;br /&gt;
In the course of this tutorial we are going to lay the groundwork for this example specification by adding a new table to hold our office room data and a window to manage the data stored within that table.&lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
To get the most out of this tutorial it is highly recommended that before you start you have made yourself familiar with the idempiere user interface.&lt;br /&gt;
&amp;lt;br/&amp;gt;Some basic understanding of the concept of the iDempiere application dictionary will be helpful but is not strictly required. &lt;br /&gt;
&amp;lt;br&amp;gt;You can greatly improve your learning experience through actively reproducing the Steps. For that you will need to have System administrator access to a sandbox iDempiere installation.&lt;br /&gt;
&lt;br /&gt;
=Steps=&lt;br /&gt;
&lt;br /&gt;
==Add Database Elements==&lt;br /&gt;
[[File:Tutorial TableWindowCreation 01.png|alt=Table and Column window|border|right|386x386px]]&lt;br /&gt;
&lt;br /&gt;
===Create a new Table Definition===&lt;br /&gt;
We will start by adding the Office Room table to our data base. &lt;br /&gt;
Log in as the SuperUser. Then open the Table &amp;amp; Column window and add a new table. &lt;br /&gt;
Now fill in the following fields:&lt;br /&gt;
* DB Table Name: ''SB_OfficeRoom''&lt;br /&gt;
* Name: ''Office&amp;amp;nbsp;Room''&lt;br /&gt;
* Data Access Level: ''Client&amp;amp;nbsp;+&amp;amp;nbsp;Organization'' &lt;br /&gt;
* Save the new record. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Tutorial TableWindowCreation 02.png.png|border|right|325x325px]]&lt;br /&gt;
[[File:Tutorial TableWindowCreation 03.png.png|thumb|379x379px]]&lt;br /&gt;
&lt;br /&gt;
====Generate Mandatory Columns====&lt;br /&gt;
&lt;br /&gt;
We will now add a number of columns to the new table. A table that has a window is required to have a number of mandatory columns that are used by iDemiere for house keeping purposes. &lt;br /&gt;
These columns can be generated very easily by copying the table schema from another existing table that meets those requirements: &lt;br /&gt;
* Click the process button  (gear icon) in the tool bar.&lt;br /&gt;
* Select Copy Columns from Table. A good candidate to be used as a template would be ''C_Subscription_Delivery''.&amp;lt;br /&amp;gt;Enter that name into the dialog that pops up and hit OK. The newly generated columns will appear in the Column sub tab right under the main edit area.&lt;br /&gt;
* We are going to need all of these columns except for ''C_Subscription_ID''. &amp;lt;br/&amp;gt;To remove it tick the checkbox at the left side of the column's row and hit the ''Delete&amp;amp;nbsp;Record'' button ('-' icon).&lt;br /&gt;
&lt;br /&gt;
====Add Custom Columns to the Table====&lt;br /&gt;
&lt;br /&gt;
Now add the ''RoomNo'' column: &lt;br /&gt;
* Click the ''Create&amp;amp;nbsp;New'' Button ('+' icon) in the ''Column'' tab tool bar. The ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Column'' window is opened with the new record loaded.&lt;br /&gt;
* [[File:Tutorial TableWindowCreation 04.png.png|right|239x239px]]Rightclick the Entity Type field and select new from the context menu.&lt;br /&gt;
* Fill in the required fields in the QuickEntry dialog then hit OK:&lt;br /&gt;
** DB Column Name: ''RoomNo''&lt;br /&gt;
** Name: ''Room&amp;amp;nbsp;Number''&lt;br /&gt;
** Print Text: ''Room&amp;amp;nbsp;Number''&lt;br /&gt;
* Back in the Column window fill in these fiels then save the new record:&lt;br /&gt;
** Reference: ''String''&lt;br /&gt;
** Length: ''30''&lt;br /&gt;
&lt;br /&gt;
Obviously it does not make sense to have a room without a number. So let's make the Room Number field mandatory:&lt;br /&gt;
&lt;br /&gt;
:* Tick the ''Mandatory'' checkbox. A new ''Office&amp;amp;nbsp;Room'' record can now only be saved when the ''Room&amp;amp;nbsp;Number'' field is not empty.  &lt;br /&gt;
&lt;br /&gt;
Repeat the above steps to create two more new columns: ''FloorNo'' (''Floor&amp;amp;nbsp;Number'') and ''BuildingWing'' (''Building&amp;amp;nbsp;Wing''). &amp;lt;br/&amp;gt;Leave the ''Mandatory'' checkbox unticked for these two columns.&lt;br /&gt;
&lt;br /&gt;
[[File:Tutorial TableWindowCreation 05.png.png|border]]&lt;br /&gt;
&lt;br /&gt;
===Generate the Table within the Database===&lt;br /&gt;
&lt;br /&gt;
The new table and its columns are now defined as part of the iDempiere application dictionary.&lt;br /&gt;
To create all of them in the database hit the ''Synchronize&amp;amp;nbsp;Column'' button in the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Column'' window.&lt;br /&gt;
Note that this button works a bit differently for a table that already exists in the database. &lt;br /&gt;
It will then only create or update the currently edited column.&lt;br /&gt;
&lt;br /&gt;
===Add a Unique Constraint===&lt;br /&gt;
&lt;br /&gt;
Since our customization only manages a single building we can safely assume that room numbers will be unique.&lt;br /&gt;
To avoid user errors we are going to create a UNIQUE constraint on that column. We have to make sure that different tenants can still have rooms with the same number. Because of that the constraint has to include the ''AD_Client_ID'' column as well.  &lt;br /&gt;
* In the subtab bar click the ''Table&amp;amp;nbsp;Index'' tab and then the ''Create&amp;amp;nbsp;New'' button of that tab. [[File:Tutorial TableWindowCreation 06.png.png|border]]&lt;br /&gt;
* Enter ''Unique_RoomNo_per_Tenant'' into the Name field of the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Table Index'' window that has just opened.&lt;br /&gt;
* Tick both the ''Create Constraint'' and the ''Unique'' checkboxes. &lt;br /&gt;
* Save the new record.&lt;br /&gt;
* Now we need to add the index columns. Hit the ''Create&amp;amp;nbsp;New'' button of the ''Index Column'' subtab. [[File:Tutorial TableWindowCreation 07.png|border]]&lt;br /&gt;
* The edit view will switch to ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Table Index&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Index Column''. Here enter ''RoomNo'' into the ''Column'' field.&lt;br /&gt;
* Save the new record and create another one for the ''AD_Client_ID'' column. &lt;br /&gt;
* Now switch back to the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Table Index'' view and click the ''Index Validate'' button. This will generate the constraint within the database.  [[File:Tutorial TableWindowCreation 08.png|border]]&lt;br /&gt;
&lt;br /&gt;
==Add the User Interface Elements==&lt;br /&gt;
&lt;br /&gt;
===Generate Window, Tab and Fields as well as a Menu Entry for the new Table===&lt;br /&gt;
[[File:Tutorial TableWindowCreation 09.png|border|right]]&lt;br /&gt;
We now go back to the ''Table'' window. Rightclick ''Table'' in the breadcrumb row or hit ''ALT+Arrow Up'' on the keyboard. &lt;br /&gt;
&lt;br /&gt;
Click the Process button in the tool bar and select ''Create Window, Tab and Field from Table'' from the context menu. &lt;br /&gt;
&lt;br /&gt;
In the dialog that appears tick the ''Create Menu'' checkbox and hit OK. &lt;br /&gt;
&lt;br /&gt;
[[File:Tutorial TableWindowCreation 10.png|border|511x511px]] &lt;br /&gt;
&lt;br /&gt;
After the successfull completion of the process a confirmation dialog will pop up.&lt;br /&gt;
In that dialog click on ''Tab:&amp;amp;nbsp;Office Room''. This will open a new ''Window&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Tab'' window. &lt;br /&gt;
&lt;br /&gt;
[[File:Tutorial TableWindowCreation 11.png|border|375x375px]] &lt;br /&gt;
&lt;br /&gt;
===Improve the Tab Layout===&lt;br /&gt;
&lt;br /&gt;
The new Tab's layout has been generated using some default settings. Let's see if we can improve it a bit.&lt;br /&gt;
&lt;br /&gt;
[[File:Tutorial TableWindowCreation 12.png|border]]&lt;br /&gt;
* hit the ''Process'' button in the toolbar of the new window and select ''Tab&amp;amp;nbsp;Editor''.&lt;br /&gt;
* This opens the ''Tab&amp;amp;nbsp;Editor'' dialog. &lt;br /&gt;
&lt;br /&gt;
[[File:Tutorial TableWindowCreation 13.png|border|897x897px]]&lt;br /&gt;
&lt;br /&gt;
The Tab editor is a very powerful tool that can't be fully covered in the course of this tutorial. We will now just reposition some of the layout elemnts.&amp;lt;br /&amp;gt;Rightclick and hold the label of the ''Building Wing'' field then move the mouse to the right of the ''Room&amp;amp;nbsp;Number'' field and release the mouse button. You have just dragged and dropped the ''Building&amp;amp;nbsp;Wing'' field to a new position.&lt;br /&gt;
* Now drag and drop the ''Active'' checkbox to the right of the ''Floor&amp;amp;nbsp;Number'' field.&lt;br /&gt;
* We want the checkbox to be vertically aligned with the editor fields in the layout column. If you find that the checkbox has landed too close to the ''Floor&amp;amp;nbsp;Number'' field change the X-Position value in the Property sidebar to the right from 4 to 5 and hit ''Enter''. This will move he checkbox to the desired position. [[File:Tutorial TableWindowCreation 14.png|border|838x838px]]&lt;br /&gt;
* Finally hit the ''OK'' button to save your edits and close the dialog.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
Now lets view the results. &lt;br /&gt;
* log in to the Application as GardenAdmin. You might have to log out before in case you are still loged in as the system user&lt;br /&gt;
* Type ''Office&amp;amp;nbsp;Room'' into the menu filter field.  [[File:Tutorial TableWindowCreation 15.png|border]]&amp;lt;br /&amp;gt;The Menu will pop up with only the ''Office&amp;amp;nbsp;Room'' entry visible.&lt;br /&gt;
* Click the entry to open the ''Office&amp;amp;nbsp;Room'' window. Note that the mandatory ''Room&amp;amp;nbsp;Number'' field is lined red while it is empty. [[File:Tutorial TableWindowCreation 16.png|border]]&lt;br /&gt;
&lt;br /&gt;
Congregulations! You have finished this tutorial. You are now able to create your own custom tables complete with its own window and menu entry within iDempiere.&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_16.png&amp;diff=18933</id>
		<title>File:Tutorial TableWindowCreation 16.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_16.png&amp;diff=18933"/>
		<updated>2021-05-24T12:26:15Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Office Room Window&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_15.png&amp;diff=18932</id>
		<title>File:Tutorial TableWindowCreation 15.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_15.png&amp;diff=18932"/>
		<updated>2021-05-24T12:24:12Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;iDempiere Menu Filter&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_14.png&amp;diff=18931</id>
		<title>File:Tutorial TableWindowCreation 14.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_14.png&amp;diff=18931"/>
		<updated>2021-05-24T12:22:32Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tab Editor - X-Position&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_13.png&amp;diff=18930</id>
		<title>File:Tutorial TableWindowCreation 13.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_13.png&amp;diff=18930"/>
		<updated>2021-05-24T12:20:10Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tab Editor&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_12.png&amp;diff=18929</id>
		<title>File:Tutorial TableWindowCreation 12.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_12.png&amp;diff=18929"/>
		<updated>2021-05-24T12:18:39Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Window, Tab &amp;amp; Field - Process Menu&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_11.png&amp;diff=18928</id>
		<title>File:Tutorial TableWindowCreation 11.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_11.png&amp;diff=18928"/>
		<updated>2021-05-24T12:16:12Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Confirmation Dialog&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_10.png&amp;diff=18927</id>
		<title>File:Tutorial TableWindowCreation 10.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_10.png&amp;diff=18927"/>
		<updated>2021-05-24T12:14:14Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Create Window, Tab &amp;amp; Field dialog&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_09.png&amp;diff=18926</id>
		<title>File:Tutorial TableWindowCreation 09.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_09.png&amp;diff=18926"/>
		<updated>2021-05-24T12:12:11Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Table window Process Menu&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Create_a_Custom_Table_and_Window&amp;diff=18925</id>
		<title>Application Dictionary - Create a Custom Table and Window</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Create_a_Custom_Table_and_Window&amp;diff=18925"/>
		<updated>2021-05-24T12:09:46Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: more screenshots added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Application Dictionary|P]]&lt;br /&gt;
&lt;br /&gt;
__INDEX__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
This tutorial is brought to you by Andreas Sumerauer. If you have any questions, criticism or suggestions for improvement, feel free to join the discussion in the [https://groups.google.com/g/idempiere iDempiere google group.] &lt;br /&gt;
&lt;br /&gt;
==Goal of this tutorial==&lt;br /&gt;
This tutorial will enable you to create your own custom Data Tables that are fully integrated within the iDempiere application framework. &lt;br /&gt;
You will be able to do that without writing a single line of SQL or Java code. Instead you will be introduced to the iDempiere Application Dictionary that provides the tools for the creation of wide ranging customizations and extensions to the iDempiere application. &lt;br /&gt;
&lt;br /&gt;
==Example Specification==&lt;br /&gt;
Let's say we want iDempiere to tell us in which office room each employee's workspace is.&lt;br /&gt;
In the course of this tutorial we are going to lay the groundwork for this example specification by adding a new table to hold our office room data and a window to manage the data stored within that table.&lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
To get the most out of this tutorial it is highly recommended that before you start you have made yourself familiar with the idempiere user interface.&lt;br /&gt;
&amp;lt;br/&amp;gt;Some basic understanding of the concept of the iDempiere application dictionary will be helpful but is not strictly required. &lt;br /&gt;
&amp;lt;br&amp;gt;You can greatly improve your learning experience through actively reproducing the Steps. For that you will need to have System administrator access to a sandbox iDempiere installation.&lt;br /&gt;
&lt;br /&gt;
=Steps=&lt;br /&gt;
&lt;br /&gt;
==Add Database Elements==&lt;br /&gt;
[[File:Tutorial TableWindowCreation 01.png|alt=Table and Column window|border|right|386x386px]]&lt;br /&gt;
&lt;br /&gt;
===Create a new Table Definition===&lt;br /&gt;
We will start by adding the Office Room table to our data base. &lt;br /&gt;
Log in as the SuperUser. Then open the Table &amp;amp; Column window and add a new table. &lt;br /&gt;
Now fill in the following fields:&lt;br /&gt;
* DB Table Name: ''SB_OfficeRoom''&lt;br /&gt;
* Name: ''Office&amp;amp;nbsp;Room''&lt;br /&gt;
* Data Access Level: ''Client&amp;amp;nbsp;+&amp;amp;nbsp;Organization'' &lt;br /&gt;
* Save the new record. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Tutorial TableWindowCreation 02.png.png|border|right|325x325px]]&lt;br /&gt;
[[File:Tutorial TableWindowCreation 03.png.png|thumb|379x379px]]&lt;br /&gt;
&lt;br /&gt;
====Generate Mandatory Columns====&lt;br /&gt;
&lt;br /&gt;
We will now add a number of columns to the new table. A table that has a window is required to have a number of mandatory columns that are used by iDemiere for house keeping purposes. &lt;br /&gt;
These columns can be generated very easily by copying the table schema from another existing table that meets those requirements: &lt;br /&gt;
* Click the process button  (gear icon) in the tool bar.&lt;br /&gt;
* Select Copy Columns from Table. A good candidate to be used as a template would be ''C_Subscription_Delivery''.&amp;lt;br /&amp;gt;Enter that name into the dialog that pops up and hit OK. The newly generated columns will appear in the Column sub tab right under the main edit area.&lt;br /&gt;
* We are going to need all of these columns except for ''C_Subscription_ID''. &amp;lt;br/&amp;gt;To remove it tick the checkbox at the left side of the column's row and hit the ''Delete&amp;amp;nbsp;Record'' button ('-' icon).&lt;br /&gt;
&lt;br /&gt;
====Add Custom Columns to the Table====&lt;br /&gt;
&lt;br /&gt;
Now add the ''RoomNo'' column: &lt;br /&gt;
* Click the ''Create&amp;amp;nbsp;New'' Button ('+' icon) in the ''Column'' tab tool bar. The ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Column'' window is opened with the new record loaded.&lt;br /&gt;
* [[File:Tutorial TableWindowCreation 04.png.png|right|239x239px]]Rightclick the Entity Type field and select new from the context menu.&lt;br /&gt;
* Fill in the required fields in the QuickEntry dialog then hit OK:&lt;br /&gt;
** DB Column Name: ''RoomNo''&lt;br /&gt;
** Name: ''Room&amp;amp;nbsp;Number''&lt;br /&gt;
** Print Text: ''Room&amp;amp;nbsp;Number''&lt;br /&gt;
* Back in the Column window fill in these fiels then save the new record:&lt;br /&gt;
** Reference: ''String''&lt;br /&gt;
** Length: ''30''&lt;br /&gt;
&lt;br /&gt;
Obviously it does not make sense to have a room without a number. So let's make the Room Number field mandatory:&lt;br /&gt;
&lt;br /&gt;
:* Tick the ''Mandatory'' checkbox. A new ''Office&amp;amp;nbsp;Room'' record can now only be saved when the ''Room&amp;amp;nbsp;Number'' field is not empty.  &lt;br /&gt;
&lt;br /&gt;
Repeat the above steps to create two more new columns: ''FloorNo'' (''Floor&amp;amp;nbsp;Number'') and ''BuildingWing'' (''Building&amp;amp;nbsp;Wing''). &amp;lt;br/&amp;gt;Leave the ''Mandatory'' checkbox unticked for these two columns.&lt;br /&gt;
&lt;br /&gt;
[[File:Tutorial TableWindowCreation 05.png.png|border]]&lt;br /&gt;
&lt;br /&gt;
===Generate the Table within the Database===&lt;br /&gt;
&lt;br /&gt;
The new table and its columns are now defined as part of the iDempiere application dictionary.&lt;br /&gt;
To create all of them in the database hit the ''Synchronize&amp;amp;nbsp;Column'' button in the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Column'' window.&lt;br /&gt;
Note that this button works a bit differently for a table that already exists in the database. &lt;br /&gt;
It will then only create or update the currently edited column.&lt;br /&gt;
&lt;br /&gt;
===Add a Unique Constraint===&lt;br /&gt;
&lt;br /&gt;
Since our customization only manages a single building we can safely assume that room numbers will be unique.&lt;br /&gt;
To avoid user errors we are going to create a UNIQUE constraint on that column. We have to make sure that different tenants can still have rooms with the same number. Because of that the constraint has to include the ''AD_Client_ID'' column as well.  &lt;br /&gt;
* In the subtab bar click the ''Table&amp;amp;nbsp;Index'' tab and then the ''Create&amp;amp;nbsp;New'' button of that tab. [[File:Tutorial TableWindowCreation 06.png.png|border]]&lt;br /&gt;
* Enter ''Unique_RoomNo_per_Tenant'' into the Name field of the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Table Index'' window that has just opened.&lt;br /&gt;
* Tick both the ''Create Constraint'' and the ''Unique'' checkboxes. &lt;br /&gt;
* Save the new record.&lt;br /&gt;
* Now we need to add the index columns. Hit the ''Create&amp;amp;nbsp;New'' button of the ''Index Column'' subtab. [[File:Tutorial TableWindowCreation 07.png|border]]&lt;br /&gt;
* The edit view will switch to ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Table Index&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Index Column''. Here enter ''RoomNo'' into the ''Column'' field.&lt;br /&gt;
* Save the new record and create another one for the ''AD_Client_ID'' column. &lt;br /&gt;
* Now switch back to the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Table Index'' view and click the ''Index Validate'' button. This will generate the constraint within the database.  [[File:Tutorial TableWindowCreation 08.png|border]]&lt;br /&gt;
&lt;br /&gt;
==Add the User Interface Elements==&lt;br /&gt;
&lt;br /&gt;
===Generate Window, Tab and Fields as well as a Menu Entry for the new Table===&lt;br /&gt;
&lt;br /&gt;
We now go back to the ''Table'' window. Rightclick ''Table'' in the breadcrumb row or hit ''ALT+Arrow Up'' on the keyboard.&lt;br /&gt;
Click the Process button in the tool bar and select ''Create Window, Tab and Field from Table'' from the context menu.&lt;br /&gt;
In the dialog that appears tick the ''Create Menu'' checkbox and hit OK.&lt;br /&gt;
After the successfull completion of the process a confirmation dialog will pop up.&lt;br /&gt;
In that dialog click on ''Tab:&amp;amp;nbsp;Office Room''. This will open a new ''Window&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Tab'' window. &lt;br /&gt;
&lt;br /&gt;
===Improve the Tab Layout===&lt;br /&gt;
&lt;br /&gt;
The new Tab's layout has been generated using some default settings. Let's see if we can improve it a bit.&lt;br /&gt;
* hit the ''Process'' button in the toolbar of the new window and select ''Tab&amp;amp;nbsp;Editor''.&lt;br /&gt;
* This opens the ''Tab&amp;amp;nbsp;Editor'' dialog. &lt;br /&gt;
&lt;br /&gt;
The Tab editor is a very powerful tool that can't be fully covered in the course of this tutorial. We will now just reposition some of the layout elemnts.&amp;lt;br/&amp;gt;&lt;br /&gt;
* Rightclick and hold the label of the ''Building Wing'' field then move the mouse to the right of the ''Room&amp;amp;nbsp;Number'' field and release the mouse button. You have just dragged and dropped the ''Building&amp;amp;nbsp;Wing'' field to a new position.&lt;br /&gt;
* Now drag and drop the ''Active'' checkbox to the right of the ''Floor&amp;amp;nbsp;Number'' field.&lt;br /&gt;
* We want the checkbox to be vertically aligned with the editor fields in the layout column. If you find that the checkbox has landed too close to the ''Floor&amp;amp;nbsp;Number'' field change the X-Position value in the Property sidebar to the right from 4 to 5 and hit ''Enter''. This will move he checkbox to the desired position.&lt;br /&gt;
* Finally hit the ''OK'' button to save your edits and close the dialog.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
Now lets view the results. &lt;br /&gt;
* log in to the Application as GardenAdmin. You might have to log out before in case you are still loged in as the system user&lt;br /&gt;
* Type ''Office&amp;amp;nbsp;Room'' into the menu filter field. &amp;lt;br/&amp;gt;The Menu will pop up with only the ''Office&amp;amp;nbsp;Room'' entry visible.&lt;br /&gt;
* Click the entry to open the ''Office&amp;amp;nbsp;Room'' window. The mandatory ''Room&amp;amp;nbsp;Number'' field is lined red while it is empty. &lt;br /&gt;
&lt;br /&gt;
Congregulations! You have finished this tutorial. You are now able to create your own custom tables complete with its own window and menu entry within iDempiere.&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_08.png&amp;diff=18924</id>
		<title>File:Tutorial TableWindowCreation 08.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_08.png&amp;diff=18924"/>
		<updated>2021-05-24T12:02:09Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Index Columns&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_07.png&amp;diff=18923</id>
		<title>File:Tutorial TableWindowCreation 07.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_07.png&amp;diff=18923"/>
		<updated>2021-05-24T11:59:33Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Table &amp;gt; Table Index &amp;gt; Index Column tab&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_06.png.png&amp;diff=18922</id>
		<title>File:Tutorial TableWindowCreation 06.png.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_06.png.png&amp;diff=18922"/>
		<updated>2021-05-24T11:56:07Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Table &amp;gt; Table Index tab&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_05.png.png&amp;diff=18921</id>
		<title>File:Tutorial TableWindowCreation 05.png.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_05.png.png&amp;diff=18921"/>
		<updated>2021-05-24T11:53:40Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Window &amp;gt; Column Grid View&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Create_a_Custom_Table_and_Window&amp;diff=18920</id>
		<title>Application Dictionary - Create a Custom Table and Window</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Create_a_Custom_Table_and_Window&amp;diff=18920"/>
		<updated>2021-05-24T11:51:47Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: screenshots added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Application Dictionary|P]]&lt;br /&gt;
&lt;br /&gt;
__INDEX__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
This tutorial is brought to you by Andreas Sumerauer. If you have any questions, criticism or suggestions for improvement, feel free to join the discussion in the [https://groups.google.com/g/idempiere iDempiere google group.] &lt;br /&gt;
&lt;br /&gt;
==Goal of this tutorial==&lt;br /&gt;
This tutorial will enable you to create your own custom Data Tables that are fully integrated within the iDempiere application framework. &lt;br /&gt;
You will be able to do that without writing a single line of SQL or Java code. Instead you will be introduced to the iDempiere Application Dictionary that provides the tools for the creation of wide ranging customizations and extensions to the iDempiere application. &lt;br /&gt;
&lt;br /&gt;
==Example Specification==&lt;br /&gt;
Let's say we want iDempiere to tell us in which office room each employee's workspace is.&lt;br /&gt;
In the course of this tutorial we are going to lay the groundwork for this example specification by adding a new table to hold our office room data and a window to manage the data stored within that table.&lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
To get the most out of this tutorial it is highly recommended that before you start you have made yourself familiar with the idempiere user interface.&lt;br /&gt;
&amp;lt;br/&amp;gt;Some basic understanding of the concept of the iDempiere application dictionary will be helpful but is not strictly required. &lt;br /&gt;
&amp;lt;br&amp;gt;You can greatly improve your learning experience through actively reproducing the Steps. For that you will need to have System administrator access to a sandbox iDempiere installation.&lt;br /&gt;
&lt;br /&gt;
=Steps=&lt;br /&gt;
&lt;br /&gt;
==Add Database Elements==&lt;br /&gt;
[[File:Tutorial TableWindowCreation 01.png|alt=Table and Column window|border|right|386x386px]]&lt;br /&gt;
&lt;br /&gt;
===Create a new Table Definition===&lt;br /&gt;
We will start by adding the Office Room table to our data base. &lt;br /&gt;
Log in as the SuperUser. Then open the Table &amp;amp; Column window and add a new table. &lt;br /&gt;
Now fill in the following fields:&lt;br /&gt;
* DB Table Name: ''SB_OfficeRoom''&lt;br /&gt;
* Name: ''Office&amp;amp;nbsp;Room''&lt;br /&gt;
* Data Access Level: ''Client&amp;amp;nbsp;+&amp;amp;nbsp;Organization'' &lt;br /&gt;
* Save the new record. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Tutorial TableWindowCreation 02.png.png|border|right|325x325px]]&lt;br /&gt;
[[File:Tutorial TableWindowCreation 03.png.png|thumb|379x379px]]&lt;br /&gt;
&lt;br /&gt;
====Generate Mandatory Columns====&lt;br /&gt;
&lt;br /&gt;
We will now add a number of columns to the new table. A table that has a window is required to have a number of mandatory columns that are used by iDemiere for house keeping purposes. &lt;br /&gt;
These columns can be generated very easily by copying the table schema from another existing table that meets those requirements: &lt;br /&gt;
* Click the process button  (gear icon) in the tool bar.&lt;br /&gt;
* Select Copy Columns from Table. A good candidate to be used as a template would be ''C_Subscription_Delivery''.&amp;lt;br /&amp;gt;Enter that name into the dialog that pops up and hit OK. The newly generated columns will appear in the Column sub tab right under the main edit area.&lt;br /&gt;
* We are going to need all of these columns except for ''C_Subscription_ID''. &amp;lt;br/&amp;gt;To remove it tick the checkbox at the left side of the column's row and hit the ''Delete&amp;amp;nbsp;Record'' button ('-' icon).&lt;br /&gt;
&lt;br /&gt;
====Add Custom Columns to the Table====&lt;br /&gt;
&lt;br /&gt;
Now add the ''RoomNo'' column: &lt;br /&gt;
* Click the ''Create&amp;amp;nbsp;New'' Button ('+' icon) in the ''Column'' tab tool bar. The ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Column'' window is opened with the new record loaded.&lt;br /&gt;
* [[File:Tutorial TableWindowCreation 04.png.png|right|239x239px]]Rightclick the Entity Type field and select new from the context menu.&lt;br /&gt;
* Fill in the required fields in the QuickEntry dialog then hit OK:&lt;br /&gt;
** DB Column Name: ''RoomNo''&lt;br /&gt;
** Name: ''Room&amp;amp;nbsp;Number''&lt;br /&gt;
** Print Text: ''Room&amp;amp;nbsp;Number''&lt;br /&gt;
* Back in the Column window fill in these fiels then save the new record:&lt;br /&gt;
** Reference: ''String''&lt;br /&gt;
** Length: ''30''&lt;br /&gt;
&lt;br /&gt;
Obviously it does not make sense to have a room without a number. So let's make the Room Number field mandatory:&lt;br /&gt;
&lt;br /&gt;
:* Tick the ''Mandatory'' checkbox. A new ''Office&amp;amp;nbsp;Room'' record can now only be saved when the ''Room&amp;amp;nbsp;Number'' field is not empty.  &lt;br /&gt;
&lt;br /&gt;
Repeat the above steps to create two more new columns: ''FloorNo'' (''Floor&amp;amp;nbsp;Number'') and ''BuildingWing'' (''Building&amp;amp;nbsp;Wing''). &amp;lt;br/&amp;gt;Leave the ''Mandatory'' checkbox unticked for these two columns.&lt;br /&gt;
&lt;br /&gt;
===Generate the Table within the Database===&lt;br /&gt;
&lt;br /&gt;
The new table and its columns are now defined as part of the iDempiere application dictionary.&lt;br /&gt;
To create all of them in the database hit the ''Synchronize&amp;amp;nbsp;Column'' button in the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Column'' window.&lt;br /&gt;
Note that this button works a bit differently for a table that already exists in the database. &lt;br /&gt;
It will then only create or update the currently edited column.&lt;br /&gt;
&lt;br /&gt;
===Add a Unique Constraint===&lt;br /&gt;
&lt;br /&gt;
Since our customization only manages a single building we can safely assume that room numbers will be unique.&lt;br /&gt;
To avoid user errors we are going to create a UNIQUE constraint on that column. We have to make sure that different tenants can still have rooms with the same number. Because of that the constraint has to include the ''AD_Client_ID'' column as well.  &lt;br /&gt;
* In the subtab bar click the ''Table&amp;amp;nbsp;Index'' tab and then the ''Create&amp;amp;nbsp;New'' button of that tab.&lt;br /&gt;
* Enter ''Unique_RoomNo_per_Tenant'' into the Name field of the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Table Index'' window that has just opened.&lt;br /&gt;
* Tick both the ''Create Constraint'' and the ''Unique'' checkboxes. &lt;br /&gt;
* Save the new record.&lt;br /&gt;
* Now we need to add the index columns. Hit the ''Create&amp;amp;nbsp;New'' button of the ''Index Column'' subtab. &lt;br /&gt;
* The edit view will switch to ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Table Index&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Index Column''. Here enter ''RoomNo'' into the ''Column'' field.&lt;br /&gt;
* Save the new record and create another one for the ''AD_Client_ID'' column. &lt;br /&gt;
* Now switch back to the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Table Index'' view and click the ''Index Validate'' button. This will generate the constraint within the database.&lt;br /&gt;
&lt;br /&gt;
==Add the User Interface Elements==&lt;br /&gt;
&lt;br /&gt;
===Generate Window, Tab and Fields as well as a Menu Entry for the new Table===&lt;br /&gt;
&lt;br /&gt;
We now go back to the ''Table'' window. Rightclick ''Table'' in the breadcrumb row or hit ''ALT+Arrow Up'' on the keyboard.&lt;br /&gt;
Click the Process button in the tool bar and select ''Create Window, Tab and Field from Table'' from the context menu.&lt;br /&gt;
In the dialog that appears tick the ''Create Menu'' checkbox and hit OK.&lt;br /&gt;
After the successfull completion of the process a confirmation dialog will pop up.&lt;br /&gt;
In that dialog click on ''Tab:&amp;amp;nbsp;Office Room''. This will open a new ''Window&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Tab'' window. &lt;br /&gt;
&lt;br /&gt;
===Improve the Tab Layout===&lt;br /&gt;
&lt;br /&gt;
The new Tab's layout has been generated using some default settings. Let's see if we can improve it a bit.&lt;br /&gt;
* hit the ''Process'' button in the toolbar of the new window and select ''Tab&amp;amp;nbsp;Editor''.&lt;br /&gt;
* This opens the ''Tab&amp;amp;nbsp;Editor'' dialog. &lt;br /&gt;
&lt;br /&gt;
The Tab editor is a very powerful tool that can't be fully covered in the course of this tutorial. We will now just reposition some of the layout elemnts.&amp;lt;br/&amp;gt;&lt;br /&gt;
* Rightclick and hold the label of the ''Building Wing'' field then move the mouse to the right of the ''Room&amp;amp;nbsp;Number'' field and release the mouse button. You have just dragged and dropped the ''Building&amp;amp;nbsp;Wing'' field to a new position.&lt;br /&gt;
* Now drag and drop the ''Active'' checkbox to the right of the ''Floor&amp;amp;nbsp;Number'' field.&lt;br /&gt;
* We want the checkbox to be vertically aligned with the editor fields in the layout column. If you find that the checkbox has landed too close to the ''Floor&amp;amp;nbsp;Number'' field change the X-Position value in the Property sidebar to the right from 4 to 5 and hit ''Enter''. This will move he checkbox to the desired position.&lt;br /&gt;
* Finally hit the ''OK'' button to save your edits and close the dialog.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
Now lets view the results. &lt;br /&gt;
* log in to the Application as GardenAdmin. You might have to log out before in case you are still loged in as the system user&lt;br /&gt;
* Type ''Office&amp;amp;nbsp;Room'' into the menu filter field. &amp;lt;br/&amp;gt;The Menu will pop up with only the ''Office&amp;amp;nbsp;Room'' entry visible.&lt;br /&gt;
* Click the entry to open the ''Office&amp;amp;nbsp;Room'' window. The mandatory ''Room&amp;amp;nbsp;Number'' field is lined red while it is empty. &lt;br /&gt;
&lt;br /&gt;
Congregulations! You have finished this tutorial. You are now able to create your own custom tables complete with its own window and menu entry within iDempiere.&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_04.png.png&amp;diff=18919</id>
		<title>File:Tutorial TableWindowCreation 04.png.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_04.png.png&amp;diff=18919"/>
		<updated>2021-05-24T11:49:51Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Element Quick Entry&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_03.png.png&amp;diff=18918</id>
		<title>File:Tutorial TableWindowCreation 03.png.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_03.png.png&amp;diff=18918"/>
		<updated>2021-05-24T11:43:01Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Copy Columns from Table Dialog&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_02.png.png&amp;diff=18917</id>
		<title>File:Tutorial TableWindowCreation 02.png.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_02.png.png&amp;diff=18917"/>
		<updated>2021-05-24T11:39:36Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Table&amp;amp;Window Process Menu&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_01.png&amp;diff=18916</id>
		<title>File:Tutorial TableWindowCreation 01.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Tutorial_TableWindowCreation_01.png&amp;diff=18916"/>
		<updated>2021-05-24T11:31:11Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Table and Column Window&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Create_a_Custom_Table_and_Window&amp;diff=18915</id>
		<title>Application Dictionary - Create a Custom Table and Window</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Create_a_Custom_Table_and_Window&amp;diff=18915"/>
		<updated>2021-05-24T11:24:24Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: /* Introduction */ removed personal email&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Application Dictionary|P]]&lt;br /&gt;
&lt;br /&gt;
__INDEX__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
This tutorial is brought to you by Andreas Sumerauer. If you have any questions, criticism or suggestions for improvement, feel free to join the discussion in the [https://groups.google.com/g/idempiere iDempiere google group.] &lt;br /&gt;
&lt;br /&gt;
==Goal of this tutorial==&lt;br /&gt;
This tutorial will enable you to create your own custom Data Tables that are fully integrated within the iDempiere application framework. &lt;br /&gt;
You will be able to do that without writing a single line of SQL or Java code. Instead you will be introduced to the iDempiere Application Dictionary that provides the tools for the creation of wide ranging customizations and extensions to the iDempiere application. &lt;br /&gt;
&lt;br /&gt;
==Example Specification==&lt;br /&gt;
Let's say we want iDempiere to tell us in which office room each employee's workspace is.&lt;br /&gt;
In the course of this tutorial we are going to lay the groundwork for this example specification by adding a new table to hold our office room data and a window to manage the data stored within that table.&lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
To get the most out of this tutorial it is highly recommended that before you start you have made yourself familiar with the idempiere user interface.&lt;br /&gt;
&amp;lt;br/&amp;gt;Some basic understanding of the concept of the iDempiere application dictionary will be helpful but is not strictly required. &lt;br /&gt;
&amp;lt;br&amp;gt;You can greatly improve your learning experience through actively reproducing the Steps. For that you will need to have System administrator access to a sandbox iDempiere installation.&lt;br /&gt;
&lt;br /&gt;
=Steps=&lt;br /&gt;
&lt;br /&gt;
==Add Database Elements==&lt;br /&gt;
&lt;br /&gt;
===Create a new Table Definition===&lt;br /&gt;
&lt;br /&gt;
We will start by adding the Office Room table to our data base. &lt;br /&gt;
Log in as the SuperUser. Then open the Table &amp;amp; Column window and add a new table. &lt;br /&gt;
Now fill in the following fields:&lt;br /&gt;
* DB Table Name: ''SB_OfficeRoom''&lt;br /&gt;
* Name: ''Office&amp;amp;nbsp;Room''&lt;br /&gt;
* Data Access Level: ''Client&amp;amp;nbsp;+&amp;amp;nbsp;Organization'' &lt;br /&gt;
* Save the new record. &lt;br /&gt;
&lt;br /&gt;
====Generate Mandatory Columns====&lt;br /&gt;
&lt;br /&gt;
We will now add a number of columns to the new table. A table that has a window is required to have a number of mandatory columns that are used by iDemiere for house keeping purposes. &lt;br /&gt;
These columns can be generated very easily by copying the table schema from another existing table that meets those requirements: &lt;br /&gt;
* Click the process button  (gear icon) in the tool bar.&lt;br /&gt;
* Select Copy Columns from Table. A good candidate to be used as a template would be ''C_Subscription_Delivery''.&amp;lt;br/&amp;gt;Enter that name into the dialog that pops up and hit OK. The newly generated columns will appear in the Column sub tab right under the main edit area.&lt;br /&gt;
* We are going to need all of these columns except for ''C_Subscription_ID''. &amp;lt;br/&amp;gt;To remove it tick the checkbox at the left side of the column's row and hit the ''Delete&amp;amp;nbsp;Record'' button ('-' icon).&lt;br /&gt;
&lt;br /&gt;
====Add Custom Columns to the Table====&lt;br /&gt;
&lt;br /&gt;
Now add the ''RoomNo'' column: &lt;br /&gt;
* Click the ''Create&amp;amp;nbsp;New'' Button ('+' icon) in the ''Column'' tab tool bar. The ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Column'' window is opened with the new record loaded.&lt;br /&gt;
* Rightclick the Entity Type field and select new from the context menu.&lt;br /&gt;
* Fill in the required fields in the QuickEntry dialog then hit OK:&lt;br /&gt;
** DB Column Name: ''RoomNo''&lt;br /&gt;
** Name: ''Room&amp;amp;nbsp;Number''&lt;br /&gt;
** Print Text: ''Room&amp;amp;nbsp;Number''&lt;br /&gt;
* Back in the Column window fill in these fiels then save the new record:&lt;br /&gt;
** Reference: ''String''&lt;br /&gt;
** Length: ''30''&lt;br /&gt;
&lt;br /&gt;
Obviously it does not make sense to have a room without a number. So let's make the Room Number field mandatory:&lt;br /&gt;
&lt;br /&gt;
:* Tick the ''Mandatory'' checkbox. A new ''Office&amp;amp;nbsp;Room'' record can now only be saved when the ''Room&amp;amp;nbsp;Number'' field is not empty.  &lt;br /&gt;
&lt;br /&gt;
Repeat the above steps to create two more new columns: ''FloorNo'' (''Floor&amp;amp;nbsp;Number'') and ''BuildingWing'' (''Building&amp;amp;nbsp;Wing''). &amp;lt;br/&amp;gt;Leave the ''Mandatory'' checkbox unticked for these two columns.&lt;br /&gt;
&lt;br /&gt;
===Generate the Table within the Database===&lt;br /&gt;
&lt;br /&gt;
The new table and its columns are now defined as part of the iDempiere application dictionary.&lt;br /&gt;
To create all of them in the database hit the ''Synchronize&amp;amp;nbsp;Column'' button in the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Column'' window.&lt;br /&gt;
Note that this button works a bit differently for a table that already exists in the database. &lt;br /&gt;
It will then only create or update the currently edited column.&lt;br /&gt;
&lt;br /&gt;
===Add a Unique Constraint===&lt;br /&gt;
&lt;br /&gt;
Since our customization only manages a single building we can safely assume that room numbers will be unique.&lt;br /&gt;
To avoid user errors we are going to create a UNIQUE constraint on that column. We have to make sure that different tenants can still have rooms with the same number. Because of that the constraint has to include the ''AD_Client_ID'' column as well.  &lt;br /&gt;
* In the subtab bar click the ''Table&amp;amp;nbsp;Index'' tab and then the ''Create&amp;amp;nbsp;New'' button of that tab.&lt;br /&gt;
* Enter ''Unique_RoomNo_per_Tenant'' into the Name field of the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Table Index'' window that has just opened.&lt;br /&gt;
* Tick both the ''Create Constraint'' and the ''Unique'' checkboxes. &lt;br /&gt;
* Save the new record.&lt;br /&gt;
* Now we need to add the index columns. Hit the ''Create&amp;amp;nbsp;New'' button of the ''Index Column'' subtab. &lt;br /&gt;
* The edit view will switch to ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Table Index&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Index Column''. Here enter ''RoomNo'' into the ''Column'' field.&lt;br /&gt;
* Save the new record and create another one for the ''AD_Client_ID'' column. &lt;br /&gt;
* Now switch back to the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Table Index'' view and click the ''Index Validate'' button. This will generate the constraint within the database.&lt;br /&gt;
&lt;br /&gt;
==Add the User Interface Elements==&lt;br /&gt;
&lt;br /&gt;
===Generate Window, Tab and Fields as well as a Menu Entry for the new Table===&lt;br /&gt;
&lt;br /&gt;
We now go back to the ''Table'' window. Rightclick ''Table'' in the breadcrumb row or hit ''ALT+Arrow Up'' on the keyboard.&lt;br /&gt;
Click the Process button in the tool bar and select ''Create Window, Tab and Field from Table'' from the context menu.&lt;br /&gt;
In the dialog that appears tick the ''Create Menu'' checkbox and hit OK.&lt;br /&gt;
After the successfull completion of the process a confirmation dialog will pop up.&lt;br /&gt;
In that dialog click on ''Tab:&amp;amp;nbsp;Office Room''. This will open a new ''Window&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Tab'' window. &lt;br /&gt;
&lt;br /&gt;
===Improve the Tab Layout===&lt;br /&gt;
&lt;br /&gt;
The new Tab's layout has been generated using some default settings. Let's see if we can improve it a bit.&lt;br /&gt;
* hit the ''Process'' button in the toolbar of the new window and select ''Tab&amp;amp;nbsp;Editor''.&lt;br /&gt;
* This opens the ''Tab&amp;amp;nbsp;Editor'' dialog. &lt;br /&gt;
&lt;br /&gt;
The Tab editor is a very powerful tool that can't be fully covered in the course of this tutorial. We will now just reposition some of the layout elemnts.&amp;lt;br/&amp;gt;&lt;br /&gt;
* Rightclick and hold the label of the ''Building Wing'' field then move the mouse to the right of the ''Room&amp;amp;nbsp;Number'' field and release the mouse button. You have just dragged and dropped the ''Building&amp;amp;nbsp;Wing'' field to a new position.&lt;br /&gt;
* Now drag and drop the ''Active'' checkbox to the right of the ''Floor&amp;amp;nbsp;Number'' field.&lt;br /&gt;
* We want the checkbox to be vertically aligned with the editor fields in the layout column. If you find that the checkbox has landed too close to the ''Floor&amp;amp;nbsp;Number'' field change the X-Position value in the Property sidebar to the right from 4 to 5 and hit ''Enter''. This will move he checkbox to the desired position.&lt;br /&gt;
* Finally hit the ''OK'' button to save your edits and close the dialog.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
Now lets view the results. &lt;br /&gt;
* log in to the Application as GardenAdmin. You might have to log out before in case you are still loged in as the system user&lt;br /&gt;
* Type ''Office&amp;amp;nbsp;Room'' into the menu filter field. &amp;lt;br/&amp;gt;The Menu will pop up with only the ''Office&amp;amp;nbsp;Room'' entry visible.&lt;br /&gt;
* Click the entry to open the ''Office&amp;amp;nbsp;Room'' window. The mandatory ''Room&amp;amp;nbsp;Number'' field is lined red while it is empty. &lt;br /&gt;
&lt;br /&gt;
Congregulations! You have finished this tutorial. You are now able to create your own custom tables complete with its own window and menu entry within iDempiere.&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Create_a_Custom_Table_and_Window&amp;diff=18914</id>
		<title>Application Dictionary - Create a Custom Table and Window</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Create_a_Custom_Table_and_Window&amp;diff=18914"/>
		<updated>2021-05-24T11:18:44Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: Restricted the tutorial scope to creation of table window, tab, field and menu.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Application Dictionary|P]]&lt;br /&gt;
&lt;br /&gt;
__INDEX__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
This tutorial is brought to you by Andreas Sumerauer. If you have any questions, criticism or suggestions for improvement, feel free to contact me [mailto:ansum@soundbytes.de via email]&lt;br /&gt;
&lt;br /&gt;
==Goal of this tutorial==&lt;br /&gt;
This tutorial will enable you to create your own custom Data Tables that are fully integrated within the iDempiere application framework. &lt;br /&gt;
You will be able to do that without writing a single line of SQL or Java code. Instead you will be introduced to the iDempiere Application Dictionary that provides the tools for the creation of wide ranging customizations and extensions to the iDempiere application. &lt;br /&gt;
&lt;br /&gt;
==Example Specification==&lt;br /&gt;
Let's say we want iDempiere to tell us in which office room each employee's workspace is.&lt;br /&gt;
In the course of this tutorial we are going to lay the groundwork for this example specification by adding a new table to hold our office room data and a window to manage the data stored within that table.&lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
To get the most out of this tutorial it is highly recommended that before you start you have made yourself familiar with the idempiere user interface.&lt;br /&gt;
&amp;lt;br/&amp;gt;Some basic understanding of the concept of the iDempiere application dictionary will be helpful but is not strictly required. &lt;br /&gt;
&amp;lt;br&amp;gt;You can greatly improve your learning experience through actively reproducing the Steps. For that you will need to have System administrator access to a sandbox iDempiere installation.  &lt;br /&gt;
&lt;br /&gt;
=Steps=&lt;br /&gt;
&lt;br /&gt;
==Add Database Elements==&lt;br /&gt;
&lt;br /&gt;
===Create a new Table Definition===&lt;br /&gt;
&lt;br /&gt;
We will start by adding the Office Room table to our data base. &lt;br /&gt;
Log in as the SuperUser. Then open the Table &amp;amp; Column window and add a new table. &lt;br /&gt;
Now fill in the following fields:&lt;br /&gt;
* DB Table Name: ''SB_OfficeRoom''&lt;br /&gt;
* Name: ''Office&amp;amp;nbsp;Room''&lt;br /&gt;
* Data Access Level: ''Client&amp;amp;nbsp;+&amp;amp;nbsp;Organization'' &lt;br /&gt;
* Save the new record. &lt;br /&gt;
&lt;br /&gt;
====Generate Mandatory Columns====&lt;br /&gt;
&lt;br /&gt;
We will now add a number of columns to the new table. A table that has a window is required to have a number of mandatory columns that are used by iDemiere for house keeping purposes. &lt;br /&gt;
These columns can be generated very easily by copying the table schema from another existing table that meets those requirements: &lt;br /&gt;
* Click the process button  (gear icon) in the tool bar.&lt;br /&gt;
* Select Copy Columns from Table. A good candidate to be used as a template would be ''C_Subscription_Delivery''.&amp;lt;br/&amp;gt;Enter that name into the dialog that pops up and hit OK. The newly generated columns will appear in the Column sub tab right under the main edit area.&lt;br /&gt;
* We are going to need all of these columns except for ''C_Subscription_ID''. &amp;lt;br/&amp;gt;To remove it tick the checkbox at the left side of the column's row and hit the ''Delete&amp;amp;nbsp;Record'' button ('-' icon).&lt;br /&gt;
&lt;br /&gt;
====Add Custom Columns to the Table====&lt;br /&gt;
&lt;br /&gt;
Now add the ''RoomNo'' column: &lt;br /&gt;
* Click the ''Create&amp;amp;nbsp;New'' Button ('+' icon) in the ''Column'' tab tool bar. The ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Column'' window is opened with the new record loaded.&lt;br /&gt;
* Rightclick the Entity Type field and select new from the context menu.&lt;br /&gt;
* Fill in the required fields in the QuickEntry dialog then hit OK:&lt;br /&gt;
** DB Column Name: ''RoomNo''&lt;br /&gt;
** Name: ''Room&amp;amp;nbsp;Number''&lt;br /&gt;
** Print Text: ''Room&amp;amp;nbsp;Number''&lt;br /&gt;
* Back in the Column window fill in these fiels then save the new record:&lt;br /&gt;
** Reference: ''String''&lt;br /&gt;
** Length: ''30''&lt;br /&gt;
&lt;br /&gt;
Obviously it does not make sense to have a room without a number. So let's make the Room Number field mandatory:&lt;br /&gt;
&lt;br /&gt;
:* Tick the ''Mandatory'' checkbox. A new ''Office&amp;amp;nbsp;Room'' record can now only be saved when the ''Room&amp;amp;nbsp;Number'' field is not empty.  &lt;br /&gt;
&lt;br /&gt;
Repeat the above steps to create two more new columns: ''FloorNo'' (''Floor&amp;amp;nbsp;Number'') and ''BuildingWing'' (''Building&amp;amp;nbsp;Wing''). &amp;lt;br/&amp;gt;Leave the ''Mandatory'' checkbox unticked for these two columns.&lt;br /&gt;
&lt;br /&gt;
===Generate the Table within the Database===&lt;br /&gt;
&lt;br /&gt;
The new table and its columns are now defined as part of the iDempiere application dictionary.&lt;br /&gt;
To create all of them in the database hit the ''Synchronize&amp;amp;nbsp;Column'' button in the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Column'' window.&lt;br /&gt;
Note that this button works a bit differently for a table that already exists in the database. &lt;br /&gt;
It will then only create or update the currently edited column.&lt;br /&gt;
&lt;br /&gt;
===Add a Unique Constraint===&lt;br /&gt;
&lt;br /&gt;
Since our customization only manages a single building we can safely assume that room numbers will be unique.&lt;br /&gt;
To avoid user errors we are going to create a UNIQUE constraint on that column. We have to make sure that different tenants can still have rooms with the same number. Because of that the constraint has to include the ''AD_Client_ID'' column as well.  &lt;br /&gt;
* In the subtab bar click the ''Table&amp;amp;nbsp;Index'' tab and then the ''Create&amp;amp;nbsp;New'' button of that tab.&lt;br /&gt;
* Enter ''Unique_RoomNo_per_Tenant'' into the Name field of the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Table Index'' window that has just opened.&lt;br /&gt;
* Tick both the ''Create Constraint'' and the ''Unique'' checkboxes. &lt;br /&gt;
* Save the new record.&lt;br /&gt;
* Now we need to add the index columns. Hit the ''Create&amp;amp;nbsp;New'' button of the ''Index Column'' subtab. &lt;br /&gt;
* The edit view will switch to ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Table Index&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Index Column''. Here enter ''RoomNo'' into the ''Column'' field.&lt;br /&gt;
* Save the new record and create another one for the ''AD_Client_ID'' column. &lt;br /&gt;
* Now switch back to the ''Table&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Table Index'' view and click the ''Index Validate'' button. This will generate the constraint within the database.&lt;br /&gt;
&lt;br /&gt;
==Add the User Interface Elements==&lt;br /&gt;
&lt;br /&gt;
===Generate Window, Tab and Fields as well as a Menu Entry for the new Table===&lt;br /&gt;
&lt;br /&gt;
We now go back to the ''Table'' window. Rightclick ''Table'' in the breadcrumb row or hit ''ALT+Arrow Up'' on the keyboard.&lt;br /&gt;
Click the Process button in the tool bar and select ''Create Window, Tab and Field from Table'' from the context menu.&lt;br /&gt;
In the dialog that appears tick the ''Create Menu'' checkbox and hit OK.&lt;br /&gt;
After the successfull completion of the process a confirmation dialog will pop up.&lt;br /&gt;
In that dialog click on ''Tab:&amp;amp;nbsp;Office Room''. This will open a new ''Window&amp;amp;nbsp;&amp;gt;&amp;amp;nbsp;Tab'' window. &lt;br /&gt;
&lt;br /&gt;
===Improve the Tab Layout===&lt;br /&gt;
&lt;br /&gt;
The new Tab's layout has been generated using some default settings. Let's see if we can improve it a bit.&lt;br /&gt;
* hit the ''Process'' button in the toolbar of the new window and select ''Tab&amp;amp;nbsp;Editor''.&lt;br /&gt;
* This opens the ''Tab&amp;amp;nbsp;Editor'' dialog. &lt;br /&gt;
&lt;br /&gt;
The Tab editor is a very powerful tool that can't be fully covered in the course of this tutorial. We will now just reposition some of the layout elemnts.&amp;lt;br/&amp;gt;&lt;br /&gt;
* Rightclick and hold the label of the ''Building Wing'' field then move the mouse to the right of the ''Room&amp;amp;nbsp;Number'' field and release the mouse button. You have just dragged and dropped the ''Building&amp;amp;nbsp;Wing'' field to a new position.&lt;br /&gt;
* Now drag and drop the ''Active'' checkbox to the right of the ''Floor&amp;amp;nbsp;Number'' field.&lt;br /&gt;
* We want the checkbox to be vertically aligned with the editor fields in the layout column. If you find that the checkbox has landed too close to the ''Floor&amp;amp;nbsp;Number'' field change the X-Position value in the Property sidebar to the right from 4 to 5 and hit ''Enter''. This will move he checkbox to the desired position.&lt;br /&gt;
* Finally hit the ''OK'' button to save your edits and close the dialog.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
Now lets view the results. &lt;br /&gt;
* log in to the Application as GardenAdmin. You might have to log out before in case you are still loged in as the system user&lt;br /&gt;
* Type ''Office&amp;amp;nbsp;Room'' into the menu filter field. &amp;lt;br/&amp;gt;The Menu will pop up with only the ''Office&amp;amp;nbsp;Room'' entry visible.&lt;br /&gt;
* Click the entry to open the ''Office&amp;amp;nbsp;Room'' window. The mandatory ''Room&amp;amp;nbsp;Number'' field is lined red while it is empty. &lt;br /&gt;
&lt;br /&gt;
Congregulations! You have finished this tutorial. You are now able to create your own custom tables complete with its own window and menu entry within iDempiere.&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Create_a_Custom_Table_and_Window&amp;diff=18913</id>
		<title>Application Dictionary - Create a Custom Table and Window</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Create_a_Custom_Table_and_Window&amp;diff=18913"/>
		<updated>2021-05-23T11:52:44Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: /* Add a new Column and Data Relation to the User Table */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Application Dictionary|P]]&lt;br /&gt;
&lt;br /&gt;
__INDEX__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
This tutorial is brought to you by Andreas Sumerauer. If you have any questions, criticism or suggestions for improvement, feel free to contact me [mailto:ansum@soundbytes.de via email]&lt;br /&gt;
&lt;br /&gt;
==Goal of this tutorial==&lt;br /&gt;
This tutorial will enable you to create your own custom Data Tables that are fully integrated within the iDempiere application framework. &lt;br /&gt;
You will be able to do that without writing a single line of SQL or Java code. Instead you will be introduced to the iDempiere Application Dictionary that provides the tools for the creation of wide ranging customizations and extensions to the iDempiere application. &lt;br /&gt;
You will learn how to create data relations to existing tables to make your new table accessible to the database. &lt;br /&gt;
Lastly You will be taught how to create and customize the user interfaces that iDempiere supplies for entering, deleting and managing your custom data seamlessly within the Application. &lt;br /&gt;
&lt;br /&gt;
==Example Specification==&lt;br /&gt;
&lt;br /&gt;
In the course of this tutorial we are going to implement a small example specification: Let's say we want iDempiere to tell us in which office room each employee's workspace is.&lt;br /&gt;
&amp;lt;br&amp;gt;To make that possible we will need a new ''Office Room'' table and also a new window to manage the data stored within that table.&lt;br /&gt;
&amp;lt;br&amp;gt;We are going to add a new ''SB_OfficeRoom_ID'' column to the ''User'' table and will add the referring editor field to the ''User'' window. These elements will establish the relation between the existing ''User'' table and our new ''Office Room'' table.&lt;br /&gt;
&amp;lt;br&amp;gt;As a last step we are going to configure iDempiere's ''QuickEdit'' dialog.  It allows us to add or modify a user's office room without having to switch away from the ''User'' window to the ''Office Room'' window. &lt;br /&gt;
&amp;lt;!--by right clicking the office room field and selecting ''New'' from the context menu.&lt;br /&gt;
However we want to improve the user experience by adding some extra functionality:&lt;br /&gt;
* Our ''Office Room'' table has a unique constraint. We are going to prohibit duplicate room numbers for a tenant.&lt;br /&gt;
** If the user inadvertently enters an existing room number and tries to save that record the standard dialog will just throw an SQL Exception.&lt;br /&gt;
Our customized dialog will do a bit better and instead load the existing room from the database.&lt;br /&gt;
* Some of our rooms are not suitable as workspaces. These will be flagged as inactive. &lt;br /&gt;
** If the ''Room Number'' of an inactive room is entered the user will be notified through a message box. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
To get the most out of this tutorial it is highly recommended that before you start you have made yourself familiar with the idempiere user interface.&lt;br /&gt;
&amp;lt;br/&amp;gt;Some basic understanding of the concept of the iDempiere application dictionary will be helpful but is not strictly required. &lt;br /&gt;
&amp;lt;br&amp;gt;You can greatly improve your learning experience through actively reproducing the Steps. For that you will need to have System administrator access to a sandbox iDempiere installation.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- topics covered by these three chapters:&lt;br /&gt;
* [[Developing_plug-ins_without_affecting_the_trunk|Developing Plug-Ins without affecting trunk]]&lt;br /&gt;
* [[Developing_Plug-Ins_-_Get_your_Plug-In_running|Get your Plug-Ins running]]&lt;br /&gt;
* [[Developing_Plug-Ins_-_IModelFactory|Create custom Models]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Steps=&lt;br /&gt;
&lt;br /&gt;
==Add Database Elements==&lt;br /&gt;
&lt;br /&gt;
===Create a new Table Definition===&lt;br /&gt;
&lt;br /&gt;
We will start by adding the Office Room table to our data base. &lt;br /&gt;
Log in as the SuperUser. Then open the Table &amp;amp; Column window and add a new table. &lt;br /&gt;
Now fill in the following fields:&lt;br /&gt;
* DB Table Name: ''SB_OfficeRoom''&lt;br /&gt;
* Name: ''Office Room''&lt;br /&gt;
* Data Access Level: ''Client + Organization'' &lt;br /&gt;
* Save the new record. &lt;br /&gt;
&lt;br /&gt;
====Generate Mandatory Columns====&lt;br /&gt;
&lt;br /&gt;
We will now add a number of columns to the new table. A table that has a window is required to have a number of mandatory columns that are used by iDemiere for house keeping purposes. &lt;br /&gt;
These columns can be generated very easily by copying the table schema from another existing table that meets those requirements: &lt;br /&gt;
* Click the process button  (gear icon) in the tool bar.&lt;br /&gt;
* Select Copy Columns from Table. A good candidate to be used as a template would be ''C_Subscription_Delivery''.&amp;lt;br/&amp;gt;Enter that name into the dialog that pops up and hit OK. The newly generated columns will appear in the Column sub tab right under the main edit area.&lt;br /&gt;
* We are going to need all of these columns except for ''C_Subscription_ID''. &amp;lt;br/&amp;gt;To remove it tick the checkbox at the left side of the column's row and hit the ''Delete Record'' button ('-' icon).&lt;br /&gt;
&lt;br /&gt;
====Add Custom Columns to the Table====&lt;br /&gt;
&lt;br /&gt;
Now add the ''RoomNo'' column: &lt;br /&gt;
* Click the ''Create New'' Button ('+' icon) in the ''Column'' tab tool bar. The ''Table &amp;gt; Column'' window is opened with the new record loaded.&lt;br /&gt;
* Rightclick the Entity Type field and select new from the context menu.&lt;br /&gt;
* Fill in the required fields in the QuickEntry dialog then hit OK:&lt;br /&gt;
** DB Column Name: ''RoomNo''&lt;br /&gt;
** Name: ''Room Number''&lt;br /&gt;
** Print Text: ''Room Number''&lt;br /&gt;
* Back in the Column window fill in these fiels then save the new record:&lt;br /&gt;
** Reference: ''String''&lt;br /&gt;
** Length: ''30''&lt;br /&gt;
&lt;br /&gt;
Repeat the above steps to create two more new columns: ''FloorNo'' (''Floor Number'') and ''BuildingWing'' (''Building Wing'').&lt;br /&gt;
&lt;br /&gt;
===Generate the Table within the Database===&lt;br /&gt;
&lt;br /&gt;
The new table and its columns are now defined as part of the iDempiere application dictionary.&lt;br /&gt;
To create all of them in the database hit the ''Synchronize Column'' button in the ''Table &amp;gt; Column'' window.&lt;br /&gt;
Note that this button works a bit differently for a table that already exists in the database. &lt;br /&gt;
It will then only create or update the currently edited column.&lt;br /&gt;
&lt;br /&gt;
===Add a Unique Constraint===&lt;br /&gt;
&lt;br /&gt;
Since our customization only manages a single building we can safely assume that room numbers will be unique.&lt;br /&gt;
To avoid user errors we are going to create a UNIQUE constraint on that column. We have to make sure that different tenants can still have rooms with the same number. Because of that the constraint has to include the ''AD_Client_ID'' column as well.  &lt;br /&gt;
* In the subtab bar click the ''Table Index'' tab and then the ''Create New'' button of that tab.&lt;br /&gt;
* Enter ''Unique_RoomNo_per_Tenant'' into the Name field of the ''Table &amp;gt; Table Index'' window that has just opened.&lt;br /&gt;
* Tick both the ''Create Constraint'' and the ''Unique'' checkboxes. &lt;br /&gt;
* Save the new record.&lt;br /&gt;
* Now we need to add the index columns. Hit the ''Create New'' button of the ''Index Column'' subtab. &lt;br /&gt;
* The edit view will switch to ''Table &amp;gt; Table Index &amp;gt; Index Column''. Here enter ''RoomNo'' into the ''Column'' field.&lt;br /&gt;
* Save the new record and create another one for the ''AD_Client_ID'' column. &lt;br /&gt;
* Now switch back to the ''Table &amp;gt; Table Index'' view and click the ''Index Validate'' button. This will generate the constraint within the database.&lt;br /&gt;
&lt;br /&gt;
===Configure the Record Identifier String===&lt;br /&gt;
ToDo&lt;br /&gt;
&lt;br /&gt;
===Add a new Column and Data Relation to the User Table===&lt;br /&gt;
&lt;br /&gt;
Now it is time to establish a relation from the database to the new table.&lt;br /&gt;
&amp;lt;!--We will now add a new custom SB_--&amp;gt;&lt;br /&gt;
* open the Table &amp;amp; Columnn window and load the AD_User table.&lt;br /&gt;
* ToDo: Add Steps.&lt;br /&gt;
&lt;br /&gt;
==Add the User Interface Elements==&lt;br /&gt;
&lt;br /&gt;
===Generate Window, Tab and Fields as well as a Menu Entry for the new Table===&lt;br /&gt;
&lt;br /&gt;
We now go back to the ''Table'' window. Rightclick ''Table'' in the breadcrumb row or hit ''ALT+Arrow Up'' on the keyboard.&lt;br /&gt;
Click the Process button in the tool bar and select ''Create Window, Tab and Field from Table'' from the context menu.&lt;br /&gt;
In the dialog that appears tick the ''Create Menu'' checkbox and hit OK.&lt;br /&gt;
After the successfull completion of the process a confirmation dialog will pop up.&lt;br /&gt;
In that dialog click on ''Tab: Office Room''. This will open a new ''Window &amp;gt; Tab'' window. &lt;br /&gt;
&lt;br /&gt;
===Improve the Tab Layout===&lt;br /&gt;
&lt;br /&gt;
The new Tab's layout has been generated using some default settings. Let's see if we can improve it a bit.&lt;br /&gt;
* hit the ''Process'' button in the toolbar of the new window and select ''Tab&amp;amp;nbsp;Editor''.&lt;br /&gt;
* This opens the ''Tab&amp;amp;nbsp;Editor'' dialog. &lt;br /&gt;
&lt;br /&gt;
The Tab editor is a very powerful tool that can't be fully covered in the course of this tutorial. We will now just reposition some of the layout elemnts.&amp;lt;br/&amp;gt;&lt;br /&gt;
* Rightclick and hold the label of the ''Building Wing'' field then move the mouse to the right of the ''Room Number field'' and release the mouse button. You have just dragged and dropped the ''Building Wing'' field to a new position.&lt;br /&gt;
* Now drag and drop the ''Active'' chackbox to the right of the ''Floor Number'' field.&lt;br /&gt;
* We want the checkbox to be vertically aligned with the editor fields in the layout column. If you find that the checkbox has landed too close to the ''Floor Number'' field change the X-Position value in the Property sidebar to the right from 4 to 5 and hit ''Enter''. This will move he checkbox to the desired position.&lt;br /&gt;
* Finally hit the ''OK'' button to save your edits and close the dialog.&lt;br /&gt;
&lt;br /&gt;
===Make selected Fields available to the Quick Entry Dialog===&lt;br /&gt;
&lt;br /&gt;
We are now going to make a few of the newly created fields available to the Quick Entry dialog. &lt;br /&gt;
In the Field subtab select the ''Room Number'' row and click the Edit Record button. &lt;br /&gt;
* Tick the ''Quick Entry'' checkbox in ''the Window &amp;gt; Tab &amp;gt; Field'' view that the window that has switched to. This makes the field available to the QuickEntry dialog. &lt;br /&gt;
&lt;br /&gt;
Repeat that last step for both the ''Floor Number'' and ''Building Wing'' fields.&lt;br /&gt;
&lt;br /&gt;
Hint: Do not forget to save your last edit. iDempiere will autosave any of your changes when you load another record into the active window or switch to a parent tab or subtab. &amp;lt;br/&amp;gt;Manual saving is required in all other cases. that is when you change the focus to any other tab in the hierarchy that is not a parent or child of the previous one.&lt;br /&gt;
&lt;br /&gt;
===Add a new field to a factory provided window.===&lt;br /&gt;
&lt;br /&gt;
As a final step we are now going to add a new ''Office Room'' field to the 'User &amp;gt; User Contact' window tab.&lt;br /&gt;
&lt;br /&gt;
Todo: Add office room field. &lt;br /&gt;
&lt;br /&gt;
==View the results==&lt;br /&gt;
&lt;br /&gt;
Todo: List UI customization elements: Menu, new Window, field in existing Window, QuickEntry Dialog enabled for new Element. &lt;br /&gt;
Todo: Login as client admin or user&lt;br /&gt;
Todo: Menu and Window Office Room&lt;br /&gt;
Todo: Usage QuickEntry&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Create_a_Custom_Table_and_Window&amp;diff=18912</id>
		<title>Application Dictionary - Create a Custom Table and Window</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Application_Dictionary_-_Create_a_Custom_Table_and_Window&amp;diff=18912"/>
		<updated>2021-05-23T11:47:49Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: Created page with &amp;quot;P  __INDEX__  =Introduction= This tutorial is brought to you by Andreas Sumerauer. If you have any questions, criticism or suggestions for...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Application Dictionary|P]]&lt;br /&gt;
&lt;br /&gt;
__INDEX__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
This tutorial is brought to you by Andreas Sumerauer. If you have any questions, criticism or suggestions for improvement, feel free to contact me [mailto:ansum@soundbytes.de via email]&lt;br /&gt;
&lt;br /&gt;
==Goal of this tutorial==&lt;br /&gt;
This tutorial will enable you to create your own custom Data Tables that are fully integrated within the iDempiere application framework. &lt;br /&gt;
You will be able to do that without writing a single line of SQL or Java code. Instead you will be introduced to the iDempiere Application Dictionary that provides the tools for the creation of wide ranging customizations and extensions to the iDempiere application. &lt;br /&gt;
You will learn how to create data relations to existing tables to make your new table accessible to the database. &lt;br /&gt;
Lastly You will be taught how to create and customize the user interfaces that iDempiere supplies for entering, deleting and managing your custom data seamlessly within the Application. &lt;br /&gt;
&lt;br /&gt;
==Example Specification==&lt;br /&gt;
&lt;br /&gt;
In the course of this tutorial we are going to implement a small example specification: Let's say we want iDempiere to tell us in which office room each employee's workspace is.&lt;br /&gt;
&amp;lt;br&amp;gt;To make that possible we will need a new ''Office Room'' table and also a new window to manage the data stored within that table.&lt;br /&gt;
&amp;lt;br&amp;gt;We are going to add a new ''SB_OfficeRoom_ID'' column to the ''User'' table and will add the referring editor field to the ''User'' window. These elements will establish the relation between the existing ''User'' table and our new ''Office Room'' table.&lt;br /&gt;
&amp;lt;br&amp;gt;As a last step we are going to configure iDempiere's ''QuickEdit'' dialog.  It allows us to add or modify a user's office room without having to switch away from the ''User'' window to the ''Office Room'' window. &lt;br /&gt;
&amp;lt;!--by right clicking the office room field and selecting ''New'' from the context menu.&lt;br /&gt;
However we want to improve the user experience by adding some extra functionality:&lt;br /&gt;
* Our ''Office Room'' table has a unique constraint. We are going to prohibit duplicate room numbers for a tenant.&lt;br /&gt;
** If the user inadvertently enters an existing room number and tries to save that record the standard dialog will just throw an SQL Exception.&lt;br /&gt;
Our customized dialog will do a bit better and instead load the existing room from the database.&lt;br /&gt;
* Some of our rooms are not suitable as workspaces. These will be flagged as inactive. &lt;br /&gt;
** If the ''Room Number'' of an inactive room is entered the user will be notified through a message box. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
To get the most out of this tutorial it is highly recommended that before you start you have made yourself familiar with the idempiere user interface.&lt;br /&gt;
&amp;lt;br/&amp;gt;Some basic understanding of the concept of the iDempiere application dictionary will be helpful but is not strictly required. &lt;br /&gt;
&amp;lt;br&amp;gt;You can greatly improve your learning experience through actively reproducing the Steps. For that you will need to have System administrator access to a sandbox iDempiere installation.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- topics covered by these three chapters:&lt;br /&gt;
* [[Developing_plug-ins_without_affecting_the_trunk|Developing Plug-Ins without affecting trunk]]&lt;br /&gt;
* [[Developing_Plug-Ins_-_Get_your_Plug-In_running|Get your Plug-Ins running]]&lt;br /&gt;
* [[Developing_Plug-Ins_-_IModelFactory|Create custom Models]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Steps=&lt;br /&gt;
&lt;br /&gt;
==Add Database Elements==&lt;br /&gt;
&lt;br /&gt;
===Create a new Table Definition===&lt;br /&gt;
&lt;br /&gt;
We will start by adding the Office Room table to our data base. &lt;br /&gt;
Log in as the SuperUser. Then open the Table &amp;amp; Column window and add a new table. &lt;br /&gt;
Now fill in the following fields:&lt;br /&gt;
* DB Table Name: ''SB_OfficeRoom''&lt;br /&gt;
* Name: ''Office Room''&lt;br /&gt;
* Data Access Level: ''Client + Organization'' &lt;br /&gt;
* Save the new record. &lt;br /&gt;
&lt;br /&gt;
====Generate Mandatory Columns====&lt;br /&gt;
&lt;br /&gt;
We will now add a number of columns to the new table. A table that has a window is required to have a number of mandatory columns that are used by iDemiere for house keeping purposes. &lt;br /&gt;
These columns can be generated very easily by copying the table schema from another existing table that meets those requirements: &lt;br /&gt;
* Click the process button  (gear icon) in the tool bar.&lt;br /&gt;
* Select Copy Columns from Table. A good candidate to be used as a template would be ''C_Subscription_Delivery''.&amp;lt;br/&amp;gt;Enter that name into the dialog that pops up and hit OK. The newly generated columns will appear in the Column sub tab right under the main edit area.&lt;br /&gt;
* We are going to need all of these columns except for ''C_Subscription_ID''. &amp;lt;br/&amp;gt;To remove it tick the checkbox at the left side of the column's row and hit the ''Delete Record'' button ('-' icon).&lt;br /&gt;
&lt;br /&gt;
====Add Custom Columns to the Table====&lt;br /&gt;
&lt;br /&gt;
Now add the ''RoomNo'' column: &lt;br /&gt;
* Click the ''Create New'' Button ('+' icon) in the ''Column'' tab tool bar. The ''Table &amp;gt; Column'' window is opened with the new record loaded.&lt;br /&gt;
* Rightclick the Entity Type field and select new from the context menu.&lt;br /&gt;
* Fill in the required fields in the QuickEntry dialog then hit OK:&lt;br /&gt;
** DB Column Name: ''RoomNo''&lt;br /&gt;
** Name: ''Room Number''&lt;br /&gt;
** Print Text: ''Room Number''&lt;br /&gt;
* Back in the Column window fill in these fiels then save the new record:&lt;br /&gt;
** Reference: ''String''&lt;br /&gt;
** Length: ''30''&lt;br /&gt;
&lt;br /&gt;
Repeat the above steps to create two more new columns: ''FloorNo'' (''Floor Number'') and ''BuildingWing'' (''Building Wing'').&lt;br /&gt;
&lt;br /&gt;
===Generate the Table within the Database===&lt;br /&gt;
&lt;br /&gt;
The new table and its columns are now defined as part of the iDempiere application dictionary.&lt;br /&gt;
To create all of them in the database hit the ''Synchronize Column'' button in the ''Table &amp;gt; Column'' window.&lt;br /&gt;
Note that this button works a bit differently for a table that already exists in the database. &lt;br /&gt;
It will then only create or update the currently edited column.&lt;br /&gt;
&lt;br /&gt;
===Add a Unique Constraint===&lt;br /&gt;
&lt;br /&gt;
Since our customization only manages a single building we can safely assume that room numbers will be unique.&lt;br /&gt;
To avoid user errors we are going to create a UNIQUE constraint on that column. We have to make sure that different tenants can still have rooms with the same number. Because of that the constraint has to include the ''AD_Client_ID'' column as well.  &lt;br /&gt;
* In the subtab bar click the ''Table Index'' tab and then the ''Create New'' button of that tab.&lt;br /&gt;
* Enter ''Unique_RoomNo_per_Tenant'' into the Name field of the ''Table &amp;gt; Table Index'' window that has just opened.&lt;br /&gt;
* Tick both the ''Create Constraint'' and the ''Unique'' checkboxes. &lt;br /&gt;
* Save the new record.&lt;br /&gt;
* Now we need to add the index columns. Hit the ''Create New'' button of the ''Index Column'' subtab. &lt;br /&gt;
* The edit view will switch to ''Table &amp;gt; Table Index &amp;gt; Index Column''. Here enter ''RoomNo'' into the ''Column'' field.&lt;br /&gt;
* Save the new record and create another one for the ''AD_Client_ID'' column. &lt;br /&gt;
* Now switch back to the ''Table &amp;gt; Table Index'' view and click the ''Index Validate'' button. This will generate the constraint within the database.&lt;br /&gt;
&lt;br /&gt;
===Configure the Record Identifier String===&lt;br /&gt;
ToDo&lt;br /&gt;
&lt;br /&gt;
===Add a new Column and Data Relation to the User Table===&lt;br /&gt;
&lt;br /&gt;
Now it is time to establish a relation from the database to the new table.&lt;br /&gt;
We will now add a new custom SB_&lt;br /&gt;
* open the Table &amp;amp; Columnn window and load the AD_User table.&lt;br /&gt;
&lt;br /&gt;
==Add the User Interface Elements==&lt;br /&gt;
&lt;br /&gt;
===Generate Window, Tab and Fields as well as a Menu Entry for the new Table===&lt;br /&gt;
&lt;br /&gt;
We now go back to the ''Table'' window. Rightclick ''Table'' in the breadcrumb row or hit ''ALT+Arrow Up'' on the keyboard.&lt;br /&gt;
Click the Process button in the tool bar and select ''Create Window, Tab and Field from Table'' from the context menu.&lt;br /&gt;
In the dialog that appears tick the ''Create Menu'' checkbox and hit OK.&lt;br /&gt;
After the successfull completion of the process a confirmation dialog will pop up.&lt;br /&gt;
In that dialog click on ''Tab: Office Room''. This will open a new ''Window &amp;gt; Tab'' window. &lt;br /&gt;
&lt;br /&gt;
===Improve the Tab Layout===&lt;br /&gt;
&lt;br /&gt;
The new Tab's layout has been generated using some default settings. Let's see if we can improve it a bit.&lt;br /&gt;
* hit the ''Process'' button in the toolbar of the new window and select ''Tab&amp;amp;nbsp;Editor''.&lt;br /&gt;
* This opens the ''Tab&amp;amp;nbsp;Editor'' dialog. &lt;br /&gt;
&lt;br /&gt;
The Tab editor is a very powerful tool that can't be fully covered in the course of this tutorial. We will now just reposition some of the layout elemnts.&amp;lt;br/&amp;gt;&lt;br /&gt;
* Rightclick and hold the label of the ''Building Wing'' field then move the mouse to the right of the ''Room Number field'' and release the mouse button. You have just dragged and dropped the ''Building Wing'' field to a new position.&lt;br /&gt;
* Now drag and drop the ''Active'' chackbox to the right of the ''Floor Number'' field.&lt;br /&gt;
* We want the checkbox to be vertically aligned with the editor fields in the layout column. If you find that the checkbox has landed too close to the ''Floor Number'' field change the X-Position value in the Property sidebar to the right from 4 to 5 and hit ''Enter''. This will move he checkbox to the desired position.&lt;br /&gt;
* Finally hit the ''OK'' button to save your edits and close the dialog.&lt;br /&gt;
&lt;br /&gt;
===Make selected Fields available to the Quick Entry Dialog===&lt;br /&gt;
&lt;br /&gt;
We are now going to make a few of the newly created fields available to the Quick Entry dialog. &lt;br /&gt;
In the Field subtab select the ''Room Number'' row and click the Edit Record button. &lt;br /&gt;
* Tick the ''Quick Entry'' checkbox in ''the Window &amp;gt; Tab &amp;gt; Field'' view that the window that has switched to. This makes the field available to the QuickEntry dialog. &lt;br /&gt;
&lt;br /&gt;
Repeat that last step for both the ''Floor Number'' and ''Building Wing'' fields.&lt;br /&gt;
&lt;br /&gt;
Hint: Do not forget to save your last edit. iDempiere will autosave any of your changes when you load another record into the active window or switch to a parent tab or subtab. &amp;lt;br/&amp;gt;Manual saving is required in all other cases. that is when you change the focus to any other tab in the hierarchy that is not a parent or child of the previous one.&lt;br /&gt;
&lt;br /&gt;
===Add a new field to a factory provided window.===&lt;br /&gt;
&lt;br /&gt;
As a final step we are now going to add a new ''Office Room'' field to the 'User &amp;gt; User Contact' window tab.&lt;br /&gt;
&lt;br /&gt;
Todo: Add office room field. &lt;br /&gt;
&lt;br /&gt;
==View the results==&lt;br /&gt;
&lt;br /&gt;
Todo: List UI customization elements: Menu, new Window, field in existing Window, QuickEntry Dialog enabled for new Element. &lt;br /&gt;
Todo: Login as client admin or user&lt;br /&gt;
Todo: Menu and Window Office Room&lt;br /&gt;
Todo: Usage QuickEntry&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Plugin:_LBR_Localization_Brazil&amp;diff=18117</id>
		<title>Plugin: LBR Localization Brazil</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Plugin:_LBR_Localization_Brazil&amp;diff=18117"/>
		<updated>2021-02-13T14:59:41Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: replaced broken bitbucket link to source (at the page bottom)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* '''Maintainer:''' [[User:Alan.lesc1|Alan Lescano]]&lt;br /&gt;
* '''Status:''' in development&lt;br /&gt;
* '''Part of:''' [[Feature/Localization Brazil]]&lt;br /&gt;
* '''Source-code:''' [https://github.com/idempierelbr/idempierelbr https://github.com/idempierelbr/idempierelbr]&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
This functionality (group of plugins) adds support to Brazilian legislation related to:&lt;br /&gt;
* Individuals and legal entities control on Business Partner window, including CEP/ZIP (lookup address using online services);&lt;br /&gt;
* Taxes on sales and purchases (one of the most complex in the world, with about 15 daily new laws);&lt;br /&gt;
* Nota Fiscal Eletrônica (fiscal electronic document that should be generated when selling goods/services, and validated through government webservices);&lt;br /&gt;
* Boletos (bank bill document) and CNAB (file used to communicate exchange billing information, payments, statements, direct debit, etc);&lt;br /&gt;
* SPED (fiscal control);&lt;br /&gt;
* And many other resources needed for the Brazilian companies.&lt;br /&gt;
&lt;br /&gt;
Due to the complexity (about 312 java classes, 23000 code lines, dozens of postgres/oracle scripts) the project was split into plugins:&lt;br /&gt;
* org.idempierelbr.core (base for Brazil; includes translation and basic columns/fields for general use);&lt;br /&gt;
* org.idempierelbr.tax (requires core plugin; resources for configuring automatic calculation of brazilian taxes);&lt;br /&gt;
* org.idempierelbr.nf (requires core and tax plugins; generate and validate Nota Fiscal Eletrônica);&lt;br /&gt;
* org.idempierelbr.openitem (requires core plugin; specific brazilian changes in reports and open item windows);&lt;br /&gt;
* org.idempierelbr.bank (requires core and openitem plugins; generate Boleto document, and bank communications);&lt;br /&gt;
* org.idempierelbr.bank.bankname (requires core, openitem and bank plugins; each brazilian bank as a plugin so its easier to generate new Boleto documents);&lt;br /&gt;
* org.idempierelbr.sped (requires core, tax and nf plugins; generates SPED, a brazilian fiscal control document).&lt;br /&gt;
&lt;br /&gt;
== Screenshots ==&lt;br /&gt;
[[File:Screenshot_home.png|520px]] [[File:Screenshot_menu.png|520px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot_bpartner.png|520px]] [[File:Screenshot_product.png|520px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot_cep.png|520px]] [[File:Screenshot_TaxTransaction.png|520px]]&lt;br /&gt;
&lt;br /&gt;
== More ==&lt;br /&gt;
Due the fact this is a specific brazilian localization, you can follow the project and get more information in portuguese through the link:&lt;br /&gt;
&lt;br /&gt;
https://github.com/idempierelbr/idempierelbr&lt;br /&gt;
&lt;br /&gt;
[[Category:Available_Plugins]]&lt;br /&gt;
[[Category:Localisation|B]]&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Developing_Plug-Ins_-_Models,_Documents_and_custom_accounting&amp;diff=18116</id>
		<title>Developing Plug-Ins - Models, Documents and custom accounting</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Developing_Plug-Ins_-_Models,_Documents_and_custom_accounting&amp;diff=18116"/>
		<updated>2021-02-13T14:55:45Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: replaced broken link to source&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development|P]]&lt;br /&gt;
[[Category:Developer documentation‏‎]]&lt;br /&gt;
[[Category:Plug-In Development]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''WARNING: THIS PAGE NEEDS YOU! IF YOU SEE ANY ERRORS, PLEASE CORRECT THEM. IF YOU THINK SOMETHING SHOULD BE DESCRIBED IN ANOTHER WAY, PLEASE CORRECT IT! IF YOU HAVE ADDITIONAL INFORMATION WHICH COULD BE USEFUL, PLEASE ADD IT!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This tutorial is brought to you by Jan Thielemann from evenos GmbH (www.evenos-consulting.de). If you have questions, criticism or improvement suggestions, feel free to visit me ([[User:Jan.thielemann|Jan.thielemann]]) or write me [mailto:jan.thielemann@evenos.de an email].&lt;br /&gt;
&lt;br /&gt;
If you think that something is missing here, feel free to modify this page and add your name here. Other contributors and people who helped me:&lt;br /&gt;
*Thomas Bayen&lt;br /&gt;
*Nicols Micoud&lt;br /&gt;
*Redhuan D. Oon&lt;br /&gt;
*Carlos Ruiz&lt;br /&gt;
&lt;br /&gt;
=Goal of this tutorial=&lt;br /&gt;
In this tutorial, I want to show you how you can implement custom document types to make your own tables act like documents. I also explain the steps to provide the necessary code so that your document can make custom accounting entries. However, I am still new to the documents topic in iDempiere so I don't claim that this tutorial is complete, nor that everything I mention is 100% correct. I dare you to correct me if I am wrong!&lt;br /&gt;
&lt;br /&gt;
=Prerequisites=&lt;br /&gt;
Before you start this tutorial, you should take a look at the following tutorials:&lt;br /&gt;
* [[Developing_plug-ins_without_affecting_the_trunk|Developing Plug-Ins without affecting the Trunk]]&lt;br /&gt;
* [[Developing_Plug-Ins_-_Get_your_Plug-In_running|Developing Plug-Ins - Get your Plug-In started]]&lt;br /&gt;
* [[Developing_Plug-Ins_-_IDocFactory_(Custom_Accounting)|Developing Plug-Ins - IDocFactory]]&lt;br /&gt;
* [[Hackers_Guide_to_Documents|Hackers Guide to Documents]] - And all the links mentioned there!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The code used in this tutorial is available here: [https://archive.softwareheritage.org/browse/origin/directory/?origin_url=https://bitbucket.org/evenos-consulting/un.kong.jim.battleplan archive.softwareheritage.org]&lt;br /&gt;
&lt;br /&gt;
=tl;dr=&lt;br /&gt;
https://www.youtube.com/watch?v=1H7NaSY5G5k&lt;br /&gt;
&lt;br /&gt;
=The Workflow=&lt;br /&gt;
==Statement of the problem==&lt;br /&gt;
Before we start writing code or other stuff, let's find an example for this tutorial. I would like to give you a concrete case where we need a new custom document type and show you how to implement it step by step. So what could be a use case where we need a document?&lt;br /&gt;
&lt;br /&gt;
Let's imagine that the dictator of East-West Rokea, Jim Kong Un, wants to use iDempiere for his battle plans and to keep track of the expenses in the upcoming war against his mortal enemy, the United States of Majaica. He needs a way to let his generals create battle plans and he wants to be the only person who can approve the plans, because he is the mighty leader. &lt;br /&gt;
&lt;br /&gt;
Battle plans can have war machinery attached, like order lines on a sales order, so once a battle plan is approved, accounting entries should be created for Jim to know how much money he burns in the war. Note that his generals are good in creating battle plans but only the army commanders know how much war machinery is actually available on the ground.&lt;br /&gt;
&lt;br /&gt;
So we have three type of people involved in creating battle plans:&lt;br /&gt;
*Generals create battle plans&lt;br /&gt;
*Commanders attach war machinery to the battle plans&lt;br /&gt;
*Jim Kong Un approves battle plans&lt;br /&gt;
&lt;br /&gt;
Generals and Commanders could be implemented by iDempiere Roles, but to ensure that only generals create battle plans and commanders attach war machinery to them we will require an iDempiere document and a custom workflow to manage the battle plans.&lt;br /&gt;
&lt;br /&gt;
Okay, so on a fresh system, we need to create users, roles, tables, windows, a workflow, a document and also we need to write some code. Let's start.&lt;br /&gt;
&lt;br /&gt;
==The Battle Plan==&lt;br /&gt;
So what is a battle plan and how could we represent it in a database? Let's think about it. What do we need? We need:&lt;br /&gt;
*The location where to attack&lt;br /&gt;
*The battalion which should attack&lt;br /&gt;
*The time when the attack should start&lt;br /&gt;
*The description of the strategy&lt;br /&gt;
*The name of the battle plan&lt;br /&gt;
*The person who is in charge for this plan (so he can be executed if the plan fails)&lt;br /&gt;
&lt;br /&gt;
Also we need a way to represent the war machinery. For this, we create a simple table which only has a name, value and description field so we can represent a battalion. Another table is the war machinery with the following fields:&lt;br /&gt;
*Name/Value/Description of the machinery&lt;br /&gt;
*Price for this machine&lt;br /&gt;
*Flag indicating that this machine is in repair (we cannot send broken tanks into the battle)&lt;br /&gt;
&lt;br /&gt;
And last but not least, we need to attach the machinery to the battle plans in a table like order lines with a simple reference to the machinery table. That should be all for the beginning.&lt;br /&gt;
&lt;br /&gt;
==Create the database tables==&lt;br /&gt;
Create the following tables and please note that in this tutorial, we don't care about database constraints, table keys, grammar or orthography. It's just an example ;)&lt;br /&gt;
&lt;br /&gt;
Battalion&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE ROK_battalion&lt;br /&gt;
(&lt;br /&gt;
--Default Columns&lt;br /&gt;
  rok_battalion_ID numeric(10,0) NOT NULL,&lt;br /&gt;
  rok_battalion_uu character varying(36) DEFAULT NULL::character varying,&lt;br /&gt;
  ad_client_id numeric(10,0) NOT NULL,&lt;br /&gt;
  ad_org_id numeric(10,0) NOT NULL,&lt;br /&gt;
  isactive character(1) NOT NULL DEFAULT 'Y'::bpchar,&lt;br /&gt;
  created timestamp without time zone NOT NULL DEFAULT now(),&lt;br /&gt;
  createdby numeric(10,0) NOT NULL,&lt;br /&gt;
  updated timestamp without time zone NOT NULL DEFAULT now(),&lt;br /&gt;
  updatedby numeric(10,0) NOT NULL,&lt;br /&gt;
&lt;br /&gt;
--User Columns&lt;br /&gt;
  value character varying(40) NOT NULL,&lt;br /&gt;
  name character varying(255) NOT NULL,&lt;br /&gt;
  description character varying(255)&lt;br /&gt;
)&lt;br /&gt;
WITH (&lt;br /&gt;
  OIDS=FALSE&lt;br /&gt;
);&lt;br /&gt;
ALTER TABLE rok_battalion&lt;br /&gt;
  OWNER TO adempiere;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
War Machines&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE ROK_war_machine&lt;br /&gt;
(&lt;br /&gt;
--Default Columns&lt;br /&gt;
  rok_war_machine_ID numeric(10,0) NOT NULL,&lt;br /&gt;
  rok_war_machine_uu character varying(36) DEFAULT NULL::character varying,&lt;br /&gt;
  ad_client_id numeric(10,0) NOT NULL,&lt;br /&gt;
  ad_org_id numeric(10,0) NOT NULL,&lt;br /&gt;
  isactive character(1) NOT NULL DEFAULT 'Y'::bpchar,&lt;br /&gt;
  created timestamp without time zone NOT NULL DEFAULT now(),&lt;br /&gt;
  createdby numeric(10,0) NOT NULL,&lt;br /&gt;
  updated timestamp without time zone NOT NULL DEFAULT now(),&lt;br /&gt;
  updatedby numeric(10,0) NOT NULL,&lt;br /&gt;
&lt;br /&gt;
--User Columns&lt;br /&gt;
  value character varying(40) NOT NULL,&lt;br /&gt;
  name character varying(255) NOT NULL,&lt;br /&gt;
  description character varying(255),&lt;br /&gt;
  price numeric NOT NULL DEFAULT 0,&lt;br /&gt;
  isrepairing character(1) NOT NULL DEFAULT 'N'::bpchar&lt;br /&gt;
)&lt;br /&gt;
WITH (&lt;br /&gt;
  OIDS=FALSE&lt;br /&gt;
);&lt;br /&gt;
ALTER TABLE rok_war_machine&lt;br /&gt;
  OWNER TO adempiere;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Battle Plan&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE ROK_battle_plan&lt;br /&gt;
(&lt;br /&gt;
--Default columns&lt;br /&gt;
  rok_battle_plan_ID numeric(10,0) NOT NULL,&lt;br /&gt;
  rok_battle_plan_uu character varying(36) DEFAULT NULL::character varying,&lt;br /&gt;
  ad_client_ID numeric(10,0) NOT NULL,&lt;br /&gt;
  ad_org_ID numeric(10,0) NOT NULL,&lt;br /&gt;
  isactive character(1) NOT NULL DEFAULT 'Y'::bpchar,&lt;br /&gt;
  created timestamp without time zone NOT NULL DEFAULT now(),&lt;br /&gt;
  createdby numeric(10,0) NOT NULL,&lt;br /&gt;
  updated timestamp without time zone NOT NULL DEFAULT now(),&lt;br /&gt;
  updatedby numeric(10,0) NOT NULL,&lt;br /&gt;
&lt;br /&gt;
--Document columns&lt;br /&gt;
  documentno character varying(30) NOT NULL,&lt;br /&gt;
  docstatus character(2) NOT NULL,&lt;br /&gt;
  docaction character(2) NOT NULL,&lt;br /&gt;
  processing character(1),&lt;br /&gt;
  processed character(1) NOT NULL DEFAULT 'N'::bpchar,&lt;br /&gt;
  c_doctype_id numeric(10,0) NOT NULL,&lt;br /&gt;
  c_doctypetarget_id numeric(10,0) NOT NULL,&lt;br /&gt;
  isapproved character(1) NOT NULL DEFAULT 'Y'::bpchar,&lt;br /&gt;
&lt;br /&gt;
--Document columns to enable accounting&lt;br /&gt;
  dateacct timestamp without time zone NOT NULL,&lt;br /&gt;
  processedon numeric,&lt;br /&gt;
  posted character(1) NOT NULL DEFAULT 'N'::bpchar,&lt;br /&gt;
  c_currency_id numeric(10,0) NOT NULL,&lt;br /&gt;
&lt;br /&gt;
--User columns&lt;br /&gt;
  value character varying(40) NOT NULL,&lt;br /&gt;
  name character varying(255) NOT NULL,&lt;br /&gt;
  description character varying(255),&lt;br /&gt;
  ad_user_id numeric(10,0), --in charge&lt;br /&gt;
  rok_battalion_ID numeric(10,0),&lt;br /&gt;
  attack_location character varying(255) NOT NULL,&lt;br /&gt;
  attack_time timestamp without time zone NOT NULL&lt;br /&gt;
)&lt;br /&gt;
WITH (&lt;br /&gt;
  OIDS=FALSE&lt;br /&gt;
);&lt;br /&gt;
ALTER TABLE ROK_battle_plan&lt;br /&gt;
  OWNER TO adempiere;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Battle Plan Line&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE rok_battle_plan_line&lt;br /&gt;
(&lt;br /&gt;
--Default Columns&lt;br /&gt;
  rok_battle_plan_line_ID numeric(10,0) NOT NULL,&lt;br /&gt;
  rok_battle_plan_line_uu character varying(36) DEFAULT NULL::character varying,&lt;br /&gt;
  ad_client_id numeric(10,0) NOT NULL,&lt;br /&gt;
  ad_org_id numeric(10,0) NOT NULL,&lt;br /&gt;
  isactive character(1) NOT NULL DEFAULT 'Y'::bpchar,&lt;br /&gt;
  created timestamp without time zone NOT NULL DEFAULT now(),&lt;br /&gt;
  createdby numeric(10,0) NOT NULL,&lt;br /&gt;
  updated timestamp without time zone NOT NULL DEFAULT now(),&lt;br /&gt;
  updatedby numeric(10,0) NOT NULL,&lt;br /&gt;
  rok_battle_plan_id numeric(10,0) NOT NULL,&lt;br /&gt;
&lt;br /&gt;
--User Columns&lt;br /&gt;
  rok_war_machine_ID numeric(10,0) NOT NULL&lt;br /&gt;
)&lt;br /&gt;
WITH (&lt;br /&gt;
  OIDS=FALSE&lt;br /&gt;
);&lt;br /&gt;
ALTER TABLE rok_battle_plan_line&lt;br /&gt;
  OWNER TO adempiere;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Create tables, columns, windows, tabs and fields==&lt;br /&gt;
Now that we have our database ready, we can start creating windows for our tables. You should be able to do this by your own. You are not? Okay, okay! Sorry. Just take a look here: https://www.youtube.com/watch?v=F1lFHS2riG4&amp;amp;list=UUbBGUUNnLy4kIHxq19DNPbA&lt;br /&gt;
&lt;br /&gt;
So the general concept is:&lt;br /&gt;
#Create a database table&lt;br /&gt;
#Login as SuperUser on System Administrator role and System client&lt;br /&gt;
#Open Table and Columns window and create your table and columns&lt;br /&gt;
#Open Window, Tab and Field window and create your window&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After creating the Tables in iDempiere, you may need to change the following columns:&lt;br /&gt;
&lt;br /&gt;
ROK_Battle_Plan&lt;br /&gt;
*Make C_DocType_ID not updatable and set default logic to &amp;quot;0&amp;quot;&lt;br /&gt;
*Change C_DocTypeTarget_ID reference to &amp;quot;Table&amp;quot; and set the reference key to &amp;quot;C_DocType&amp;quot;. Also create a new dynamic validation and set it to here. The validation sql should look like &amp;quot;C_DocType.DocBaseType ='ROK'&amp;quot;&lt;br /&gt;
*Make DocumentNo not updateable and part of the identifier&lt;br /&gt;
*Change DocAction reference to button, change reference key to &amp;quot;_Document Action&amp;quot; and create a new process &amp;quot;Process Battle Plan&amp;quot; and attach it to the button. The Process only need a name and a search key for now. I chose &amp;quot;Process Battle Plan&amp;quot; for both. Also change the default logic to &amp;quot;CO&amp;quot;&lt;br /&gt;
*For DocStatus, set the reference key to &amp;quot;_Document Status&amp;quot; and set the default logic to &amp;quot;DR&amp;quot;&lt;br /&gt;
*Make Processed not updateable&lt;br /&gt;
*Change length of ProcessedOn to 20&lt;br /&gt;
*Change reference of Processing to Button and use Process Battle Plan as the process&lt;br /&gt;
*Make isApproved not updateable and set default logic to &amp;quot;@IsApproved@&amp;quot;&lt;br /&gt;
*Change reference of DateAcct to Date, length to 7 and use &amp;quot;@#Date@&amp;quot; as default logic&lt;br /&gt;
*Change reference of Posted to Button, set reference key to &amp;quot;_Posted Status&amp;quot; and default logic to &amp;quot;N&amp;quot;&lt;br /&gt;
*Set default logic of C_Currency_ID to &amp;quot;@C_Currency_ID@&amp;quot; and make it not updateable&lt;br /&gt;
&lt;br /&gt;
ROK_Battle_Plan_Line&lt;br /&gt;
*Set default logic of ROK_Battle_Plan_ID to &amp;quot;@ROK_Battle_Plan_ID@&amp;quot;, make it not updateable and check the Parent link column checkbox&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now create the corresponding windows. After you created them, you may need to change the following fields:&lt;br /&gt;
&lt;br /&gt;
ROK_Battle_Plan window&lt;br /&gt;
*Hide Account Date&lt;br /&gt;
*Hide Approved&lt;br /&gt;
*Hide Process Now&lt;br /&gt;
*Hide Processed&lt;br /&gt;
*Hide Processed On&lt;br /&gt;
*Set display logic of Posted to &amp;quot;@Processed@=Y &amp;amp; @#ShowAcct@=Y&amp;quot;&lt;br /&gt;
*Make currency read only&lt;br /&gt;
*Make Document Type read only&lt;br /&gt;
*Make Document Status read only&lt;br /&gt;
&lt;br /&gt;
Finally create the menu entries for our new windows.&lt;br /&gt;
&lt;br /&gt;
==Create a custom document type in the Application Dictionary==&lt;br /&gt;
Now that we have our windows ready, we can start creating our new document type. To do this, first open the Reference window and search the &amp;quot;C_DocType DocBaseType&amp;quot; reference. Go to the List Validation tab and add a new entry:&lt;br /&gt;
*Value=ROK&lt;br /&gt;
*Name=Battle Plan&lt;br /&gt;
&lt;br /&gt;
With this new base type, we can create a new document type. Open the Document Type window and create a new entry:&lt;br /&gt;
*Name=Battle Plan&lt;br /&gt;
*Print Text=Battle Plan&lt;br /&gt;
*CL Category=None&lt;br /&gt;
*Document BaseType=Battle Plan&lt;br /&gt;
&lt;br /&gt;
Please note that if you want to use this document on a specific client, you have to create it on this client!&lt;br /&gt;
&lt;br /&gt;
==IModelFactory and IDocFactory==&lt;br /&gt;
The Application Dictionary is now ready. Now we can implement some code. Follow the other tutorials on this wiki or take a look at evenos Consultings youtube videos. What you basically do is:&lt;br /&gt;
*Create a new Plug-in&lt;br /&gt;
*Create a ModelFactory class and implement IModelFactory&lt;br /&gt;
*Create a DocumentFactory class and implement IDocFactory&lt;br /&gt;
*Create component definitions for Model- and DocFactory (note that DocFactory has an additional parameter called &amp;quot;gaap&amp;quot; whose value is &amp;quot;*&amp;quot;&lt;br /&gt;
*Generate the X and I classes via model.generator app in eclipse&lt;br /&gt;
*Create M classes for your models&lt;br /&gt;
*Create a new document class called &amp;quot;Doc_ROKBattlePlan&amp;quot; which extends &amp;quot;Doc&amp;quot;&lt;br /&gt;
*Implement DocAction and DocOption in MROKBattlePlan&lt;br /&gt;
&lt;br /&gt;
Don't forget to add the dependencies to your MANIFEST.MF&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After you created the basic shell for all classes, let's get into the implementation details. Open MROKBattlePlan and make some changes to the default generated methods:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@Override&lt;br /&gt;
public int customizeValidActions(String docStatus, Object processing, String orderType, String isSOTrx, int AD_Table_ID,&lt;br /&gt;
		String[] docAction, String[] options, int index) {&lt;br /&gt;
	if (options == null)&lt;br /&gt;
		throw new IllegalArgumentException(&amp;quot;Option array parameter is null&amp;quot;);&lt;br /&gt;
	if (docAction == null)&lt;br /&gt;
		throw new IllegalArgumentException(&amp;quot;Doc action array parameter is null&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	// If a document is drafted or invalid, the users are able to complete, prepare or void&lt;br /&gt;
	if (docStatus.equals(DocumentEngine.STATUS_Drafted) || docStatus.equals(DocumentEngine.STATUS_Invalid)) {&lt;br /&gt;
		options[index++] = DocumentEngine.ACTION_Complete;&lt;br /&gt;
		options[index++] = DocumentEngine.ACTION_Prepare;&lt;br /&gt;
		options[index++] = DocumentEngine.ACTION_Void;&lt;br /&gt;
&lt;br /&gt;
		// If the document is already completed, we also want to be able to reactivate or void it instead of only closing it&lt;br /&gt;
	} else if (docStatus.equals(DocumentEngine.STATUS_Completed)) {&lt;br /&gt;
		options[index++] = DocumentEngine.ACTION_Void;&lt;br /&gt;
		options[index++] = DocumentEngine.ACTION_ReActivate;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return index;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Override&lt;br /&gt;
public boolean processIt(String action) throws Exception {&lt;br /&gt;
	log.warning(&amp;quot;Processing Action=&amp;quot; + action + &amp;quot; - DocStatus=&amp;quot; + getDocStatus() + &amp;quot; - DocAction=&amp;quot; + getDocAction());&lt;br /&gt;
	DocumentEngine engine = new DocumentEngine(this, getDocStatus());&lt;br /&gt;
	return engine.processIt(action, getDocAction());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Override&lt;br /&gt;
public boolean unlockIt() {&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Override&lt;br /&gt;
public boolean invalidateIt() {&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Override&lt;br /&gt;
public String prepareIt() {&lt;br /&gt;
	setC_DocType_ID(getC_DocTypeTarget_ID());&lt;br /&gt;
	return DocAction.STATUS_InProgress;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Override&lt;br /&gt;
public boolean approveIt() {&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Override&lt;br /&gt;
public boolean rejectIt() {&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Override&lt;br /&gt;
public String completeIt() {&lt;br /&gt;
	setProcessed(true);&lt;br /&gt;
	return DocAction.STATUS_Completed;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Override&lt;br /&gt;
public boolean voidIt() {&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Override&lt;br /&gt;
public boolean closeIt() {&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Override&lt;br /&gt;
public boolean reverseCorrectIt() {&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Override&lt;br /&gt;
public boolean reverseAccrualIt() {&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Override&lt;br /&gt;
public boolean reActivateIt() {&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Override&lt;br /&gt;
public String getSummary() {&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Override&lt;br /&gt;
public String getDocumentInfo() {&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Override&lt;br /&gt;
public File createPDF() {&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Override&lt;br /&gt;
public String getProcessMsg() {&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Override&lt;br /&gt;
public int getDoc_User_ID() {&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Override&lt;br /&gt;
public BigDecimal getApprovalAmt() {&lt;br /&gt;
	return BigDecimal.ONE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you see, we don't do much business logic here. Thats not necessary for our case but if you create documents for your own, you may want to add some more code here ;)&lt;br /&gt;
Take a look at other document model classes to see what you could do. Just search for classes which implement DocAction. A example would be MOrder, MInvoice and so on.&lt;br /&gt;
&lt;br /&gt;
Also heres how the Doc_ROKBattlePlan looks like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Doc_ROKBattlePlan extends Doc{&lt;br /&gt;
&lt;br /&gt;
	public Doc_ROKBattlePlan (MAcctSchema as, ResultSet rs, String trxName)&lt;br /&gt;
	{&lt;br /&gt;
		super (as, MROKBattlePlan.class, rs, null, trxName);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	protected String loadDocumentDetails() {&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public BigDecimal getBalance() {&lt;br /&gt;
		return BigDecimal.ZERO;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public ArrayList&amp;lt;Fact&amp;gt; createFacts(MAcctSchema as) {&lt;br /&gt;
		ArrayList&amp;lt;Fact&amp;gt; facts = new ArrayList&amp;lt;Fact&amp;gt;();&lt;br /&gt;
		return facts;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For testing purposes i added a &amp;quot;log.warning(&amp;quot;---------------&amp;quot;)&amp;quot; to every method in my model as well as my Doc_ class.&lt;br /&gt;
&lt;br /&gt;
==Create Users and Roles==&lt;br /&gt;
Since we want to play a little bit, we need differen users and roles. I created the following users and roles:&lt;br /&gt;
*User: Jim&lt;br /&gt;
*User: GeneralA&lt;br /&gt;
*User: CommanderA&lt;br /&gt;
*Role: Generals&lt;br /&gt;
*Role: Commanders&lt;br /&gt;
&lt;br /&gt;
The assignment of the users to the roles should be clear i guess :P. By the way, all roles are created on the target client. I use GardenWorld for this purpose. Also make sure that all users are added to the Business Partners GardenAdmin BP or GardenUser BP or you won't find them later in the Workflow Responsible window.&lt;br /&gt;
&lt;br /&gt;
==Create the workflow==&lt;br /&gt;
The workflow is an essential part when working with documents. The workflow describes the steps needed to make a document transition into other states. Heres an example: At first, the document has the status drafted. The Genreals enter some information and complete the document. The doc now has the status in progress because it needs approval by Jim. Once Jim approved the document, it gets the status approved. From this status it can transition into completed. Which steps exactly are necessarry are described by the workflow.&lt;br /&gt;
&lt;br /&gt;
===Workflow===&lt;br /&gt;
So let's start by creating a new workflow on System client. I call mine ROK_Battle_Plan, set access level to all and author to Jim Kong Un, our mighty leader. The Workflow Type is Document Process because we want to process a document. The Table is ROK_Battle_Plan and the Publication Status is Released. &lt;br /&gt;
Then we open the report and process window and search the process we created earlier (Process Battle Plan). Here i chose my newly created workflow and save the process.&lt;br /&gt;
This all happend on the System Client.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Responsibles===&lt;br /&gt;
&lt;br /&gt;
Next we have to create some Workflow Responsibles. Go to the GardenWorld client and create some responsibles there. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Type !! Others &lt;br /&gt;
|-&lt;br /&gt;
|Jim||Human || User=Jim&lt;br /&gt;
|-&lt;br /&gt;
|Generals||Role || Role=Generals&lt;br /&gt;
|-&lt;br /&gt;
|Commanders||Role || Role=Commanders&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Nodes===&lt;br /&gt;
Now to the more tricky part. We need to create Workflow Nodes and transitions but our responsibles are in GardenWorld and not on System client so we have to mix it a little bit:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name/Search Key  !! Action !! Others  !! Workflow Responsible !! Client&lt;br /&gt;
|-&lt;br /&gt;
|(Start)||Wait (Sleep) || - || - || System&lt;br /&gt;
|-&lt;br /&gt;
|(DocPrepare) ||Document Action || Document Action = Prepare || - || System&lt;br /&gt;
|-&lt;br /&gt;
|(DocComplete) ||Document Action || Document Action = Complete || - || System&lt;br /&gt;
|-&lt;br /&gt;
|(DocAuto) ||Document Action || Document Action = &amp;lt;None&amp;gt; || -  || System&lt;br /&gt;
|-&lt;br /&gt;
|(DocApprove) ||User Choice || Column = isApproved || Jim || GardenWorld&lt;br /&gt;
|-&lt;br /&gt;
|(AddWarMachine)||User Window|| Window = ROK_Battle_Plan || Commanders || GardenWorld&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When you are done, make sure that (Start) is set as the starting node in the Workflow window.&lt;br /&gt;
&lt;br /&gt;
===Transitions===&lt;br /&gt;
The next step is to create the transitions. You need the following transitions:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Start Node  !! Destination Node !! LineNo&lt;br /&gt;
|-&lt;br /&gt;
|(Start)||(DocPrepare) ||10&lt;br /&gt;
|-&lt;br /&gt;
|(Start)||(DocAuto) || 100&lt;br /&gt;
|-&lt;br /&gt;
|(DocPrepare)||(AddWarMachine)||10&lt;br /&gt;
|-&lt;br /&gt;
|(AddWarMachine)||(DocApprove)||10&lt;br /&gt;
|-&lt;br /&gt;
|(DocApprove)||(DocComplete)||10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
We are nearly done. Hopefully i didn't forget to mention a step i did. If something doesn't work for you like i describe it here, sent me a mail! If you find the error by yourself, then please correct this page!&lt;br /&gt;
&lt;br /&gt;
However, for me it now should work so let's make a test!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Login as GeneralA:&lt;br /&gt;
&lt;br /&gt;
[[File:Roktest1.png|320px|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Open the ROK_Battle_Plan window and enter some details:&lt;br /&gt;
&lt;br /&gt;
[[File:Roktest2.png|720px|border]]&lt;br /&gt;
&lt;br /&gt;
Hit the process button in the toolbar and start the process. Chose Complete as the action:&lt;br /&gt;
&lt;br /&gt;
[[File:Roktest4.png|320px|border]]&lt;br /&gt;
[[File:Roktest3.png|320px|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hit the button again and you will see that the workflow has started:&lt;br /&gt;
&lt;br /&gt;
[[File:Roktest4.png|320px|border]]&lt;br /&gt;
[[File:Roktest5.png|420px|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Log out and back in but this time chose CommanderA as the user:&lt;br /&gt;
&lt;br /&gt;
[[File:Roktest6.png|320px|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You should see that there is a Workflow Activity waiting for you:&lt;br /&gt;
&lt;br /&gt;
[[File:Roktest7.png|320px|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Click on the button and the Workflow Activities tab opens:&lt;br /&gt;
&lt;br /&gt;
[[File:Roktest8.png|720px|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Click on the window button and enter some lines. When you are done, close the window and hit the green checkmark button in the Workflow Activties tab:&lt;br /&gt;
&lt;br /&gt;
[[File:Roktest9.png|720px|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Open the battle plan again and try to complete it. You should see a message that the plan need approval by Jim:&lt;br /&gt;
&lt;br /&gt;
[[File:Roktest10.png|720px|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finally log into the system with Jim as the user. He also has a workflow activity. Open it and chose Yes. Then hit the green Checkbox. Congratulations! You completed the document! Open the battle plan and hit the process toolbar button. You should now also see the Posted button. Press it and you will see the accounting entries which were created (no in our case).&lt;br /&gt;
&lt;br /&gt;
[[File:Roktest12.png|320px|border]]&lt;br /&gt;
[[File:Roktest11.png|320px|border]]&lt;br /&gt;
[[File:Roktest13.png|720px|border]]&lt;br /&gt;
[[File:Roktest14.png|720px|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you take a look at the console output (if you don't see anything but it still works, you have not added &amp;quot;log.warning()&amp;quot; to your methods ;), you see that the model ran through different stages and also our DocFactory returned our Doc_ROKBattlePlan and called it's methods:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Aug 27, 2014 2:27:31 PM un.kong.jim.model.MROKBattlePlan processIt&lt;br /&gt;
WARNING: Processing Action=AP - DocStatus=IP - DocAction=CO&lt;br /&gt;
Aug 27, 2014 2:27:31 PM un.kong.jim.model.MROKBattlePlan approveIt&lt;br /&gt;
WARNING: ----------------------------------------------------------------------------------&lt;br /&gt;
Aug 27, 2014 2:27:31 PM un.kong.jim.model.MROKBattlePlan &amp;lt;init&amp;gt;&lt;br /&gt;
WARNING: ----------------------------------------------------------------------------------&lt;br /&gt;
Aug 27, 2014 2:27:31 PM un.kong.jim.model.MROKBattlePlan processIt&lt;br /&gt;
WARNING: Processing Action=CO - DocStatus=AP - DocAction=CO&lt;br /&gt;
Aug 27, 2014 2:27:31 PM un.kong.jim.model.MROKBattlePlan completeIt&lt;br /&gt;
WARNING: ----------------------------------------------------------------------------------&lt;br /&gt;
Aug 27, 2014 2:27:31 PM un.kong.jim.model.MROKBattlePlan &amp;lt;init&amp;gt;&lt;br /&gt;
WARNING: ----------------------------------------------------------------------------------&lt;br /&gt;
Aug 27, 2014 2:27:31 PM un.kong.jim.document.Doc_ROKBattlePlan &amp;lt;init&amp;gt;&lt;br /&gt;
WARNING: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&lt;br /&gt;
Aug 27, 2014 2:27:31 PM un.kong.jim.document.Doc_ROKBattlePlan loadDocumentDetails&lt;br /&gt;
WARNING: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&lt;br /&gt;
Aug 27, 2014 2:27:31 PM org.compiere.acct.Doc isConvertible&lt;br /&gt;
WARNING: NOT from C_Currency_ID=195 to 100 - X_ROK_Battle_Plan[1000002]&lt;br /&gt;
Aug 27, 2014 2:27:31 PM un.kong.jim.document.Doc_ROKBattlePlan getBalance&lt;br /&gt;
WARNING: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&lt;br /&gt;
Aug 27, 2014 2:27:31 PM un.kong.jim.model.MROKBattlePlan getSummary&lt;br /&gt;
WARNING: ----------------------------------------------------------------------------------&lt;br /&gt;
Aug 27, 2014 2:27:31 PM un.kong.jim.model.MROKBattlePlan getProcessMsg&lt;br /&gt;
WARNING: ----------------------------------------------------------------------------------&lt;br /&gt;
Aug 27, 2014 2:27:31 PM un.kong.jim.model.MROKBattlePlan &amp;lt;init&amp;gt;&lt;br /&gt;
WARNING: ----------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
All you now have to do is to implement all the methods in your model/document. I would love to explain them step by step but unfortunately i am still very new to documents and i simply cant. So please, if there is somebody who has experience with it, tell the world how to do it. However, by taking a look at other document classes you should be able to find a way to get things working.&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
*Take a look at this to solve many parts of the model creation and utilities - [[Plugin:_Aladdin_Magic_Plugin]].&lt;br /&gt;
*A study on Workflow is given here - http://red1.org/adempiere/viewtopic.php?f=45&amp;amp;t=1801&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Plugin:_Wordpress_Soap_integration&amp;diff=18115</id>
		<title>Plugin: Wordpress Soap integration</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Plugin:_Wordpress_Soap_integration&amp;diff=18115"/>
		<updated>2021-02-13T14:51:18Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* '''Maintainer:''' [[User:habib.salhi]]&lt;br /&gt;
* '''License:''' [http://www.gnu.org/licenses/gpl-2.0.html GPLv2] - Free as in Freedom not Free Lunch&lt;br /&gt;
* '''Guide: installation''' [https://bitbucket.org/hsalhi77/wp-idempiere-soap/src/7f46523665a8af30dc145b1a1f0129de7519c0ba/01-installation.ogv?at=master]&lt;br /&gt;
* '''Guide: demo''' [https://bitbucket.org/hsalhi77/wp-idempiere-soap/src/7f46523665a8af30dc145b1a1f0129de7519c0ba/02-demo.ogv?at=master]&lt;br /&gt;
* '''Sources:''' [https://archive.softwareheritage.org/browse/origin/directory/?origin_url=https://bitbucket.org/hsalhi77/wp-idempiere-soap.git archive.softwareheritage.org]&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__ &lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
&lt;br /&gt;
With The increasing popularity of wordpress, I felt that many projects in iDempiere might benefit from having a little interaction with outside users, weather it be business partners logging in to view their orders or make new orders or any form of communication with the ERP organizations.&lt;br /&gt;
&lt;br /&gt;
This page will describe the process of creating the wordpress plugin that will connect to idempiere (SOAP as the communication protocol) and allow the below (functionality) interactions with wordpress site visitors.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
steps to implement&lt;br /&gt;
* download the project&lt;br /&gt;
&lt;br /&gt;
on idempiere (GardenWorld):&lt;br /&gt;
* Pack in the included webservices (9 no) from wp-idempiere-soap/PackIn&lt;br /&gt;
* for each one of the 9 imported webservice, go to &amp;quot;WebService Access&amp;quot; Tab add an access for Role &amp;quot;Web Service Execution&amp;quot;&lt;br /&gt;
* open Role Window, find the record &amp;quot;Web Service Execution&amp;quot; and check the box for &amp;quot;Access Advanced&amp;quot; - this is required to be able to add a record to &amp;quot;AD_User_Roles&amp;quot; Table as per our example&lt;br /&gt;
* add a role for the newly registered users we added role &amp;quot;External Partner User&amp;quot; (AD_Role_ID=1000000)&lt;br /&gt;
* add a Request Type &amp;quot;New User Notification&amp;quot; (R_RequestType_ID=1000000) and a Request Category &amp;quot;CRM Requests&amp;quot; (R_Category_ID=1000000)&lt;br /&gt;
&lt;br /&gt;
on wordpress:&lt;br /&gt;
* modify the file wp-idempiere-soap/includes/general-setting.php to adapt to your access settings (AD_Client_ID, AD_Role_ID, UserName, Password, serviceURL of your server, p_AD_Role_ID, p_R_RequestType_ID, p_R_Category_ID, p_SalesRep_ID) as per the included sample&lt;br /&gt;
* zip the project into wp-idempiere-soap.zip and import the plugin from wp-admin&lt;br /&gt;
* add a menu and the pages to the theme&lt;br /&gt;
&lt;br /&gt;
== Functionality Overview ==&lt;br /&gt;
&lt;br /&gt;
[puser-registration]&lt;br /&gt;
&lt;br /&gt;
Here user can register to become a user of a certain Business Partner, the script will run the following 3 webservice in a compositeOperation wp-compositeWrapper:&lt;br /&gt;
&lt;br /&gt;
* run wp-createUpdateUser webservice to add a new user to the chosen bPartner. The User will be locked and will have a random verification code assigned, awaiting verification&lt;br /&gt;
* run wp-AddUserRole and add the new user to a predefined Role&lt;br /&gt;
* run wp-userRQ and create a new request for the company CRM team to notify them of the new user registration and email the new user with their login credentials and a link to verify their login&lt;br /&gt;
&lt;br /&gt;
[user-verification]&lt;br /&gt;
&lt;br /&gt;
This page will be used by the user to verify his registration, typically they would have received an email with this format:&lt;br /&gt;
&lt;br /&gt;
http://siteurl/wordpress/index.php?username=newuser&amp;amp;code=fsd78dfs6df&lt;br /&gt;
&lt;br /&gt;
then do the following verification:&lt;br /&gt;
&lt;br /&gt;
* run the wp-queryUsers webservice to query the AD_User_ID from the passed username parameter and the EMailVerify Code in iDempiere to be compared with the code parameter&lt;br /&gt;
* if the EMailVerify matches the passed code then run the wp-VerifyUser webservice to set the EMailVerifyDate timestamp and IsLocked to N&lt;br /&gt;
&lt;br /&gt;
this will allow the user to login&lt;br /&gt;
&lt;br /&gt;
[user-login]&lt;br /&gt;
&lt;br /&gt;
This page has 2 forms&lt;br /&gt;
&lt;br /&gt;
* User login using the wp-queryUsers webservice&lt;br /&gt;
* reset of the password using the wp-compositeWrapper and that internally will run 2 webservices&lt;br /&gt;
&lt;br /&gt;
1. wp-createUpdateUser to change the user password with a random string&lt;br /&gt;
&lt;br /&gt;
2. wp-userRQ will create a request that will email the user the new password and alert the system admin of the change&lt;br /&gt;
&lt;br /&gt;
[user-profile]&lt;br /&gt;
&lt;br /&gt;
after a successful login, the user is directed to this page, which again has 2 forms&lt;br /&gt;
&lt;br /&gt;
1- view user profile using wp-queryUsers webservice&lt;br /&gt;
&lt;br /&gt;
2- Edit user profile using the wp-createUpdateUser&lt;br /&gt;
&lt;br /&gt;
[partner-orders]&lt;br /&gt;
&lt;br /&gt;
This page will display the order history for the Business partner and requires 2 steps:&lt;br /&gt;
&lt;br /&gt;
1- fetch the C_BPartner_ID of the logged in user by running the wp-queryUsers webService&lt;br /&gt;
&lt;br /&gt;
2- run the wp-queryOrders webService and display the history of orders of that user&lt;br /&gt;
&lt;br /&gt;
== Credits &amp;amp; Other Resources ==&lt;br /&gt;
&lt;br /&gt;
special thank to evenos Consulting GmbH (Jan Thielemann) for the great educational videos (link below) that jump started the project, I will highly recommend for anyone that wants to develop webservices in iDempiere&lt;br /&gt;
&lt;br /&gt;
Ameet Kumar Srivastava (amtsrivastava007@gmail.com) for doing all the php coding for the wordpress plugin&lt;br /&gt;
&lt;br /&gt;
My role in the project was initiating the idea for the plugin, all the base preparation in iDempiere, XML file on SmartBear (soupui), sponsoring, guiding and testing the implementation and documenting the open source project&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Available_Plugins]]&lt;br /&gt;
[[Category:Broken_Link_Bitbucket]]&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Swing_Maintenance_Team&amp;diff=18114</id>
		<title>Swing Maintenance Team</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Swing_Maintenance_Team&amp;diff=18114"/>
		<updated>2021-02-13T14:43:47Z</updated>

		<summary type="html">&lt;p&gt;Soundbytes: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is for everyone who wants to improve the Swing client. It was done in the weekly meeting of 2013-23-01. (There is a page about [[Comparison of Clients]] also.)&lt;br /&gt;
&lt;br /&gt;
Features that are worth a jira ticket and will be worked on can be collected as &amp;quot;blocking&amp;quot; on jira tracker [http://idempiere.atlassian.net/browse/IDEMPIERE-588 IDEMPIERE-588 Swing Client improvement].&lt;br /&gt;
&lt;br /&gt;
We began by collecting missing features:&lt;br /&gt;
&lt;br /&gt;
== missing features ==&lt;br /&gt;
* Start Info Windows from the menu tree&lt;br /&gt;
* WebStart ([http://idempiere.atlassian.net/browse/IDEMPIERE-591 IDEMPIERE-591])&lt;br /&gt;
* Toolbar is not configurable ([http://idempiere.atlassian.net/browse/IDEMPIERE-234 IDEMPIERE-234])&lt;br /&gt;
* List View Columns are not configurable&lt;br /&gt;
* http://wiki.idempiere.org/en/Swing_Client_Security&lt;br /&gt;
* form layout http://wiki.idempiere.org/en/NF001_FormLayout&lt;br /&gt;
: CarlosRuiz: that one is maybe the most important IMHO - because it is creating some duplicate effort to try to maintain both different approaches to position fields&lt;br /&gt;
* http://wiki.idempiere.org/en/NF001_QuickEntry&lt;br /&gt;
* http://wiki.idempiere.org/en/NF001_CustomWindowToolbarButton&lt;br /&gt;
* http://wiki.idempiere.org/en/NF001_ColumnToolbarButton&lt;br /&gt;
* &amp;lt;CarlosRuiz&amp;gt;active session and broadcast message (even if i have no idea on how to do it in swing) ([http://idempiere.atlassian.net/browse/IDEMPIERE-294 IDEMPIERE-294])&lt;br /&gt;
* &amp;lt;CarlosRuiz&amp;gt; - on the Welcome screen the Recent Items&lt;br /&gt;
* &amp;lt;CarlosRuiz&amp;gt; and the new portlets to show reports (not sure if this works on swing)&lt;br /&gt;
* &amp;lt;CarlosRuiz&amp;gt; - the little &amp;quot;new&amp;quot; icon in front of menu and favourites options&lt;br /&gt;
* &amp;lt;a42niem&amp;gt; and the calendar stuff&lt;br /&gt;
* &amp;lt;CarlosRuiz&amp;gt; - setup wizard form doesn't have swing counterpart&lt;br /&gt;
* &amp;lt;nmicoud&amp;gt; Print format wizard&lt;br /&gt;
* &amp;lt;CarlosRuiz&amp;gt; and the tab editor&lt;br /&gt;
* &amp;lt;CarlosRuiz&amp;gt; in zk we implemented some zoom functionality from the ending message of a process - or the process log ([http://idempiere.atlassian.net/browse/IDEMPIERE-370 IDEMPIERE-370 Implement link from process ending message to next records])&lt;br /&gt;
* &amp;lt;Deepak&amp;gt; We added link when process called from button generating a document. This link can be used to navigate to newly generated record&lt;br /&gt;
&lt;br /&gt;
* at the end of a process, ability to return to parameter panel&lt;br /&gt;
* Field group labels is not hidden when attached field is not displayed ([http://idempiere.atlassian.net/browse/IDEMPIERE-349 IDEMPIERE 349])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''in progress'''&lt;br /&gt;
** scroll wheel works in very small steps in Swing Client ([http://idempiere.atlassian.net/browse/IDEMPIERE-572 IDEMPIERE-572])&lt;br /&gt;
** Swing text areas break user flow when cycling focus with tab key ([http://idempiere.atlassian.net/browse/IDEMPIERE-573 IDEMPIERE-573])&lt;br /&gt;
** Swing AutoReducible ComboBox not reduced when used with cursor keys ([http://idempiere.atlassian.net/browse/IDEMPIERE-574 IDEMPIERE-574])&lt;br /&gt;
** Swing: Toolbar Button to start Process from button fields ([http://idempiere.atlassian.net/browse/IDEMPIERE-587 IDEMPIERE-587])&lt;br /&gt;
** Restricted items on Combobox ([http://idempiere.atlassian.net/browse/IDEMPIERE-90 IDEMPIERE-90])&lt;br /&gt;
** DocAction button is showing now just &amp;quot;Action&amp;quot; instead of the name of an action (part of [http://idempiere.atlassian.net/browse/IDEMPIERE-594 IDEMPIERE-594])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''done'''&lt;br /&gt;
** SaveAndCreate Button (raised by nmicoud but [https://bitbucket.org/idempiere/idempiere/commits/all/tip/keyword%28SaveAndCreate%29 done by hengsin]. ;-)&lt;br /&gt;
&lt;br /&gt;
= Ticketing and Peer Review Procedures =&lt;br /&gt;
&lt;br /&gt;
The Team consists of&lt;br /&gt;
* Nicolas Micoud&lt;br /&gt;
* Thomas Bayen&lt;br /&gt;
* Dirk Niemeyer&lt;br /&gt;
* ...you?&lt;br /&gt;
&lt;br /&gt;
=== Our workflow ===&lt;br /&gt;
&lt;br /&gt;
* everyone can write an issue into the above '''list of missing features'''&lt;br /&gt;
* everyone can create a '''JIRA ticket'''. A JIRA ticket means either that the issue is of special significance or that the reporter takes responsibility that someone work on this ticket. (We do not want to create a bunch of dead tickets that noone reads and resolves.)&lt;br /&gt;
* Every issue where the Swing Maintenance Team should be responsible becomes the following attributes:&lt;br /&gt;
: - Component '''&amp;quot;Swing Client&amp;quot;'''&lt;br /&gt;
: - Label '''&amp;quot;SwingUI&amp;quot;'''&lt;br /&gt;
: - Link the new issue as '''blocking to IDEMPIERE-588''' (Swing Client improvement)&lt;br /&gt;
* If one wants to work on an issue he sets himself as the Assignee. (Others may comment at any time or give code if they want.)&lt;br /&gt;
* If one really does work he sets the status to '''&amp;quot;Progress&amp;quot;'''. Others are aware to ask him before they do code on the same issue&lt;br /&gt;
* If the Assignee thinks his code is well done he changes status to '''&amp;quot;Peer Review&amp;quot;'''. He needs to give a link to his contribution in the comment.&lt;br /&gt;
* If one experienced member of the Swing Maintenance Team has reviewed he may reopen the ticket or mark it as resolved. This Team member includes the code into the iDempiere Swing Repository at https://bitbucket.org/tbayen/idempiere-swing&lt;br /&gt;
* If another Team member (not the Assignee and not the Reviewer) has done a second review he closes the issue. After 4 weeks (and noone else complaining) the issue may be closed by anyone who thinks it is solved.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The Swing Repository (BBP philosophy) ===&lt;br /&gt;
&lt;br /&gt;
'''At the moment the Swing repository is *very* outdated. I will re-synchonize it with the active trunk in the first half of december. Please stay tuned...'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Swing Repository can be found at https://bitbucket.org/tbayen/idempiere-swing .&lt;br /&gt;
&lt;br /&gt;
The first idea was to insert here peer reviewed code one patch after the other and do a pull request to the main idempiere repository from time to time. This did not work. Our peer review is not good enough to guarantee perfect quality. We can not use the same branch for our peer review (= possible unstable code) and for pull requests to the main trunk (= stable code). Often we see much more issues in our code if Carlos Ruiz or Heng Sin as Maintainers of the main Repository look onto it. But then it was not trivial to separate working patches from not working patches. We agreed that swing changes should stay in the swing directory. But half of our contributions affect other parts of idempiere so this separation is not easy possible. &lt;br /&gt;
&lt;br /&gt;
The solution is: We separate them all and create a new staging area. I call this BBP (Bayen's Best Practice). :-) See [[Mercurial Bayen Best Practice]] for more.&lt;br /&gt;
&lt;br /&gt;
[[Category:Broken_Link_Bitbucket]]&lt;/div&gt;</summary>
		<author><name>Soundbytes</name></author>
	</entry>
</feed>