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

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

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

Ответить
neon_tmn
Сообщения: 16
Зарегистрирован: 02 апр 2015, 10:49

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

Сообщение 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 выводит не верные.
Как получить именно текущую должность?
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

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

Сообщение RAJAH »

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

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

persons.appointcur == appointments.nrec
neon_tmn
Сообщения: 16
Зарегистрирован: 02 апр 2015, 10:49

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

Сообщение 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 пару добавляется.
Что не правильно делаю?
neon_tmn
Сообщения: 16
Зарегистрирован: 02 апр 2015, 10:49

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

Сообщение 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] := '';
	}

И оно отработало верно. Поправьте, если я что-то сделал не верно.
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

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

Сообщение RAJAH »

Может, дело в getfirst? Этот запрос должен выдать хоть что-нибудь:

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

select persons.fio
from Persons, Appointments, catalogs
where
((
Persons.appointcur /== Appointments.nrec and
appointments.post  /== catalogs.nrec
))
order by Appointments.AppointDate;
neon_tmn
Сообщения: 16
Зарегистрирован: 02 апр 2015, 10:49

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

Сообщение neon_tmn »

Я понимаю, что этот запрос должен выводить множество записей.
А getfirst используется для получения многих данных, там и должность и подразделение и стаж...
Мне пока в этом коде сложно ориентироваться, как часто пишут "только начал изучать".
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

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

Сообщение RAJAH »

neon_tmn писал(а):getfirst используется для получения многих данных, там и должность и подразделение и стаж...
Возможно, имеет смысл всё запихать в один запрос? Getfirst весьма чувствителен к окружающей его применение обстановке. :)
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

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

Сообщение 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 (( ...
Вы его просто ,скажем так, перекрыли. Вот и все.
neon_tmn
Сообщения: 16
Зарегистрирован: 02 апр 2015, 10:49

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

Сообщение neon_tmn »

RAJAH, спасибо за совет.
Den, спасибо за разъяснение. буду еще разбираться. Там еще проблемки есть тоже с запросом.
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

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

Сообщение 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));
Ответить