Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / ВТОРОЙ ЗАХОД / 22 сообщений из 22, страница 1 из 1
19.11.2002, 08:22:58
    #32069361
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ВТОРОЙ ЗАХОД
Постараюсь все подробно объяснить:
Программа по учету з/п
Есть таблица orders
CREATE TABLE [dbo].[orders] (
[id] [bigint] IDENTITY (1, 1) NOT NULL ,
[order] [int] NOT NULL ,
[submission_date] [datetime] NOT NULL ,
[employee] [int] NOT NULL ,
[from_date] [datetime] NOT NULL ,
[till_date] [datetime] NOT NULL ,
[belong_date] [datetime] NOT NULL
) ON [PRIMARY]
GO
Это таблица приказов, по-идее каждый приказ соответсвует начислению в таблице charges
CREATE TABLE [dbo].[charges] (
[employee] [int] NOT NULL ,
[kind] [int] NOT NULL ,
[from_date] [datetime] NOT NULL ,
[till_date] [datetime] NOT NULL ,
[day_count] [int] NOT NULL ,
[sum] [money] NOT NULL
) ON [PRIMARY]
GO
Необходимо написать функции, которая на основании выборки из orders формирует новые записи в charges - причем один приказ, обычно, соответсвует одной записи в charges
Как написать эту функции без курсора по orders и вызова для каждой записи фунции process_order()
...
Рейтинг: 0 / 0
19.11.2002, 09:33:46
    #32069382
Лëля
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ВТОРОЙ ЗАХОД
День добрый!
1. Если для КАЖДОЙ записи в orders должна существовать одна запись в charges, нужно связать их по ключу.
2. Далее в фукцию передавать этот ключ
3. В функции по ключу проверять, есть ли запись в charges, если нет - формировать ее.
----------------
Второй вариант - повесить на INSERT-триггер таблицы orders вставку в таблицу charges
------------------
На самом деле приказ только определяет, что для employee, например, установлена не разовая выплата, а как следует из таблицы orders - некоторый механизм выплаты ден. средств на определенный срок. Поэтому в зависимости от того болел ли человек в этот срок, или находился в отпуске - sum ставить сразу- не есть правильно.
Вы подумайте, обычно у бухгалтерии есть шифры начислений/удержаний, набор которых индивидуален для каждого employee, а приказ включает/выключает эти шифры на определенный срок....
По-моему так....
...
Рейтинг: 0 / 0
19.11.2002, 10:26:15
    #32069412
fima
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ВТОРОЙ ЗАХОД
>которая на основании выборки из orders формирует новые записи в charges
Что за выборка то? select * from orders? Как заполнять таблицу charges? Поправьте меня если я не прав, Вам нужно занести в таблицу charges записи, данные для которых берутся в таблице orders, так?
...
Рейтинг: 0 / 0
19.11.2002, 10:51:21
    #32069436
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ВТОРОЙ ЗАХОД
во-во... я опять не пойму....
это просто добобавление.... зачем фунцции?
опять же привидите примеры данных ... что есть и что нужно получить.... а то не ясно выражаетесь....
...
Рейтинг: 0 / 0
19.11.2002, 11:18:24
    #32069460
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ВТОРОЙ ЗАХОД
2Лëля: Наконец-то что-то дельное!
Насчет тригера отпадает
Первый вариант тоже - я привел упрощенный пример - на самом деле, конечно же, все сложнее и , например, приказ о больничном листе, отменяет все остальные на период своего действия. Раньше все работало на курсоре
Т.Е. Добавили прика -> потом сфлормировали выплаты, на основании дейсвующИХ приказов. Вопрос-то мой не в том - как написать учет зар. платы, а в том как в моей ситуации избавиться от курсора
Тем кому интересно - посмотрите ветку "Наверное, НЕ простой вопрос" там написаны два моих, правда не работающий, решения.
...
Рейтинг: 0 / 0
19.11.2002, 11:33:15
    #32069485
dao
dao
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ВТОРОЙ ЗАХОД
А почему тригер отпадает? Эта самая задача для тригера - так как приказы записываются по одному - и он полностью переделывает вторую таблицу.А если ещё привернуть case -то и курсор не нужен - хотя если уж очень много бизнес - правил то наверное всётаки курсор лучше.
...
Рейтинг: 0 / 0
19.11.2002, 11:44:08
    #32069498
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ВТОРОЙ ЗАХОД
2dao: тригер ничего не решит! Тригер также может выполнятся для группы строк, а мне нужно для ОДНО!
...
Рейтинг: 0 / 0
19.11.2002, 12:06:16
    #32069532
Лëля
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ВТОРОЙ ЗАХОД
>Раньше все работало на курсоре
И правильно работало, т.к. момет расчета ЗП и внесения приказа в базу - разные вещи, приказы набираются за месяц, ЗП - рассчитывается 1 раз в месяц.

Правильнее будет обрабатывать employee по всем заведенным на него приказам, причем обработка приказа на налоговые льготы отличается от обработки приказа на оплату ночных часов и т.д.


>я привел упрощенный пример
Это не страшно, но Вы привели упрощенный пример логики- в данном случае это неправильно

