Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 как сделать более грамотно (изящнее)  [new]
nerv
Member

Откуда:
Сообщений: 734
Есть таблица - справочник, например SPR1
SPR1_ID, SPR1_CODE, SPR1_NAME
содержит около 100-150 записей.

Cправочник SPR2 (содержит до 50 записей)
SPR2_ID SPR2_NAME

Есть таблица-справочник SPR3
SPR3_ID, SPR1_ID, SPR2_ID

Связь SPR1 c SPR3 один-ко-многим. Каждой записи SPR1 соответствует от 4-х до 8 записей SPR2.

SPR1_CODE - буквенно-цифровой код различной длины.

Предполагается, что пользователь будет импортировать из xls файлик с записями, который необходимо проанализировать.
Количество записей в xls могут быть и 30 записей и 3000 записей.
Формат записи примерно такой:

Наименование ; Коды из справочника SPR1_CODE

То есть в одном поле "Коды из справочника SPR1_CODE" могут быть перечислены несколько кодов через какой-нибудь разделитель, например "\".

В результате анализа надо получить таблицу вида
Наименование SPR2_ID, отсеив повторяющиеся SPR2_ID.

+
ну например, может не очень удачный
SPR1
1 хлеб
2 пицца
3 суп_с_грибами
4 макароны_с_котлетами

SPR2
1 мука
2 яйцо
3 мясо
4 соль
5 грибы
6 лук
7 дрожжи

SPR3
1 1 1 (то есть хлеб состоит из муки)
2 1 2 (хлеб состоит из яйца)
3 1 7 (хлеб состоит из дрожжей)
4 1 4 (хлеб состоит из соли)
5 2 1 (пицца сосоит из муки)
6 2 2 (пицца состоит из соли)
7 3 4 (суп_с_грибами состоит из соли)
8 3 5 (грибов)
9 3 6 (лука)

Пришла строка из XLS
MENU_1 хлеб\суп_с_грибами

следовательно в результате анализа по данной строке мы должны получить:
MENU_1 7 (дрожжи)
MENU_1 4 (соль - повторяется два раза, в результате должна быть один раз)
MENU_1 5

Как грамотнее сделать? Хочется процесс анализа показывать в виде прогресс-бара на экране и выдавать лог анализастолько то строк обработано, найдено: соль, мука... и выводить ошибки, например пришло из xls "винегрет", которого нет в справочнике SPR1, то написать, что "винегрет" не сопоставлен.

Собственно вопрос. Как грамотнее это реализовать:
В программе открывать построчно записи из xls (они предварительно проимпортируются во временную таблицу) и передавать ID в процедуру и выводить в результирующую таблицу включая ошибки. В этом случае мы знаем сколько записей всего в таблице и сможем правильно процесс анализа показать на прогресс-баре.
Но это увеличит время обработки и количество запросов на сервер.
Или же лучше сразу произвести обработку на сервере (что значительно быстрее), результат поместить в таблицу и на экран уже вывести результат. Как грамотнее сделать?
P.S. пример совершенно от фонаря и не имеет ничего общего с заданием.
14 янв 13, 10:38    [13764942]     Ответить | Цитировать Сообщить модератору
 Re: как сделать более грамотно (изящнее)  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
При правильной организации импорт и обработка файла в 3000 строк займет секунды - не вижу смысла в прогресс-баре.
"Закачать, обработать, выдать ошибки" - имхо более правильный паттерн, чем обрабатывать построчно.
14 янв 13, 11:28    [13765297]     Ответить | Цитировать Сообщить модератору
 Re: как сделать более грамотно (изящнее)  [new]
nerv
Member

Откуда:
Сообщений: 734
Cпасибо за ответ, Кот Матроскин.
А где лучше делать закачку xls-файла: на стороне сервера или на стороне клиента?
В MS SQL есть возможность импорта через ODBS xls - файлов, но тогда я так понимаю путь к xls-файлу надо указывать со стороны сервера. Мне ж надо выгрузить полностью xls файл в какую-нибудь временную (создаваемую на время работы пользователя с функционалом) и потом удалять эту таблицу.
То есть юзер на своем клиенте выбирает через диалог открытия файла файл xls, придумывается имя временной таблицы, создается ее структура и полностью сливается xls- файл в эту только созданную таблицу. После чего юзеру отображается эта "временная таблица" в Gride, пользователь работает с ней и по нажатию какой-то кнопки производится обработка этой таблицы, сохранение ее в постоянную таблицу (в нужном формате, с нужными id и т.д.) и уничтожается временная таблица.
Если это делать на клиенте, видимо необходимо по строчкам вытаскивать записи из xls и сохранять в таблицу. Если же импортировать на сервере, то: 1) что по поводу пути к xls-файлу (путь с клиентской машины, а не с сервера); 2) как передать клиенту имя "временной" таблицы. Имя можно генерить скажем по текущей дате/времени.
14 янв 13, 19:01    [13768895]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить