I am using the following sage50 uk sdk code (v26.2.136.0) to create invoice.
//Declare Variables
SageDataObject250.SDOEngine oSDO = new SageDataObject250.SDOEngine();
SageDataObject250.WorkSpace oWS;
SageDataObject250.InvoicePost oInvoicePost;
SageDataObject250.InvoiceItem oInvoiceItem;
SageDataObject250.SalesRecord oSalesRecord;
SageDataObject250.StockRecord oStockRecord;
String szDataPath;
//Instantiate WorkSpace
oWS = (SageDataObject250.WorkSpace)oSDO.Workspaces.Add("Example");
//Show select company dialog
szDataPath = oSDO.SelectCompany("C:\\ProgramData\\Sage\\Accounts\\2020");
//Try a connection, will throw an exception if it fails
try
{
//Leaving the username and password blank generates a login dialog
oWS.Connect(szDataPath, "", "", "Example");
//Instantiate objects
oSalesRecord = (SageDataObject250.SalesRecord)oWS.CreateObject("SalesRecord");
oInvoicePost = (SageDataObject250.InvoicePost)oWS.CreateObject("InvoicePost");
oStockRecord = (SageDataObject250.StockRecord)oWS.CreateObject("StockRecord");
//Set the invoice type
oInvoicePost.Type = (SageDataObject250.InvoiceType)SageDataObject250.LedgerType.sdoLedgerInvoice;
//Read the first customer record and use to populate the invoice fields
oSalesRecord.MoveFirst();
SDOHelper.Write(oInvoicePost.Header, "ACCOUNT_REF", (String)SDOHelper.Read(oSalesRecord, "ACCOUNT_REF"));
SDOHelper.Write(oInvoicePost.Header, "NAME", (String)SDOHelper.Read(oSalesRecord, "NAME"));
SDOHelper.Write(oInvoicePost.Header, "ADDRESS_1", (String)SDOHelper.Read(oSalesRecord, "ADDRESS_1"));
SDOHelper.Write(oInvoicePost.Header, "ADDRESS_2", (String)SDOHelper.Read(oSalesRecord, "ADDRESS_2"));
SDOHelper.Write(oInvoicePost.Header, "ADDRESS_3", (String)SDOHelper.Read(oSalesRecord, "ADDRESS_3"));
SDOHelper.Write(oInvoicePost.Header, "ADDRESS_4", (String)SDOHelper.Read(oSalesRecord, "ADDRESS_4"));
SDOHelper.Write(oInvoicePost.Header, "ADDRESS_5", (String)SDOHelper.Read(oSalesRecord, "ADDRESS_5"));
SDOHelper.Write(oInvoicePost.Header, "DEL_ADDRESS_1", (String)SDOHelper.Read(oSalesRecord, "DEL_ADDRESS_1"));
SDOHelper.Write(oInvoicePost.Header, "DEL_ADDRESS_2", (String)SDOHelper.Read(oSalesRecord, "DEL_ADDRESS_2"));
SDOHelper.Write(oInvoicePost.Header, "DEL_ADDRESS_3", (String)SDOHelper.Read(oSalesRecord, "DEL_ADDRESS_3"));
SDOHelper.Write(oInvoicePost.Header, "DEL_ADDRESS_4", (String)SDOHelper.Read(oSalesRecord, "DEL_ADDRESS_4"));
SDOHelper.Write(oInvoicePost.Header, "DEL_ADDRESS_5", (String)SDOHelper.Read(oSalesRecord, "DEL_ADDRESS_5"));
SDOHelper.Write(oInvoicePost.Header, "CUST_TEL_NUMBER", (String)SDOHelper.Read(oSalesRecord, "TELEPHONE"));
SDOHelper.Write(oInvoicePost.Header, "CONTACT_NAME", (String)SDOHelper.Read(oSalesRecord, "CONTACT_NAME"));
SDOHelper.Write(oInvoicePost.Header, "GLOBAL_TAX_CODE", (Int16)SDOHelper.Read(oSalesRecord, "DEF_TAX_CODE"));
//Populate other invoice header information
SDOHelper.Write(oInvoicePost.Header, "INVOICE_DATE", (DateTime)DateTime.Today);
SDOHelper.Write(oInvoicePost.Header, "NOTES_1", (String)"Notes 1");
SDOHelper.Write(oInvoicePost.Header, "NOTES_2", (String)"Notes 2");
SDOHelper.Write(oInvoicePost.Header, "NOTES_3", (String)"Notes 3");
SDOHelper.Write(oInvoicePost.Header, "TAKEN_BY", (String)"Chris Reed");
SDOHelper.Write(oInvoicePost.Header, "ORDER_NUMBER", (String)"");
SDOHelper.Write(oInvoicePost.Header, "CUST_ORDER_NUMBER", (String)"");
SDOHelper.Write(oInvoicePost.Header, "PAYMENT_REF", (String)"");
// If anything is entered in the GLOBAL_NOM_CODE, all of the updated invoice’s splits will have this nominal code and
// also this willforce anything entered in the GLOBAL_DETAILS field into the all the splits details field.
SDOHelper.Write(oInvoicePost.Header, "GLOBAL_NOM_CODE", (String)"");
SDOHelper.Write(oInvoicePost.Header, "GLOBAL_DETAILS", (String)"");
SDOHelper.Write(oInvoicePost.Header, "INVOICE_TYPE_CODE",
(Byte)SageDataObject250.InvoiceType.sdoProductInvoice);
// Set the Net Value Discount values. If setting NVD the program logic will now recalculate
// the invoice Item values regardless of whether the TAX_FLAG is set on the item.
SDOHelper.Write(oInvoicePost.Header,"NETVALUE_DISCOUNT", (Double)10);
SDOHelper.Write(oInvoicePost.Header,"NETVALUE_DESCRIPTION", (String)"Discount offered");
//Create and invoice item
//Need to invoke the Add method
oInvoiceItem = (SageDataObject250.InvoiceItem)SDOHelper.Add(oInvoicePost.Items);
//Read the First Stock Code & populate fields from Stock Code
oStockRecord.MoveFirst();
SDOHelper.Write(oInvoiceItem, "STOCK_CODE", (String)SDOHelper.Read(oStockRecord, "STOCK_CODE"));
SDOHelper.Write(oInvoiceItem, "DESCRIPTION", (String)SDOHelper.Read(oStockRecord, "DESCRIPTION"));
SDOHelper.Write(oInvoiceItem, "NOMINAL_CODE", (String)SDOHelper.Read(oStockRecord, "NOMINAL_CODE"));
SDOHelper.Write(oInvoiceItem, "TAX_CODE", (Int16)SDOHelper.Read(oStockRecord, "TAX_CODE"));
//Populate other fields required for Invoice Item
//From 2015 the update method now wraps internal business logic
//that calculates the vat amount if a net amount is given.
//If you wish to calculate your own Tax values you will need
//to ensure that you set the TAX_FLAG to 1 and set the TAX_AMOUNT value on the item line
//***Note if a NVD is set the item line values will be recalculated
//regardless of the Tax_Flag being set to 1***
SDOHelper.Write(oInvoiceItem, "QTY_ORDER", (Int32)1);
SDOHelper.Write(oInvoiceItem, "UNIT_PRICE", (Int32)200);
SDOHelper.Write(oInvoiceItem, "NET_AMOUNT", (Int32)200);
SDOHelper.Write(oInvoiceItem, "FULL_NET_AMOUNT", (Int32)200);
SDOHelper.Write(oInvoiceItem, "COMMENT_1", (String)"Comment 1");
SDOHelper.Write(oInvoiceItem, "COMMENT_2", (String)"Comment 2");
SDOHelper.Write(oInvoiceItem, "UNIT_OF_SALE", (String)"");
SDOHelper.Write(oInvoiceItem, "FULL_NET_AMOUNT", (Int32)200);
SDOHelper.Write(oInvoiceItem, "TAX_RATE", (Int32)20);
//Update the invoice
if (oInvoicePost.Update())
{
MessageBox.Show("Invoice Posted Successfully", "C# SDO Examples");
}
else
{
MessageBox.Show("Failed to create Invoice", "C# SDO Examples");
}
//Disconnect
oWS.Disconnect();
}
catch (Exception ex)
{
MessageBox.Show("SDO Generated the Following Error: \n\n" + ex.Message, "Error!");
}
This create invoice perfectly but i don't know how to make the invoice's ledger update so that it could appear in the customer's list in sage 50.
An invoice can appear in the customer activity list when we update the ledger in the invoice list like in the following screen shot.