Давайте сначала
1. Возникает приказ
2. Согласно ему генерируется, удаляется, корректируется employee
3. ЧТо именно корректируется у employee?
4. Когда происходит расчет ЗП? Ну не в тот же момент издания приказа... (и для разных типов приказов- по разному)


Антропоцентрический подход: Не танцуйте от приказов, танцуйте от ЧЕЛОВЕКА :-))))
...
Рейтинг: 0 / 0
19.11.2002, 12:43:58
    #32069557
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ВТОРОЙ ЗАХОД
2Лëля:
Программу с самого начала писал я, сейчас она завершена, просто "оптимизирую" разные слабы места
Сейчас ее архитектурастроится вокруг таких "главных" таблиц
employees->orders->charges/taxes->paied_charges( собственно выплаченные, на основании charges деньги )
Вроде никаких "скользких" мест не видно - все считается - просто хотел убрать курсор, если это возможно - а то при рассчете зарплаты для всей организации ( банк ) это уже не пара секунд ( 2 минуты ) Вот так!

P.S. Антропоцентрический подход: Не танцуйте от приказов, танцуйте от ЧЕЛОВЕКА :-)))) Пока без коментариев - подумаю
...
Рейтинг: 0 / 0
19.11.2002, 14:46:35
    #32069663
Лëля
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ВТОРОЙ ЗАХОД
Ну вот, теперь все понятно, банковские не хотят ждать 2 минуты при расчете их ЗП ;-)))))
>employees->orders->charges/taxes->paied_charges
Вы сами поставили сначала employees.
И при такой организации данных правильно Вам все говорили - или курсор, или функция для расчета ЗП. И хорошо триггер для заполнения charges по orders.

Правда в бухгалтерии традиционно используются коды начислений/удержаний. К ним привязывают некоторые алгоритмы расчета по этим кодам, а приказ лишь отражает используется ли этот код при расчете ЗП конкретного employee и на какое время.
----------------------------
Я бы предпочла функцию, т.к. иногда необходимо рассчитать конкретного employee, который, например уволился в середине месяца и т.д.

Но если все работает, не ломайте, пусть живет....

Удачи!
...
Рейтинг: 0 / 0
20.11.2002, 02:02:53
    #32069897
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ВТОРОЙ ЗАХОД
блин ну скажите мне зачем тут нужен курсор? что тут такого супер сложного?
функции и курсоры лучше не использовать - тяжеловесные операции... лучше процедуру.....
коды начисления эт правильно.... намного гибче....
закон поменяется меняем только алгоритм для кода начисления.... зарплату считать нужно в конце месяца...
потому что существует табель,больничный, и тд....
можно конечно считать в начале месяца и походу модифицировать... но это ,пардон конечно ,через Ж.....У
...
Рейтинг: 0 / 0
20.11.2002, 09:13:35
    #32069957
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ВТОРОЙ ЗАХОД
MiCe:
угу - насчет алгоритмов согласен. А еще можно пойти дальше, разбить алгоритмы по хп и накатав соответствующую метаструктурку под них, получить историю изменения алгоритмов во времени и возможность их изменения задним числом, фактически дав возможность провести расчет задним числом, по тем алгоритмам, которые тогда действовали или пересчитать задним числом по изменившемуся алгоритму

Насчет - через Ж..У:
Категорически не согласен. У меня движок расчетов работает по принципу Расчет по требованию и может посчитать в любой момент обращения клиента к расчетной информации, причем даже отдельное начисление/удержание. Фича полезная - в любой момент расчетчик может посмотреть, чего там на чела выходит (например при распределении премий между отделами гораздо удобнее их выставлять и сразу видеть, сколько кому получается). Скорость кстати не страдает, так как все результаты расчетов сбрасываются и сохраняются в расчетном кэше, который отслеживает изменения в БД, помечая не только какие договора поменялись и их надо пересчитать, но и вплоть до того, какие расчетные статьи поменялись. Для правильной работы расчета сюда же приплюсуйте систему отношений (dependenced), которая ответственна за поддержку иеархии между статьями нач/удерж. В итоге даже если у вас расчет для всех людей пройдет в начале месяца, и вы всему одному договору измените условия - например поставите премию, то при закрытии расчетного месяца досчитается именно этот договор, причем считаться будет именно эта премия, а пересчитается только то, что на нее завязано (подоходний, ...). Кстати весь движок расчетов, вплоть до механизма пользовательских нач/удерж писан на TSQL и довольно таки шустро работает несмотря на универсальность - полный расчет 1000 договоров занимает где то 20 сек.
...
Рейтинг: 0 / 0
20.11.2002, 10:25:54
    #32069977
Лëля
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ВТОРОЙ ЗАХОД
То MiCe, ASCRUS

Правильно Вы все сказали!!!!

Но структуру данных у funikovyuri видали?
Не подбивайте человека все ломать, придет время, сам поймет... Если 3 человека говорят про коды начислений/удержаний, то, по-видимому, что-то в этом есть :-)

