Форум: "Начинающим";
Текущий архив: 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