Пытаюсь решить следущую задачу - автоматическое добавление дат выхода газеты при нажатии на кнопку.
Заполняется поле "Дата начала", "Количество выходов" и поле "Через номер"(да/нет), и при нажатии на кнопку "Подсчет" в таблицу "Даты выхода" добавляются необходимые даты, удаляются(если есть)даты не из этого диапозона и пропускаются даты которые уже есть.
Проблема возникает при попытке удаления большого количества дат, т.е. курсор при помощи 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;
}

Нравится

2 комментария

Попробуйте установить свойство FetchRecordsCount равным -1 перед открытием датасета.

Но в этом случае Вам придётся заменить первый вызов функции RefreshDataset на такую конструкцию:

vihdataset.Close();
vihdataset.FetchRecordsCount = -1;
vihdataset.Open();

И, возможно, вместо второго вызова аналогичным способом опять установить размер выборки равным 40.

Спасибо Вам огроменное, Олег!
Я часа 3 бородил по форуму, в поисках решения, а все оказывается так просто.:( :)
Нужно внимательней читать мануал.

Показать все комментарии