Страница 1 из 1
Проблема в модуле ЗП
Добавлено: 11 янв 2010, 10:23
hope
Добрый день, ВСЕМ!!!
В ЗП при предварительной разноске по одному работнику вылетает Галактика. Пытаюсь зайти в постоянные доплаты - вылетает. Создаю новую постоянную доплату - вылетает.
Что можно сделать?
Добавлено: 11 янв 2010, 11:09
hope
Для этого работника нельзя посмотреть табель, нельзя добавить постоянные виды доплат, нельзя сформировать предварительную разноску, вручную тоже запись с разноской не добавить, расчет ЗП сделать тоже нельзя. Галактика вылетает.
Остальное дает сделать.
Этот человек работает с 1997 года. Говорят: никаких данных по нему не меняли, новые данные не вводили.
Для этого человека делаю еще один точно такой же лицевой счет (в том же подразделении, с тем же окладом...) - все работает.
Значит дело именно в данных лицевого счета?
Запускала разные проверки - не помогает.
Правда не делала "Сжатие БД".
Добавлено: 11 янв 2010, 11:10
edward_K
хм. что то было подобное. Отпуска проверте - может очень длинный. А заодно и табель - просмотр и печать. У меня вроде проблема была в просмотре табеля и со всем что с этим связано- еле вычислил, что отпуск виноват - на 100 лет забили. Если так не найдете то вам бы в тп, чтобы отладку вставили в добавление доплат. Опять же по журналу отследите что проходит у этого и что у других при добавлении доплат. Я после перебора всех вариантов с dsk и так далее искал то "просто" - нашел список всех функций, что использовалиь в печати табеля и сделал ard c их использованим - на обработке отклонений вылетел - стал их смотреть - увидел отпуск кривой.
Добавлено: 11 янв 2010, 11:12
edward_K
вроде этим искал
там лог делается
вместо ????????? подставте ваш табельный, и ниже проверка на админа идет.
Код: Выделить всё
.Form Zp_Test
.Group 'Зарплата'
.NameInList 'Тестирование зарплаты'
.ard
.var
wmes: longint ;
VedMonth, VedYear :word ;
RabChas : array[1..31] of double ;
RabDayT : array[1..31] of string ;
AbsenceCount :word ;
Country: word;
AbsNotation :string ;
Day1P,Day2P :word ;
TabEmpty,PreferredAbsenceCoding :word ;
.endvar
.create view vvv
as select lschet.nrec
from lschet where (( ?????????==lschet.tabn )) ;
.procedure wmessage(w:string) ;
begin
wmes:=wmes+1 ;
message(string(wmes)+ ' '+ w)
logstrtofile('!test_zar.txt',string(wmes)+ ' '+ w)
end.
.begin
if username<>'supervisor'
{ message('Не для вас писалось!')
Zp_Test.fexit ;
}
if vvv.getfirst lschet=0 {}
if fileexist('!test_zar.txt') deletefile('!test_zar.txt')
wmessage('Start')
Country := wGetTune('Country');
InitWorkingTable ;
VedMonth:=2 ; VedYear:=2009 ;
LoadWorkingTable(vvv.LSCHET.NREC, VedMonth, VedYear)
wmessage('Day1P:=0' )
Day1P:=0 ;
// отбросить редуцированные части табелей
var CurrentPeriodBeginning, CurrentPeriodEnding :date ;
if WT_GetDaysBwDates(dkEnabled, stActual, CurrentPeriodBeginning, CurrentPeriodEnding) = 0
exit;
wmessage('WT_GetDaysBwDates')
var AbsencesLoaded: boolean;
AbsencesLoaded := WT_LoadMonthlyAbsences = 0;
wmessage('WT_LoadMonthlyAbsences ')
var PeriodDay: date;
var i:word ;
// помечаем дни условными обозначениями
for (I := 1; I <= 31; Inc(I))
{
wmessage('for '+string(i))
PeriodDay := AD_Date(I, VedMonth, VedYear);
if (PeriodDay < CurrentPeriodBeginning) or (PeriodDay > CurrentPeriodEnding)
continue;
if not WT_IsDayValid(I, false) or not WT_IsDayEnabled(I)
{
RabDayT[I]:= 'X';
continue;
}
else // если рабочий день
{
wmessage('WT_TestDay(I, dkWholeWorking, stActual)')
if WT_TestDay(I, dkWholeWorking, stActual)
and (WT_GetSystemAbsenceKindOnDate(AD_Date(I, VedMonth, VedYear)) = 0)
{
if ((WT_GetHoursInDay(I, hkWeekend, stActual) > 0) or (WT_GetHoursInDay(I, hkHoliday, stActual) > 0)) and (Country = ccRus)
// работа в выходной
{ RabDayT[I] := AbsNotation;
}
else
//помечаются явки
{ RabDayT[I] := 'Я';
}
RabChas[I] := WT_GetHoursInDay(I, hkWholeWorking, stActual);
wmessage('RabChas[I] := WT_GetHoursInDay')
if I <= 15 // день первой половины месяца
Inc(Day1P);
else // день второй половины месяца
Inc(Day2P);
wmessage('Inc(Day2P);')
}
// если выходной
else
{
wmessage('WT_TestDay(I, dkWeekend, stActual)')
if WT_TestDay(I, dkWeekend, stActual) and ((TabEmpty and 2) = 0)
{
RabDayT[I] := WeekendMark;
}
else
{
var A: integer;
A := -1;
wmessage('AbsencesLoaded')
if AbsencesLoaded
{
// индекс последнего из приходящихся на день I элементов карты отклонений
A := WT_AbsencesMapLastOn(atMonthly, AD_Date(I, VedMonth, VedYear));
if A <> -1
// номер неявки в списке
A := WT_AbsencesMapAbsenceAt(atMonthly, A);
// отбросить отзывы из отпуска
var Kind: word;
if not WT_GetAbsenceAttribute(atMonthly, A, aaKind, Kind)
or (Kind = akVacationRecall)
A := -1;
}
wmessage('111')
if (A <> -1)
{
wmessage('if (A <> -1)')
var CurDate: date;
var MappedOn: boolean;
CurDate := AD_date(I, VedMonth, VedYear);
if PreferredAbsenceCoding = 0
// типовые условные обозначения
{ // RabDayT[I] := AC.GetStandardCode(atMonthly, A, CurDate, MappedOn);
}
else
// пользовательские условные обозначения
{ // RabDayT[I] := AC.GetUserCode(atMonthly, A, CurDate, MappedOn);
}
if (RabDayT[I] = '')
RabDayT[I] := WeekendMark;
// накопление итогов по неявкам
// возможно, будет найдена неявка с таким же условным обозначением как у текущего
wmessage('MappedOn')
if MappedOn or ((RabDayT[I] = WeekendMark) and ((TabEmpty and 2) = 2))
{
wmessage('MappedOn=true')
var J: integer;
J:=0
/*
for (J := 1; J <= AbsenceCount; Inc(J))
if Absences[J].Code = RabDayT[I]
break;
if J <= 8
{
// если такое условное обозначение еще не встречалось, добавим его
if J >= AbsenceCount
{
AbsenceCount := J;
Absences[J].Code := RabDayT[I];
}
Inc(Absences[J].Days);
// приходящееся на дату количество часов отклонения
var Hours: double;
WT_GetAbsenceHoursOn(atMonthly, A, CurDate, Hours);
Absences[J].Hours := Absences[J].Hours + Hours;
}
*/
}
}
else
RabDayT[I] := '?';
wmessage('WT_TestDay(I, dkWholeWorking, stActual)')
// если на день пришлась командировка, которая оставляет день рабочим
if WT_TestDay(I, dkWholeWorking, stActual)
and (WT_GetSystemAbsenceKindOnDate(AD_Date(I, VedMonth, VedYear)) = akBusinessTrip)
{
RabChas[I] := WT_GetHoursInDay(I, hkWholeWorking, stActual);
wmessage('RabChas[I]')
if I <= 15
Inc(Day1P);
else
Inc(Day2P);
}
wmessage('=')
}
wmessage('==')
}
wmessage('===')
}
wmessage('====')
}
wmessage('DoneWorkingTable ;')
DoneWorkingTable ;
wmessage('End')
end.
.endform
Добавлено: 11 янв 2010, 11:15
hope
понятно! спасибо за наводку!
Добавлено: 11 янв 2010, 11:52
hope
Спасибо edward-у!
Действительно на этого работника был оформлен отпуск в 2090 году!
Добавлено: 11 янв 2010, 14:23
empyros
Надо бы в ПИР внести, раз грабли не первый раз попадаются.
Добавлено: 12 янв 2010, 20:26
Screw
В июле 2009-го года правил такую проблему. В 31-ю сборку wt.dll вошло.