powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проблемы с меню на сети
7 сообщений из 7, страница 1 из 1
Проблемы с меню на сети
    #39682221
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пользователи работают с программой удаленно по сети. Проблема в том, что при запуске сетевого exe-файла, появляется форма с меню, которое не работает (при наведении курсора мыши на пункт меню он становится синим, а при последующем нажатии мыши - белым и не раскрывается, только по двойному клику и то не всегда). Этот же exe-файл нормально отрабатывает на локальной машине(пункты меню открываются по одиночному клику без проблем). В чем может быть проблема?
...
Рейтинг: 0 / 0
Проблемы с меню на сети
    #39682618
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного докопался до сути проблемы, но пока не до конца:
В одном из пунктов меню в поле SkipFor у меня стояла функия isEnable() , с кодом что то типа:
Код: sql
1.
2.
3.
4.
5.
6.
7.
select a.* from table where условие

if _tally = 0
   return .T.
else
   return .F.
endif



Проблему вызывает select , но пока не понял почему.
...
Рейтинг: 0 / 0
Проблемы с меню на сети
    #39682641
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreenНемного докопался до сути проблемы, но пока не до конца:
В одном из пунктов меню в поле SkipFor у меня стояла функия isEnable() , с кодом что то типа:
Код: sql
1.
2.
3.
4.
5.
6.
7.
select a.* from table where условие

if _tally = 0
   return .T.
else
   return .F.
endif



Проблему вызывает select , но пока не понял почему.Потому, что сия операция может быть сильно зависящей от ресурсов машины и сети, в которой неизвестно что творится. Тем более, что приведенный код далек от оптимальности с точки зрения производительности и использования ресурсов. А пока сей запрос выполняется все ваши попытки нажимать кнопки и тыкать мышкой будут выдавать описанные эффекты.
Так как запрос нужен только для определения наличия хотя бы одной записи в базе, то можно использовать top 1 в запросе дабы не плодить возможно большой результирующий курсор. Да и все поля в нем не нужны. И который, в свою очередь, заменить на массив, исчезающий и освобождающий ресурсы сразу при выходе из функции.
Код: sql
1.
select top 1 .t.  from table where условие into array ResArray


5(Пять) оставшихся строчек легко и непринужденно заменяются 1(Одной) строкой
Код: sql
1.
return  _tally = 0
...
Рейтинг: 0 / 0
Проблемы с меню на сети
    #39682803
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про последние пять строк логично, просто привык так обработку делать - получил курсор, если записи есть один блок кода, если нет - другой. У меня это конструкция на автомате набивается ).
По самой сути задачи - есть переменная, которая при наличии в некоторой выборке (селекте) должна позволять выбрать пункт меню или нет. Как вариант можно вынести этот код туда где меняется эта переменная и там, например, присваивать результат другой переменной, и уже по ней блокировать/деблокировать пункт меню. Так у нас не будет вызываться процедура при каждом нажатии на меню.

Тут еще вопрос возник про
Код: sql
1.
top n

записей. Как оно работает? Вроде пишут, что если таблица не сортирована и не имеет индекса, то при выборке сначала будут получены ВСЕ записи и только потом отберутся N первых.
...
Рейтинг: 0 / 0
Проблемы с меню на сети
    #39682819
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreenТут еще вопрос возник про
Код: sql
1.
top n

записей. Как оно работает? Вроде пишут, что если таблица не сортирована и не имеет индекса, то при выборке сначала будут получены ВСЕ записи и только потом отберутся N первых.Этот утверждение легко и быстро проверяется практически. Если уж думать не хочется.
...
Рейтинг: 0 / 0
Проблемы с меню на сети
    #39682848
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По последнему вопросу - Top N не будет работать без секции order by , так что тут вопросы отпали. Но чем больше копаешь, тем больше вопросов появляется.

Таблица tab1 (id N(10), string C(250)), количество записей 1 000 000.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
USE tab1 IN 0

timer1_1 = DATETIME()
SELECT TOP 1 id, string FROM tab1 INTO TABLE t1 ORDER BY id
timer1_2 = DATETIME()
MESSAGEBOX(timer1_2 - timer1_1)

timer2_1 = DATETIME()
SELECT id, string FROM tab1 INTO TABLE t2 ORDER BY id
timer2_2 = DATETIME()
MESSAGEBOX(timer2_2 - timer2_1)

CLOSE TABLES



Результаты выполнения (перед открытием спойлера попробуйте предугадать результат):
MESSAGEBOX(timer1_2 - timer1_1) - 4 секунды
MESSAGEBOX(timer2_2 - timer2_1) - 2 секунды


После изменеия кода (Поменял местами оба селекта):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
USE tab1 IN 0
timer2_1 = DATETIME()
SELECT id, string FROM tab1 INTO TABLE t2 ORDER BY id
timer2_2 = DATETIME()
MESSAGEBOX(timer2_2 - timer2_1)
timer1_1 = DATETIME()
SELECT TOP 1 id, string FROM tab1 INTO TABLE t1 ORDER BY id
timer1_2 = DATETIME()
MESSAGEBOX(timer1_2 - timer1_1)
CLOSE TABLES



MESSAGEBOX(timer2_2 - timer2_1) - 3 секунды
MESSAGEBOX(timer1_2 - timer1_1) - 1 секунды

После изменения кода (поменял поле сортировки во втором селекте):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
USE tab1 IN 0
timer1_1 = DATETIME()
SELECT TOP 1 id, string FROM tab1 INTO TABLE t1 ORDER BY id
timer1_2 = DATETIME()
MESSAGEBOX(timer1_2 - timer1_1)
timer2_1 = DATETIME()
SELECT id, string FROM tab1 INTO TABLE t2 ORDER BY string
timer2_2 = DATETIME()
MESSAGEBOX(timer2_2 - timer2_1)
CLOSE TABLES



MESSAGEBOX(timer1_2 - timer1_1) - 1 секунды
MESSAGEBOX(timer2_2 - timer2_1) - 15 секунды



В целом тему можно закрывать, последнее сообщение привел ради интереса.
...
Рейтинг: 0 / 0
Проблемы с меню на сети
    #39682951
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно вообще не использовать select-sql, если Вы работаете с DBF-таблицами. А вместо него использовать LOCATE

Код: sql
1.
2.
3.
4.
5.
6.
7.
* Если таблица не открыта, то предварительно
* USE MyTab.dbf alias a

select a
set order to 0   && это для оптимизации locate
locate for условие
return found()



LOCATE FOR при отключенном главном индексе (SET ORDER TO 0) также использует оптимизацию запросов, как и Select-SQL, поэтому по скорости выполнения потерь не будет.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проблемы с меню на сети
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]