AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.01.2007, 17:27   #1  
unalexia is offline
unalexia
Участник
 
79 / 10 (1) +
Регистрация: 28.12.2005
Thumbs up
Nav 3.6
Как можно побороть медленную отработку фильтра по Наличию в списке товаров - до 15 минут (ключ естественно по данному полю создать нельзя т.к. это калкфилд). Проблема усугубляется, если еще заполнено поле "Склад Фильр" (и более того, если склад не имеет ячеечного хранения - если выбирать склад с ячеечным хранением - работает значительно быстрее)?
Старый 18.01.2007, 18:09   #2  
NeNavision_imported is offline
NeNavision_imported
Участник
Аватар для NeNavision_imported
 
241 / 10 (1) +
Регистрация: 12.08.2005
Нельзя существенно убыстрить медленную отработку фильтра по вычисляемому полю.
Системе все равно необходимо для всего списка товаров вычислять поле Наличие.
Возможно проблема с ключами?
Может со свойствами MaintainSQLIndex, MaintainSIFTIndex, SIFTLevelsToMaintain
поколдовать соответствующего ключа из 32ой.
(А то он может и тупым сканированием вычисляемые поля считать)
__________________
Должен остаться только один.
Старый 21.01.2007, 18:20   #3  
Storkich is offline
Storkich
Участник
 
149 / 10 (1) +
Регистрация: 08.03.2007
Хочешь бысро получать остатки по складу
У меня 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  
artkashin is offline
artkashin
Участник
MCBMSS
 
519 / 18 (2) ++
Регистрация: 06.12.2006
Цитата:
Сообщение от unalexia Посмотреть сообщение
Nav 3.6
Как можно побороть медленную отработку фильтра по Наличию в списке товаров - до 15 минут (ключ естественно по данному полю создать нельзя т.к. это калкфилд). Проблема усугубляется, если еще заполнено поле "Склад Фильр" (и более того, если склад не имеет ячеечного хранения - если выбирать склад с ячеечным хранением - работает значительно быстрее)?
Сталкивался с данной проблемой. (50000 наименований в базе). Принципиально увеличить скорость не удалось, как не старался. В итоге - фильтр на флоуфилд при больших объемах таблиц ставить не эффективно. Используйте выгрузку остатков в эксель с последующей сортировкой и фильтрацией в нем, как советовал Storkich.
Старый 22.01.2007, 12:43   #5  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Если нужна форма подбора:

Сделайте ключ в 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  
artkashin is offline
artkashin
Участник
MCBMSS
 
519 / 18 (2) ++
Регистрация: 06.12.2006
Цитата:
Сообщение от rmv Посмотреть сообщение
Lookup на поле "Item No.":
1. Собираем список товаров описанной выше ф-цией.
2. If Form.runmodal(0, tempItem)=action::lookupok then begin....
Во! Век живи - век учись! Однозначно Респект!!!!
Старый 22.01.2007, 17:00   #7  
Storkich is offline
Storkich
Участник
 
149 / 10 (1) +
Регистрация: 08.03.2007
Цитата:
Сообщение от Kashin Посмотреть сообщение
Цитата:
Сообщение от rmv Посмотреть сообщение
Lookup на поле "Item No.":
1. Собираем список товаров описанной выше ф-цией.
2. If Form.runmodal(0, tempItem)=action::lookupok then begin....
Во! Век живи - век учись! Однозначно Респект!!!!
Господа новички, если вам нужна скорость бешанная, то используйте временные таблицы и циклы.
Меньше калкифилдов и фаиндов.
Если нет удобного ключа, то выбираем сначала удобный, копируем во временную и извращаемся как хотим.
Старый 23.01.2007, 10:47   #8  
romtex_imported is offline
romtex_imported
Участник
 
66 / 10 (1) +
Регистрация: 06.12.2005
Ну зачем же все так усложнять?
Да и еще плюс к этому приведенный пример отчета имеет существенный недостаток: по нему нельзя посмотреть остатки на определенную дату. Между тем можно очень просто сделать отчет по скорости сопоставивый, а чаще и превосходящий приведенный пример. При этом в нем будет всего одна переменная и одна строчка кода: Item.GET("Item No.") для вывода описания и прочих реквизитов товара в секшн!
А делать его нужно так: в датаайтем вставить товар книгу операций с ключом, начинающимся с поля Товар Но.. В тоталфилдс добавить кол-во, в груптоталфилдс - товар Но. Ну и, естественно, в секшены добавить групфутер.
И вот оно быстрое счастье за 10 минут без всяких временных таблиц и циклов.
Старый 23.01.2007, 16:12   #9  
artkashin is offline
artkashin
Участник
MCBMSS
 
