Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Нужна помощь
|
|||
|---|---|---|---|
|
#18+
Добрый день У меня есть таблица - "План выпуска": Plan Izdelie varchar - наименование изделия Quantity int - количество выпускаемых изделий Level int - количество этажей на которое расчитано это изделие Эту таблицу заполняет отдел снабжения. Есть таблица Sprav Izdelie varchar Tbl_Etalon varchar Tbl_One varchar В этой таблице к каждому изделию привязывается две таблицы на сервере. Эти две таблицы имеют одинаковую структуру: KodMat varchar NameMat varchar Norma real Поясню - в этих таблицах описывается расход материала на определенное изделие. Но, так как расход материала зависит от этажности изделия, то существет две таблицы первая таблица - расход материалов на изделие эталон (16 этажей) - A вторая таблица - расход материалов на один этаж (1 этаж) - B Эти файлы подготавливаются сторонней организацией и менять их структуру я не могу. Задача необходимо получить потребность в материалах в соответствии с планом. Раньше задача решалась на локальных машинах, но теперь принято решение переносить все данные на SQL Server - таким образом сторонней организации передавать нам эти данные. Ранее вся логика была на клиентском месте, теперь как я понимаю хорошо бы перенести ее на сервер, например в виде хранимой процедуры. Но вот как ее написать я пока даже не представляю. Методика расчета следующая (как делалось раньше): 1. Для каждого изделия вычисляется потребность в материалах, как A.Norma+B.Norma(Level-16) Получается следующая структура: KodMat NameMat Norma 2. Данные полученные для каждого изделия собираются в одну таблицу 3. У материалов с одинаковыми KodMat складываются нормы (то есть делается group by - sum) Теперь хотелось бы сделать это виде хранимой процедуры, но вопросов больше, чем ответов. Буду благодарен за любую помощь. Спасибо за внимание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2002, 13:57 |
|
||
|
Нужна помощь
|
|||
|---|---|---|---|
|
#18+
Я думаю Вам легче всего создать свою нормализованную структуру, без всякого множества таблиц, и перекачивать в нее данные, раз те таблицы со сторонних организаций и менять их нельзя. Уверен, что как только Вы это сделаете, у Вас отпадут все вопросы как сделать ХП и скорее всего достаточно будет написать не очень даже сложный запрос, чтобы получить требуемое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2002, 19:36 |
|
||
|
Нужна помощь
|
|||
|---|---|---|---|
|
#18+
Добрый день. >>>> Я думаю Вам легче всего создать свою нормализованную структуру, без всякого множества таблиц, и перекачивать в нее данные, раз те таблицы со сторонних организаций и менять их нельзя. Уверен, что как только Вы это сделаете, у Вас отпадут все вопросы как сделать ХП и скорее всего достаточно будет написать не очень даже сложный запрос, чтобы получить требуемое. >>>> Все дело в том, что эти данные постоянно изменяются, то есть имеющиеся таблицы расходов материалов на изделия модифицируются, с появлением новых изделий - появляются новые таблицы. А при расчете каждый раз потребности в материалах обновлять свою нормализованную структуру мне кажется неразумным. Или я не прав ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2002, 14:13 |
|
||
|
Нужна помощь
|
|||
|---|---|---|---|
|
#18+
Если у вашей "сторонней организации" с каждым новым видом изделия плодятся таблицы, это не значит, что ВАШИ таблицы, продуманные, нормализованные и расчитанные на более или менее общий случай, должны плодиться тоже - они останутся такими же. Да, скорее всего придется писать программку, которая "данные сторонней организации" будет конвертировать в данные для вашей базы. Ну так вам и так придется что-то менять, если вы хотите поддерживать постоянно меняющиеся данные вашей "сторонней организации". А лучше менять (дополнять) программу чем вашу базу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2002, 14:59 |
|
||
|
Нужна помощь
|
|||
|---|---|---|---|
|
#18+
>>> Если у вашей "сторонней организации" с каждым новым видом изделия плодятся таблицы, это не значит, что ВАШИ таблицы, продуманные, нормализованные и расчитанные на более или менее общий случай, должны плодиться тоже - они останутся такими же. Да, я это понимаю. >> Да, скорее всего придется писать программку, которая "данные сторонней организации" будет конвертировать в данные для вашей базы. Это тоже я понимаю. Когда должна осуществляться конвертация ? С учетом того, что данные "сторонней организации" изменяются ежедневно и они нам про это не сообщают и мы производим расчетнесколько раз в день, то наверное это должно осуществляться непосредственно перед расчетом. Так ? Раньше эта организация поставляла нам данные в dbf, сооттветственно у меня написано приложение которое осуществляет расчет описанным мною выше методом. Теперь эта организация выложила все данные на SQL сервер. Так как это уже клиент серверная технология мне хочется не просто брать данные из другого источника, но и УСКОРИТЬ ВРЕМЯ РАСЧЕТА за счет использования возможностей SQL сервера. Если я буду каждый раз перед расчетом осуществлять конвертацию данных я думаю время расчета не только не уменьшится, но и наоборот возрастет. Тогда пусть уж лучше все остается по старому... >>> Ну так вам и так придется что-то менять, если вы хотите поддерживать постоянно меняющиеся данные вашей "сторонней организации". Вовсе нет. Сейчас я смотрю какие у меня изделия в плане, смотрю какие таблички соответствуют этим базам данных, и в процессе расчета выбираю данные из этих табличек. То что делалось просто на клиенте, а именно 1) получение списка необходимых таблиц 2) непосредственно работа с этими таблицами на SQL вызывает у меня затруднения. То есть с помощью одного запроса я могу получить список всех таблиц, которые я хочу использовать. А вот формирование следующих запросов (которые зависят от выбранного списка) вызывают трудность. Надеюсь я все понятно излагаю Благодарю за внимание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2002, 15:16 |
|
||
|
Нужна помощь
|
|||
|---|---|---|---|
|
#18+
А как "в жизни" (опишите, пожалуйста, алгоритм) по таблице с "новым видом изделия" можно определить методику расчета? И второй вопрос (а скорее, совет или даже довольно-таки наглое утверждение - если я чего не понимаю, то извините заранее: Почему вы считаете, что процесс расчета должен происходить ИМЕННО В ХРАНИМОЙ ПРОЦЕДУРЕ НА SQL СЕРВЕРЕ? Можно ведь сделать так: 1. Оставить расчет (вместе с алгоритмомом выбора метода расчета по исходной таблице, который как я понял, на SQL реализовать трудно) - на клиентской машине. 2. Написать опять же программу (COM-объект предпочтительно, можно даже серверный и distributed) выполняющий расчет, установить его (COM-объект) на сервере, установить PROXY для этого объекта на клиентских машинах - и работать с объектом. Раз уж вы попали в ситуацию, когда проще переложить некую функцию вашей системы на клиентские (по отношению к SQL Server) машины или машину, не вижу ничего криминального, чтобы так и поступить. Более того, концепция n-уровнего приложения так и требует - никакой бизнес логики в самой базе данных, вся бизнес логика заключена в приложении. Смотрите на базу данных просто как на хранилище данных, а не аппарат реализующий в себе бизнес-логику. И база получится проще (без завернутых хранимых процедур), и приложение лучше (аккуратное разделение полномочий между подсистемами, удобтсво в обслуживании и модификации, т.д.). Дмитрий ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2002, 17:56 |
|
||
|
Нужна помощь
|
|||
|---|---|---|---|
|
#18+
>> А как "в жизни" (опишите, пожалуйста, алгоритм) по таблице с "новым видом изделия" можно определить методику расчета? Методика расчета остается та же. Просто в запрос попадает еще одна таблица. >> Почему вы считаете, что процесс расчета должен происходить ИМЕННО В ХРАНИМОЙ ПРОЦЕДУРЕ НА SQL СЕРВЕРЕ? Я так не считаю. Я это пытаюсь выяснить. Ответ, что данная вещь на SQL сложно реализуется - является тоже ответом, и является аргументом, чтобы оставить логику на клиенте, что я похоже и сделаю. >> Более того, концепция n-уровнего приложения так и требует - никакой бизнес логики в самой базе данных, вся бизнес логика заключена в приложении. Смотрите на базу данных просто как на хранилище данных, а не аппарат реализующий в себе бизнес-логику. И база получится проще (без завернутых хранимых процедур), и приложение лучше (аккуратное разделение полномочий между подсистемами, удобтсво в обслуживании и модификации, т.д.). Очень интересно. А можно узнать, на чем строится данное утверждение (например ссылку). То есть реализация n-уровневого приложения исключает такие механизмы, как триггеры и хранимые процедуры ??? Но ведь триггер или хранимая процедура отработает, быстрее, чем несколько запросов посылаемых сервером приложений. И на последок. Для повышения уровня знаний: Если я одним запросом получил список таблиц: select TableNames from AllTables where TableNeeded = 1 могу ли я выполнить следующий запрос: select * from Table1 union select * from Table2 union ..... union select * from Tablen где Table1..Table2 - берутся из первого запроса ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2002, 06:16 |
|
||
|
Нужна помощь
|
|||
|---|---|---|---|
|
#18+
Выполнить то запрос можно, но посредством динамического SQL. То есть на первый запрос организовать курсор, в цикле этого курсора построить строку скрипта, а потом уже выполнить. Единственное, что не стоит забывать, что кол-во union-ов ограниченно (точно не скажу на сколько, лучше почитать в BOL). Так что если таблиц много, то лучше организовать временную таблицу и в цикле курсора динамическим скриптом впихивать в нее данные из таблиц. А после прогона курсора уже можно будет над ней выполнять различные действия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2002, 10:30 |
|
||
|
Нужна помощь
|
|||
|---|---|---|---|
|
#18+
2Андрей Что вам мешает объединить ВСЕ таблицы расходов материалов одного типа в одну (физически или с помощью представления) и заменить в таблице Sprav(Izdelie varchar, Tbl_Etalon varchar, Tbl_One varchar) Tbl_Etalon и Tbl_One на код таблицы ? Что-то вроде такого CREATE EtalonView AS SELECT 1 AS tableid, KodMat, NameMat, Norma FROM etalontable1 UNION ALL SELECT 2 AS tableid, KodMat, NameMat, Norma FROM etalontable2 UNION ALL SELECT 3 AS tableid, KodMat, NameMat, Norma FROM etalontable3 .... CREATE OneView AS SELECT 1 AS tableid, KodMat, NameMat, Norma FROM onetable1 UNION ALL SELECT 2 AS tableid, KodMat, NameMat, Norma FROM onetable2 UNION ALL SELECT 3 AS tableid, KodMat, NameMat, Norma FROM onetable3 .... Тогда отпадет необходимость в динамических запросах SELECT * FROM Plan a INNER JOIN Sprav b ON b.Izdelie = a.Izdelie LEFT OUTER JOIN EtalonView c ON c.tableid = b.Tbl_Etalon LEFT OUTER JOIN OneView d ON d.tableid = b.Tbl_One ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2002, 11:32 |
|
||
|
Нужна помощь
|
|||
|---|---|---|---|
|
#18+
>> Выполнить то запрос можно, но посредством динамического SQL. То есть на первый запрос организовать курсор, в цикле этого курсора построить строку скрипта, а потом уже выполнить. Спасибо. А нельзя ли посмотреть пример скрипта ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2002, 13:01 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32029914&tid=1822786]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
163ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
| others: | 254ms |
| total: | 542ms |

| 0 / 0 |
