|
|
|
ВТОРОЙ ЗАХОД
|
|||
|---|---|---|---|
|
#18+
Постараюсь все подробно объяснить: Программа по учету з/п Есть таблица 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() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2002, 08:22:58 |
|
||
|
ВТОРОЙ ЗАХОД
|
|||
|---|---|---|---|
|
#18+
День добрый! 1. Если для КАЖДОЙ записи в orders должна существовать одна запись в charges, нужно связать их по ключу. 2. Далее в фукцию передавать этот ключ 3. В функции по ключу проверять, есть ли запись в charges, если нет - формировать ее. ---------------- Второй вариант - повесить на INSERT-триггер таблицы orders вставку в таблицу charges ------------------ На самом деле приказ только определяет, что для employee, например, установлена не разовая выплата, а как следует из таблицы orders - некоторый механизм выплаты ден. средств на определенный срок. Поэтому в зависимости от того болел ли человек в этот срок, или находился в отпуске - sum ставить сразу- не есть правильно. Вы подумайте, обычно у бухгалтерии есть шифры начислений/удержаний, набор которых индивидуален для каждого employee, а приказ включает/выключает эти шифры на определенный срок.... По-моему так.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2002, 09:33:46 |
|
||
|
ВТОРОЙ ЗАХОД
|
|||
|---|---|---|---|
|
#18+
>которая на основании выборки из orders формирует новые записи в charges Что за выборка то? select * from orders? Как заполнять таблицу charges? Поправьте меня если я не прав, Вам нужно занести в таблицу charges записи, данные для которых берутся в таблице orders, так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2002, 10:26:15 |
|
||
|
ВТОРОЙ ЗАХОД
|
|||
|---|---|---|---|
|
#18+
во-во... я опять не пойму.... это просто добобавление.... зачем фунцции? опять же привидите примеры данных ... что есть и что нужно получить.... а то не ясно выражаетесь.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2002, 10:51:21 |
|
||
|
ВТОРОЙ ЗАХОД
|
|||
|---|---|---|---|
|
#18+
2Лëля: Наконец-то что-то дельное! Насчет тригера отпадает Первый вариант тоже - я привел упрощенный пример - на самом деле, конечно же, все сложнее и , например, приказ о больничном листе, отменяет все остальные на период своего действия. Раньше все работало на курсоре Т.Е. Добавили прика -> потом сфлормировали выплаты, на основании дейсвующИХ приказов. Вопрос-то мой не в том - как написать учет зар. платы, а в том как в моей ситуации избавиться от курсора Тем кому интересно - посмотрите ветку "Наверное, НЕ простой вопрос" там написаны два моих, правда не работающий, решения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2002, 11:18:24 |
|
||
|
ВТОРОЙ ЗАХОД
|
|||
|---|---|---|---|
|
#18+
А почему тригер отпадает? Эта самая задача для тригера - так как приказы записываются по одному - и он полностью переделывает вторую таблицу.А если ещё привернуть case -то и курсор не нужен - хотя если уж очень много бизнес - правил то наверное всётаки курсор лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2002, 11:33:15 |
|
||
|
ВТОРОЙ ЗАХОД
|
|||
|---|---|---|---|
|
#18+
2dao: тригер ничего не решит! Тригер также может выполнятся для группы строк, а мне нужно для ОДНО! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2002, 11:44:08 |
|
||
|
ВТОРОЙ ЗАХОД
|
|||
|---|---|---|---|
|
#18+
>Раньше все работало на курсоре И правильно работало, т.к. момет расчета ЗП и внесения приказа в базу - разные вещи, приказы набираются за месяц, ЗП - рассчитывается 1 раз в месяц. Правильнее будет обрабатывать employee по всем заведенным на него приказам, причем обработка приказа на налоговые льготы отличается от обработки приказа на оплату ночных часов и т.д. >я привел упрощенный пример Это не страшно, но Вы привели упрощенный пример логики- в данном случае это неправильно Давайте сначала 1. Возникает приказ 2. Согласно ему генерируется, удаляется, корректируется employee 3. ЧТо именно корректируется у employee? 4. Когда происходит расчет ЗП? Ну не в тот же момент издания приказа... (и для разных типов приказов- по разному) Антропоцентрический подход: Не танцуйте от приказов, танцуйте от ЧЕЛОВЕКА :-)))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2002, 12:06:16 |
|
||
|
ВТОРОЙ ЗАХОД
|
|||
|---|---|---|---|
|
#18+
2Лëля: Программу с самого начала писал я, сейчас она завершена, просто "оптимизирую" разные слабы места Сейчас ее архитектурастроится вокруг таких "главных" таблиц employees->orders->charges/taxes->paied_charges( собственно выплаченные, на основании charges деньги ) Вроде никаких "скользких" мест не видно - все считается - просто хотел убрать курсор, если это возможно - а то при рассчете зарплаты для всей организации ( банк ) это уже не пара секунд ( 2 минуты ) Вот так! P.S. Антропоцентрический подход: Не танцуйте от приказов, танцуйте от ЧЕЛОВЕКА :-)))) Пока без коментариев - подумаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2002, 12:43:58 |
|
||
|
ВТОРОЙ ЗАХОД
|
|||
|---|---|---|---|
|
#18+
Ну вот, теперь все понятно, банковские не хотят ждать 2 минуты при расчете их ЗП ;-))))) >employees->orders->charges/taxes->paied_charges Вы сами поставили сначала employees. И при такой организации данных правильно Вам все говорили - или курсор, или функция для расчета ЗП. И хорошо триггер для заполнения charges по orders. Правда в бухгалтерии традиционно используются коды начислений/удержаний. К ним привязывают некоторые алгоритмы расчета по этим кодам, а приказ лишь отражает используется ли этот код при расчете ЗП конкретного employee и на какое время. ---------------------------- Я бы предпочла функцию, т.к. иногда необходимо рассчитать конкретного employee, который, например уволился в середине месяца и т.д. Но если все работает, не ломайте, пусть живет.... Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2002, 14:46:35 |
|
||
|
ВТОРОЙ ЗАХОД
|
|||
|---|---|---|---|
|
#18+
блин ну скажите мне зачем тут нужен курсор? что тут такого супер сложного? функции и курсоры лучше не использовать - тяжеловесные операции... лучше процедуру..... коды начисления эт правильно.... намного гибче.... закон поменяется меняем только алгоритм для кода начисления.... зарплату считать нужно в конце месяца... потому что существует табель,больничный, и тд.... можно конечно считать в начале месяца и походу модифицировать... но это ,пардон конечно ,через Ж.....У ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2002, 02:02:53 |
|
||
|
ВТОРОЙ ЗАХОД
|
|||
|---|---|---|---|
|
#18+
MiCe: угу - насчет алгоритмов согласен. А еще можно пойти дальше, разбить алгоритмы по хп и накатав соответствующую метаструктурку под них, получить историю изменения алгоритмов во времени и возможность их изменения задним числом, фактически дав возможность провести расчет задним числом, по тем алгоритмам, которые тогда действовали или пересчитать задним числом по изменившемуся алгоритму Насчет - через Ж..У: Категорически не согласен. У меня движок расчетов работает по принципу Расчет по требованию и может посчитать в любой момент обращения клиента к расчетной информации, причем даже отдельное начисление/удержание. Фича полезная - в любой момент расчетчик может посмотреть, чего там на чела выходит (например при распределении премий между отделами гораздо удобнее их выставлять и сразу видеть, сколько кому получается). Скорость кстати не страдает, так как все результаты расчетов сбрасываются и сохраняются в расчетном кэше, который отслеживает изменения в БД, помечая не только какие договора поменялись и их надо пересчитать, но и вплоть до того, какие расчетные статьи поменялись. Для правильной работы расчета сюда же приплюсуйте систему отношений (dependenced), которая ответственна за поддержку иеархии между статьями нач/удерж. В итоге даже если у вас расчет для всех людей пройдет в начале месяца, и вы всему одному договору измените условия - например поставите премию, то при закрытии расчетного месяца досчитается именно этот договор, причем считаться будет именно эта премия, а пересчитается только то, что на нее завязано (подоходний, ...). Кстати весь движок расчетов, вплоть до механизма пользовательских нач/удерж писан на TSQL и довольно таки шустро работает несмотря на универсальность - полный расчет 1000 договоров занимает где то 20 сек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2002, 09:13:35 |
|
||
|
ВТОРОЙ ЗАХОД
|
|||
|---|---|---|---|
|
#18+
То MiCe, ASCRUS Правильно Вы все сказали!!!! Но структуру данных у funikovyuri видали? Не подбивайте человека все ломать, придет время, сам поймет... Если 3 человека говорят про коды начислений/удержаний, то, по-видимому, что-то в этом есть :-) To funikovyuri Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2002, 10:25:54 |
|
||
|
ВТОРОЙ ЗАХОД
|
|||
|---|---|---|---|
|
#18+
Ну и что за фигня: причем здесь коды начислений, я не про них спрашиваю, понятное дело они итак есть, понятное что где надо используются процедуры - просто интересно - как без тригеров и курсовров записать запрос! ВСЕЕЕЕ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2002, 11:12:55 |
|
||
|
ВТОРОЙ ЗАХОД
|
|||
|---|---|---|---|
|
#18+
Постараюсь смотреть только на Ваше первое сообщение Итак имеем две таблицы, по наличию записей в одной таблице должны добавляться записи в другой таблице Других инф. потоков Вы не привели >по-идее каждый приказ соответсвует начислению в таблице 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 в пределах предложенной логической схемы Всего доброго! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2002, 11:42:14 |
|
||
|
ВТОРОЙ ЗАХОД
|
|||
|---|---|---|---|
|
#18+
Где связь 1:1 между таблицами orders и charges? По каким столбцам? Строго говоря связи нет - точнее - не хотелось бы иметь Потому что отношение не 1:1 2. В таблице charges все столбцы NOT NULL. charges - это таблица в которой просто не может быть null'ов, если они нужны, то можно использовать временную таблицу с такой же структурой, затем , после заполненния - вставлять в charges Как генерируются данные в столбцах [kind] [int] и [sum] [money]? kind - вид начисления, формирутся каким-то правилом отображения приказов на начисления - сейчас не важно [sum] - величина начисления - формируется тем же правилом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2002, 12:39:28 |
|
||
|
ВТОРОЙ ЗАХОД
|
|||
|---|---|---|---|
|
#18+
Да, упорный Вы человек... Пойдем последовательно... 1. Как узнать, есть ли записи в таблице charges, которым соответствуют записи в таблице orders, если нет ключей Разберитесь с этим вопросом, потом будем думать дальше... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2002, 13:09:32 |
|
||
|
ВТОРОЙ ЗАХОД
|
|||
|---|---|---|---|
|
#18+
. Как узнать, есть ли записи в таблице charges, которым соответствуют записи в таблице orders, если нет ключей И зачем мне такое узнавать? Для моего вопроса это не нужно - в реальной таблице все конечно есть - но сейчас это не важно Да, упорный Вы человек... Был, да вышел. Задаешь вопрос и с табой начинают общаться как с бараном - следующим Вашим ответом вероятно будет просьбаразобраться с PK и FK - если так -лучше пойдите ... поотвечайте другим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2002, 13:16:07 |
|
||
|
ВТОРОЙ ЗАХОД
|
|||
|---|---|---|---|
|
#18+
funikovyuri: Интересно, как написать запрос на 2 таблицы, если они никак между собой не соединяются ? По идее у Вас в обоих таблицах присутствует как я понял код служающего. Других связей я предположить не могу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2002, 09:11:41 |
|
||
|
ВТОРОЙ ЗАХОД
|
|||
|---|---|---|---|
|
#18+
в общем-то можно использовать для связи [order] и [kind] но проблема не в этом - ну связали их по ключу - как ДЛЯ КАЖДОЙ ЗАПИСИ В orders выполнить process_order() не используя курсор process_order( [order], ... ) -возвращает таблицу типа ( employee int, charge_kind int, [sum] money, ... ) -но может и ничего не возвращать, а может возвращать и несколько -- вот то что она вернула нужно отправить в [charges] :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2002, 09:27:04 |
|
||
|
ВТОРОЙ ЗАХОД
|
|||
|---|---|---|---|
|
#18+
>с табой начинают общаться как с бараном А зачем за баранов других держать? Ты своий первй пост почитай 2 таблицы, по-идее каждый приказ соответсвует начислению в таблице charge , причем один приказ, обычно, соответсвует одной записи в charges И что люди думать должны Или здесь телепаты... кстати и последний пост process_order( [order], ... ) -возвращает таблицу типа ( employee int, charge_kind int, [sum] money, ... ) -но может и ничего не возвращать, а может возвращать и несколько Чего несколько - таблиц? или наборов? или записей И орать не надо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2002, 14:40:52 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32070023&tid=1818608]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 229ms |
| total: | 350ms |

| 0 / 0 |
