2

使用 API 创建客户付款方式的正确方法是什么?这也将回答如何使用具有键值对的网格而不是仅将值存储到特定字段中。

该代码已经使用并正常运行了将近一年,然后从本周早些时候开始,它不再有效。

    // Connect to Acumatica
    context = new acumatica.Screen();
    context.CookieContainer = new System.Net.CookieContainer();
    context.AllowAutoRedirect = true;
    context.EnableDecompression = true;
    context.Timeout = 1000000;
    context.Url = Properties.Settings.Default.WebServiceURL;
    LoginResult result = api.context.Login(Properties.Settings.Default.AcumaticaUserName, Properties.Settings.Default.AcumaticaPassword);

    context.AR303010Clear();
    AR303010Content AR303010 = context.AR303010GetSchema();

    try
    {
    Debug.WriteLine("--- Payment Method Start ---");
        // Create Invoice
        AR303010.Actions.Save.Commit = true;
        AR303010Content[] AR303010Content = context.AR303010Submit
        (
            new Command[]
            {

                new Value { Value = "ABARTENDE", LinkedCommand = AR303010.PaymentMethodSelection.Customer, Commit = true },

                AR303010.Actions.Insert,

                new Value { Value = "VISA", LinkedCommand = AR303010.PaymentMethodSelection.PaymentMethod, Commit = true },

                new Key
                {
                    ObjectName = AR303010.PaymentMethodDetails.Description.ObjectName,
                    FieldName = AR303010.PaymentMethodDetails.Description.FieldName,
                    Value = "=[" + AR303010.PaymentMethodDetails.Description.ObjectName + "." + AR303010.PaymentMethodDetails.Description.FieldName + "]"
                },

                new Value {Value = "Card Number", LinkedCommand = AR303010.PaymentMethodDetails.Description},
                new Value {Value = "4000000000003636", LinkedCommand = AR303010.PaymentMethodDetails.Value, Commit = true},

                new Key
                {
                    ObjectName = AR303010.PaymentMethodDetails.Description.ObjectName,
                    FieldName = AR303010.PaymentMethodDetails.Description.FieldName,
                    Value = "=[" + AR303010.PaymentMethodDetails.Description.ObjectName + "." + AR303010.PaymentMethodDetails.Description.FieldName + "]"
                },

                new Value {Value = "Card Verification Code", LinkedCommand = AR303010.PaymentMethodDetails.Description},
                new Value {Value = "321", LinkedCommand = AR303010.PaymentMethodDetails.Value, Commit = true},

                new Key
                {
                    ObjectName = AR303010.PaymentMethodDetails.Description.ObjectName,
                    FieldName = AR303010.PaymentMethodDetails.Description.FieldName,
                    Value = "=[" + AR303010.PaymentMethodDetails.Description.ObjectName + "." + AR303010.PaymentMethodDetails.Description.FieldName + "]"
                },

                new Value {Value = "Expiration Date", LinkedCommand = AR303010.PaymentMethodDetails.Description},
                new Value {Value = "012015", LinkedCommand = AR303010.PaymentMethodDetails.Value, Commit = true},

                AR303010.Actions.Save
            }
        );

        Debug.WriteLine("--- Payment Method Created ---");
    }
    catch (Exception ex)
    {
        Debug.WriteLine(" --- Failed to create Payment Method ---");
        Debug.WriteLine(ex.Message);
    }

该代码最初是从 Acumatica 论坛中提取的:

http://forum.acumatica.com/forum/acumatica-reseller-and-isv-community/development-and-customization/5873-setting-credit-card-fields-though-web-services

http://forum.acumatica.com/forum/acumatica-reseller-and-isv-community/development-and-customization/885-help-on-add-new-payment-method-to-a-given-customer-通过-webservice-ar303010

• 我们曾尝试在以前的版本上使用该代码,我们知道 100% 可以使用该代码。• 我们已尝试取消发布我们的自定义。• 我们已尝试将数据发送到位于 tryacumatica.com 的 acumatica 演示

我们测试过的每个站点/版本/计算机都会返回相同的错误。

 Error #12: Inserting  'Customer Payment Method Detail' record raised one or more errors. Please review. Error: 'Value' may not be empty. ---> PX.Data.PXOuterException: Error #12: Inserting  'Customer Payment Method Detail' record raised one or more errors. Please review.

有人可以指出我正确的方向吗?

4

2 回答 2

3

好的,这是 Acumatica 提供的工作代码。我仍然不知道为什么旧代码在整年都在工作时会崩溃,但这是工作代码,它更干净一些,因为您不必处理键/值。

        var context = new acumatica.Screen();
        context.CookieContainer = new System.Net.CookieContainer();
        context.AllowAutoRedirect = true;
        context.EnableDecompression = true;
        context.Timeout = 1000000;
        LoginResult result = context.Login("admin", "admin");

        context.AR303010Clear();
        AR303010Content AR303010 = context.AR303010GetSchema();

        try
        {
            var commands = new Command[]
                    {
                        new Value { Value = "ABARTENDE", 
                            LinkedCommand = AR303010.PaymentMethodSelection.Customer},
                        AR303010.Actions.Insert,
                        new Value { Value = "VISA", 
                            LinkedCommand = AR303010.PaymentMethodSelection.PaymentMethod},

                        new Value
                        {
                            Value = "='CCDNUM'",
                            LinkedCommand = AR303010.PaymentMethodDetails.Description
                        },

                        new Value { Value = "41111111111111118",
                                    LinkedCommand = AR303010.PaymentMethodDetails.Value,
                                    Commit = true
                        },

                        new Value
                        {
                            Value = "='CVV'",
                            LinkedCommand = AR303010.PaymentMethodDetails.Description
                        },

                        new Value { Value = "121",
                                    LinkedCommand = AR303010.PaymentMethodDetails.Value,
                                    Commit = true
                        },

                        new Value
                        {
                            Value = "='EXPDATE'",
                            LinkedCommand = AR303010.PaymentMethodDetails.Description
                        },

                        new Value {Value = "01/2019", 
                                   LinkedCommand = AR303010.PaymentMethodDetails.Value,
                                    Commit = true
                        },

                        new Value
                        {
                            Value = "='NAMEONCC'",
                            LinkedCommand = AR303010.PaymentMethodDetails.Description
                        },

                        new Value {Value = "Mr Jon Doe 8", 
                                   LinkedCommand = AR303010.PaymentMethodDetails.Value,
                                    Commit = true
                        },

                        AR303010.Actions.Save};
            AR303010Content[] AR303010Content = context.AR303010Submit(commands.ToArray());

        }
        catch (Exception ex)
        {
        }
于 2014-11-03T17:15:33.107 回答
-2

这是我使用的示例

public void CreateARPayment()
{
    string paymentType = GetParamValue("lblARPaymentType");
    string paymentNbr = GetParamValue("lblARPaymentNbr");
    string customerID = GetParamValue("txbCustomerID");
    string cardAccountNo = GetParamValue("lblCardAccountNo");

    string arInvoiceNbr = GetParamValue("txbARInvoiceNbr");
    string soInvoiceNbr = GetParamValue("txbSOInvoiceNbr");

    Screen context = new Screen();
    context.CookieContainer = new System.Net.CookieContainer();
    context.Url = Url;
    context.Login(Login, Password);

    AR302000Content paymentSchema = context.AR302000GetSchema();

    paymentSchema.PaymentSummary.CardAccountNo.FieldName += "!Descr";

    var commands = new Command[]
    {
        new Value 
        { 
            Value = customerID, 
            LinkedCommand = paymentSchema.PaymentSummary.Customer 
        },
        new Value 
        {
            Value = "TOKENCC", 
            LinkedCommand = paymentSchema.PaymentSummary.PaymentMethod 
        },
        new Value 
        {
            Value = cardAccountNo, 
            LinkedCommand = paymentSchema.PaymentSummary.CardAccountNo 
        },
        new Value 
        {
            Value = "101000", 
            LinkedCommand = paymentSchema.PaymentSummary.CashAccount 
        },
        new Value 
        {
            Value = "09/2014/AR-00001", 
            LinkedCommand = paymentSchema.PaymentSummary.PaymentRef 
        },

        paymentSchema.DocumentsToApply.ServiceCommands.NewRow,
        new Value 
        {
            Value = arInvoiceNbr, 
            LinkedCommand = paymentSchema.DocumentsToApply.ReferenceNbr, 
            Commit = true 
        },

        paymentSchema.DocumentsToApply.ServiceCommands.NewRow,
        new Value 
        {
            Value = soInvoiceNbr, 
            LinkedCommand = paymentSchema.DocumentsToApply.ReferenceNbr, 
            Commit = true 
        },

        paymentSchema.PaymentSummary.AppliedToDocuments,
    };
    var payment = context.AR302000Submit(commands)[0];

    commands = new Command[]
    {
        new Value 
        {
            Value = payment.PaymentSummary.AppliedToDocuments.Value, 
            LinkedCommand = paymentSchema.PaymentSummary.PaymentAmount 
        },

        paymentSchema.Actions.Save,

        paymentSchema.PaymentSummary.ReferenceNbr,
        paymentSchema.PaymentSummary.Status,
        paymentSchema.PaymentSummary.PaymentAmount
    };
    payment = context.AR302000Submit(commands)[0];

    UpdateSetting("lblARPaymentNbr", payment.PaymentSummary.ReferenceNbr.Value);
    UpdateSetting("lblARPaymentStatus", payment.PaymentSummary.Status.Value);
    UpdateSetting("lblARPaymentAmount", payment.PaymentSummary.PaymentAmount.Value);
}
于 2014-11-03T09:17:14.547 回答