在 Acumatica 中对客户屏幕使用过滤器 API

Using filter with Customer screen in Acumatica API

查看来自 Acumatica 的 API 示例,我编写了代码以基于单个过滤器从客户屏幕导出一些数据。过滤器应强制客户的电子邮件地址等于特定值(一旦起作用,我还将检查带有加密密码的自定义字段)。然而,出于某种原因,导出功能返回的似乎是我们数据库中的每条客户记录。谁能告诉我我的过滤器或其他任何东西做错了什么?调试器的代码和屏幕截图如下。

谢谢!

Public Function ValidateUser(ByVal emailAddress As String, ByVal password As String, ByRef customerFirstName As String, ByRef customerLastName As String, ByRef customerCountry As String, ByRef customerPhone As String, ByRef customerCell As String) As String

    Dim customer As AR303000Content = m_context.AR303000GetSchema()
    m_context.AR303000Clear()

    Dim emailFilter As Filter = New Filter()
    emailFilter.Field = customer.GeneralInfoMainContact.Email
    emailFilter.Condition = FilterCondition.Equals
    emailFilter.Value = emailAddress

    Dim searchfilters() As Filter = {emailFilter}
    Dim searchCommands() As Command = {customer.CustomerSummary.CustomerID, customer.CustomerSummary.CustomerName, customer.GeneralInfoMainContact.Phone1, customer.GeneralInfoMainContact.Phone2, customer.GeneralInfoMainAddress.Country}
    Dim searchResult As String()() = m_context.AR303000Export(searchCommands, searchfilters, 0, False, False)

    Dim numRecords = searchResult.Length
    Dim customerID As String = ""
    Dim customerName As String = ""
    If numRecords > 0 Then
        ' we found a user with that email address
        Dim i As Integer = 0
        For i = 1 To numRecords
            customerID = searchResult(i - 1)(0)
            customerName = searchResult(i - 1)(1)
            customerPhone = searchResult(i - 1)(2)
            customerCell = searchResult(i - 1)(3)
            customerCountry = searchResult(i - 1)(4)
        Next
    End If

    Dim spaceInName = customerName.IndexOf(" ")
    If spaceInName >= 0 Then
        customerFirstName = customerName.Substring(0, spaceInName)
        customerLastName = customerName.Substring(spaceInName + 1)
    End If

    Return customerID
End Function

过滤器通常仅适用于主视图(例如,主视图 table - 在本例中为 BAccount+Customer)。如果您尝试过滤次要视图中包含的数据,系统将默默地忽略它。电子邮件地址和联系人记录数据包含在联系人 table 中,因此您无法按这些字段进行筛选。

我认为这种行为应该改进,我会在内部提出建议,如果您尝试过滤不允许的内容,至少会抛出异常。它至少会更容易解决此问题。

作为替代方案,如果您使用 Submit() 函数加载特定记录,您可以更改架构中的基础 FieldName 以使其与另一个字段匹配。下面的示例显示了如何根据电子邮件地址查找客户来更新客户信用验证设置:

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

AR303000Content custSchema = context.AR303000GetSchema();

custSchema.CustomerSummary.CustomerID.FieldName += 
    ("!" + custSchema.CustomerSummary.ServiceCommands.FilterEmail.FieldName);

var commands = new Command[]
{
    new Value 
    {
        Value = "demo@gmail.com", 
        LinkedCommand = custSchema.CustomerSummary.CustomerID 
    },

    new Value 
    {
        Value = "Disabled", 
        LinkedCommand = custSchema.GeneralInfoCreditVerificationRulesCreditVerification.CreditVerification 
    },

    custSchema.Actions.Save,

    custSchema.GeneralInfoFinancialSettings.CustomerClass
};
var customer = context.AR303000Submit(commands)[0];

您还可以使用 Submit() 函数来检索数据。通常您将需要的字段放在命令数组中,但如果您特别需要 CustomerID,则需要使用技巧来检索它,因为 CustomerID.FieldName 值已更改以添加电子邮件过滤器。这是示例:

private static string GetCustomerIDByEmail(string eMailAddress)
{
    Screen context = new Screen();
    context.CookieContainer = new System.Net.CookieContainer();
    context.Login("admin", "admin");

    Content custSchema = context.GetSchema();

    custSchema.CustomerSummary.CustomerID.FieldName +=
        ("!" + custSchema.CustomerSummary.ServiceCommands.FilterEmail.FieldName);

    var commands = new Command[]
    {
        new Value 
        {
            Value = eMailAddress,
            LinkedCommand = custSchema.CustomerSummary.CustomerID
        },

        // Manually define the Field by setting ObjectName and FieldName. We can't use custSchema.CustomerSummary.CustomerID field because it was altered to make it search by e-mail.
        new Field
        {
            ObjectName = "BAccount",
            FieldName = "AcctCD"
        }
    };

    var results = context.Submit(commands);

    if (results.Length == 0)
        return "Not found";
    else
        return results[0].CustomerSummary.CustomerID.Value;
}