Страница 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 вошло.