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

Текущая должность. Не верно выводит

Добавлено: 05 июн 2015, 14:22
neon_tmn
Добрый день, столкнулся с проблемой, программный код не верно выводит текущую должность.
Сотруднику год назад было назначено временное заместительство на 1 месяц.
Выяснилось, что теперь этому сотруднику постоянно выводит должность сотрудника, которого он замещал.
И это не единичный случай.
Выполняется запрос

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

create view
var
  sPath : string;
  wType : word;
  wId   : word;
  hDBFh,
  fDBFf : longint;
  bExPr : boolean;
  l_date : date;
  intStaj  : integer;
  iStaj  : RunStaj;

from
  Persons
 ,LSchet
 ,Appointments
 ,Catalogs
 ,Synonym Catalogs CatStaj
 ,KlRejim
 ,Education
 ,tmpDBF

where
((
    Persons.nRec == Appointments.Person
and Persons.nRec == LSchet.TPerson
))

order by Appointments.AppointDate
  
bounds PersInArchive   
    as  'У' == Persons.IsEmployee Ordered by Persons.FIO
bounds AllPers         
    as  'С' == Persons.IsEmployee Ordered by Persons.FIO
bounds PersIsEmployee  
    as  'С' == Persons.IsEmployee  and
          0 == Persons.DisDate(noindex) ordered by Persons.FIO
;

После него получаем должность:

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

  if getfirst Catalogs 
    where ((Appointments.Post == Catalogs.nRec)) = tsok
      {
        StrV[6] := Catalogs.nRec;
        StrV[7] := Catalogs.Name;       
      }
nRec и Name выводит не верные.
Как получить именно текущую должность?

Re: Текущая должность. Не верно выводит

Добавлено: 05 июн 2015, 15:13
RAJAH
neon_tmn писал(а):Persons.nRec == Appointments.Person
Это даст вам все назначения для человека, в том числе и те, которые он ранее занимал. Текущее определяется так:

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

persons.appointcur == appointments.nrec

Re: Текущая должность. Не верно выводит

Добавлено: 05 июн 2015, 15:34
neon_tmn
Попробовал заменить, такой запрос мне выдал нулевой результат

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

create view
var
  sPath : string;
  wType : word;
  wId   : word;
  hDBFh,
  fDBFf : longint;
  bExPr : boolean;
  l_date : date;
  intStaj  : integer;
  iStaj  : RunStaj;

from
  Persons
 ,LSchet
 ,Appointments
 ,Catalogs
 ,Synonym Catalogs CatStaj
 ,KlRejim
 ,Education
 ,tmpDBF

where
((
 Persons.appointcur == Appointments.nrec 
and Persons.nRec == LSchet.TPerson
))

order by Appointments.AppointDate
Хотя уже на форуме нашел запросы с примерно таким же условием, там еще AND пару добавляется.
Что не правильно делаю?

Re: Текущая должность. Не верно выводит

Добавлено: 05 июн 2015, 16:16
neon_tmn
Не знаю, верно ли сделал, НО!
При первом запросе

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

...
where
((
    Persons.nRec == Appointments.Person
and Persons.nRec == LSchet.TPerson
))
...
сделал условие ниже

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

         if ( GetFirst Appointments where (( Persons.AppointCur == Appointments.nRec )) = tsOk )
             {
                if ( GetFirst Catalogs where (( Appointments.Post == Catalogs.nRec )) = tsOk ) {
		  StrV[6] := Catalogs.nRec;
		  StrV[7] := Catalogs.Name;
		}
                else {
                  StrV[6] := '';
                  StrV[7] := '';
		}	
             }
         else {
            StrV[6] := '';
            StrV[7] := '';
	}

И оно отработало верно. Поправьте, если я что-то сделал не верно.

Re: Текущая должность. Не верно выводит

Добавлено: 05 июн 2015, 16:17
RAJAH
Может, дело в getfirst? Этот запрос должен выдать хоть что-нибудь:

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

select persons.fio
from Persons, Appointments, catalogs
where
((
Persons.appointcur /== Appointments.nrec and
appointments.post  /== catalogs.nrec
))
order by Appointments.AppointDate;

Re: Текущая должность. Не верно выводит

Добавлено: 05 июн 2015, 16:22
neon_tmn
Я понимаю, что этот запрос должен выводить множество записей.
А getfirst используется для получения многих данных, там и должность и подразделение и стаж...
Мне пока в этом коде сложно ориентироваться, как часто пишут "только начал изучать".

Re: Текущая должность. Не верно выводит

Добавлено: 05 июн 2015, 16:26
RAJAH
neon_tmn писал(а):getfirst используется для получения многих данных, там и должность и подразделение и стаж...
Возможно, имеет смысл всё запихать в один запрос? Getfirst весьма чувствителен к окружающей его применение обстановке. :)

Re: Текущая должность. Не верно выводит

Добавлено: 05 июн 2015, 16:44
Den
neon_tmn писал(а):Не знаю, верно ли сделал, НО!
При первом запросе

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

...
where
((
    Persons.nRec == Appointments.Person
and Persons.nRec == LSchet.TPerson
))
...
сделал условие ниже

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

         if ( GetFirst Appointments where (( Persons.AppointCur == Appointments.nRec )) = tsOk )
             {
                if ( GetFirst Catalogs where (( Appointments.Post == Catalogs.nRec )) = tsOk ) {
		  StrV[6] := Catalogs.nRec;
		  StrV[7] := Catalogs.Name;
		}
                else {
                  StrV[6] := '';
                  StrV[7] := '';
		}	
             }
         else {
            StrV[6] := '';
            StrV[7] := '';
	}

И оно отработало верно. Поправьте, если я что-то сделал не верно.
у Вас во вью во where было описано одно реляционнное отношение на Appointments, а в коде обработчника своим явным GetFirst Appointments where (( ...
Вы его просто ,скажем так, перекрыли. Вот и все.

Re: Текущая должность. Не верно выводит

Добавлено: 05 июн 2015, 16:49
neon_tmn
RAJAH, спасибо за совет.
Den, спасибо за разъяснение. буду еще разбираться. Там еще проблемки есть тоже с запросом.

Re: Текущая должность. Не верно выводит

Добавлено: 05 июн 2015, 17:53
m0p3e
Для работы с назначениями есть объект готовый. Как и с каталогами впрочем.

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

.var 
  iAppFunc : AppointmentsFunctions;
  iCatFunc : CatalogsFunctions;
  CurPost : string;
.endvar
..........
CurPost := If(GetFirst Appointments Where (( iAppFunc.GetAppNrec_OnDate(Persons.nrec,Cur_Date) == Appointments.nrec )) <>tsOk
              ,'не найдено'
              ,iCatFunc.GetCatalogsName(Appointments.Post));