查看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
答案 0 :(得分:0)
过滤器通常仅适用于主视图(例如,主表 - 在本例中为BAccount + Customer)。如果您尝试过滤辅助视图中包含的数据,系统将默默忽略它。电子邮件地址和联系人记录数据包含在联系人表格中,因此您无法按这些字段进行过滤。
我认为应该改进这种行为,如果你试图过滤一些不允许的东西,我会在内部提出一个建议,至少抛出异常。它至少可以解决这个问题。
作为替代方案,如果您使用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;
}