InitWorkingTable и Runtime Error 216 in atlantis.rtl at 2F7B

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

InitWorkingTable и Runtime Error 216 in atlantis.rtl at 2F7B

Сообщение niteo »

Доброго всем времени, возникла следующая ошибка

есть такая функция:

Код: Выделить всё

function GetUpperHours(ds, de: date; Chel : comp): double;
{
    GetUpperHours := 0;
    var j: integer;

    WriteMessageLog(string(ds) + ' ' + string(de) + ' ' + string(chel));
    if InitWorkingTable
    {
        writemessagelog('InitWorkingTable - ' + string(cur_time));
        if LoadWorkingTable(slschet.nrec, 9, 2009) = 0
        {
            Message('Табель загрузился', mfInformation or OkButton);
            writemessagelog('LoadWorkingTable - ' + string(cur_time));
            Message('Сейчас будет работа с табелем', mfinformation or OkButton);
            WT_AddDayRangeFilter(1, 31)   // WT_AddDayRangeFilter - Устанавливает на табель дополнительный фильтр по диапазону дней
            if WT_LoadMonthlyAbsences = 0 // Загружает в память информацию о месячных неявках
            {
                //atMonthly = 1
                for(j := 0; j < WT_GetAbsenceCount(atMonthly); Inc(j))
                // WT_GetAbsenceCount - Возвращает количество загруженных неявок типа atMonthly
                { 
                    var Notation: comp;
                    if not WT_GetAbsenceAttribute(atMonthly, j, aaNotation, Notation) or (Notation = 0) //aaNotation - Nrec условного обозначения неявки
                    continue;
                    var Hours: double;
                    var Days: byte;
                    WT_GetAbsenceAttribute(atMonthly, j, aaHours, Hours);
                    WT_GetAbsenceAttribute(atMonthly, j, aaDays, Days);
                    GetUpperHours := GetUpperHours + Hours;
                }
            }
        }
        else
            Message('Табель не загрузился', mfError or OkButton);
        DoneWorkingTable;
    }
}
вызывая которую получаю ошибку вида:
Runtime Error 216 in atlantis.rtl at 2F7B

Вылетает она на LoadWorkingTable.

Табель который пытаюсь загрузить - присутствует. Делаю вроде по науке....?
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Сообщение Screw »

Забавно. А если зайти в просмотр табеля этого товарища?
Виталий
niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

Сообщение niteo »

В Галактике показывает табеля нормально. В отчете по любому товарищу смотрел, не проходит. Может я что то делаю не так? При чем данная конструкция у меня не проходит ни на одном из 3-х!!! клиентах.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

надо войти именно в этот табель что пытатетесь поднять, но вообще я бы грешил на slschet.nrec - в лог его тоже выведите. Еще попробуйте тоже самое вызвать по ctrl+F4 находясь в этом табеле(и лучше на тесте)
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Сообщение Screw »

Niteo, интересует возможность просмотра именно загружаемого табеля. Вполне допускаю существование у этого лицевого счета кривого набора смежных данных, приводящего к падению при загрузке табеля - такое уже случалось (никогда не удается точно предсказать степень кривости и ее форму).

Эдвард, само по себе нехорошее значение параметра не приведет к падению. Однако бо-ме точный диагноз можно поставить только при наличии atlerror.log (niteo, в личку, пожалуйста). Отчет о рабочей станции, разумеется, тоже нужен. Я не ТП, но хотя бы подсказать направление поисков смогу.
Виталий
niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

Сообщение niteo »

Пробывал делать на разных лицевых счетах.
Падать перестала, как перенес работу с табелем из функции в основной код. :shock:
В чем связь - непонятно....?
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Сообщение Screw »

Любопытно. А падало при первом же вызове функции?
Виталий
niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

Сообщение niteo »

Да, падала на InitWorkingTable, но при этом выдывала сообщение
Табель не загрузился. Думал сначала что падает из-за лога (мало ли...) убирал все логи, все равно, стабильно падала, и не зависимо от ЛС. Перенес код в основную процедуру, перестала падать. Правда сейчас говорит, что не может загрузить табель. Ну это я думаю что то с условиями....
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Сообщение Screw »

Если выдавалась мессага "Табель загрузился", значит на InitWorkingTable падать не могло. И даже не на LoadWorkingTable упало, а где-то позже. Как вообще была определена точка падения?

Между делом, в вызове WT_AddDayRangeFilter(1, 31) смысла нет.

А что должна возвращать функция?
Виталий
niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

Сообщение niteo »

Везде лог шел, последняя запись в логе была с датами и nrec ЛС человека, то есть как раз перед

Код: Выделить всё

if InitWorkingTable 
    {
        ....
.
Но перед падением она выдавала сообщение Табель не загрузился то есть как будто дошла до условия

Код: Выделить всё

if LoadWorkingTable(slschet.nrec, 9, 2009) = 0
но перед этим условием у меня стоит строчка для записи в лог, но в лог ничего не падало....


Эта функция должна выдавать колличество часов переработок в зависимости от графика работы человека а так же от типа неявки.
Между делом, в вызове WT_AddDayRangeFilter(1, 31) смысла нет.
пока да, потом будет необходима, для выборки не за месяц в целом, а за диапазон дат.
niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

Сообщение niteo »

Нет, падает на LoadWorkingTable. Поставил message перед вызовом. Мессага появилась - галактика упала. Значит что то не так с LoadWorkingTable, хотя пробывал передавать nrec напрямую:

Код: Выделить всё

if LoadWorkingTable(85568392920071951, 9, 2009) = 0
тот же эффект.

Самое любопытное, что все это происходит только если работа с табелем идет в функции, если в основной процедуре - все ок. то есть не падает.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

Была как то тробла приводящая к утечке памяти при формировании ТХО(эт к LaaLaa - мож он вспомнит). Возможно DoneWorkingTable не до конца все чистит и после 1000(?) вызова заглох? Вообще память это такая тонкая штука. Раньше галка вообще не любила кучи вложенных вызовов и упрощение кода существено повышало стабильность, но теперь вроде получше стало.
niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

Сообщение niteo »

Падает на первом же заходе в функцию и обращению к LoadWorkingTable. До DoneWorkingTable и недоходила наверное. Как я понял, засада была в факте использования LoadWorkingTable в другой функцие, а не в теле основной процедуры. По мне, я бы сам все "руками" разобрал, без использования этих функций, только инфы по атрибутам неявок нету. Вот и приходится :)
Сейчас вроде нормально работает, перенес код из функции в цикл процедуры.
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Сообщение Screw »

Дело, по всей видимости, в реализации writemessagelog. Т.е., в буферизованной (отложенной) записи данных.
Для простоты отследить точное место падения можно обычными мессагами.
Виталий
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Сообщение Screw »

Запоздал я со своими предположениями.

Ясно одно, что в описании проблемы представлена только вершина айсберга, и дело не в вызове, а в окружении вызова. Одно очевидно: инициализировать табель нужно до начала цикла обхода лицевых счетов, а не на каждой его итерации. Оптимальнее во всех смыслах.

Насчет того, что причина падения LoadWorkingTable - вызов ее в функции - это домыслы.
Виталий
Ответить