Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Загрузка данных в MsSQL сервер через WEB интерфейс
Форумы портала PHP.SU » » Работа с СУБД » Загрузка данных в MsSQL сервер через WEB интерфейс

Страниц (1): [1]
 

1. lamer6666 - 09 Октября, 2014 - 20:14:23 - перейти к сообщению
Добрый день уважаемые.
Планирую "накидать" ресурс (IIS Server + MsSQL Server) со следующим функционалом:
1. На сайте регистрируется пользователи.
2. После аутентификации, пользователю нужно загрузить свой прайс лист по средствам WEB сервера в MsSQL
3. При повторной загрузке нужно обновлять данные имеющихся позиций прайса, а новые позиции добавлять.

в связи с этим хотелось бы услышать ваше мнение по реализации?
Мне бы главное блок схему реализации в голове нарисовать.


Всем огромное спасибо.
2. Dastor - 10 Октября, 2014 - 11:08:16 - перейти к сообщению
Я так понимаю, что больше интересует 2 и 3 пункты?
По MsSQL не подскажу, но что-то подобное делали для Mysql и Oracle. В качестве web-сервера apache/php.

Тезисно опишу.
1. Прайсы в csv. Если это xls/xlsx, то необходимо преобразовать в csv.
Если это csv, пользователю наверное стоит дать выбор обрамляющих кавычек, разделителя, формата даты в файле и т.д. Либо это жестко установить.
Тогда в доке надо указать какой должен быть формат данных в csv.
2. Если прайсы большие, то скорее всего без дополнительной (назовем ее служебной) таблицы не обойтись.
3. Данные сначала загружаются в служебную таблицу. В mysql использовали load data infile, в oracle sqlloader. Думаю в mssql тоже есть что-то подобное.
4. Переносим данные из служебной таблицы в ту где хранятся прайсы.
В mysql используем insert select ... on duplicate key update
В oracle - merge.
В этом случае новые записи будут вставляться, а существующие обновляться. Единственный вопрос: что считать критерием существованием имеющейся позиции (критерий уникальности), чтобы определять какую позицию вставлять, а какую обновлять Скорее всего это будет какой-то уникальный идентификатор позиции, или же совокупность нескольких полей (префикс, название, зона и т.д.). Для mysql в этом случае надо лишь правильно настроить pk/uk.
5. Очищаем служебную таблицу.

Естественно это упрощенное описание. Многие моменты надо еще продумать: например, в п.5 нельзя бездумно транкейтить таблицу, надо удалять только те данные, которые относились к данной загрузке.Или например, что делать если в прайсе несколько одинаковых позиций (одинаковых с точки зрения п.4, цена у них может быть разная)
Можно пойти дальше: после загрузки данных в служебную таблицу, можно отобразить эти данные пользователю с пометкой какие позиции будут обновляться, а какие вставляться.
Также необходимо делать проверку данных, хотя бы примитивную. Например, что в поле дата - действительно дата в нужном формате; на максимальное/минимальное значение; на тип данных и т.д. Опять же это можно показать пользователю, если в файле есть невалидные данные.

Можно в принципе обойтись без служебной таблицы, если прайсы небольшие. В этом случае просто формировать запросы: insert values ... on duplicate key update/merge.

Ну с веб-мордой думаю проблем быть не должно. Сам загрузчик можно сделать из нескольких шагов.

 

Powered by ExBB FM 1.0 RC1