Показать сообщение отдельно
Старый 17.06.2008, 14:51   #1  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
? Как подставить вычисляемое значение в Range у query
Задача сделать выпадающий список с таблицы рабочих смен.
Если смена открыта 17.06.2008 с 8:00 до 20:00 в сейчас время к примеру 14 часов.. то запрос выполнится.

А как быть если смена открыта 17.06.2008 23 часа до 18.06.2008 до 6 утра.
а сейчас время 2:00 утра, то запрос не выполнится.
Условие надо поправить так чтоб время открытой смены проверялось между двумя датами queryBuildDataSource.addRange(fieldnum(MilkShifts,StartTime)).value("<"+t);
queryBuildDataSource.addRange(fieldnum(MilkShifts,EndTime)).value(">" + t);

Как это сделать? Что т оне соображу.


X++:
static void lookupIDShift(FormStringControl _ctrl)
{   Query                          query=new Query();
    QueryBuildDataSource    queryBuildDataSource;
    QueryBuildRange         queryBuildRange;
    QueryRun                    qr;

    //Таблицы
    SysCompanyUserInfo      scUI;
    MilkGroupMaterialResponsibilityLine     mGMRLine;

    SysTableLookup          sysTableLookup = SysTableLookup::newParameters(tableNum(MilkShifts), _ctrl);


    Str                     t= time2str(timenow(),1,1), d=strfmt("%1", systemdateget()), IDgmt, saveText;
    Str   300               war, warNull;
    ;
 war="Вы не определены ни в одну группу материальной ответственности поэтому не можете создавать складские и производстенные журналы."+
     " Обратитесь к администратору системы или используйте форму [Управление запасами/ Настройка/ Смены/ Группы материальной ответственности]";

 warNull="Ни одна смена для групп материальной ответственности, в которой Вы входите, не является открытой на текущий момент."+
         " Отредактируйте Группы материальной ответственности или используйте периодическую операцию Закрытие смены";

    saveText = _ctrl.text();
    _ctrl.text(""); // Disable filter effects

    sysTableLookup.addLookupfield(fieldNum(MilkShifts,IDShift));
    sysTableLookup.addLookupfield(fieldNum(MilkShifts,StartTime));
    sysTableLookup.addLookupfield(fieldNum(MilkShifts,EndTime));
    sysTableLookup.addLookupfield(fieldNum(MilkShifts,StartDate));
    sysTableLookup.addLookupfield(fieldNum(MilkShifts,EndDate));
    sysTableLookup.addLookupfield(fieldNum(MilkShifts,Milk_IDGroupMaterialResponsibility));

    queryBuildDataSource=query.addDataSource(tablenum(MilkShifts));



    //Ищем сотрудника по пользовательским связям через текущего пользователя
    SELECT firstonly EmplId FROM scUI where scUI.UserId==curUserId();

    //Ищем ID группы материальной ответственности

    while select IDGroupMaterialResponsibility from mGMRLine
          where mGMRLine.EmplId==scUI.EmplId
    {
       IDgmt+=mGMRLine.IDGroupMaterialResponsibility+",";
    }
    IDgmt=substr(IDgmt,1,strlen(IDgmt)-1);

    if (IDgmt=="")  Box::warning( war, "Вы не состоите ни в одной группе материальной ответственности" );
    else {
     // Запрос возвращает номер текущих смен. Надо сравнить с тем есть ли у этой смены ИД группы мат отв.
 
   queryBuildDataSource.addRange(fieldnum(MilkShifts,StartTime)).value("<"+t);

   queryBuildDataSource.addRange(fieldnum(MilkShifts,EndTime)).value(">" +   t); 

   queryBuildDataSource.addRange(fieldnum(MilkShifts,StartDate)).value(".." + d ); 
   queryBuildDataSource.addRange(fieldnum(MilkShifts,EndDate)).value(d + ".."); 

   queryBuildDataSource.addRange(fieldnum(MilkShifts,StatusShift)).value(enum2str(StatusShift::Open)); 
   queryBuildDataSource.addRange(fieldnum(MilkShifts,Milk_IDGroupMaterialResponsibility)).value(IDgmt);// Список групп в которых учавствует пользователь

    qr= new QueryRun(query);
    If(qr.next()) {
      //    sysTableLookup.parmTmpBuffer(MilkShifts);
            sysTableLookup.parmQuery(query);
            sysTableLookup.performFormLookup();
                   }
    else  Box::warning( warNull, "Необходимо открыть смену" );
         }
    _ctrl.text(saveText);
}
запрос в дебагере выглядит так
SELECT * FROM MilkShifts WHERE ((StartTime<53103)) AND ((EndTime>53103)) AND ((StartDate<={ts '2008-06-17 00:00:00.000'})) AND ((EndDate>={ts '2008-06-17 00:00:00.000'})) AND ((StatusShift = 0)) AND ((Milk_IdGroupmaterialResponsibility = N'Гр2'))