powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нужна помощь
10 сообщений из 10, страница 1 из 1
Нужна помощь
    #32029658
АНДРЕЙ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день

У меня есть таблица - "План выпуска":

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)

Теперь хотелось бы сделать это виде хранимой процедуры, но вопросов больше, чем ответов. Буду благодарен за любую помощь.

Спасибо за внимание.
...
Рейтинг: 0 / 0
Нужна помощь
    #32029680
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю Вам легче всего создать свою нормализованную структуру, без всякого множества таблиц, и перекачивать в нее данные, раз те таблицы со сторонних организаций и менять их нельзя. Уверен, что как только Вы это сделаете, у Вас отпадут все вопросы как сделать ХП и скорее всего достаточно будет написать не очень даже сложный запрос, чтобы получить требуемое.
...
Рейтинг: 0 / 0
Нужна помощь
    #32029785
Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

>>>>
Я думаю Вам легче всего создать свою нормализованную структуру, без всякого множества таблиц, и перекачивать в нее данные, раз те таблицы со сторонних организаций и менять их нельзя. Уверен, что как только Вы это сделаете, у Вас отпадут все вопросы как сделать ХП и скорее всего достаточно будет написать не очень даже сложный запрос, чтобы получить требуемое.
>>>>

Все дело в том, что эти данные постоянно изменяются, то есть имеющиеся таблицы расходов материалов на изделия модифицируются, с появлением новых изделий - появляются новые таблицы. А при расчете каждый раз потребности в материалах обновлять свою нормализованную структуру мне кажется неразумным. Или я не прав ?
...
Рейтинг: 0 / 0
Нужна помощь
    #32029791
Dimos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если у вашей "сторонней организации" с каждым новым видом изделия плодятся таблицы, это не значит, что ВАШИ таблицы, продуманные, нормализованные и расчитанные на более или менее общий случай, должны плодиться тоже - они останутся такими же.
Да, скорее всего придется писать программку, которая "данные сторонней организации" будет конвертировать в данные для вашей базы.
Ну так вам и так придется что-то менять, если вы хотите поддерживать постоянно меняющиеся данные вашей "сторонней организации". А лучше менять (дополнять) программу чем вашу базу.
...
Рейтинг: 0 / 0
Нужна помощь
    #32029793
Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>>>
Если у вашей "сторонней организации" с каждым новым видом изделия плодятся таблицы, это не значит, что ВАШИ таблицы, продуманные, нормализованные и расчитанные на более или менее общий случай, должны плодиться тоже - они останутся такими же.

Да, я это понимаю.

>> Да, скорее всего придется писать программку, которая "данные сторонней организации" будет конвертировать в данные для вашей базы.

Это тоже я понимаю. Когда должна осуществляться конвертация ? С учетом того, что данные "сторонней организации" изменяются ежедневно и они нам про это не сообщают и мы производим расчетнесколько раз в день, то наверное это должно осуществляться непосредственно перед расчетом. Так ?

Раньше эта организация поставляла нам данные в dbf, сооттветственно у меня написано приложение которое осуществляет расчет описанным мною выше методом. Теперь эта организация выложила все данные на SQL сервер. Так как это уже клиент серверная технология мне хочется не просто брать данные из другого источника, но и УСКОРИТЬ ВРЕМЯ РАСЧЕТА за счет использования возможностей SQL сервера.

Если я буду каждый раз перед расчетом осуществлять конвертацию данных я думаю время расчета не только не уменьшится, но и наоборот возрастет. Тогда пусть уж лучше все остается по старому...

>>> Ну так вам и так придется что-то менять, если вы хотите поддерживать постоянно меняющиеся данные вашей "сторонней организации".

Вовсе нет. Сейчас я смотрю какие у меня изделия в плане, смотрю какие таблички соответствуют этим базам данных, и в процессе расчета выбираю данные из этих табличек.

То что делалось просто на клиенте, а именно

1) получение списка необходимых таблиц
2) непосредственно работа с этими таблицами

на SQL вызывает у меня затруднения.

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

Надеюсь я все понятно излагаю


Благодарю за внимание.
...
Рейтинг: 0 / 0
Нужна помощь
    #32029798
Dimos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как "в жизни" (опишите, пожалуйста, алгоритм) по таблице с "новым видом изделия" можно определить методику расчета?
И второй вопрос (а скорее, совет или даже довольно-таки наглое утверждение - если я чего не понимаю, то извините заранее:
Почему вы считаете, что процесс расчета должен происходить ИМЕННО В ХРАНИМОЙ ПРОЦЕДУРЕ НА SQL СЕРВЕРЕ?
Можно ведь сделать так:
1. Оставить расчет (вместе с алгоритмомом выбора метода расчета по исходной таблице, который как я понял, на SQL реализовать трудно) - на клиентской машине.
2. Написать опять же программу (COM-объект предпочтительно, можно даже серверный и distributed) выполняющий расчет, установить его (COM-объект) на сервере, установить PROXY для этого объекта на клиентских машинах - и работать с объектом.

Раз уж вы попали в ситуацию, когда проще переложить некую функцию вашей системы на клиентские (по отношению к SQL Server) машины или машину, не вижу ничего криминального, чтобы так и поступить. Более того, концепция n-уровнего приложения так и требует - никакой бизнес логики в самой базе данных, вся бизнес логика заключена в приложении. Смотрите на базу данных просто как на хранилище данных, а не аппарат реализующий в себе бизнес-логику. И база получится проще (без завернутых хранимых процедур), и приложение лучше (аккуратное разделение полномочий между подсистемами, удобтсво в обслуживании и модификации, т.д.).

Дмитрий
...
Рейтинг: 0 / 0
Нужна помощь
    #32029902
Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>> А как "в жизни" (опишите, пожалуйста, алгоритм) по таблице с "новым видом изделия" можно определить методику расчета?

Методика расчета остается та же. Просто в запрос попадает еще одна таблица.

>> Почему вы считаете, что процесс расчета должен происходить ИМЕННО В ХРАНИМОЙ ПРОЦЕДУРЕ НА 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 - берутся из первого запроса ?
...
Рейтинг: 0 / 0
Нужна помощь
    #32029914
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выполнить то запрос можно, но посредством динамического SQL. То есть на первый запрос организовать курсор, в цикле этого курсора построить строку скрипта, а потом уже выполнить. Единственное, что не стоит забывать, что кол-во union-ов ограниченно (точно не скажу на сколько, лучше почитать в BOL). Так что если таблиц много, то лучше организовать временную таблицу и в цикле курсора динамическим скриптом впихивать в нее данные из таблиц. А после прогона курсора уже можно будет над ней выполнять различные действия.
...
Рейтинг: 0 / 0
Нужна помощь
    #32029919
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Нужна помощь
    #32029982
Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>> Выполнить то запрос можно, но посредством динамического SQL. То есть на первый запрос организовать курсор, в цикле этого курсора построить строку скрипта, а потом уже выполнить.

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


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