Показать сообщение отдельно
Старый 12.10.2004, 21:48   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
2 Muzzy
Спасибо за ответ.


Хотелось бы узнать еще вот что. Получается что если я перебираю в цикле (while select) записи таблицы и нужные мне кладу в map, то получается что по выходе из цикла все элементы map-a будут ссылаться на одну запись которая была в цикле последней...

А хотелось бы иметь набор отобранных экземпляров записей ...

Т.е. неясно как ведет себя цикл при итерациях. -
1. Создает заново новый экземпляр табличной переменной, а старая освобождается (если, естественно, на неё больше нет ссылок)

2. либо просто грузит новые значения в один и тот же экземпляр.

Подозреваю, что скорее всего второе.

Но в таком случае - есть ли способ гарантированно создать копию, чтобы положить её в map ?
(Это нужно для создания некоего подобия кеша из записей, с возможностью быстрого доступа и обработки)

Я смотрел код в аксапте (3.0 SP 2 ) и, например, в классе
InventCostItemDim
нашел такой пример, но там для каждой строки создается отдельный экземпляр путем нового (!!!) запроса к базе данных :

/*для каждой выбранной строки вызывается этот метод */
protected void loadTrans(InventTrans _inventTrans)
{
InventTrans inventTransCopy;
;
InventTransCopy = inventTrans::findRecId(_inventTrans.RecId,true);

if (inventTransCopy.RecId)
{
mapInventTrans.insert(inventTransCopy.RecId,inventTransCopy);
...

}

но мне кажется это неоптимально - для каждой записи делать отдельный запрос к базе. Гораздо быстрее (что как раз от меня и требуется !) было бы отбирать группу записей и потом обрабатывать, а не дергать их по одной заводя кучу табличных переменных.

Хотя возможно движок аксапты использует кеширование, так что вызов приведенного метода уже не приводит к новому обращению к базе. Но это надо уточнять.