Creating purchase orders from code is one of the many
things that are required when building custom functionality. Normally,
the user selects only a few bits of information like vendor account,
item number, delivery date, etc. and the rest is created by the system.
It is also possible that purchase orders may be created as part of some
process in custom modules.
In this recipe, we will
learn how to create a purchase order from X++ code. We will use a
standard method provided by the application.
How to do it...
1. In AOT, create a new class called PurchaseOrderCreate with the following code:
class PurchaseOrderCreate
{
}
public static void main(Args _args)
{
NumberSeq numberSeq;
PurchTable purchTable;
PurchLine purchLine;
;
ttsbegin;
numberSeq = NumberSeq::newGetNumFromCode(
PurchParameters::numRefPurchId().numberSequence,
true);
purchTable.PurchId = numberSeq.num();
purchTable.initValue();
purchTable.initFromVendTable(VendTable::find('1001'));
if (!purchTable.validateWrite())
{
throw Exception::Error;
}
purchTable.insert();
purchLine.PurchId = purchTable.PurchId;
purchLine.ItemId = '1205';
purchLine.createLine(true, true, true, true, true, true);
ttscommit;
}
2. Run the class to create a new purchase order.
3. Open Accounts payable | Purchase Order Details to view the created purchase order:
How it works...
First we create a new class, which will run our code using its main(). Here we place all the code into a ttsbegin/ttscommit pair to make sure everything is rolled back if something goes wrong.
The method starts with generating the next number for a new purchase order.
Next, we call initValue() and initFromVendTable() to initialize various purchTable fields. Normally, the argument of initFromVendTable()
should come from a user selection screen or other source. For
demonstration purposes, here we simply use the first vendor number from
the list.
If we pass validation of validateWrite() successfully, we create a purchase order header by calling purchTable.insert().
The next thing to do is to
create purchase order lines. Here we need minimal information. First, we
assign a purchase order number and then we set the item number. As
previously the item number should come from user input or some other
source. For demonstration purposes, we use item 1205 from the inventory list.
And finally, we call createLine() on the purchLine
table to create a line. This method could be called a number of times
depending on the number lines that need to be created. This method
accepts a number of optional boolean arguments:
Perform data validations before saving? The default is false.
Initialize from PurchTable table? The default is false.
Initialize from InventTable table? The default is false.
Calculate inventory quantity? The default is false.
Add miscellaneous charges? The default is true.
Use trade agreements to calculate item price? The default is false.