В Outlook возможно быстрое получение записей (задач, контактов и т.п. по фильтру). У меня была задача сделать так, чтобы функция для фильтрации записей в SQL-запросе и функция проверки этого же параметра при обработке записи описывались только раз, без дублирования.
Например, я определил бы функцию "важные задачи" и "обычные задачи", запустил бы фильт "важные задачи или обычные задачи", а затем в тексте отчета для каждой полученной записи определял бы опять же с помощью этой функции, является ли задача "важной" или "обычной" и проставлял бы этот флаг.
Суть прикола в том, что функция должна в первом случае выдавать код на языке запросов SQL, а в другом случае - на языке java-script.
Я-таки добился своего.
По контексту определяется, для чего используется функция.
Например, фильтр может быть таким:
function ImportantTask()
{
//Только те задачи, что относятся к категори VIP
A=Category("VIP");
//Только те задачи, что не закрыты
B=Closed();
C=not(B)
return And(A,C);
}
Тогда если эта функция вызывается для SQL-фильтра:
Category("VIP") вернет "outlook:Category='VIP'"
Closed() вернет "outlook:closed=1"
not(B) вернет "not(outlook:closed=1)"
And(A,C) вернет "(outlook:closed=1) and (not(outlook:closed=1))"
Если же функци вызывается на java-script, то будут осуществляться проверки текущего объекта I на категорию VIP, на закрытость задачи и т.п.
Таким образом, реализается базовый класс SQLQueryLanguage, от него наследуется новый класс, где содержатся определенные пользователем функции, например ImportantTask.
Если в родительском классе SQLQueryLanguage установлен объект I, то все методы будут проверять свойства объекта I и возвращать логические значения.
В противном случае будут возвращаться строки.