Страница 1 из 2

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

Добавлено: 01 мар 2010, 17:32
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.

Табель который пытаюсь загрузить - присутствует. Делаю вроде по науке....?

Добавлено: 01 мар 2010, 17:56
Screw
Забавно. А если зайти в просмотр табеля этого товарища?

Добавлено: 01 мар 2010, 18:03
niteo
В Галактике показывает табеля нормально. В отчете по любому товарищу смотрел, не проходит. Может я что то делаю не так? При чем данная конструкция у меня не проходит ни на одном из 3-х!!! клиентах.

Добавлено: 01 мар 2010, 19:14
edward_K
надо войти именно в этот табель что пытатетесь поднять, но вообще я бы грешил на slschet.nrec - в лог его тоже выведите. Еще попробуйте тоже самое вызвать по ctrl+F4 находясь в этом табеле(и лучше на тесте)

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

Эдвард, само по себе нехорошее значение параметра не приведет к падению. Однако бо-ме точный диагноз можно поставить только при наличии atlerror.log (niteo, в личку, пожалуйста). Отчет о рабочей станции, разумеется, тоже нужен. Я не ТП, но хотя бы подсказать направление поисков смогу.

Добавлено: 02 мар 2010, 12:59
niteo
Пробывал делать на разных лицевых счетах.
Падать перестала, как перенес работу с табелем из функции в основной код. :shock:
В чем связь - непонятно....?

Добавлено: 02 мар 2010, 13:30
Screw
Любопытно. А падало при первом же вызове функции?

Добавлено: 02 мар 2010, 13:56
niteo
Да, падала на InitWorkingTable, но при этом выдывала сообщение
Табель не загрузился. Думал сначала что падает из-за лога (мало ли...) убирал все логи, все равно, стабильно падала, и не зависимо от ЛС. Перенес код в основную процедуру, перестала падать. Правда сейчас говорит, что не может загрузить табель. Ну это я думаю что то с условиями....

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

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

А что должна возвращать функция?

Добавлено: 02 мар 2010, 14:51
niteo
Везде лог шел, последняя запись в логе была с датами и nrec ЛС человека, то есть как раз перед

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

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

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

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


Эта функция должна выдавать колличество часов переработок в зависимости от графика работы человека а так же от типа неявки.
Между делом, в вызове WT_AddDayRangeFilter(1, 31) смысла нет.
пока да, потом будет необходима, для выборки не за месяц в целом, а за диапазон дат.

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

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

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

Самое любопытное, что все это происходит только если работа с табелем идет в функции, если в основной процедуре - все ок. то есть не падает.

Добавлено: 02 мар 2010, 15:33
edward_K
Была как то тробла приводящая к утечке памяти при формировании ТХО(эт к LaaLaa - мож он вспомнит). Возможно DoneWorkingTable не до конца все чистит и после 1000(?) вызова заглох? Вообще память это такая тонкая штука. Раньше галка вообще не любила кучи вложенных вызовов и упрощение кода существено повышало стабильность, но теперь вроде получше стало.

Добавлено: 02 мар 2010, 15:46
niteo
Падает на первом же заходе в функцию и обращению к LoadWorkingTable. До DoneWorkingTable и недоходила наверное. Как я понял, засада была в факте использования LoadWorkingTable в другой функцие, а не в теле основной процедуры. По мне, я бы сам все "руками" разобрал, без использования этих функций, только инфы по атрибутам неявок нету. Вот и приходится :)
Сейчас вроде нормально работает, перенес код из функции в цикл процедуры.

Добавлено: 02 мар 2010, 16:18
Screw
Дело, по всей видимости, в реализации writemessagelog. Т.е., в буферизованной (отложенной) записи данных.
Для простоты отследить точное место падения можно обычными мессагами.

Добавлено: 02 мар 2010, 16:22
Screw
Запоздал я со своими предположениями.

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

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