Пытаюсь решить следущую задачу - автоматическое добавление дат выхода газеты при нажатии на кнопку.
Заполняется поле "Дата начала", "Количество выходов" и поле "Через номер"(да/нет), и при нажатии на кнопку "Подсчет" в таблицу "Даты выхода" добавляются необходимые даты, удаляются(если есть)даты не из этого диапозона и пропускаются даты которые уже есть.
Проблема возникает при попытке удаления большого количества дат, т.е. курсор при помощи dataset.Delete() доходит до конца выборки из сорока записей и пытаясь удалить следущую запись вызывает исключение.
Вот так это происходит:
function Button1OnClick(Control) {
var vihdataset=wndvihGridArea.Window.ComponentsByName('dlData').Dataset;
var InvoiceID=dlData.Dataset.ValAsGUID('ID');
DataGridView = wndvihGridArea.Window.ComponentsByName('grdData').Items(0);
wndvihGridArea.Window.ComponentsByName('grdData').ActiveView=DataGridView;
column = DataGridView.Items(0);
column.OrderType=otAsc;
column.OrderPosition = 1;
var SelectQuery = vihdataset.SelectQuery;
column=SelectQuery.Columns.ItemsByAlias('dat');
column.OrderType=otAsc;
column.OrderPosition = 1;
//количество выходов
var kol=dlData.Dataset.ValAsInt('kol');
RefreshDataset(vihdataset);
//Дата начала
var dat=new Date(dlData.Dataset.ValAsDateTime('Dat1'));
//Массив содержаший все необходимые даты выхода
var dats = new Array();
var vihDates="";
for (var i = 0; i kol; i++){
//текстовое представтение всех необходимых дат выхода
vihDates=vihDates+((i==0)?" ":", ")+DatToStrV(dat);
//
dats.push(new Date(dat).getVarDate());
//Добавляем 7 либо 14 дней к дате в зависимости от значения поля "Через номер"
dat=new Date(AddDateDays(dat,7*((!dlData.Dataset.ValAsInt('ChN')>0) ? 1 : 2)));
}
//Массив с уже имеющимися датами
var datIn = new Array();
//Если в Датасете ds_vih уже есть данные обрабатываем их...
if (vihdataset.RecordsCount>0){
vihdataset.GotoFirst();
var rc=vihdataset.RecordsCount;
for (var i = 0; i rc; i++){
// функция GetIndexOfItemInArrayV возвращает индекс даты в массиве дат
//вот ее код:
/*function GetIndexOfItemInArrayV(SearchValue, SearchArray) {
if (SearchArray.length==0){
return -1;
}
for (var i = 0; i SearchArray.length; i++) {
if (SearchValue-SearchArray[i]==0) {
return i;
}
}
return -1;
}*/
//если значение поля dat не в массиве необходимых дат выхода или оно уже в массиве с уже имеющимися датами..
if ((GetIndexOfItemInArrayV(vihdataset.ValAsDateTime('dat'), dats)==-1)||(
GetIndexOfItemInArrayV(vihdataset.ValAsDateTime('dat'), datIn)!=-1)){
//то удаляем эту запись
vihdataset.Delete();
}
else{
//иначе добавляем ее в в массив с уже имеющимися датами
datIn.push(vihdataset.ValAsDateTime('dat'));
vihdataset.GotoNext();
}
}
}
//массив с новыми датами
var datNew = new Array();
for (var i = 0; i kol; i++){
//добавляем в него даты из массива содержашего все необходимые даты выхода, которых нет в массиве с уже имеющимися датами
if (GetIndexOfItemInArrayV(dats[i], datIn)==-1){
datNew.push(dats[i]);
}
}
//Добавляем новые даты в ds_vih
if (datNew.length>0){
for (var i = 0; i datNew.length; i++) {
vihdataset.Append();
vihdataset.ValAsGUID('InvoiceID') = InvoiceID;
vihdataset.ValAsDateTime('dat') = new Date(datNew[i]).getVarDate();
vihdataset.Post();
}
}
RefreshDataset(vihdataset);
return;
}