Показать сообщение отдельно
Старый 01.03.2010, 16:24   #1  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Акс 3.0 Запросы на источнике с или
Создан EDT FilmCode по примеру Dimension, но состоит из 25 элементов. Тип данных в нем int.

Затем сделана форма и одна из группы полей на grid FilmCode.

Задача отфильтровать те строки, где в группе FilmCode хотя бы в одном элементе указано выбранное значение. Значение указывается через специальное поле StringEdit на форме.

Пишу запрос
X++:
public void executeQuery()
{
    QueryBuildRange      qbdsrange1;
    QueryBuildDataSource qbds1;
    Integer              _idx;
    str 10000      strFilter;
    str 10 CinemaFilmCode;
    ;
    qbds1 = this.query().dataSourceTable(tableNum(CinemaSchTable));
    CinemaFilmCode = int2str(CinemaFilmTable::findName(FindFilm.valueStr()).FilmCode);
    qbds1.clearRange(fieldId2Ext(fieldNum(CinemaSchTable,FilmCode),1));

    if (FindFilm.valueStr())
    {
        qbdsrange1 =  qbds1.addRange(fieldNum(CinemaSchTable,FilmCode));
        strFilter = '((CinemaSchTable.FilmCode[1] == '+CinemaFilmCode+')';
        for (_idx=2; _idx <=25; _idx++)
        {
               strFilter +=  ' || (CinemaSchTable.FilmCode['+ int2str(_idx)+'] == '+ CinemaFilmCode+')';
        }       
        strFilter += ')';
        qbdsrange1.value(strFmt(strFilter));
    }
    super();
}
Выдает ошибку нехватает скобки правой на 28 символе. Однако, этот же запрос через обзор таблицы работает.
SELECT * FROM CinemaSchTable WHERE ((((CinemaSchTable.FilmCode[1] == 437) || (CinemaSchTable.FilmCode[2] == 437) || (CinemaSchTable.FilmCode[3] == 437) || (CinemaSchTable.FilmCode[4] == 437) || (CinemaSchTable.FilmCode[5] == 437) || (CinemaSchTable.FilmCode[6] == 437) || (CinemaSchTable.FilmCode[7] == 437) || (CinemaSchTable.FilmCode[8] == 437) || (CinemaSchTable.FilmCode[9] == 437) || (CinemaSchTable.FilmCode[10] == 437) || (CinemaSchTable.FilmCode[11] == 437) || (CinemaSchTable.FilmCode[12] == 437) || (CinemaSchTable.FilmCode[13] == 437) || (CinemaSchTable.FilmCode[14] == 437) || (CinemaSchTable.FilmCode[15] == 437) || (CinemaSchTable.FilmCode[16] == 437) || (CinemaSchTable.FilmCode[17] == 437) || (CinemaSchTable.FilmCode[18] == 437) || (CinemaSchTable.FilmCode[19] == 437) || (CinemaSchTable.FilmCode[20] == 437) || (CinemaSchTable.FilmCode[21] == 437) || (CinemaSchTable.FilmCode[22] == 437) || (CinemaSchTable.FilmCode[23] == 437))))

Если писать без указания таблицы FilmCode[24] = 541..., то тоже не работает.
Если писать = или вместо || поставить or, то тоже не работает.
Если в qbdsrange1.value(strFmt(strFilter)); записать просто 541, то по первому полю в группе работает.
Не могу понять где ошиблась.

Если
X++:
    if (FindFilm.valueStr())
    {
        qbdsrange1 =  qbds1.addRange(fieldid2ext(fieldNum(CinemaSchTable,FilmCode),1));
        strFilter = ' == 1)||(CinemaSchTable.FilmCode[1] == '+CinemaFilmCode+')';
        for (_idx=2; _idx <=2; _idx++)
        {
               strFilter +=  ' || (CinemaSchTable.FilmCode['+ int2str(_idx)+'] == '+ CinemaFilmCode+')';
        }       
        strFilter += '';
        qbdsrange1.value(strFmt(strFilter));
    }
ошибок нет, но и фильтр не работает
Такое впечатление, что он пытается зачем-то поставить FilmCode[1] =

Последний раз редактировалось Arahnid; 01.03.2010 в 17:07.