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

Таблица Persons и "профессия"

Добавлено: 23 мар 2007, 12:59
lerich
Подскажите, плз, как выбрать запросом табельные номера сотрудников по номеру и названию профессии.
Например, выбрать всех "Токарей", код профессии 8211.2
В таблице Persons есть ссылка на профессию, а дальше я никак не могу разобраться.
Please help 8-)

Добавлено: 23 мар 2007, 15:23
varvara
В таблице Persons есть ссылка на профессию?Интересно, какая?
Насколько я понимаю, в Рersons есть ссылка на текущее назначение
Appointcur, а уже в таблице Appointments есть ссылка на проффессию
Post.

Добавлено: 23 мар 2007, 16:47
lerich
Там есть такое поле CBASEPROF, написано, что это ссылка на профессию

Добавлено: 23 мар 2007, 18:20
varvara
Да, но в нашей базе оно почему-то пустое(версия 7.12).

Добавлено: 23 мар 2007, 18:46
lerich
Разобралась, наконец-то!
В таблице Appointments есть поле POST (профессия), но это ссылка, но только не указано на какую таблицу.
А вот используя поле-ссылку CBASEPROF из таблицы PERSON, можно в перейти в таблицу CATALOGS, где как раз и находятся профессии (должности) с кодами и т.п.

Добавлено: 23 мар 2007, 18:54
varvara
Ссылка Post это тоже на таблицу Catalogs.А в вашей базе поле CBASEPROF заполняется?

Добавлено: 26 мар 2007, 13:27
k_vit
select
CATALOGS.NAME,
PERSONS.FIO
from
CATALOGS,
persons
where
((
COMP(x) == CATALOGS.NREC AND
CATALOGS.NREC == APPOINTMENTS.POST(NOINDEX) AND
APPOINTMENTS.NREC /== PERSONS.APPOINTCUR(noindex)
));

Добавлено: 27 мар 2007, 15:44
lerich
varvara писал(а):Ссылка Post это тоже на таблицу Catalogs.А в вашей базе поле CBASEPROF заполняется?
да, как оказалось это поле имеет нулевое значение :(

Добавлено: 27 мар 2007, 15:48
lerich
k_vit писал(а):select
CATALOGS.NAME,
PERSONS.FIO
from
CATALOGS,
persons
where
((
COMP(x) == CATALOGS.NREC AND
CATALOGS.NREC == APPOINTMENTS.POST(NOINDEX) AND
APPOINTMENTS.NREC /== PERSONS.APPOINTCUR(noindex)
));
А что за функция COMP(x) и что означает (noindex)

Добавлено: 27 мар 2007, 16:43
k_vit
COMP(x)
COMP - функция преобразования любого типа к типу Comp
x - nRec должности, впринципе можно использовать и код должности, но вряд ли в таблице будет такой индекс.

NOINDEX - привязка без индекса, так как в таблице Appointments
нет такого индекса (с полем POST), а втаблице PERSONS нет индеска с полем APPOINTCUR.

Добавлено: 27 мар 2007, 17:09
Ged
COMP(x) - преобразование типов.
соответственно x - переменная.

(noindex)
В двойных скобках (( ... )) обычно указываются подцепки с учетом индексов, но если по некоторому полю нет индекса, то можно указать и так.
или так
-----------------------------
select
CATALOGS.NAME,
PERSONS.FIO
from
CATALOGS,
persons
where
((
COMP(x) == CATALOGS.NREC AND
(
CATALOGS.NREC = APPOINTMENTS.POST AND
APPOINTMENTS.NREC = PERSONS.APPOINTCUR
)
));

---------------------------------------------------
А вот так ограничение будет учитываться на всю вьюху
---------------------------------------------------
select
CATALOGS.NAME,
PERSONS.FIO
from
CATALOGS,
persons
where
((
COMP(x) == CATALOGS.NREC
))
And
(
CATALOGS.NREC = APPOINTMENTS.POST AND
APPOINTMENTS.NREC = PERSONS.APPOINTCUR
)
;

И вообще безиндексные запросы на больших БД будут тормозить.
И лучше правильно построить запрос.

Добавлено: 27 мар 2007, 19:24
lerich
А у вас случайно нет документации или краткого справочника по всем функциям, которые можно использовать в SQL для Галактики?

Добавлено: 27 мар 2007, 22:00
Ged
vipprog.chm входит в стандартную документацию.

Добавлено: 30 мар 2007, 18:37
lerich
Делаю запрос

select persons.tabnmb,persons.fio,persons.galdep,catalogs.code,catalogs.name
from persons,catalogs,katpodr
where ((CATALOGS.NREC /== APPOINTMENTS.POST(NOINDEX) AND APPOINTMENTS.NREC /== PERSONS.APPOINTCUR(noindex))) and catalogs.name='Слесарь-ремонтник'
order by persons.tabnmb;

Получаю: вывелись сведения для 3-х сотрудников, у одного табельный номер 0. Но при этом каждая запись продублирована раз по 10 :(

Через модуль "Управление персоналом", иерархические отчеты по картотеке формирую отчет, где выводятся сотрудники с данной должностью.
В результате получаю 3 человека, причем в этом списке есть сотрудник, который уже уволен.

Как-то получается неочень, потому что я хочу на основе этого запроса еще получить более расширенную информацию по сотрудникам (начисленную зп, фактически отработанное время).

Добавлено: 02 апр 2007, 11:13
varvara
А зачем вам в запросе Katpodr?Уберите ее и будет все нормально.
Чтобы в запрос не поподали уволенные, добавьте еще одно оганичение сомр(persons.disdate)=0