cancel
Showing results for 
Search instead for 
Did you mean: 

Errors when adding A/P Credit Memos in a Brazil Database

zach_hunter
Discoverer
0 Kudos

I'm trying to essentially create a cancellation document for some A/P down Payment Invoices by creating linked A/P Credit Memos. When I actually go to add the doc, its fails with the error:

[RPC1.CSTfIPI][line: 1] , 'Linked value 03 does not exist'

Even if I manually fill the 'CST for IPI' field with a value I know is valid it still continues to throw that error. I'm rather lost at what the problem could be.

Here is the code as I'm using it:

        private void CancelInvoice(string Invoice)
        {
            SAPbobsCOM.Documents oMemo;
            SAPbobsCOM.Recordset oRSHeader;
            SAPbobsCOM.Recordset oRSLines;


            for (int i = 0; i < Invoices.Count; i++)
            {
                oMemo = Globals.oApplication.Company.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oPurchaseCreditNotes);
                oRSHeader = Globals.oApplication.Company.GetBusinessObject(SAPbobsCOM.BoObjectTypes.BoRecordset);
                oRSLines = Globals.oApplication.Company.GetBusinessObject(SAPbobsCOM.BoObjectTypes.BoRecordset);


                Query = "SELECT ";
                Query += "T0.DocEntry, ";
                Query += "T0.CardCode, ";
                Query += "T0.NumAtCard, ";
                Query += "T0.BPLId, ";
                Query += "T0.DocCur, ";
                Query += "T0.DocRate, ";
                Query += "T1.MainUsage ";
                Query += "FROM ODPO T0 ";
                Query += "JOIN DPO12 T1 ON T0.DocEntry = T1.DocEntry ";
                Query += "WHERE DocNum = '" + Invoice + "'";
                oRSHeader.DoQuery(Query);


                // Add Header detail.
                oMemo.CardCode = oRSHeader.Fields.Item("CardCode").Value;
                oMemo.NumAtCard = oRSHeader.Fields.Item("NumAtCard").Value;
                oMemo.DocDueDate = DateTime.Today;
                oMemo.BPL_IDAssignedToInvoice = oRSHeader.Fields.Item("BPLId").Value;
                oMemo.DocCurrency = oRSHeader.Fields.Item("DocCur").Value;
                oMemo.DocRate = oRSHeader.Fields.Item("DocRate").Value;
                oMemo.TaxExtension.MainUsage = oRSHeader.Fields.Item("MainUsage").Value;
                oMemo.Comments = "Based On A/P Down Payment " + Invoice + ".";


                // Get the DP Invoices line information.
                Query = "SELECT ";
                Query += "ItemCode, ";
                Query += "Quantity, ";
                Query += "Price, ";
                Query += "Usage, ";
                Query += "WhsCode, ";
                Query += "LineNum ";
                Query += "FROM DPO1 ";
                Query += "WHERE DocEntry = '" + oRSHeader.Fields.Item("DocEntry").Value + "'";
                oRSLines.DoQuery(Query);


                for (int j = 0; j < oRSLines.RecordCount; j++)
                {
                    //// Adds line detail and ties the Return to the GRPO.
                    oMemo.Lines.BaseEntry = Convert.ToInt32(oRSHeader.Fields.Item("DocEntry").Value);
                    oMemo.Lines.BaseLine = oRSLines.Fields.Item("LineNum").Value;
                    oMemo.Lines.BaseType = 204;
                    oMemo.Lines.Quantity = oRSLines.Fields.Item("Quantity").Value;
                    oMemo.Lines.CSTforIPI = "53";

                    oMemo.Lines.Add();

                    oRSLines.MoveNext();
                }


                if (oMemo.Add() != 0)
                {
                    throw new Exception(Globals.oApplication.Company.GetLastErrorDescription());
                }

                // Clean up the Objects for next run.
                System.Runtime.InteropServices.Marshal.ReleaseComObject(oMemo);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(oRSHeader);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(oRSLines);
                oMemo = null;
                oRSHeader = null;
                oRSLines = null;
            }
        

Accepted Solutions (1)

Accepted Solutions (1)

former_member185682
Active Contributor
0 Kudos

Hi Zach,

Based in your scenario and code, I wrote this sample code. Execute this in your database and check if it works. (I did run on SBODemoBR database, the demo database for Brazil and works fine).

