Get PurchaseOrder and Lineitems

SOLVED

How to get PurchaseOrderNo using PurchaseOrder Details & LineItems data from Sage 100 desktop application using C#?

I have using DispatchObject and done login and select company functionality.

Can you please help me to get PO detail using C#?

  • +1
    verified answer

    You may want to try searching for examples on here. Most scripting for sage 100 is done in VBScript but there are a few examples for other languages.

    I found this post which should give you the bulk of what needs done.

    https://www.sagecity.com/support_communities/sage100_erp/f/sage-100-business-object-interface/90544/c-po-write-fails-boi/297653#297653

    Since you want the line item data, you can't use the PO_PurchaseOrder_Svc class, instead, you will have to use PO_PurchaseOrder_Bus so you can access the oLines property which is the object handle to the PO_PurchaseOrderDetail_Bus class which will allow you to loop through the lines in a similar fashion to looping through an ADO recordset.

    When you use nSetKey on the header (PO_PurchaseOrder_Bus), it should filter the detail (PO_PurchaseOrderDetail_Bus) to only loop through the respective purchase order line's vs every line in the table.

    Alternatively, you can query the data via ODBC and loop through the resulting recordset. You would query data either individually from PO_PurchaseOrderHeader and PO_PurchaseOrderDetail or if you are going to join the tables into one query, use an INNER JOIN on the PurchaseOrderNo field.

  • 0
    SUGGESTED

    Do you need to write back to Sage 100?  If not, ODBC may be easier.

  • 0 in reply to Kevin M

    can you please share the ODBC example?

  • +1 in reply to rajeshkannanait
    verified answer

    This is a VBScript example, but I assume you can translate the concept to C#.  (SOTAMAS90 is a user DSN created when logging in to Sage 100... the user / password / company code are set higher in the script, as are the Div / Vendor values).

    None of this is specific to Sage 100, except for the connection string is the syntax for the Providex ODBC driver, so you should be able to Google to find C# examples of ODBC queries.

        strConn = "DSN=SOTAMAS90;UID=" & sSageUser & ";PWD=" & sSagePassword & ";company=" & sSageCompanyCode

        Set DBConn = CreateObject("ADODB.Connection")
        DBConn.open strConn    
        sSelect = "SELECT CheckEntryNo FROM AP_CheckHeader WHERE APDivisionNo= '" & sAPDiv & "' " & "AND VendorNo = '" & sVendor & "' "
        Set ReturnSet = CreateObject("ADODB.RecordSet")
        ReturnSet.Open sSelect, DBConn
        do until ReturnSet.EoF
           ...
           ReturnSet.MoveNext
        loop
        ReturnSet.Close
        DBConn.Close

  • 0 in reply to David Speck

               using (DispatchObject poObject = new DispatchObject(pvx.InvokeMethod("NewObject", "PO_PurchaseOrder_bus", oSS.GetObject())))
                {
    
                    poObject.InvokeMethod("nMoveFirst");
                    int sEOF = (int)poObject.GetProperty("nEOF");
                    do
                    {
                        var purchaseOrder = new PurchaseOrder();
                        purchaseOrder.PurchaseOrderNo = poObject.GetDataObject("PurchaseOrderNo$");
                        purchaseOrder.OrderDate = TextUtilities.ConvertDate(poObject.GetDataObject("PurchaseOrderDate$"));
    
                        using (DispatchObject po_line = new DispatchObject(poObject.GetProperty("oLines")))
                        {
                            po_line.InvokeMethod("nMoveFirst");
                            int EOF = (int)po_line.GetProperty("nEOF");
                            do
                            {
                                   var item = new LineItem
                                    {
                                        ItemCode = po_line.GetDataObject("ItemCode$"),
                                        Description = po_line.GetDataObject("ItemCodeDesc$"),
                                        UPC = po_line.GetDataObject("UnitOfMeasure$"),
                                        MFGCode = po_line.GetDataObject("PurchasesAcctKey$"),
                                        Quantity = TextUtilities.ConvertInt(po_line.GetDataObject("QuantityOrdered$")),
                                        QuantityShipped = TextUtilities.ConvertInt(po_line.GetDataObject("QuantityReceived$"))
                                    };
    
                                    purchaseOrder.AddLine(item);
    
                                po_line.InvokeMethod("nMoveNext");
                                EOF = (int)po_line.GetProperty("nEOF");
    
                            } while (EOF != 1);
                        }
    
                        purchaseOrderList.Add(purchaseOrder);
    
                        poObject.InvokeMethod("nMoveNext");
                        sEOF = (int)poObject.GetProperty("nEOF");
    
                    } while (sEOF != 1);
                }
    
    
    


    I have got the purchase order and line items data.


    And I have used the keyword "QuantityOrdered" to get the quantity data and unit price. But I didn't get it.

    I need to get item full data (see below image).

    Can you please help me?


  • +1 in reply to rajeshkannanait
    verified answer

    No $ for numeric fields.  Use QuantityOrdered not QuantityOrdered$.

  • +1 in reply to Kevin M
    verified answer

    Also, since i don't know C# syntax, i don't know for sure but i don't recognize your use of of the GetDataObject method on the sage BOI objects.

    If I recall seeing other C# examples, they combine the C# InvokeMethod with the BOI object's GetValue method, the latter accepts two arguments, the first being the field name (add the "$" suffix for string fields only) and the variable you want to receive the value in.

    It would probably help to search the forum for more C# examples for other purposes and objects besides purchase orders so you can see a broader range of typical use.

  • 0 in reply to Kevin M

    Thanks for the clarification Kevin.

  • 0 in reply to rajeshkannanait

    How to get an Invoice and Line Item details? 

    Can you please share the code or share the line item keywords?

    I did get the Invoice No, Date and Shipping Address but I can not fetch the Line Items details?

    One more thing, I have also got the PO & SO detail and Line Items details, but I am struggling in Invoice Line Items.

    Can you please help me?

     oSS.InvokeMethod("nSetDate", "S/O", DateTime.Now.ToString("yyyyMMdd"));
                oSS.InvokeMethod("nSetModule", "S/O");
    
                int TaskID = (int)oSS.InvokeMethod("nLookupTask", "SO_Invoice_ui");
                int setProgramTest = (int)oSS.InvokeMethod("nSetProgram", TaskID);
    
                //we create two lists to store the line keys and quantities in.
                List<Invoice> invoiceList = new List<Invoice>();
    
                using (DispatchObject soObject = new DispatchObject(pvx.InvokeMethod("NewObject", "SO_Invoice_bus", oSS.GetObject())))
                {
                    soObject.InvokeMethod("nMoveFirst");
                    int sEOF = (int)soObject.GetProperty("nEOF");
                    do
                    {
                        var invoiceNo = soObject.GetDataObject("InvoiceNo$");
    
                        var invoice = new Invoice();
                        invoice.InvoiceNo = invoiceNo;
                        invoice.ShipToAddress1 = soObject.GetDataObject("ShipToAddress1$");
                        invoice.OrderDate = TextUtilities.ConvertDate(soObject.GetDataObject("InvoiceDate$"));
    
                        using (DispatchObject so_line = new DispatchObject(soObject.GetProperty("oLines")))
                        {
                            so_line.InvokeMethod("nMoveFirst");
                            int EOF = (int)so_line.GetProperty("nEOF");
                            do
                            {
                                var ItemCode = so_line.GetDataObject("ItemCode$");