Страница 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
Это даст вам все назначения для человека, в том числе и те, которые он ранее занимал. Текущее определяется так:
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));