2

是否可以让图形和页面使用完全未绑定的 DAC?

当前在 4.20 中尝试此操作时,我收到以下错误消息:

Incorrect syntax near the keyword 'FROM'.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Data.SqlClient.SqlException: Incorrect syntax near the keyword 'FROM'.

如果我在数据库中创建一个表并将我的 DAC 字段从 PXInt 更改为 PXDBInt,那么页面会加载,但是对于我正在尝试做的事情,我不需要实际存储数据。

DAC样本:

    namespace Acumatica1
{
    [PXPrimaryGraph(typeof(UnboundDataTest))]
    [System.SerializableAttribute()]
    public class UnboundDAC : PX.Data.IBqlTable
        {
        public abstract class unboundKey : PX.Data.IBqlField
        {
        }
        protected int _UnboundKey;
        [PXInt(IsKey = true)]
        [PXUIField(Visible = false)]
        public virtual int UnboundKey
        {
            get
            {
                return this._UnboundKey;
            }
            set
            {
                this._UnboundKey = value;
            }
        }

        #region UnboundText
        public abstract class unboundText : PX.Data.IBqlField
        {
        }
        protected string _UnboundText;
        [PXString]
        [PXUIField(DisplayName = "Text")]
        public virtual string UnboundText
        {
            get
            {
                return this._UnboundText;
            }
            set
            {
                this._UnboundText = value;
            }
        }
        #endregion
    }
}

图表样本:

public class UnboundDataTest: PXGraph<UnboundDataTest>
{
    public PXSelect<UnboundDAC> UnboundInfo;
}
4

1 回答 1

3

要控制选择过程,您需要创建一个委托,该委托将在选择 UnboundInfo 视图时被调用:

public IEnumerable unboundInfo()
{
    //TODO: Put your logic to return a new instance of UnboundDAC here
}

在这个委托中,您可以自由使用任何机制来检索应该由这个未绑定选择返回的记录。例如,您可以动态创建一个或多个对象并返回它们:

public IEnumerable unboundInfo()
{
    yield return new UnboundDAC() { UnboundKey = 1, UnboundText = "A" };
    yield return new UnboundDAC() { UnboundKey = 2, UnboundText = "B" };
}

如果您需要以某种方式允许用户编辑 UnboundDAC 中的值,您可以利用缓存,并在第一次选择视图时将记录插入缓存中:

public IEnumerable unboundInfo()
{
    PXCache cache = _Graph.Caches[typeof(Table)];
    cache._AllowInsert = true;
    cache._AllowUpdate = true;

    if(cache.Current == null)
    {
        cache.SetStatus(new UnboundDAC() { UnboundKey = 1, UnboundText = "A" }, PXEntryStatus.Held);
        cache.SetStatus(new UnboundDAC() { UnboundKey = 2, UnboundText = "B" }, PXEntryStatus.Held);
    }

    return UnboundInfo.Cache.Cached;
}

最后,你可以看看 PXFilter 的内部实现;PXFilter 是一个专门的 PXSelect,它实际上并不从数据库中选择任何东西;它所做的一切都是在第一次选择它时在缓存中插入一行,并防止保留该行。您可以使用类似的技术来创建可以在多个图中轻松重用的 PXUnboundSelect 类。

于 2014-10-25T14:31:45.577 回答