Главная страница
    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.07 c
15-1333905177
U+
2012-04-08 21:12
2013.03.22
Как подключить модуль через IN?


1-1297343566
neversleep
2011-02-10 16:12
2013.03.22
TListView. Setfocus внутри OnSelectItem


15-1342444836
картман
2012-07-16 17:20
2013.03.22
точка пересечения двух графиков


15-1351865113
TObject
2012-11-02 18:05
2013.03.22
DBGrid


15-1347455469
Artem
2012-09-12 17:11
2013.03.22
Как включить отображение 3d визуализации?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский