2015-03-23 2 views
1

Изучив примеры API из Acumatica, я написал код для экспорта некоторых данных с экрана Customer на основе одного фильтра. Фильтр должен обеспечить, чтобы адрес электронной почты клиента равнялся определенному значению (после того, как он работает, я также проверю настраиваемое поле с зашифрованным паролем). Однако по какой-либо причине функция Export возвращает то, что, по-видимому, является каждой записью клиента в нашей базе данных. Может ли кто-нибудь сказать, что я делаю неправильно с моим фильтром или что-то еще? Код и скриншот от отладчика приведены ниже.Использование фильтра с экраном клиента в 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 

Debugger showing 1512 records returned

+0

Для ваших целей вы должны использовать Generic запрос первого, а затем применить фильтр – srodionov

ответ

0

Фильтры как правило, только работа на первичном виде (например, главной таблицы - в этом случае BAccount + Клиента). Если вы попытаетесь фильтровать данные, содержащиеся во вторичных представлениях, система будет молча игнорировать его. Данные электронной почты и данные записи контактов содержатся в таблице контактов, поэтому вы не можете фильтровать эти поля.

Я думаю, что это поведение должно быть улучшено, и я сделаю внутреннее предложение, чтобы хотя бы выбросить исключение, если вы попытаетесь отфильтровать что-то, что не разрешено. По крайней мере, это поможет устранить эту проблему.

В качестве альтернативы, если вы используете функцию 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 = "[email protected]", 
     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() для извлечения данных. Обычно вы размещаете нужные поля в массиве команд, но если вам нужен конкретный идентификатор Customer, вам нужно использовать трюк для его получения, поскольку значение 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; 
} 
+0

Спасибо, но это не работает для меня. Я не пытаюсь сохранить данные здесь, я просто пытаюсь получить идентификатор клиента, который имеет этот адрес электронной почты. Я думал, что ваше решение может работать в любом случае, если я просто сохраню некоторое фиктивное значение, если есть какой-то способ получить идентификатор клиента из результатов. Но когда я его запускал, API думает, что я пытаюсь добавить нового клиента и дает ошибки в отношении отсутствия необходимых полей. Если бы мы создали пользовательский экран с идентификатором клиента и адресом электронной почты на нем, мы могли бы фильтровать его по адресу электронной почты, как я пытался? –

+0

Эрик, я обновлю свой ответ, чтобы включить образец. – Gabriel

+0

Ваш второй образец с GetCustomerIDByEmail работал отлично, спасибо! Я согласен с тем, что было бы неплохо, если бы фильтр работал на вторичном представлении или, по крайней мере, дал какую-то ошибку, так что спасибо за подачу предложения. –