Обеспечить поиск данных для PXSelector - PullRequest
0 голосов
/ 12 февраля 2019

Мне нужен совет, чтобы преобразовать SQL в BQL или установить Resultset, управляемый кодом C #, в PXSelector.

Мне нужно настроить Счет-фактуру AR и добавить 2 настраиваемых поля для записи учетной записи GL COGS и дополнительной учетной записи для клиента внутри компании, когда компания вводит эту строку счета-фактуры в качестве счета.Это настраиваемое поле должно искать все дополнительные учетные записи, которые ограничены этим идентификатором филиала Клиента и учетной записью GL.По сути, поиск всей субсчета системы заботится о группе ограничений, но о пользовательских полях;для этого нужно написать собственный PXSelector.Ниже приведен SQL-код, который предоставляет необходимые дополнительные учетные записи, но мне нужно знать, как заставить SQL-запрос работать в Acumatica

- SQL для необходимых данных

DECLARE @GLAccountCD nvarchar(10) = 'COGS'
DECLARE @BranchCD nvarchar(30) = 'PurchaseBranch'
SELECT * 
FROM Sub 
where (((CAST(Sub.groupmask as int) & CAST((SELECT GroupMask FROM Account WHERE AccountCD = @GLAccountCD AND CompanyID = 3 AND DeletedDatabaseRecord = 0) AS int)) > 1 
        AND (CAST(Sub.groupmask as int) & CAST((SELECT GroupMask FROM Branch WHERE BranchCD = @BranchCD AND CompanyID = 3 AND DeletedDatabaseRecord = 0) AS int)) > 1)
        OR (Sub.GroupMask = 0 AND Sub.DeletedDatabaseRecord = 0))
        AND CompanyID = 3
ORDER BY SubCD

- НижеPXSelector предоставляет все дополнительные учетные записи группы ограничений, - мне нужно, чтобы PXSelector использовал приведенный выше результат SQL-запроса

#region UsrAPBIllGLSubAccID
[PXDBInt]
[PXUIField(DisplayName="Bill COGS SubAccount")]  
[PXSelector(typeof(Search<Sub.subID, Where<Sub.active, Equal<True>>, OrderBy<Desc<Sub.subCD>>>),
            new Type[] {typeof(Sub.subCD),
                        typeof(Sub.description)},
            SubstituteKey = typeof(Sub.subCD)
           )] 
public virtual int? UsrAPBIllGLSubAccID { get; set; }
public abstract class usrAPBIllGLSubAccID : IBqlField { }
#endregion

1 Ответ

0 голосов
/ 12 февраля 2019

Я думаю, что это было бы достижимо при использовании предложения Match BQL .

В файле GLAccess.cs есть запросы BQL для ограничения учетных записей на основе маски группы Sub и Branch с использованием предложения Match,это было бы хорошим местом для расследования:

public PXSelect<Sub> Sub;
protected virtual IEnumerable sub(
)
{
    if (Group.Current != null && !String.IsNullOrEmpty(Group.Current.GroupName))
    {
        bool inserted = (Group.Cache.GetStatus(Group.Current) == PXEntryStatus.Inserted);
        foreach (Sub item in PXSelect<Sub,
            Where2<Match<Current<PX.SM.RelationGroup.groupName>>,
            Or2<Match<Required<Sub.groupMask>>, Or<Sub.groupMask, IsNull>>>>
            .Select(this, new byte[0]))
        {
            if (!inserted || item.Included == true)
            {
                Sub.Current = item;
                yield return item;
            }
            else if (item.GroupMask != null)
            {
                PX.SM.RelationGroup group = Group.Current;
                bool anyGroup = false;
                for (int i = 0; i < item.GroupMask.Length && i < group.GroupMask.Length; i++)
                {
                    if (group.GroupMask[i] != 0x00 && (item.GroupMask[i] & group.GroupMask[i]) == group.GroupMask[i])
                    {
                        Sub.Current = item;
                        yield return item;
                    }
                    anyGroup |= item.GroupMask[i] != 0x00;
                }
                if (!anyGroup)
                {
                    Sub.Current = item;
                    yield return item;
                }
            }
        }
    }
    else
    {
        yield break;
    }
}
public PXSelect<Branch> Branch;
protected virtual IEnumerable branch(
)
{
    if (Group.Current != null && !String.IsNullOrEmpty(Group.Current.GroupName))
    {
        bool inserted = (Group.Cache.GetStatus(Group.Current) == PXEntryStatus.Inserted);
        foreach (Branch item in PXSelect<Branch,
            Where2<Match<Current<PX.SM.RelationGroup.groupName>>,
            Or<Match<Required<Branch.groupMask>>>>>
            .Select(this, new byte[0]))
        {
            if (!inserted)
            {
                Branch.Current = item;
                yield return item;
            }
            else if (item.GroupMask != null)
            {
                PX.SM.RelationGroup group = Group.Current;
                bool anyGroup = false;
                for (int i = 0; i < item.GroupMask.Length && i < group.GroupMask.Length; i++)
                {
                    if (group.GroupMask[i] != 0x00 && (item.GroupMask[i] & group.GroupMask[i]) == group.GroupMask[i])
                    {
                        Branch.Current = item;
                        yield return item;
                    }
                    anyGroup |= item.GroupMask[i] != 0x00;
                }
                if (!anyGroup)
                {
                    Branch.Current = item;
                    yield return item;
                }
            }
        }
    }
    else
    {
        yield break;
    }
}
...