|
22.11.2007, 12:01 | #1 |
Участник
|
Не знаю, работает ли это в Oracle, но в MS SQL есть такая фича
PHP код:
Соответственно, можно другим запросом подсчитать количество серийных номеров для каждой партии. Смотря что именно нужно. Кроме того, судя по коду, у Вас только одна компания, раз нет фильтра по DataAreaId. Ну, а собственно JOB мне не нравится избыточным количеством проходов. Поскольку уже первый запрос упорядочивает данные по полям InventSerialId, InventBatchId, то какие проблемы тут же и подсчитать количество повторов? Ведь записи выстроены в нужной последовательности. Собственно, все можно решить за один проход. И без каких-либо временных таблиц. X++: static void KKu_FindDupleInventSerialId(Args _args) { InventDim inventDim; InventTrans inventTrans; int nextI; InventSerialId inventSerialIdPrev; Container conValue; ; info('Серийный номер --- Кол-во повторений -- Номер партии'); info('===================================================='); while select InventSerialId, InventBatchId from inventDim group by InventSerialId, InventBatchId exists join inventTrans where inventDim.InventDimId == inventTrans.InventDimId { if (inventDim.inventSerialId != inventSerialIdPrev) { if (inventSerialIdPrev && conLen(conValue) > 1) { for (nextI = 1; nextI <= conLen(conValue); nextI++ ) { info( strfmt('%1 --- %2 --- %3', inventSerialIdPrev, conLen(conValue), conPeek(conValue,nextI) ) ); } } // Сброс значений очередной группы inventSerialIdPrev = inventDim.inventSerialId; conValue = conNull(); } else { conValue += [inventDim.inventBatchId]; } } if (inventSerialIdPrev && conLen(conValue) > 1) { for (nextI = 1; nextI <= conLen(conValue); nextI++ ) { info( strfmt('%1 --- %2 --- %3', inventSerialIdPrev, conLen(conValue), conPeek(conValue,nextI) ) ); } } } |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|