Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.088 c
2-1333617575
TSubject
2012-04-05 13:19
2013.03.22
Трехзвенка с помощью TSocketConnection


15-1339971700
Дмитрий С
2012-06-18 02:21
2013.03.22
Предлагаю плохих людей называть футболистами :)


2-1337760388
yuiyui
2012-05-23 12:06
2013.03.22
ctrl + i не работает


15-1339765869
alexdn
2012-06-15 17:11
2013.03.22
Хост для asp


2-1337350435
LDV
2012-05-18 18:13
2013.03.22
DblClick на кнопке





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский