【问题标题】:Getting Combo-box values set from REST API从 REST API 获取组合框值集
【发布时间】:2019-08-16 18:07:31
【问题描述】:

我正在通过 REST API 使用联系人,我正在尝试在我的应用程序中添加一个输入字段,以指定 ContactSource。问题是Source 字段是一个组合框,这意味着它的值可以通过自动化步骤(SM205000)进行修改。例如,下面是Source 的默认值列表:

对应于该字段的CRMSourcesAttribute

// Token: 0x020003D3 RID: 979
public class CRMSourcesAttribute : PXStringListAttribute
{
    // Token: 0x06004052 RID: 16466 RVA: 0x000FD4A4 File Offset: 0x000FB6A4
    public CRMSourcesAttribute() : base(new string[]
    {
        "W",
        "H",
        "R",
        "L",
        "O"
    }, new string[]
    {
        "Web",
        "Phone Inquiry",
        "Referral",
        "Purchased List",
        "Other"
    })
    {
    }

    // Token: 0x04002158 RID: 8536
    public const string _WEB = "W";

    // Token: 0x04002159 RID: 8537
    public const string _PHONE_INQ = "H";

    // Token: 0x0400215A RID: 8538
    public const string _REFERRAL = "R";

    // Token: 0x0400215B RID: 8539
    public const string _PURCHASED_LIST = "L";

    // Token: 0x0400215C RID: 8540
    public const string _OTHER = "O";
}

我应该通过自动化步骤表来获取组合框的最终值,还是有办法通过指定的 REST API 来获取它,例如,DAC.FIELD

【问题讨论】:

  • 我认为这可能是 feedback.acumatica.com 上的一个很好的功能请求
  • 您查看的是所有可能的值,还是特定状态的可能值?
  • @KRichardson 我正在寻找 Source 查找的所有可能值。我知道附加值存储在 AUCombo 表中,而“活动”复选框存储在 AUComboStep 表中。但我正在寻找一种获取该值的最佳方法,因为它会在外部应用程序端每次请求这些表时产生延迟。
  • 如果您要获取它/在本地缓存它,我会将 GI 写入 AUStepCombo 表,指定 ScreenID/FieldName/TableName/StepID 并将列出的值返回给应用程序
  • @KRichardson 这正是我正在考虑如何获得这些值的方式,但我想看看是否有人遇到过这个问题并有解决方案。

标签: acumatica acumatica-kb


【解决方案1】:

对于此类任务,我建议使用反射。下面是使用示例读取属性的示例:

    protected IEnumerable records()
    {
        //var row = new ClassFilter { ClassName = "PX.Objects.CR.CRMSourcesAttribute" };
        var row = Filter.Current;
        if (row != null && !string.IsNullOrWhiteSpace(row.ClassName))
        {
            var type = Type.GetType(row.ClassName) ??
                        Type.GetType(row.ClassName + ", PX.Objects");

            if (type != null)
                switch (type.BaseType.Name)
                {
                    case "PXIntListAttribute":
                        {
                            int[] values;
                            string[] labels;
                            GetRecords(type, out values, out labels);

                            for (int i = 0; i < values.Length; i++)
                                yield return new KeyValueRecord { Key = values[i].ToString(), UiValue = labels[i] };
                            break;
                        }
                    case "PXStringListAttribute":
                        {
                            string[] values, labels;
                            GetRecords(type, out values, out labels);

                            for (int i = 0; i < values.Length; i++)
                                yield return new KeyValueRecord { Key = values[i], UiValue = labels[i] };
                            break;
                        }
                }
        }
    }

    private void GetRecords<T>(Type type, out T[] values, out string[] labels)
    {
        var obj = Activator.CreateInstance(type);
        var flags = BindingFlags.NonPublic | BindingFlags.Instance;

        values = type.GetField("_AllowedValues", flags).GetValue(obj) as T[];
        labels = type.GetField("_AllowedLabels", flags).GetValue(obj) as string[];
    }

和图片:

之后,您可以将图形和 DAC 添加到端点并公开它。

带有 cmets 的完整源代码可在here 获得。

【讨论】:

  • 我刚刚运行了代码,这个方法的问题是它没有返回从自动化步骤添加的值。在 20 R1 Acumatica 中添加了一个按钮,显示下拉列表的所有可能值,并且该按钮向我显示的值比此方法更多。
猜你喜欢
  • 1970-01-01
  • 2019-08-01
  • 2014-07-24
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多