Data from Multiple Data Sources: General Information
In most cases, you want generic inquiry forms to give users the ability to review the data of some entity along with the data from other related entities. For example, suppose that you are creating a generic inquiry that lists open sales orders by customer. To build such an inquiry, you need to combine data from two data access classes (DACs): one that holds information about sales orders, and another that holds information about customers. For details on data access classes, which are referred to as tables on the user interface of the Generic Inquiry (SM208000) form, see DAC Discovery: General Information.
You can use other generic inquiries as data sources, or have both DACs and inquiries as data sources for an inquiry, and combine then into query by setting relations between the sources. For details on using generic inquiries as data sources, see Data from Multiple Data Sources: Use of Generic Inquiry as Data Source.
Learning Objectives
In this chapter, you will learn how to construct a data request to retrieve data from multiple data access classes.
Applicable Scenarios
You may find the information in this chapter useful when you are responsible for the customization of MYOB Acumatica in your company, including developing and modifying generic inquiries to give users information they need to do their jobs. You need to deliver different inquiries that your colleagues may need to perform their jobs effectively. Many of these inquiries require the retrieval of data from multiple related data access classes.
Construction of a Data Request from Multiple Tables
You start from inspecting the related forms (that is, the data entry forms of the data you will use) to determine the list of data access classes and fields you need to have in the results grid and use in formulas.
After the list of the tables is prepared, you determine how the tables will relate to each other (parent-child pairs) and what join type the system should use. Thus, you define how the system returns combined records in case either a parent or a child table is missing a record to combine.
Then for each pair you map a field from the parent table to the corresponding field from the child table. Thus, you define how the system will combine the records of the paired tables—that is, join conditions in SQL terms.
We recommend using the Related Tables dialog box to simplify configuration of relations between the tables. If the system offers you multiple suggestions on how a pair of tables can be linked, you can read detailed information about the tables and their fields in the DAC Schema Browser.
You can construct a data request manually (or you can change automatically configured settings) by using the instructions for the manual procedure. For more information, see Data from Multiple Data Sources: Discovery of Key Fields.
Definition of Relations Between Data Sources
After you have determined all the data sources you need for your inquiry, you need to decide how you will pair the sources and in what order you will list the pairs.
For each pair you determine which source is considered the parent table and which is the
child one. Usually, the parent table is the one that provides the primary data and the child
table provides additional information. For example, for an inquiry that lists sales orders
by customers, you specify SOOrder
as the parent table, because the primary
data that the inquiry is displaying is provided by the SOOrder
class. The
Customer
class provides additional information, so you select it as the
child table.
The order in which you add the pairs to the system determines the sequence in which the system will retrieve the data. First, the system retrieves and combines data for the first pair of the sources to the single table. Then, the system adds up to this constructed table the data retrieved and combined from the next pair of the sources until there are no more pairs.
Selection of a Join Type
After you have decided which data source is considered the parent table and which is the child one, you decide on a type of join for these sources. In MYOB Acumatica you can use one of the following join types:
- Inner: An Inner join creates a result by combining the records of the
parent and child tables when there is at least one match in both tables (see the figure
below). For example, suppose that for an inquiry that lists open sales orders by
customers, you join
SOOrder
andCustomer
with an Inner join. The system will return only those open sales orders (fromSOOrder
) for which there are customer records in theCustomer
table. The system will not display customers who do not have open sales orders. - Left: A Left join returns all the records from the parent table combined
with any matching records of the child table (see the figure below). For example, suppose
that for an inquiry that lists open sales orders by customers, you join
SOOrder
(the parent table) andCustomer
(the child table) with the Left join. The system returns all open sales orders. For an open sales order for which the customer record was not found, the system returns an empty value in the column with customer information. - Right: A Right join returns all the records from the child table combined
with any matching records from the parent table (see the figure below). For example,
suppose that for an inquiry that lists open sales orders by customers, you join
SOOrder
(parent table) andCustomer
(child table) with the Right join. The system will return all customers. For a customer for which a sales order record was not found, the system returns an empty value in the column with sales order information. - Full: A Full join returns all the records from both the parent table and
the child table when there is a match in a parent or child table record (see the figure
below). For example, suppose that for an inquiry that lists open sales orders by
customers, you join
SOOrder
andCustomer
with a Full join. The system will return all open sales orders (fromSOOrder
) and all customers (from theCustomer
table). A Full join can return a huge number of records. - Cross: A Cross join returns each record from the parent table combined with each record from the child table. Thus, the number of records in the result set is the number of records in the parent table multiplied by the number of records in the child table (see the figure below). Unlike the Inner, Left, Right, and Full join, the Cross join does not require a joining condition.
Definition of Join Conditions
After you have specified how the system should return combined records, you need to specify what data needs to be combined. To link the parent and child tables, you should specify the fields and conditions to link.
For example, suppose that for an inquiry that lists open sales orders by customers, you
joined SOOrder
as the parent table and Customer
as the
child table (the type of join does not matter for linking fields). This means that the
system should combine the records of these two tables by adding data from the child table to
the parent one. The child table provides customer details, so you should indicate to the
system that the data of the particular customer needs to be joined with the data of
particular open sales order of this customer. To do this, you add the link that indicates to
the system that the customerID
field from the SOOrder
table equals the BAccountID field from the Customer
table. The BAccountID
field is a key field in the Customer
table. The system finds an open sales order, identifies the value of the
customerID
field, and searches for the same value in the
BAccountID
column of the Customer
table. When the
customer record is found, the system combines these two records into one and proceeds to the
next open sales order. The following screenshot shows the SOOrder
and
Customer
tables and the result of their combination.
You can link the same two tables using different join conditions. The join conditions you
specify should be determined by the result that you need to receive. For example, you
establish a relation between the Users
(parent) and
CRActivity
(child) tables. You can use the PKID field for the
Users
table and one of the CreatedByID and LastModifiedByID
fields in the CRActivity
table.
If you are designing a generic inquiry to get data about users who created records in the
CRActivity
table, you link the PKID field with the Equal
condition to the CreatedByID field.
If you are designing a generic inquiry to get data about users who modified records in the
CRActivity
table, you link the PKID field with the Equal
condition to the LastModifiedByID field.