To funikovyuri
Удачи!
...
Рейтинг: 0 / 0
20.11.2002, 11:12:55
    #32070007
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ВТОРОЙ ЗАХОД
Ну и что за фигня:
причем здесь коды начислений, я не про них спрашиваю, понятное дело они итак есть, понятное что где надо используются процедуры - просто интересно - как без тригеров и курсовров записать запрос! ВСЕЕЕЕ!
...
Рейтинг: 0 / 0
20.11.2002, 11:42:14
    #32070023
Лëля
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ВТОРОЙ ЗАХОД
Постараюсь смотреть только на Ваше первое сообщение
Итак имеем две таблицы, по наличию записей в одной таблице должны добавляться записи в другой таблице
Других инф. потоков Вы не привели

>по-идее каждый приказ соответсвует начислению в таблице charges
1. Где связь 1:1 между таблицами orders и charges?
По каким столбцам?
2. В таблице charges все столбцы NOT NULL.
Как генерируются данные в столбцах [kind] [int] и [sum] [money]? На основании имеющихся данных в двух этих таблицах?
3. Поскольку существует избыточность данных по столбцам [from_date] [datetime] NOT NULL , [till_date] [datetime] NOT NULL (они в обоих таблицах), то что делать с корректировками этих данных?
Вывод:
Написание запроса на добавление крайне затруднено отсутствием связей, ограничениями NOT NULL
в пределах предложенной логической схемы

Всего доброго!
...
Рейтинг: 0 / 0
20.11.2002, 12:39:28
    #32070058
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ВТОРОЙ ЗАХОД
Где связь 1:1 между таблицами orders и charges?
По каким столбцам?

Строго говоря связи нет - точнее - не хотелось бы иметь
Потому что отношение не 1:1
2. В таблице charges все столбцы NOT NULL.
charges - это таблица в которой просто не может быть null'ов, если они нужны, то можно использовать временную таблицу с такой же структурой, затем , после заполненния - вставлять в charges
Как генерируются данные в столбцах [kind] [int] и [sum] [money]?
kind - вид начисления, формирутся каким-то правилом отображения приказов на начисления - сейчас не важно
[sum] - величина начисления - формируется тем же правилом
...
Рейтинг: 0 / 0
20.11.2002, 13:09:32
    #32070083
Лëля
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ВТОРОЙ ЗАХОД
Да, упорный Вы человек...
Пойдем последовательно...
1. Как узнать, есть ли записи в таблице charges, которым соответствуют записи в таблице orders, если нет ключей

Разберитесь с этим вопросом, потом будем думать дальше...
...
Рейтинг: 0 / 0
20.11.2002, 13:16:07
    #32070088
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ВТОРОЙ ЗАХОД
. Как узнать, есть ли записи в таблице charges, которым соответствуют записи в таблице orders, если нет ключей

И зачем мне такое узнавать? Для моего вопроса это не нужно - в реальной таблице все конечно есть - но сейчас это не важно


Да, упорный Вы человек... Был, да вышел. Задаешь вопрос и с табой начинают общаться как с бараном - следующим Вашим ответом вероятно будет просьбаразобраться с PK и FK - если так -лучше пойдите ... поотвечайте другим
...
Рейтинг: 0 / 0
21.11.2002, 09:11:41
    #32070536
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ВТОРОЙ ЗАХОД
funikovyuri:
Интересно, как написать запрос на 2 таблицы, если они никак между собой не соединяются ? По идее у Вас в обоих таблицах присутствует как я понял код служающего. Других связей я предположить не могу.
...
Рейтинг: 0 / 0
21.11.2002, 09:27:04
    #32070541
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ВТОРОЙ ЗАХОД
в общем-то можно использовать для связи [order] и [kind] но проблема не в этом - ну связали их по ключу - как
ДЛЯ КАЖДОЙ ЗАПИСИ В orders выполнить process_order() не используя курсор
process_order( [order], ... ) -возвращает таблицу типа
( employee int,
charge_kind int,
[sum] money,
... ) -но может и ничего не возвращать, а может возвращать и несколько

-- вот то что она вернула нужно отправить в [charges] :)
...
Рейтинг: 0 / 0
21.11.2002, 14:40:52
    #32070782
Гость
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ВТОРОЙ ЗАХОД
>с табой начинают общаться как с бараном
А зачем за баранов других держать?
Ты своий первй пост почитай
2 таблицы, по-идее каждый приказ соответсвует начислению в таблице charge , причем один приказ, обычно, соответсвует одной записи в charges

И что люди думать должны Или здесь телепаты...
кстати и последний пост
process_order( [order], ... ) -возвращает таблицу типа
( employee int,
charge_kind int,
[sum] money,
... ) -но может и ничего не возвращать, а может возвращать и несколько


Чего несколько - таблиц? или наборов? или записей
И орать не надо...
...
Рейтинг: 0 / 0
21.11.2002, 15:00:59
    #32070804
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ВТОРОЙ ЗАХОД
2Гость: Я кстати пока не орал и не хамил

Предлагаю топик закрыть, покрайней мере я бы так хотел
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / ВТОРОЙ ЗАХОД / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]