Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

проверка перед добавлением


NieL ©   (2012-02-24 12:49:00) 

Делаю сервер автоматизации для системы учета товаров (СУБД Firebird). Один из методов должен добавлять товар в указываемые категории товаров. Метод будет использоваться для синхронизации товаров с 1C и прочими внешними программами.


IProductsController = interface(IDispatch)
 ['{111B152D-8EA3-4AC2-A4B2-BAF79EFA2701}']
 // ...
 function AddProduct(CategoryIDs: OleVariant): Integer; safecall;
 // ...
end;


Метод должен быстро работать (может понадобится добавить > 100 000 товаров, тогда в цикле придется > 100 000 раз вызвать метод и каждый раз перед добавление проверять валидность передаваемых идентификаторов категорий товаров). Как и где правильнее всего будет сделать проверку?


Плохиш   (2012-02-25 12:48:00) [1]


> Loginov Dmitry ©   (24.02.12 22:32) [8]

Короче, им программист нужен, без вариантов.


Loginov Dmitry   (2012-02-24 22:32:00) [2]


> Метод должен быстро работать (может понадобится добавить
> > 100 000 товаров, тогда в цикле придется > 100 000 раз
> вызвать метод и каждый раз перед добавление проверять валидность
> передаваемых идентификаторов категорий товаров). Как и где
> правильнее всего будет сделать проверку?


Откуда будет вызываться метод AddProduct? Из 1С-ки?
Если добавление 100000 товаров - это разовая операция, то имхо, правильнее реализовать для нее отдельный, скоростной механизм, а AddProduct оставить для ручного внесения нового товара.


> Как узнать IDs добавленных записей?


В чем конкретно сложности? В извлечении ID-шников добавленных записей из БД, или в формировании выходного массива? Выходной массив можно передавать в виде обычной строки, где между IDs проставлены разделители. Можно также воспользоваться вариантным массивом.

Для извлечения ID из БД также есть куча способов:
- использовать INSERT-запрос с RETURNING
- генерировать ID заранее, отдельным запросом, с помощью GEN_ID
- определить состояние генератора до и после вставки
- предусмотреть поле "Дата/время добавления", заполняемое в триггере, запоминать дату/время добавления до вставки, затем после вставки запросить ID у новых записей (правда, если БД находится на другом компьютере, то становится актуальной проблема с синхронизацией времени, лучше всего время на сервере получить отдельным SQL-запросом)
- и др.


sniknik   (2012-02-24 15:41:00) [3]

> Это будет делать другой метод
при таком подходе и SQL будет тормозить...  какая разница по записям, или по столбцам разбивка, смысл групповой команды в том, что пишешь нужное для определенной группы, причем не обязательно для списка, можно условием и она все все это сама делает.


NieL   (2012-02-24 15:36:00) [4]

трабла в том, как вернуть идентификаторы всех добавленных записей. мне их обязательно нужно возвращать для того чтобы можно было дальше работать с добавленными товарами. Например, вызвал AddProducts - добавил 1000 товаров. Дальше хочу для всех добавленных товаров установить цену - 100 рублей. Это будет делать другой метод, которому нужно передать IDs товаров, которые были добавлены. Как узнать IDs добавленных записей? Рыть в сторону identity?


sniknik   (2012-02-24 14:59:00) [5]

> сделать out
inout


sniknik   (2012-02-24 14:58:00) [6]

как в winapi обычно делается, передача параметра по ссылке (var) с возвратом в ней обработанного/оставшегося, как больше нравится.

> которые были добавлены?
имхо, лучше тех что осталось, ошибки должны быть редкостью, и тогда/чаще всего там будет пустой список. (про 900 шутка была, согласно смайлику...)


Плохиш   (2012-02-24 14:55:00) [7]

Последний параметр сделать out, в процедуре AddProducts заполнить его требуемыми значениями.


NieL   (2012-02-24 14:28:00) [8]


> Правильнее всего сделать "групповые операции"


ok, переделал функцию:


procedure AddProducts(CategoryIDs: OleVariant; Count: Integer; IDsOfAdded: OleVariant);

// - Count - кол-во добавляемых товаров
// - IDsOfAdded - идентификаторы товаров, которые были добавлены


Добавляю одним запросом, например, 1000 записей. Как теперь получить идентификаторы записей которые были добавлены?


sniknik   (2012-02-24 13:41:00) [9]

Правильнее всего сделать "групповые операции", т.е. типа задали пакет из 1 000 идентификаторов, обновил что смог, и вернул 900 ;) ошибочных.

p.s. посмотри на SQL, если позаписьно из дельфи оперировать, то времени очень много уходит, если тоже самое одной командой, то много раз меньше. (на порядки)


Наверх

Титульная страница Поиск, карта сайта Написать письмо