Показать сообщение отдельно
Старый 05.12.2008, 13:36   #1  
dawl is offline
dawl
Участник
 
3 / 10 (1) +
Регистрация: 05.12.2008
Не получается сформировать lookup по запросу с outer join
Здравствуйте.
Может кто-нибудь подсказать, как реализовать лукап, для такого запроса:


while select EmployeeTable
where EmployeeTable.IsNotInUse == NoYes::No &&
EmployeeTable.EmployeeId != FCurrentEmployeeId /* var */
outer join TimeSheetTable
where TimeSheetTable.EmployeeId == EmployeeTable.EmployeeId &&
TimeSheetTable.CurrentDate == FCurrentDate /* var */
{
if ((!TimeSheetTable) || (EmploymentTable::find(TimeSheetTable.EmploymentAssessment).Value == 0)
{
// Нужно получить эти значения
}
}

Условно схема такая:
Таблица сотрудников: EmployeeTable; // EmployeeId, FullName
Табель учета сотрудников: TimeSheetTable; // EmployeeId, EmploymentId, CurrentTime
Таблица оценок занятости: EmploymentTable; // EmploymentId, Value

Проблема состоит в том, что я не знаю, как отфильтровать условие ...if (!TimeSheetTable),
которое в данном случае является необходимым.

Пример кода:

// 1
query = new Query();
masterSource = query.addDataSource(tableNum(EmployeeTable));
masterSource.orderMode(OrderMode::GroupBy);
masterSource.addSortField(fieldNum(EmployeeTable, EmployeeId));
masterSource.addSortField(fieldNum(EmployeeTable, ScheduledNumber));
masterSource.addSortField(fieldNum(EmployeeTable, FullName));
masterSource.addRange(fieldNum(EmployeeTable, IsNotInUse)).value(StrFmt('%1', NoYes::No));
filterString = StrFmt('(%1 != "%2")', fieldStr(EmployeeTable, EmployeeId), TimeSheetTable.EmployeeId); // TimeSheetTable = ds
masterSource.addRange(fieldNum(EmployeeTable, EmployeeId)).value(filterString);

// 2
slaveSource = masterSource.addDataSource(tableNum(TimeSheetTable));
slaveSource.orderMode(OrderMode::GroupBy);
slaveSource.joinMode(JoinMode::OuterJoin);
slaveSource.addLink(fieldNum(EmployeeTable, EmployeeId), fieldNum(TimeSheetTable, EmployeeId));
filterString = Date2Str(FCurrentDate, 123, 2, 2, 2, 2, 2);
slaveSource.addRange(fieldNum(TimeSheetTable, CurrentDate)).value(filterString);
filterString = StrFmt('(%1 != "")', fieldStr(TimeSheetTable, EmploymentAssessment));
while select tEmploymentTable
where (tEmploymentTable.Value == 0)
{
filterString += StrFmt(' || (%1 == "%2")', fieldStr(TimeSheetTable, EmploymentAssessment), tEmploymentTable.EmploymentId);
}
// Получается, что этот фильтр не работает...
slaveSource.addRange(fieldNum(TimeSheetTable, EmploymentAssessment)).value(filterString);

// 3
sysTableLookup = SysTableLookup::newParameters(tableNum(EmployeeTable), _formControl);
sysTableLookup.addLookupfield(fieldNum(EmployeeTable, EmployeeId));
sysTableLookup.addLookupfield(fieldNum(EmployeeTable, ScheduledNumber));
sysTableLookup.addLookupfield(fieldNum(EmployeeTable, FullName));
sysTableLookup.parmQuery(query);
sysTableLookup.performFormLookup();

Возможно я в чем-то ошибаюсь...
Заранее спасибо.