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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.02.2007, 15:17   #1  
art06 is offline
art06
Участник
Аватар для art06
 
192 / 10 (1) +
Регистрация: 11.08.2006
Добрый день.
Предположим есть:

Repaet
Until


Для того чтобы увидеть ход выполнения работы внутри цикла, и для того чтобы увидеть когда выборка закончиться - можно использовать строки

Dial.OPEN('Выполнение @1@@@@@@@');
I_COUNT := Employee1.COUNT;
Repeat
I := I + 1;
Dial.UPDATE(1,ROUND((I / I_COUNT * 10000),1));
Until
-----------------
А, вот если много вложенных :
REPEAT

REPEAT2

REPEAT3
UNTIL3

UNTIL2

UNTIL

как в этом случае написать код - чтобы один прогресс отображал все действия ?????
Старый 26.02.2007, 15:24   #2  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Видимо так.
Код:
Dial.OPEN('Выполнение @1@@@@@@@\' +
	'Выполнение @2@@@@@@@\' + 
	...
	'Выполнение @n@@@@@@@');
в своих циклах выполнять
Код:
Dial.UPDATE(1,ROUND((I / I_COUNT * 10000),1));
Dial.UPDATE(2,ROUND((J / J_COUNT * 10000),1));
Dial.UPDATE(n,ROUND((K / K_COUNT * 10000),1));
Чета не получается у меня код оформлять -))
ПС. Получилось )
Старый 26.02.2007, 15:26   #3  
art06 is offline
art06
Участник
Аватар для art06
 
192 / 10 (1) +
Регистрация: 11.08.2006
я такой вариант уже делал.
И хотел узнать как можно в одном прогрессе отобразить всё
Старый 26.02.2007, 15:33   #4  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Цитата:
Сообщение от art Посмотреть сообщение
я такой вариант уже делал.
И хотел узнать как можно в одном прогрессе отобразить всё
Описанный в предыдущем посте способ не отобразит одно окно диалога с n прогрессами?? Ведь OPEN мы вызываем один раз, с тремя переменными.
Старый 26.02.2007, 15:40   #5  
art06 is offline
art06
Участник
Аватар для art06
 
192 / 10 (1) +
Регистрация: 11.08.2006
Я хотел узнать - как в одном прогрессе @1@@@@@@@@.
А, вы предлагаете вариант с один диалоговым окном , и несколькими прогрессами
@1@@@@@@@@
@2@@@@@@@@
Старый 26.02.2007, 15:48   #6  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Цитата:
Сообщение от art Посмотреть сообщение
Я хотел узнать - как в одном прогрессе @1@@@@@@@@.
А, вы предлагаете вариант с один диалоговым окном , и несколькими прогрессами
@1@@@@@@@@
@2@@@@@@@@
1 Игнорируйте вложенные циклы. Обновляйте только в первом.
2 Посчитать колво обрабатываемых записей во всех циклах и это считать общим COUNTом. В последнем вложенном цикле наращивать значение счетчика, сдвигая значение прогресса.
Старый 26.02.2007, 15:57   #7  
randrews is offline
randrews
Участник
Аватар для randrews
 
312 / 10 (1) +
Регистрация: 06.12.2004
Цитата:
Сообщение от art Посмотреть сообщение
Добрый день.
Dial.OPEN('Выполнение @1@@@@@@@');
I_COUNT := Employee1.COUNT;
Repeat
I := I + 1;
Dial.UPDATE(1,ROUND((I / I_COUNT * 10000),1));
Until
Цитата:
Сообщение от art Посмотреть сообщение
И хотел узнать как можно в одном прогрессе отобразить всё
Зависит от того, какой код будет во вложенных циклах.
Для общего случая -
Вариант 1) Если есть возможность быстро вычислить сумарное количество итераций, то Вы сами выше напеисали код.
Вариант 2) Остается только неравномерное движение прогрес бара.
Например
Код:
Dial.OPEN('Выполнение @1@@@@@@@');
I_COUNT := Employee1.COUNT;
REPEAT
   I := I + 1;
   J_COUNT := SomeTable.COUNT;  
   J :=  0;
   REPEAT
	  J := J + 1; 
	  Dial.UPDATE(1,ROUND(((I+J / J_COUNT ) / I_COUNT * 10000),1));
   UNTIL SomeTable.NEXT = 0;
UNTIL Employee1.NEXT = 0;
P.S. J обнулить забыл Ну и FIND если надо поставьте
Старый 26.02.2007, 16:03   #8  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Код не анализировал, но это J_COUNT := SomeTable.COUNT; нужно вынести из цикла.
Старый 26.02.2007, 16:05   #9  
randrews is offline
randrews
Участник
Аватар для randrews
 
