Задача сделать выпадающий список с таблицы рабочих смен.
Если смена открыта 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'))