Monday, August 18, 2025

Create SalesTable (Header) and SalesLine (Line) in X++ D365FO

SalesTable   salesTable;

SalesLine    salesLine;

CustTable    custTable=  custTable::find("Test123"); // assume populated earlier

InventTable  inventTable; // assume populated earlier


// Generate SalesId using number sequence

NumberSeq num      = NumberSeq::newGetNum(NumberSeqReference::findReference(extendedTypeNum(ProArSalesId)));

SalesId   salesId  = num.num();


salesTable.initValue();

salesTable.SalesId      = salesId;  // Assign generated SalesId

num.used();                         // Mark number sequence as consumed


// Initialize header values from customer

salesTable.CustAccount  = custTable.AccountNum;

salesTable.initFromCustTable();


// Payment and currency settings

salesTable.PaymMode     = CustPaymModeTable::find("Test").PaymMode;

salesTable.CurrencyCode = 'USD';

salesTable.LanguageId   = '';


// Dates

salesTable.ShippingDateRequested = today();

salesTable.ReceiptDateRequested  = today();

salesTable.DeliveryDate          = salesTable.ShippingDateRequested;


// Intercompany fields

salesTable.InterCompanyOrder                 = NoYes::No;

salesTable.InterCompanyCompanyId             = '';

salesTable.InterCompanyAutoCreateOrders      = NoYes::No;

salesTable.InterCompanyDirectDelivery        = NoYes::No;

salesTable.InterCompanyAllowIndirectCreation = NoYes::No;


// Dimensions

salesTable.DefaultDimension = DimensionDefaultFacade::serviceMergeDefaultDimensions( 34556578437,custTable.DefaultDimension);

// Taxes

salesTable.TaxGroup = "";

// Source document header

SourceDocumentHeader sourceDocumentHeader;

sourceDocumentHeader.TypeEnumName     = enumStr(SourceDocument_ProductSale);

sourceDocumentHeader.TypeEnumValue    = SourceDocument_ProductSale::SalesOrder;

sourceDocumentHeader.AccountingStatus = SourceDocumentAccountingStatus::InProcess;

salesTable.SourceDocumentHeader = SourceDocumentHeader::createSourceDocumentHeader(tableNum(SalesTable),

                                      sourceDocumentHeader);

// Validate and insert SalesTable

if (salesTable.validateWrite())

{

    salesTable.insert();

}

// ----------------------------------------------------------------------

// Create SalesLine

// ----------------------------------------------------------------------


InventDim               inventDim, inventDimSales;

InventTableModule       salesTableModule        = InventTableModule::find(inventTable.ItemId, ModuleInventPurchSales::Sales);

InventItemOrderSetupMap inventItemOrderSetupMap = InventItemOrderSetupMap::findDefault(

                                                      inventTable.ItemId,

                                                      InventItemOrderSetupMap::module2SetupType(ModuleInventPurchSales::Sales));


// Build inventDim

inventDim.InventSiteId     = salesTableModule.inventSiteId()     ? salesTableModule.inventSiteId()     : inventItemOrderSetupMap.inventSiteId();

inventDim.InventLocationId = salesTableModule.inventLocationId() ? salesTableModule.inventLocationId() : inventItemOrderSetupMap.inventLocationId();

inventDimSales = InventDim::findOrCreate(inventDim);

salesLine.clear();

salesLine.initValue(salesTable.SalesType);

salesLine.initFromSalesTable(salesTable);


// Line-specific details

salesLine.TaxWithholdGroup = TaxWithholdGroupHeading::find("");

salesLine.ItemId           = inventTable.ItemId;

salesLine.Name             = InventTable::name(inventTable.ItemId);

salesLine.TaxItemGroup     = salesTableModule.TaxItemGroupId;


// Line number

salesLine.LineNum                    = SalesLine::lastLineNum(salesLine.SalesId) + 1.0;

salesLine.LineCreationSequenceNumber = real2int(salesLine.LineNum);


// InventTransId from number sequence

salesLine.InventTransId              = NumberSeq::newGetNum(InventParameters::numRefInventTransId()).num();


// Dimensions

salesLine.TaxWithholdItemGroupHeading_ = salesTableModule.TaxWithholdItemGroupHeading_TH;

salesLine.InventDimId                  = inventDimSales.InventDimId;

salesLine.SalesUnit                    = salesTableModule.UnitId;


// Barcode lookup

InventItemBarcode inventItemBarcode = InventItemBarcode::findSalesBarcodeDimension( salesLine.ItemId,

                                          salesLine.inventDim(), '',salesLine.SalesUnit);

if (inventItemBarcode.RecId)

{

    salesLine.BarCode     = inventItemBarcode.ItemBarCode;

    salesLine.BarCodeType = inventItemBarcode.BarcodeSetupId;

}

// Pricing and quantities

salesLine.PriceUnit         = salesTableModule.PriceUnit;

salesLine.SalesPrice        = 90;

salesLine.SalesQty          = 5;

salesLine.DefaultDimension  = DimensionDefaultFacade::serviceMergeDefaultDimensions(3466899223,

                                  custTable.DefaultDimension,inventTable.DefaultDimension);

salesLine.RemainSalesPhysical = salesLine.SalesQty;

salesLine.LineAmount          = salesLine.calcLineAmount();

salesLine.RevRecContractStartDate = today();

salesLine.TaxGroup            = '';

// Source document line

SourceDocumentLine sourceDocumentLine;

sourceDocumentLine.SourceDocumentHeader = salesLine.salesTable().SourceDocumentHeader;

sourceDocumentLine.TypeEnumName         = enumStr(SourceDocumentLine_ProductSale);

sourceDocumentLine.TypeEnumValue        = SourceDocumentLine_ProductSale::SalesOrderLine;

sourceDocumentLine.AccountingStatus     = SourceDocumentLineAccountingStatus::Draft;


// Insert SalesLine

ttsBegin;

salesLine.SourceDocumentLine = SourceDocumentLine::createSourceDocumentLine(tableNum(SalesLine),  sourceDocumentLine);

salesLine.doInsert();

ttsCommit;



Call API using x++ D365FO

 System.Net.HttpWebRequest    request; System.Net.HttpWebResponse   response; System.IO.Stream             dataStream; System.IO.StreamReade...