519 / 18 (2) ++
Регистрация: 06.12.2006
Цитата:
Сообщение от romtex Посмотреть сообщение
Ну зачем же все так усложнять?
Да и еще плюс к этому приведенный пример отчета имеет существенный недостаток: по нему нельзя посмотреть остатки на определенную дату. Между тем можно очень просто сделать отчет по скорости сопоставивый, а чаще и превосходящий приведенный пример. При этом в нем будет всего одна переменная и одна строчка кода: Item.GET("Item No.") для вывода описания и прочих реквизитов товара в секшн!
А делать его нужно так: в датаайтем вставить товар книгу операций с ключом, начинающимся с поля Товар Но.. В тоталфилдс добавить кол-во, в груптоталфилдс - товар Но. Ну и, естественно, в секшены добавить групфутер.
И вот оно быстрое счастье за 10 минут без всяких временных таблиц и циклов.
В общем-то, это отчет. По этому отчету, ты не сможешь отфильтровать (не забывай, номенклатуры 10000-100000. (В 32 таблице меньше полей, по которым возможен анализ чем в 27) не можешь много чего, чего можно делать с выгрузкой в эксель. Хотя данную реализацию можно переделать на выгрузку в эксель, так что да. Решение без временной таблицы.
Старый 23.01.2007, 16:23   #10  
artkashin is offline
artkashin
Участник
MCBMSS
 
519 / 18 (2) ++
Регистрация: 06.12.2006
Цитата:
Сообщение от Storkich Посмотреть сообщение
Цитата:
Сообщение от Kashin Посмотреть сообщение
Цитата:
Сообщение от rmv Посмотреть сообщение
Lookup на поле "Item No.":
1. Собираем список товаров описанной выше ф-цией.
2. If Form.runmodal(0, tempItem)=action::lookupok then begin....
Во! Век живи - век учись! Однозначно Респект!!!!
Господа новички, если вам нужна скорость бешанная, то используйте временные таблицы и циклы.
Меньше калкифилдов и фаиндов.
Если нет удобного ключа, то выбираем сначала удобный, копируем во временную и извращаемся как хотим.
Это все временное решение, позволяющее достаточно быстро, но все равно в сотни раз медленнее, чем используя SQL запросы. Остатки я получаю, используя SQL View, который объединяет 5802 Value Entry таблицы всех фирм в компании, с последующим анализом в сводных таблицах Экселя. Есть идея написать даже обратную связь с использованием макросов. Данное решение позволяет наиболее быстро получить остатки.
Старый 23.01.2007, 16:36   #11  
romtex_imported is offline
romtex_imported
Участник
 
66 / 10 (1) +
Регистрация: 06.12.2005
Цитата:
Сообщение от Kashin Посмотреть сообщение
не забывай, номенклатуры 10000-100000
Не забывай - максимальное число строк в эксель 65535.
Если хватает - то либо Save as HTML и открывай экселем, либо точно также пишешь выгрузку на секшн в шаблон.

Цитата:
Сообщение от Kashin Посмотреть сообщение
В 32 таблице меньше полей, по которым возможен анализ чем в 27
Правильно! А как ты думаешь для чего нужна единственная строчка кода
Старый 23.01.2007, 18:18   #12  
artkashin is offline
artkashin
Участник
MCBMSS
 
519 / 18 (2) ++
Регистрация: 06.12.2006
Цитата:
Сообщение от romtex Посмотреть сообщение
Цитата:
Сообщение от Kashin Посмотреть сообщение
не забывай, номенклатуры 10000-100000
Не забывай - максимальное число строк в эксель 65535.
Если хватает - то либо Save as HTML и открывай экселем, либо точно также пишешь выгрузку на секшн в шаблон.

Цитата:
Сообщение от Kashin Посмотреть сообщение
В 32 таблице меньше полей, по которым возможен анализ чем в 27
Правильно! А как ты думаешь для чего нужна единственная строчка кода
Насчет 65535 - это точно.. палку перегнул с 100000 :-)) Тут уже надо Crystal Analysis использовать, или еще что.

Я согласен, что это один из способов. Имеющий свои недостатки. Просто твой случай не даст такой ответ, как остатки товара весом более 10 кг штука. Т.е. ФИЛЬТРАЦИЯ возможна только по полям 32 таблицы, а характеристик товара в 32 таблице значительно меньше, чем в 27...
Старый 24.01.2007, 10:43   #13  
romtex_imported is offline
romtex_imported
Участник
 
66 / 10 (1) +
Регистрация: 06.12.2005
Цитата:
Сообщение от Kashin Посмотреть сообщение
Я согласен, что это один из способов. Имеющий свои недостатки. Просто твой случай не даст такой ответ, как остатки товара весом более 10 кг штука. Т.е. ФИЛЬТРАЦИЯ возможна только по полям 32 таблицы, а характеристик товара в 32 таблице значительно меньше, чем в 27...
Хе-хе, а код Строкича, про который я сказал, что можно и попроще даст?

Он имеет точно такой же недостаток - там тоже нельзя предварительно отфильтровать по полям таблицы 27, тем самым ускорив работу отчета.
Выгрузив же их в Эксель можно будет отфильтровать в обоих версия кода, но только по полям выгруженным в эксель.

Вообще-то, я хотел сказать, что весь код Строкича, не связанный с Экселем - абсолютно лишний - его можно заменить один в один тоталфилдсами и групфутерами. По-моему это бесспорно.
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:57.