312 / 10 (1) +
Регистрация: 06.12.2004
Цитата:
Сообщение от romeo Посмотреть сообщение
Код не анализировал, но это J_COUNT := SomeTable.COUNT; нужно вынести из цикла.
Я там упоминул, что зависит от кода от кода внутри цикла. Соответственно на SomeTable могут накладываться фильтры. Если не накладывать, то это вариант 1, в котором можно быстро вычислить количество итераций I_COUNT*J_COUNT - и тогда этот код вообще не нужен !!!
Приведенный код это для сложного случая.
PS А код я и сам не анализировал толком Вроде должно работать.
Старый 26.02.2007, 16:10   #10  
art06 is offline
art06
Участник
Аватар для art06
 
192 / 10 (1) +
Регистрация: 11.08.2006
Цитата:
Сообщение от romeo Посмотреть сообщение
Цитата:
Сообщение от art Посмотреть сообщение
Я хотел узнать - как в одном прогрессе @1@@@@@@@@.
А, вы предлагаете вариант с один диалоговым окном , и несколькими прогрессами
@1@@@@@@@@
@2@@@@@@@@
1 Игнорируйте вложенные циклы. Обновляйте только в первом.
2 Посчитать колво обрабатываемых записей во всех циклах и это считать общим COUNTом. В последнем вложенном цикле наращивать значение счетчика, сдвигая значение прогресса.

1) если кол-во в первом цикле будет = 1. Тогда , если вся выборка займет например час - то, пользователь увидит 0%, и через час 100%
2) Как я могу посчитать кол-во во всех циклах - если внутренние циклы постоянно имеют разное кол-во записей.

Цитата:
Сообщение от randrews Посмотреть сообщение
Цитата:
Сообщение от art Посмотреть сообщение
Добрый день.
Dial.OPEN('Выполнение @1@@@@@@@');
I_COUNT := Employee1.COUNT;
Repeat
I := I + 1;
Dial.UPDATE(1,ROUND((I / I_COUNT * 10000),1));
Until
Цитата:
Сообщение от art Посмотреть сообщение
И хотел узнать как можно в одном прогрессе отобразить всё
Зависит от того, какой код будет во вложенных циклах.
Для общего случая -
Вариант 1) Если есть возможность быстро вычислить сумарное количество итераций, то Вы сами выше напеисали код.
Вариант 2) Остается только неравномерное движение прогрес бара.
Например
Код:
Dial.OPEN('Выполнение @1@@@@@@@');
I_COUNT := Employee1.COUNT;
REPEAT
   I := I + 1;
   J_COUNT := SomeTable.COUNT;  
   J :=  0;
   REPEAT
	  J := J + 1; 
	  Dial.UPDATE(1,ROUND(((I+J / J_COUNT ) / I_COUNT * 10000),1));
   UNTIL SomeTable.NEXT = 0;
UNTIL Employee1.NEXT = 0;
P.S. J обнулить забыл Ну и FIND если надо поставьте

Получается прогресс будет прыгать , то вперед, то назад ?
Старый 26.02.2007, 16:14   #11  
randrews is offline
randrews
Участник
Аватар для randrews
 
312 / 10 (1) +
Регистрация: 06.12.2004
[quote=art;357412]
Цитата:
Сообщение от romeo Посмотреть сообщение
Получается прогресс будет прыгать , то вперед, то назад ?
Почему? Может я чего-то не вижу. Будет по I равномерно идти, а по J - в зависимости от кода. То есть
1 итерация первого цикла (вложенный цикл большой)
2 итерация первого цикла (вложенный цикл маленький)
3 итерация первого цикла (вложенный цикл большой)
Должно - треть прогресс бара идти медленно, вторая треть быстро, третья медленно.

Ах, да. I := I + 1 лучше в конец поставить - ошибся.
Перед UNTIL Employee1.NEXT = 0;
Старый 26.02.2007, 16:31   #12  
art06 is offline
art06
Участник
Аватар для art06
 
192 / 10 (1) +
Регистрация: 11.08.2006
Но, это случай когда обязательно попадешь в самый последний цикл ?

Возможен ли вариант - приращение прогресса после каждого FIND ?
Старый 26.02.2007, 16:40   #13  
randrews is offline
randrews
Участник
Аватар для randrews
 
312 / 10 (1) +
Регистрация: 06.12.2004
Цитата:
Сообщение от art Посмотреть сообщение
Но, это случай когда обязательно попадешь в самый последний цикл ?

