Я так понимаю, что больше интересует 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.
Ну с веб-мордой думаю проблем быть не должно. Сам загрузчик можно сделать из нескольких шагов.
|