18.01.2007, 17:27 | #1 |
Участник
|
Nav 3.6
Как можно побороть медленную отработку фильтра по Наличию в списке товаров - до 15 минут (ключ естественно по данному полю создать нельзя т.к. это калкфилд). Проблема усугубляется, если еще заполнено поле "Склад Фильр" (и более того, если склад не имеет ячеечного хранения - если выбирать склад с ячеечным хранением - работает значительно быстрее)? |
|
18.01.2007, 18:09 | #2 |
Участник
|
Нельзя существенно убыстрить медленную отработку фильтра по вычисляемому полю.
Системе все равно необходимо для всего списка товаров вычислять поле Наличие. Возможно проблема с ключами? Может со свойствами MaintainSQLIndex, MaintainSIFTIndex, SIFTLevelsToMaintain поколдовать соответствующего ключа из 32ой. (А то он может и тупым сканированием вычисляемые поля считать)
__________________
Должен остаться только один. |
|
21.01.2007, 18:20 | #3 |
Участник
|
Хочешь бысро получать остатки по складу
У меня 25 000 наименований у всех вызывать калкфилды нерационально. Код: FastInventoryToDateInLocation(LocationCode : Code[10]) ItemLedger.SETCURRENTKEY(Open,"Location Code","Item No.","Variant Code","Unit of Measure Code","Lot No.","Serial No."); ItemLedger.SETRANGE(Open,TRUE); ItemLedger.SETRANGE("Location Code",LocationCode); IF NOT ItemLedger.FIND('-') THEN EXIT; REPEAT IF TempItem."No."<>ItemLedger."Item No." THEN BEGIN RecItem.GET(ItemLedger."Item No."); TempItem."No.":=ItemLedger."Item No."; TempItem.Description:=GetNormalDescription(RecItem); TempItem."Base Unit of Measure":=RecItem."Base Unit of Measure"; TempItem."Designer Code":=RecItem."Designer Code"; TempItem."Maximum Inventory":=ItemLedger."Remaining Quantity"; TempItem.INSERT; END ELSE TempItem."Maximum Inventory"+=ItemLedger."Remaining Quantity"; TempItem.MODIFY; UNTIL ItemLedger.NEXT=0; TempItem.SETCURRENTKEY(TempItem."Designer Code"); IF NOT TempItem.FIND('-') THEN EXIT; TempItem.SETFILTER("Location Filter",LocationCode); xl.Template('InventoryFast',10); xl.PasteSection(1,2,FALSE); xl.OUTToSection(1,1,STRSUBSTNO('%4 %1 %2 %3',TIME,TODAY,USERID,LocationCode)); REPEAT xl.PasteSection(3,3,FALSE); xl.OUTToSection(1,3,TempItem."No."); xl.OUTToSection(2,3,TempItem.Description); xl.OUTToSection(3,3,FORMAT(TempItem."Maximum Inventory")); xl.OUTToSection(4,3,TempItem."Base Unit of Measure"); UNTIL TempItem.NEXT=0; xl.Finish('',FALSE); xl.Open; |
|
22.01.2007, 11:46 | #4 |
Участник
|
Цитата:
Сообщение от unalexia
Nav 3.6
Как можно побороть медленную отработку фильтра по Наличию в списке товаров - до 15 минут (ключ естественно по данному полю создать нельзя т.к. это калкфилд). Проблема усугубляется, если еще заполнено поле "Склад Фильр" (и более того, если склад не имеет ячеечного хранения - если выбирать склад с ячеечным хранением - работает значительно быстрее)? |
|
22.01.2007, 12:43 | #5 |
Участник
|
Если нужна форма подбора:
Сделайте ключ в 32 по Item No., Open с sumindexfield'ом на Remaining Quantity. (если нужен срез по Variant Code и Unit Of Measure Code - добавьте и их). Код Storkich'а лучше заменить на with 32 do begin setcurrentkey("Item No.", Open); setrange(Open, true) if find('-') then repeat setrange("Item No.", "Item No."); Item.get("Item No."); tempItem:=Item; tempItem.insert; find('+'); setrange("Item No."); until next=0; end Lookup на поле "Item No.": 1. Собираем список товаров описанной выше ф-цией. 2. If Form.runmodal(0, tempItem)=action::lookupok then begin.... |
|
22.01.2007, 16:29 | #6 |
Участник
|
|
|
22.01.2007, 17:00 | #7 |
Участник
|
Цитата:
Меньше калкифилдов и фаиндов. Если нет удобного ключа, то выбираем сначала удобный, копируем во временную и извращаемся как хотим. |
|
23.01.2007, 10:47 | #8 |
Участник
|
Ну зачем же все так усложнять?
Да и еще плюс к этому приведенный пример отчета имеет существенный недостаток: по нему нельзя посмотреть остатки на определенную дату. Между тем можно очень просто сделать отчет по скорости сопоставивый, а чаще и превосходящий приведенный пример. При этом в нем будет всего одна переменная и одна строчка кода: Item.GET("Item No.") для вывода описания и прочих реквизитов товара в секшн! А делать его нужно так: в датаайтем вставить товар книгу операций с ключом, начинающимся с поля Товар Но.. В тоталфилдс добавить кол-во, в груптоталфилдс - товар Но. Ну и, естественно, в секшены добавить групфутер. И вот оно быстрое счастье за 10 минут без всяких временных таблиц и циклов. |
|
23.01.2007, 16:12 | #9 |
Участник
|
Цитата:
Сообщение от romtex
Ну зачем же все так усложнять?
Да и еще плюс к этому приведенный пример отчета имеет существенный недостаток: по нему нельзя посмотреть остатки на определенную дату. Между тем можно очень просто сделать отчет по скорости сопоставивый, а чаще и превосходящий приведенный пример. При этом в нем будет всего одна переменная и одна строчка кода: Item.GET("Item No.") для вывода описания и прочих реквизитов товара в секшн! А делать его нужно так: в датаайтем вставить товар книгу операций с ключом, начинающимся с поля Товар Но.. В тоталфилдс добавить кол-во, в груптоталфилдс - товар Но. Ну и, естественно, в секшены добавить групфутер. И вот оно быстрое счастье за 10 минут без всяких временных таблиц и циклов. |
|
23.01.2007, 16:23 | #10 |
Участник
|
Это все временное решение, позволяющее достаточно быстро, но все равно в сотни раз медленнее, чем используя SQL запросы. Остатки я получаю, используя SQL View, который объединяет 5802 Value Entry таблицы всех фирм в компании, с последующим анализом в сводных таблицах Экселя. Есть идея написать даже обратную связь с использованием макросов. Данное решение позволяет наиболее быстро получить остатки.
|
|
23.01.2007, 16:36 | #11 |
Участник
|
Не забывай - максимальное число строк в эксель 65535.
Если хватает - то либо Save as HTML и открывай экселем, либо точно также пишешь выгрузку на секшн в шаблон. Правильно! А как ты думаешь для чего нужна единственная строчка кода |
|
23.01.2007, 18:18 | #12 |
Участник
|
Цитата:
Я согласен, что это один из способов. Имеющий свои недостатки. Просто твой случай не даст такой ответ, как остатки товара весом более 10 кг штука. Т.е. ФИЛЬТРАЦИЯ возможна только по полям 32 таблицы, а характеристик товара в 32 таблице значительно меньше, чем в 27... |
|
24.01.2007, 10:43 | #13 |
Участник
|
Цитата:
Он имеет точно такой же недостаток - там тоже нельзя предварительно отфильтровать по полям таблицы 27, тем самым ускорив работу отчета. Выгрузив же их в Эксель можно будет отфильтровать в обоих версия кода, но только по полям выгруженным в эксель. Вообще-то, я хотел сказать, что весь код Строкича, не связанный с Экселем - абсолютно лишний - его можно заменить один в один тоталфилдсами и групфутерами. По-моему это бесспорно. |
|