Change the hard coded values by valid values in your database.

        private void CreateCancelAPDownPayment()
        {
            if (oCompany == null || !oCompany.Connected)
                this.connect();


            try
            {
                Documents oPchDowPay = oCompany.GetBusinessObject(BoObjectTypes.oPurchaseDownPayments);
                oPchDowPay.CardCode = "V10000"; //Change this
                oPchDowPay.DocDate = DateTime.Now;
                oPchDowPay.DownPaymentType = DownPaymentTypeEnum.dptInvoice;


                oPchDowPay.Lines.ItemCode = "A00002";//Change this
                oPchDowPay.Lines.Quantity = 2;
                oPchDowPay.Lines.Add();
                oPchDowPay.Lines.ItemCode = "A00004";//Change this
                oPchDowPay.Lines.Quantity = 1;


                int docEntry = 0;
                if(oPchDowPay.Add() != 0)
                {
                    throw new Exception(oCompany.GetLastErrorDescription());
                }
                else
                {
                    docEntry = Convert.ToInt32(oCompany.GetNewObjectKey());
                    CancelPurchaseDownPayments(docEntry);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


        private void CancelPurchaseDownPayments(int docEntry)
        {
            Documents oMemo = null;
            Recordset oRSHeader = null;
            Recordset oRSLines = null;


            try
            {
                oMemo = oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oPurchaseCreditNotes);
                oRSHeader = oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.BoRecordset);
                oRSLines = oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.BoRecordset);
                
                string query = @"SELECT 
                                    T0.DocEntry,
                                    T0.DocNum,
                                    T0.CardCode,
                                    T0.NumAtCard,
                                    T0.BPLId,
                                    T0.DocCur,
                                    T0.DocRate,
                                    T1.MainUsage
                                FROM 
                                    ODPO T0
                                    JOIN DPO12 T1 ON T0.DocEntry = T1.DocEntry 
                                WHERE 
                                    T0.DocEntry = {0}";
                query = string.Format(query, docEntry);
                oRSHeader.DoQuery(query);


                oMemo.CardCode = oRSHeader.Fields.Item("CardCode").Value;
                oMemo.NumAtCard = oRSHeader.Fields.Item("NumAtCard").Value;
                oMemo.DocDueDate = DateTime.Today;
                oMemo.BPL_IDAssignedToInvoice = oRSHeader.Fields.Item("BPLId").Value;
                oMemo.DocCurrency = oRSHeader.Fields.Item("DocCur").Value;
                oMemo.DocRate = oRSHeader.Fields.Item("DocRate").Value;
                //I commented this line, because the main usage in my sample code returns 0
                //oMemo.TaxExtension.MainUsage = oRSHeader.Fields.Item("MainUsage").Value;
                oMemo.Comments = "Based On A/P Down Payment " + oRSHeader.Fields.Item("DocNum").Value + ".";


                // Get the DP Invoices line information.
                query = @"  SELECT
                                ItemCode,
                                Quantity,
                                Price,
                                Usage,
                                WhsCode,
                                LineNum
                            FROM 
                                DPO1
                            WHERE 
                            DocEntry = {0}";
                query = string.Format(query, docEntry);
                oRSLines.DoQuery(query);


                for (int j = 0; j < oRSLines.RecordCount; j++)
                {
                    //// Adds line detail and ties the Return to the GRPO.
                    oMemo.Lines.BaseEntry = Convert.ToInt32(oRSHeader.Fields.Item("DocEntry").Value);
                    oMemo.Lines.BaseLine = oRSLines.Fields.Item("LineNum").Value;
                    oMemo.Lines.BaseType = (int)BoObjectTypes.oPurchaseDownPayments;
                    //Valid CFOP for me
                    oMemo.Lines.CFOPCode = "5202";//Change this


                    oMemo.Lines.Add();


                    oRSLines.MoveNext();
                }


                if (oMemo.Add() != 0)
                {
                    throw new Exception(oCompany.GetLastErrorDescription());
                }
            }
            catch(Exception ex)
            {
                throw ex;
            }
            finally
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(oMemo);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(oRSHeader);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(oRSLines);
                oMemo = null;
                oRSHeader = null;
                oRSLines = null;
            }
        }

Hope it helps,

Kind Regards,

Diego Lother

Answers (2)

Answers (2)

zach_hunter
Discoverer
0 Kudos

Hi Diego,

I ran your code and it seems if I create the DP Invoice using the code, or manually, then the credit memo works, but it still gives the same error if I run it on a DP invoice already in the Test DB (which was copied directly from a instance of production). Although I think I found the issue. Most of these DP invoice are posted from a integrated system, which is putting in values for the CSTfIPI, CSTfPIS, CSTfCOFINS on the DP Invoice Lines. In the Invoice generated manually or from the code above these DB value for those fields are NULL. If the DB values are NULL it doesn't have a problem generating a Credit Memo, if they have values, it does. You can see this in the attached picture, the DocEntry #3932 is the one that was generated by the integrated system and the DocEntry #3975 is the one generated by code above and didn't have a problem. Its also where I think the '03' in the error message is coming from.

It looks like there really isn't a way to work around this so I'll have to look at other approaches. Thanks for your help!

former_member185682
Active Contributor
0 Kudos

Hi Zach,

Try the following:

Fill the TaxCode property at the line level of your document. The TaxCode will be provide the information for CSTforIPI automatically. Probably your CSTforIPI that you provided doesn't match with the CSTforIPI of the TaxCode. After this, propably you will receive a message of invalid CFOPCode if this was not provided at the line of your A/P down Payment Invoice.

Hope it helps.

Kind Regards,

Diego Lother

zach_hunter
Discoverer
0 Kudos

Thanks Diego for the suggestion, but is doesn't seem to work. I generated (but didn't add) a Copy-To -> A/P Credit Memo document from my test DP Invoice, took the values that B1 set, and set the TaxCode (then on later runs the CFOP Code and the CSTforIPI Code) in the code. Still got the same error. I'm thinking either I'm still missing some other reference field I have to fill or when B1 does the auto generation from the BaseEntry, BaseType and BaseLine its overwriting what I put.

I would leave the BaseEntry, Type and Line empty and not tie the CM to the Invoice but if I do it asks to select batches (which the Invoice doesn't have). I seem to be stuck either way.

Thanks again.