Возможен ли вариант - приращение прогресса после каждого FIND ?
??? Не понял. Что значит после каждого FIND?
У вас первый цикл состоит, например из 2х итераций. Каждый внутренний из 5.
Результат - равномерно по 10% прогрессбара будет ползти.

Вы хотите, перед вторым циклом увеличился прогресс? Тогда у вас сразу прогресс скакнет на 50%. То есть такой вариант есть - его предложил romeo - учитывать только первый цикл.
Старый 26.02.2007, 16:44   #14  
grif is offline
grif
Участник
Аватар для grif
 
236 / 10 (1) +
Регистрация: 31.08.2006
Вобще перерисовку прогресс бара лучше делать не прик аждой итерации, а раз в какое-то число

нужно делать неравномерно , ведь даже в виндовсе этим не побрезговали
Старый 26.02.2007, 16:44   #15  
art06 is offline
art06
Участник
Аватар для art06
 
192 / 10 (1) +
Регистрация: 11.08.2006
Dial.OPEN('Выполнение @1@@@@@@@');
I_COUNT := Employee1.COUNT;
REPEAT
I := I + 1;
J_COUNT := SomeTable.COUNT;
J := 0;
REPEAT
J := J + 1;
Dial.UPDATE(1,ROUND(((I+J / J_COUNT ) / I_COUNT * 10000),1));
UNTIL SomeTable.NEXT = 0;
UNTIL Employee1.NEXT = 0;

По этому примеру - если я не попаду в цикл REPEAT по SomeTable, то прогесса не будут Правильно ?
Старый 26.02.2007, 16:47   #16  
grif is offline
grif
Участник
Аватар для grif
 
236 / 10 (1) +
Регистрация: 31.08.2006
Цитата:
Сообщение от art Посмотреть сообщение
По этому примеру - если я не попаду в цикл REPEAT по SomeTable, то прогесса не будут Правильно ?
Ну и что? Зато при следущей он может будет, это ведь не независимые прогрессы, а подпрогресс. Опять же, помню при установке винды такое где-то было - в 2 или 3 прогресса и последний мог пробегать моментом, а мог бежать плавно
Старый 26.02.2007, 16:47   #17  
art06 is offline
art06
Участник
Аватар для art06
 
192 / 10 (1) +
Регистрация: 11.08.2006
Цитата:
Сообщение от grif Посмотреть сообщение
Вобще перерисовку прогресс бара лучше делать не прик аждой итерации, а раз в какое-то число

нужно делать неравномерно , ведь даже в виндовсе этим не побрезговали

Если делать перерисовку через определленое кол-во записей - то, если пользователь свернет Nav, потом например через 10 минут развернет окно Nav, он не увидет процент прогресса пока не будет обновленно окно.
Старый 26.02.2007, 16:49   #18  
randrews is offline
randrews
Участник
Аватар для randrews
 
312 / 10 (1) +
Регистрация: 06.12.2004
Цитата:
Сообщение от art Посмотреть сообщение
Dial.OPEN('Выполнение @1@@@@@@@');
I_COUNT := Employee1.COUNT;
REPEAT
I := I + 1;
J_COUNT := SomeTable.COUNT;
J := 0;
REPEAT
J := J + 1;
Dial.UPDATE(1,ROUND(((I+J / J_COUNT ) / I_COUNT * 10000),1));
UNTIL SomeTable.NEXT = 0;
UNTIL Employee1.NEXT = 0;

По этому примеру - если я не попаду в цикл REPEAT по SomeTable, то прогесса не будут Правильно ?
Правильно. Если надо добавьте еще Dial.UPDATE. Но учтите поправку grif
И не забудьте I := I + 1 в конец перенести
Старый 26.02.2007, 16:49   #19  
grif is offline
grif
Участник
Аватар для grif
 
236 / 10 (1) +
Регистрация: 31.08.2006
Цитата:
Сообщение от art Посмотреть сообщение
Если делать перерисовку через определленое кол-во записей - то, если пользователь свернет Nav, потом например через 10 минут развернет окно Nav, он не увидет процент прогресса пока не будет обновленно окно.
Ну надо поймать примерно такую частоту итераций, чтоб окно перерисовывалось не по несколько раз в секунуду, но и не раз в пол часа, а то это замедлит обработку.
Старый 26.02.2007, 16:53   #20  
art06 is offline
art06
Участник
Аватар для art06
 
192 / 10 (1) +
Регистрация: 11.08.2006
Хорошо. Вообще-то пример понятен. Буду пробовать . СПАСИБО всем.
 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:03.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.