This will be a short post to cover the column mainline on the Transactionline table.
The main line of a transaction is a row on the TransactionLine table that contains certain information about the transaction. Each transaction has exactly one main line. We can check if a transaction line is the main line by checking the mainline column on the TransactionLine table.
If the transaction is a work order or an assembly build, the main line will contain the item being built. On some transactions that don’t have a main line item - such as a sales order, item fullfilment etc. - there will be a Transactionline row that has the mainline column set to true with a null item column.
The reason for NetSuite moving some info to the TransactionLine table is for certain accounting reasons. Specifically when NetSuite gets inventory, internally it is summing up the TransactionLine table and grouping by item (see SuiteQL: Inventory Detail).
So let’s imagine creating an assembly transaction. If we store the assembly item in the Transaction table, as we usually do with other transaction body fields, when NetSuite looks at the TransactionLine table it won’t see the line for the assembly item.
Let’s take a look at the TransactionLine rows for an Assembly:
1
2
3
4
5
6
7
8
9
10
11
SELECT
Transaction.tranid,
TransactionLine.mainline,
BUILTIN.DF(TransactionLine.item) AS item,
Transactionline.quantity
FROM Transaction
INNER JOIN
TransactionLine
ON TransactionLine.Transaction = Transaction.id
WHERE
Transaction.tranid = 'ASSYB123'
This returns:
| Tranid | Mainline | Item | Quantity |
|---|---|---|---|
| ASSYB123 | T | Table (Assembly) | 1 |
| ASSYB123 | F | Legs (Component) | -4 |
| ASSYB123 | F | Base (Component) | -1 |
| ASSYB123 | F | Screws (Component) | -10 |
As we can see the mainline row has the assembly item and the quantity is positive 1 because we are adding 1 assembly to inventory. The other rows are the components and the quantity is negative because we are removing the components from inventory (note that we will see a positive quantity in the UI).
Some fields on the TransactionLine main line row can be usefull even when we aren’t looking at the line data.
The field Transaction.location is marked as removed. The query SELECT Transaction.location FROM Transaction returns the following error:
1
Search error occurred: Field 'location' for record 'transaction' was not found. Reason: REMOVED - Field is removed
We can still get the location of a transaction by joining the main line row:
1
2
3
4
5
6
SELECT
Transaction.tranid,
TransactionLine.location,
FROM
Transaction inner join TransactionLine on TransactionLine.Transaction = Transaction.id
AND TransactionLine.mainline = 'T'
Now you will be able to get the location. Another field not found on the Transaction table is the “Created From” field usually found on the body of a transaction.
Again we can get this field by joining the main line row:
1
2
3
4
5
6
7
SELECT
Transaction.tranid,
TransactionLine.createdfrom,
FROM
Transaction inner join TransactionLine on TransactionLine.Transaction = Transaction.id
AND TransactionLine.mainline = 'T'
WHERE transaction.tranid = 'ASSYB123'
This will return the internal id of the work order that created this assembly. We can also use BUILTIN.DF to get the text representation as it shows in the UI:
1
2
3
4
5
6
7
SELECT
Transaction.tranid,
BUILTIN.DF(TransactionLine.createdfrom) AS createdfrom,
FROM
Transaction inner join TransactionLine on TransactionLine.Transaction = Transaction.id
AND TransactionLine.mainline = 'T'
WHERE transaction.tranid = 'ASSYB123'
This returns:
| Tranid | Createdfrom |
|---|---|
| ASSYB123 | Work Order #WO110 |
Note that
Work Order #WO110is not exactly thetranidof the work order which isWO110. Be careful when filtering.
The subsidiary column is also not accessible on the Transaction table.
The specific error when trying to access it is:
1
Search error occurred: Field 'subsidiary' for record 'transaction' was not found. Reason: NOT_EXPOSED - Field is marked as internal for channel SEARCH
Once again we can get this field by joining the main line row.
1
2
3
4
5
6
SELECT
Transaction.tranid,
TransactionLine.subsidiary,
FROM
Transaction inner join TransactionLine on TransactionLine.Transaction = Transaction.id
AND TransactionLine.mainline = 'T'
I hope this post was helpful.
For questions or comments, please leave a comment below or contact me at contact@netsuitediagnostics.com.