Тем, кому лень дизайнить сервисы для несложной выборки, посвящается.
Развивая тему, описанную мною здесь, можно получать набор данных, используя сервис, прикрепленный к этому посту (см. вложение), и следующую функцию:
function GetDatasetBySQL(sql) {
var sq = Services.GetNewItemByUSI('sq_Select');
sql = sql.replace('select', '');
var sqlWithoutTop = '';
if ((sql.indexOf('top') != -1) && (sql.indexOf('top') 10)) {
sqlWithoutTop = Trim(sql.replace('top', ''));
sqlWithoutTop = sqlWithoutTop.substring(sqlWithoutTop.indexOf(' '), sqlWithoutTop.length);
}
var FindFrom = 'from';
var FromArray = (sqlWithoutTop == '') ?
sql.split('from') :sqlWithoutTop.split('from');
if (FromArray.length > 0) {
FindFrom = 'from' + FromArray[FromArray.length - 1];
}
var SQLColumns = (sqlWithoutTop == '') ?
Trim(sql.substring(0, sql.indexOf(FindFrom))).split(',') :
Trim(sqlWithoutTop.substring(0, sqlWithoutTop.indexOf(FindFrom))).split(',');
var Columns = sq.Items(0).Columns;
var ColCount = SQLColumns.length;
for (var i = 0; i ColCount; i++) {
if (!Assigned(Columns.ItemsByAlias(SQLColumns[i]))) {
var NewCol = Columns.CreateConstColumn();
var NewColAlias = SQLColumns[i];
NewColAlias = (NewColAlias.indexOf(' as') != -1) ?
NewColAlias.substring(NewColAlias.indexOf(' as') + 3,
NewColAlias.length) : NewColAlias;
NewCol.ColumnAlias = Trim(NewColAlias);
Columns.Add(NewCol);
}
}
Columns.ItemsByAlias('SQLColumn').SQLText = sql + '/*';
var ds = sq.Open();
return ds;
}
Использовать эту функцию можно так:
var Prefix = (Connector.CurrentUser.IsAdmin) ? 'tbl_' : 'vw_';
var sql =
"select Name " +
"from " + Prefix + "Contact " +
"where not AccountID is null " +
"group by Name " +
"having not Name like '%test%' " +
"order by Name asc ";
var Dataset = GetDatasetBySQL(sql);
Log.Write(1, Dataset('Name'));
Поддерживается использование агрегатных функций, только в этом случае нужно обязательно дать полям выборки алиасы:
var Prefix = (Connector.CurrentUser.IsAdmin) ? 'tbl_' : 'vw_';
var sql =
"select count(Name) as test " +
"from " + Prefix + "Contact ";
var Dataset = GetDatasetBySQL(sql);
Log.Write(1, Dataset('test'));
"+": экономия времени, не нужно особо ничего дизайнить.
"-": не предусмотрены сложные конструкции запросов с подзапросами, с exists-фильтрами и т.д. Поэтому рекомендую использовать в более простых случаях (или же доработать функцию своими силами).