问题
I need to import value of Amount Paid using webservices to Acumatica ERP System. Please refer to this screenshot below.
I have already create some codes using Reference Number = "1700000016", DocType = "Bill", VendorRef = "SV-889-JKT-2", VendorID = "V000000030" and Amount Paid = "1,250,000". Please refer to this codes below.
sCon.getLogin(username, password, url, context);
AP301000Content konten = context.AP301000GetSchema();
//context.AP301000Clear();
List<Command> oCmds = new List<Command>();
//oCmds.Add(konten.Actions.Insert);
//--------------- adding header transaction -----------------//
konten.DocumentSummary.Type.Commit = false;
konten.DocumentSummary.Type.LinkedCommand = null;
oCmds.Add(new Value { LinkedCommand = konten.DocumentSummary.Type, Value = "Bill" });
oCmds.Add(new Value { LinkedCommand = konten.DocumentSummary.ReferenceNbr, Value = "0000" });
oCmds.Add(new Value { LinkedCommand = konten.DocumentSummary.Date, Value = dtDateSV.Text });
oCmds.Add(new Value { LinkedCommand = konten.DocumentSummary.VendorRef, Value = "SV-889-JKT-2" });
oCmds.Add(new Value { LinkedCommand = konten.DocumentSummary.Vendor, Value = "V000000030" });
//-------------- adding detail transaction (Based on values in Data Grid )-------------
int a = dgvDocDetailSV.Rows.Count;
for (int x = 0; x < a; x++)
{
oCmds.Add(konten.DocumentDetails.ServiceCommands.NewRow);
oCmds.Add(new Value { LinkedCommand = konten.DocumentDetails.Branch, Value = dgvDocDetailSV.Rows[x].Cells[1].Value.ToString() });
oCmds.Add(new Value { LinkedCommand = konten.DocumentDetails.InventoryID, Value = dgvDocDetailSV.Rows[x].Cells[2].Value.ToString() });
oCmds.Add(new Value { LinkedCommand = konten.DocumentDetails.JobOrderNbr, Value = dgvDocDetailSV.Rows[x].Cells[3].Value.ToString() });
oCmds.Add(new Value { LinkedCommand = konten.DocumentDetails.Quantity, Value = dgvDocDetailSV.Rows[x].Cells[4].Value.ToString() });
oCmds.Add(new Value { LinkedCommand = konten.DocumentDetails.UOM, Value = dgvDocDetailSV.Rows[x].Cells[5].Value.ToString() });
oCmds.Add(new Value { LinkedCommand = konten.DocumentDetails.UnitCost, Value = dgvDocDetailSV.Rows[x].Cells[6].Value.ToString() });
}
//------ add document in Applications Tab Menu -------//
string DocTypePrepayment = "Prepayment";
string RefNbrPrepayment = "1700000015";
oCmds.Add(new Key
{
ObjectName = konten.Applications.DocTypeDisplayDocType.ObjectName,
FieldName = konten.Applications.DocTypeDisplayDocType.FieldName,
Value = DocTypePrepayment
});
oCmds.Add(new Key
{
ObjectName = konten.Applications.ReferenceNbrDisplayRefNbr.ObjectName,
FieldName = konten.Applications.ReferenceNbrDisplayRefNbr.FieldName,
Value = RefNbrPrepayment
});
oCmds.Add(new Value { LinkedCommand = konten.Applications.AmountPaid, Value = "1250000" });
//------ save transaction in acumatica -------//
oCmds.Add(konten.Actions.Save);
var result = context.AP301000Submit(oCmds.ToArray());
I have an error message after trying to import this data. The error message is "System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> PX.Data.PXException: Error #111: An error occurred while processing the field CuryAdjdAmt : Object reference not set to an instance of an object.. ---> System.NullReferenceException: Object reference not set to an instance of an object. ". It seems that field CuryAdjdAmt is null, and this field is mapped to AmountPaid field in Application Menu Tab of Acumatica System.
Please give me reference to solve this issue. Thanks
回答1:
Looks like there is an issue with Adjustments data view delegate caused by performance improvements we made for the Bills and Adjustments screen about a year ago. I've forwarded all details to Acumatica engineering team for further investigation.
As a temporary workaround you can implement an extension for the APInvoiceEntry BLC and slightly change delegate of the Adjustments data view:
public class APInvoiceEntryExt : PXGraphExtension<APInvoiceEntry>
{
[PXCopyPasteHiddenView]
public PXSelectJoin<APAdjust,
InnerJoin<APPayment, On<APPayment.docType, Equal<APAdjust.adjgDocType>,
And<APPayment.refNbr, Equal<APAdjust.adjgRefNbr>>>>> Adjustments;
public IEnumerable adjustments()
{
IEnumerable result;
bool origIsImport = Base.IsImport;
Base.IsImport = false;
try
{
result = Base.Adjustments.Select();
}
finally
{
Base.IsImport = origIsImport;
}
return result;
}
}
With the temporary workaround applied, I was able to update AmountPaid field with following set of commands. Given the level of complexity put into the Adjustments data view (as it has to work with both records retrieved from database and created at runtime), you have to use RowNumber service command when there are more than 1 document in the Applications tab (Screen-Based API commands of the Key type unfortunately will not work to locate record in the Applications tab).
The sample below will send 2 requests to Acumatica API: - 1st call to export all records from the Applications tab - by looping though returned array, you can determine what are RowNumbers of records, that require new value set for AmountPaid - with your 2nd call, you pass RowNumber and assign new value to the AmountPaid field
Screen context = new Screen();
context.CookieContainer = new System.Net.CookieContainer();
context.Url = "http://localhost/AP301000/Soap/AP301000.asmx";
context.Login("admin", "123");
Content billSchema = context.GetSchema();
// 1st call to export all records from the Applications tab
billSchema.DocumentSummary.Type.Commit = false;
billSchema.DocumentSummary.Type.LinkedCommand = null;
var commands = new Command[]
{
new Value
{
Value = "Bill",
LinkedCommand = billSchema.DocumentSummary.Type
},
new Value
{
Value = "000927",
LinkedCommand = billSchema.DocumentSummary.ReferenceNbr
},
billSchema.Applications.DocTypeDisplayDocType,
billSchema.Applications.ReferenceNbrDisplayRefNbr,
billSchema.Applications.Balance
};
var applications = context.Submit(commands).ToList();
// end of 1st call to export all records from the Applications tab
// 2nd call to set AmountPaid in the Applications tab
var cmds = new List<Command>();
foreach (var application in applications)
{
cmds.Add(
new Value
{
Value = applications.IndexOf(application).ToString(),
LinkedCommand = billSchema.Applications.ServiceCommands.RowNumber
});
cmds.Add(
new Value
{
Value = application.Applications.Balance.Value,
LinkedCommand = billSchema.Applications.AmountPaid
});
}
cmds.Add(billSchema.Actions.Save);
context.Submit(cmds.ToArray());
// end of 2nd call to set AmountPaid in the Applications tab
来源:https://stackoverflow.com/questions/41605306/import-amount-paid-in-screen-bill-and-adjusment-using-webservices-api-in-acumati