Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

проверка перед добавлением   Найти похожие ветки 

 
NieL ©   (2012-02-24 12:49) [0]

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


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


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


 
sniknik ©   (2012-02-24 13:41) [1]

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

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


 
NieL ©   (2012-02-24 14:28) [2]


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


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


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

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


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


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

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


 
sniknik ©   (2012-02-24 14:58) [4]

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

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


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

> сделать out
inout


 
NieL ©   (2012-02-24 15:36) [6]

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


 
sniknik ©   (2012-02-24 15:41) [7]

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


 
Loginov Dmitry ©   (2012-02-24 22:32) [8]


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


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


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


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

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


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.052 c
15-1338625099
Омлет
2012-06-02 12:18
2013.03.22
Kuru-Kuru Nabe - кострюля с конвекционным самоперемешиванием


15-1341390679
alexdn
2012-07-04 12:31
2013.03.22
Индексация припаркованного домена


15-1346016093
Artem
2012-08-27 01:21
2013.03.22
Не поможете с Visual C++?


15-1342301646
silver
2012-07-15 01:34
2013.03.22
icfpc 2012


15-1329510280
istok20
2012-02-18 00:24
2013.03.22
Перехват gtalk и gmail..