【问题标题】:Filtering an Export of Appointments by Customer ID with Acumatica API使用 Acumatica API 按客户 ID 过滤约会导出
【发布时间】:2015-05-06 00:04:30
【问题描述】:

我想在 Acumatica 中为客户导出所有即将到来的约会。我为导出命令创建了两个过滤器:一个用于客户 ID,一个用于日期范围。日期范围过滤器得到适当应用,但客户 ID 过滤器被忽略。所有客户的所有即将到来的约会都将被退回。目前,我正在将自己的客户 ID 过滤器应用于返回的结果,但我认为当所有客户都有大量即将到来的约会时,这会非常慢。这是我的代码:

Public Function GetUpcomingAppointmentList(ByVal customerID As String) As String()()
    Dim appt As SD300200Content = m_context.SD300200GetSchema()
    m_context.SD300200Clear()

    ' THIS FILTER IS IGNORED
    Dim customerFilter As Filter = New Filter()
    customerFilter.Field = appt.ServiceOrderHeader.CustomerID
    customerFilter.Condition = FilterCondition.Equals
    customerFilter.Value = customerID

    Dim dateFilter As Filter = New Filter()
    dateFilter.Field = appt.ScheduledDateAndTime.Date
    dateFilter.Condition = FilterCondition.GreaterOrEqual
    dateFilter.Value = Date.Today

    Dim searchfilters() As Filter = {customerFilter, dateFilter}
    Dim searchCommands() As Command = {appt.AppointmentRecords.ServiceCommands.EveryAppointmentNbr, appt.ServiceOrderHeader.CustomerID, appt.AppointmentRecords.Status, appt.AppointmentRecords.AppointmentNbr, appt.AppointmentRecords.ServiceOrderNbr, appt.ScheduledDateAndTime.Date, appt.ScheduledDateAndTime.StartTime, appt.Employees.EmployeeName}
    Dim searchResult As String()() = m_context.SD300200Export(searchCommands, searchfilters, 0, False, False)

    ' SINCE ABOVE CUSTOMER FILTER DOESN'T WORK, HAVE TO FILTER OUT OTHER CUSTOMERS
    Dim filteredResults As List(Of String()) = New List(Of String())
    Dim i As Integer, apptCustomer As String
    For i = 0 To searchResult.Length - 1
        apptCustomer = searchResult(i)(0)
        If apptCustomer = customerID Then
            filteredResults.Add(searchResult(i))
        End If
    Next

    Return filteredResults.ToArray()
End Function

我还认为我可能会应用类似于Using filter with Customer screen in Acumatica API 中提供的解决方案的东西。但似乎需要这样一行:

appt.AppointmentRecords.ServiceOrderNbr.FieldName = appt.AppointmentRecords.ServiceOrderNbr.FieldName + "!" + appt.ServiceOrderHeader.ServiceCommands.FilterCustomerID.FieldName

但 appt.ServiceOrderHeader.ServiceCommands 中根本没有任何“过滤器”属性。是否有任何其他方法可以按客户 ID 过滤约会,或者我上面的代码有问题?

另一件有趣的事情是,即使导出返回的许多结果与我尝试应用的 CustomerID 过滤器不匹配,它返回的额外结果也不提供实际的 CustomerID 编号。相反,与过滤器不匹配的记录的 appt.ServiceOrderHeader.CustomerID 作为空字符串返回。

【问题讨论】:

  • 不是很清楚,你用的是什么普通屏,什么版本?
  • @acumember 抱歉,我是 Acumatica 的新手,我不确定您所说的“普通”屏幕是什么意思。但我为 API 引用的 Acumatica 屏幕是用于约会的 SD300200。我知道我们有一些自定义,但我不确定那个屏幕是否是其中之一。我们的 Acumatica 版本是 4.20.2063 版
  • 您好 Eric,屏幕 SD300200 不是我们开箱即用的,看起来是您自己定制的屏幕,acumatica 不提供 ID 为 SD300200 的屏幕。因此,可能与您的屏幕有关。尝试询问您的开发人员谁准备了屏幕。和数据结构、key等有关。

标签: acumatica


【解决方案1】:

这可能不是完整的答案,但这是我学到的:

正如您链接的答案中所暗示的,过滤器更喜欢屏幕上的基础对象。组合过滤器时,请密切注意您引用的字段的 ObjectName。 "and" 条件似乎只在 ObjectName 相同时才有效!

这是一个与我为 CR.30.20.00 准备的代码特别相关的示例,它尝试按联系人类型(员工、联系人等)和上次修改日期进行过滤。这两个字段在“Contact”ObjectName 中都可用,但如果您将 ContactCurrent 用于其中一个对象名称,则忽略 AND 并根据一个过滤器获取所有记录。

filters.Add(new AcumaticaWS.Filter
{
    Field = CR302000Schema.ContactSummary.Type,
    Condition = FilterCondition.Equals,
    Value = "Employee"
});
filters.Add(new AcumaticaWS.Filter
{
    //Field = WSTools.NewA4Field(CR302000Schema.DetailsSummary.CompanyName.ObjectName, "LastModifiedDateTime"), // different object name
    Field = WSTools.NewA4Field(CR302000Schema.ContactSummary.Type.ObjectName, "LastModifiedDateTime"), // works!
    Condition = FilterCondition.GreaterOrEqual,
    Value = "2015-04-01"
});

我没有使用过您的屏幕,但如果 appt.ScheduledDateAndTime.ObjectName 上的 CustomerID 字段也可用,那么您可能正在做生意。还要注意,即使它不在强类型模式中,有时也可以使用字段 - 就像我的 LastModifiedDateTime 示例一样。

祝你好运!

【讨论】:

  • 谢谢你的回答,斯坦。不幸的是,它对我不起作用。对于我的客户过滤器,我尝试将字段的 ObjectName 设置为 appt.ScheduledDateAndTime.Date.ObjectName 并将其 FieldName 设置为“CustomerID”,但我仍然得到相同的结果 - 没有错误消息,但未应用过滤器。我还尝试完全删除日期过滤器以仅使用 CustomerID 过滤器,但在这种情况下仍然没有应用。
猜你喜欢
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
相关资源
最近更新 更多