Как известно, для удаления записей из таблицы, правильней всего создавать
специальный DeleteQuery, но как показала практика - делать это всем лень :)
для таких случаев была написана следующая функция.
function DeleteRecords(Dataset, Dictionary) {
if (!Assigned(Dataset)) {
if (!IsEmptyValue(Dataset) &&
Assigned(Services.InformationsByUSI(Dataset))) {
Dataset = GetSingleItemByCode(Dataset, 'DeleteRecords');
} else {
return;
}
}
if ('DBDataset' == Dataset.ServiceTypeCode) {
var Table = Dataset.SelectQuery.Items(0).FromTable;
} else
if ('Table' == Dataset.ServiceTypeCode) {
var Table = Dataset;
} else {
return;
}
var dq = Services.CreateItem('DeleteQuery');
dq.Table = Table;
var TableFields = Table.Fields;
var Filters = dq.Filters;
var Parameters = dq.Parameters;
var TableField;
var FilterFieldType;
var CompareOperatorType = cotEqual;
var Parameter;
var Keys = new VBArray(Dictionary.Keys()).toArray();
var KeysLength = Keys.length;
for (var i = 0; i KeysLength; i++) {
TableField = TableFields.ItemsByName(Keys[i]);
FilterFieldType =
GetParameterTypeBySQLDataType(TableField.SQLDataType);
Parameter = AddQueryParameter(Parameters, Keys[i],
FilterFieldType, Dictionary(Keys[i]));
AddQueryCompareFilter(Filters, Keys[i], TableField,
Parameter, CompareOperatorType);
}
return dq.Execute();
}
первый параметр - может быть как именем сервиса так и самим объектом Таблица или Датасет;
второй параметр - это набор полей и их значений в виде Словаря.
Функция апдейта:
function UpdateRecord(Dataset, RecordID, Dictionary) {
if (!Assigned(Dataset)) {
if (!IsEmptyValue(Dataset) &&
Assigned(Services.InformationsByUSI(Dataset))) {
Dataset = GetSingleItemByCode(Dataset, 'UpdateRecord');
} else {
return;
}
}
if ('DBDataset' == Dataset.ServiceTypeCode) {
var Table = Dataset.SelectQuery.Items(0).FromTable;
} else
if ('Table' == Dataset.ServiceTypeCode) {
var Table = Dataset;
} else {
return;
}
var uq = Services.CreateItem('UpdateQuery');
uq.Table = Table;
var TableFields = Table.Fields;
var Filters = uq.Filters;
var Parameters = uq.Parameters;
var Columns = uq.ColumnsValues;
var TableField;
var FieldType;
var CompareOperatorType = cotEqual;
var Parameter;
var Column;
TableField = TableFields.ItemsByName('ID');
Parameter = AddQueryParameter(Parameters, 'ID', sdtGUID, RecordID);
AddQueryCompareFilter(Filters, 'ID', TableField,
Parameter, CompareOperatorType);
var Keys = new VBArray(Dictionary.Keys()).toArray();
var KeysLength = Keys.length;
for (var i = 0; i KeysLength; i++) {
TableField = TableFields.ItemsByName(Keys[i]);
if (!Assigned(TableField)) {
continue;
}
FieldType = GetParameterTypeBySQLDataType(TableField.SQLDataType);
AddQueryParameter(Parameters, Keys[i], FieldType,
Dictionary(Keys[i]));
Column = Columns.CreateItem();
Column.ParameterName = Column.KeyValue = Column.Name = Keys[i];
Column.DataType = FieldType;
Columns.Add(Column);
}
var Result = uq.Execute();
return Result;
}
первый параметр - может быть как именем сервиса так и самим объектом Таблица или Датасет;
второй параметр - это ID записи в таблице, которую нужно обновить;
третий параметр - это набор полей и их значений в виде Словаря.
Также нужно подключить scr_DB
Пример использования:
var Dictionary = GetNewDictionary();
Dictionary('AccountID') = RecordID;
Dictionary('TypeID') = tOne;
DeleteRecords('tbl_AccountAddress', Dictionary);
var Dictionary = GetNewDictionary();
Dictionary('Name') = 'NewValue';
Dictionary('Name2') = 'NewValue2';
Dictionary('Name3') = 'NewValue3';
UpdateRecord('tbl_Account', RecordID, Dictionary);