Показать сообщение отдельно
Старый 05.06.2015, 12:45   #2  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Если в таблице, которую планируется фильтровать таким способом - не будет индекса по recid - фильтр будет тормозить.

Не лучше ли пойти другим путем - просто перечислить через запятую те значения полей, по которым построен индекс в фильтруемой таблице таблице (AccountNum например в вашем случае)
и запихнуть это в Range dataSource данной таблицы ?
например qbr.value("10001,10003,10005,15155,13555,15555 и так далее")


Только нужно помнить что у Range есть ограничение на длинну этого самого Range - 250 символов как я понял.
Но это обходится добавлением нового Range в dataSource формы.

Вот пример реализации добаления Range в форме SalesTable



X++:
        // Удалить все Range по SalesId
        while (SalesTable_qr.query().dataSourceTable(tablenum(SalesTable)).findRange(fieldnum(SalesTable, SalesId)))
        {
           SalesTable_qr.query().dataSourceTable(tablenum(SalesTable)).clearRange(fieldnum(SalesTable, SalesId));
        }

	// Получить список Range, разбитых по длинне не более 250 символов
        rangeCon = salesStatusFilter.criteriaCon();

        if (rangeCon == conNull())
        {
            SalesTable_qr.query().dataSourceTable(tablenum(SalesTable)).addRange(fieldnum(SalesTable, SalesId)).value("null");
        }
        else
        {
            // Может быть добавлено несколько Range
            for (i = 1; i <= conLen(rangeCon); i++)
            {
                rangeTmp = conPeek(rangeCon, i);

                qbr = SalesTable_qr.query().dataSourceTable(tablenum(SalesTable)).addRange(fieldnum(SalesTable, SalesId));

                qbr.value(rangeTmp);
            }
        }
       SalesTable_ds.research();
Вот пример как эти Range подготовить (разбитые по 250 символов)

X++:
    range = "";

    while (    )
    {
        salesTable =   ;

        pr.setText("Обработка заказа: " + salesTable.SalesId);
        pr.incCount();


        if (     )
        {
            if (strLen(range + "," + salesTable.SalesId) > #maxQueryRangeLen)
            {
                statusFilterCon += range;

                range = "";
            }

            if (range)
                range += ",";

            range += salesTable.SalesId;

            i++;
        }
    }

    if (range)
    {
        statusFilterCon += range;
    }
Таким способом можно фильтровать сотни (может и тысячи) произвольных записей.
При этом будет работать индекс в фильтруемой таблице