:: Visual Foxpro, Foxpro for DOS
Re: Проблема с открытием таблиц в DE по заданному пути
Каратаев

Сообщений: 3974
Откуда: Алматы
Дата регистрации: 04.12.2001
В методе BeforeOpenTables DE прописано так:
LOCAL lcPathFile as Character
IF AMEMBERS(la_Cursors,ThisForm.DataEnvironment,2) >0
WITH ThisForm.DataEnvironment
FOR ln_Cot=1 TO ALEN(la_Cursors,1)
lc_Cursor=la_Cursors(ln_Cot)
* Переназначим пути к БД в ДЕ
IF .&lc_Cursor..BaseClass = 'Cursor'
* Выберем путь к БД по условию
DO CASE
CASE UPPER(ALLTRIM(.&lc_Cursor..Alias))=="PERSON"
lcPathFile = ALLTRIM(goApp.PathBdPerson)
OTHERWISE
lcPathFile = ALLTRIM(goApp.PathFile)
ENDCASE
IF NOT '\' $ .&lc_Cursor..CursorSource
lc_Table=SUBSTR(.&lc_Cursor..DataBase,RAT('\', .&lc_Cursor..DataBase)+1, ;
LEN(.&lc_Cursor..DataBase)-RAT('\',.&lc_Cursor..DataBase))
.&lc_Cursor..DataBase=lcPathFile+lc_Table
ELSE
lc_Table=SUBSTR(.&lc_Cursor..CursorSource,RAT('\',.&lc_Cursor..CursorSource)+1, ;
LEN(.&lc_Cursor..CursorSource)-RAT('\',.&lc_Cursor..CursorSource))
.&lc_Cursor..CursorSource=lcPathFile+lc_Table
ENDIF
ENDIF
ENDFOR
ENDWITH
ENDIF
Это работает.


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/1 positive
Re: Проблема с открытием таблиц в DE по заданному пути
Артём

Сообщений: 116
Дата регистрации: 23.04.2001
Можно запихать все открытия таблиц в Load формы, а DataEnvironment очистить
IF !USED( 'dates')
USE &cDBFPath.dates IN 0 EXCLUSIVE
ENDIF
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
Каратаев
В методе BeforeOpenTables DE прописано так:
Это работает.
Но читать сие невозможно. Не пробовали посчитать сколько раз в этом куске использовано .&lc_Cursor.?
Хрен с вами если не умеете работать с объектами без макро, но зачем сие еще и плодить в невообразимых количествах? Один раз ведь намного сложнее вычислить?


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
Артём
Можно запихать все открытия таблиц в Load формы, а DataEnvironment очистить
USE &cDBFPath.dates IN 0 EXCLUSIVE
Для замены сего безобразия еще со времен FP2.0 придуманы Name expression:
USE (cDBFPath.dates) IN 0 EXCLUSIVE


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
Каратаев

Сообщений: 3974
Откуда: Алматы
Дата регистрации: 04.12.2001
ssa
Не пробовали посчитать сколько раз в этом куске использовано .&lc_Cursor.?
Хрен с вами если не умеете работать с объектами без макро, но зачем сие еще и плодить в невообразимых количествах? Один раз ведь намного сложнее вычислить?
Там же не одна таблица, их может быть несколько...


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
Каратаев
ssa
Не пробовали посчитать сколько раз в этом куске использовано .&lc_Cursor.?
Хрен с вами если не умеете работать с объектами без макро, но зачем сие еще и плодить в невообразимых количествах? Один раз ведь намного сложнее вычислить?
Там же не одна таблица, их может быть несколько...
М-да, ни за что бы не догадался...
Вариант преобразования на коленке, возможны очепятки:
Local lcPathFile As Character
If Amembers(la_Cursors,Thisform.DataEnvironment,2) >0
With Thisform.DataEnvironment
For ln_Cot=1 To Alen(la_Cursors,1)
lo_Cursor=Evaluate('.'+la_Cursors(ln_Cot))
* Переназначим пути к БД в ДЕ
With lo_Cursor
If .BaseClass = 'Cursor'
* Выберем путь к БД по условию
lcPathFile = Alltrim(Iif(Upper(Alltrim(.Alias))=="PERSON", goApp.PathBdPerson, goApp.PathFile))
If Not '\' $ .CursorSource
lc_Table=Substr(.Database,Rat('\', .Database)+1, Len(.Database)-Rat('\',.Database))
.Database=lcPathFile+lc_Table
Else
lc_Table=Substr(.CursorSource,Rat('\', .CursorSource)+1, ;
LEN(.CursorSource)-Rat('\', .CursorSource))
.CursorSource=lcPathFile+lc_Table
Endif
Endif
Endwith
Endfor
Endwith
Endif
Еще бы ALLTRIM() все поубирать, правда для этого надо их аргументы заполнять правильно и не хранить концевые пробелы где ни попадя...
И еще я бы использовал for each вместо Amembers. Пример в теме про Targrid. И кода меньше, в том числе без Evaluate(). И работает быстрее... Да и читать приятнее.


------------------
Лень - это неосознанная мудрость.




Исправлено 1 раз(а). Последнее : ssa, 10.03.23 11:34
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
Еще один вариант переработки продемонстрированной нетленки.
Проверить не на чем, потому на коленке с возможными очепятками:
Local lcPathFile As Character
For Each lo_Object In Thisform.DataEnvironment
* Переназначим пути к БД в ДЕ
With lo_Object
If .BaseClass == 'Cursor'
* Выберем путь к БД по условию
lcPathFile = Alltrim(Iif(Upper(Alltrim(.Alias))=="PERSON", goApp.PathBdPerson, goApp.PathFile))
If Not '\' $ .CursorSource
lc_Table = Juststem(.Database)
.Database = lcPathFile+lc_Table
Else
lc_Table = Juststem(.CursorSource)
.CursorSource = lcPathFile+lc_Table
Endif
Endif
Endwith
Endfor


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
Каратаев

Сообщений: 3974
Откуда: Алматы
Дата регистрации: 04.12.2001
Сергей, спасибо. Второй вариант лично мне нравится больше. Всё более оптимально. Чуть изменил первую строку цикла на
For Each lo_Object In Thisform.DataEnvironment.objects
В понедельник уже дальше буду адаптировать. Как говорится: век живи - век учись.
Спасибо!


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
Каратаев
Второй вариант лично мне нравится больше. Всё более оптимально.
Мне тоже В первом просто показал как уменьшить в 13 раз использование макро. 13 умножить на количество таблиц сколько будет? А во втором обычный перебор некой коллекции совмещенный с анализом действий внутри цикла. Оказалось, что там можно использовать встроенные функции для замены самописного безобразия.
Цитата:
Чуть изменил первую строку цикла на
For Each lo_Object In Thisform.DataEnvironment.objects
Ну так я же предупредил, что делал на коленке.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
Каратаев

Сообщений: 3974
Откуда: Алматы
Дата регистрации: 04.12.2001
Ну вот и рабочий вариант:
* объявим переменную для назначения пути к БД
LOCAL lcPathFile as Character
FOR EACH lo_Object In Thisform.DataEnvironment.objects
* Переназначим пути к БД в ДЕ
WITH lo_Object
IF .BaseClass == 'Cursor'
* Выберем путь к БД по условию
lcPathFile = Alltrim(Iif(Upper(Alltrim(.Alias))=="PERSON", goApp.PathBdPerson, goApp.PathFile))
IF Not '\' $ .CursorSource
lc_Table = JUSTFNAME(.Database)
lc_Cursor = UPPER(.name)
.Database = lcPathFile+lc_Table
ELSE
lc_Table = JUSTFNAME(.CursorSource)
.CursorSource = lcPathFile+lc_Table
ENDIF
ENDIF
ENDWITH
ENDFOR
Код, от моего первоначального, намного сократился и обошлось без макроподстановок.
Вот что значит пинок в нужную сторону!


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.




Исправлено 1 раз(а). Последнее : Каратаев, 13.03.23 08:00
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
Каратаев
Ну вот и рабочий вариант:
Рабочий то он рабочий, но есть еще потенциал для совершенствования!
Цитата:
* объявим переменную для назначения пути к БД
LOCAL lcPathFile as Character
FOR EACH lo_Object In Thisform.DataEnvironment.objects
* Переназначим пути к БД в ДЕ
WITH lo_Object
IF .BaseClass == 'Cursor'
* Выберем путь к БД по условию
lcPathFile = Alltrim(Iif(Upper(Alltrim(.Alias))=="PERSON", goApp.PathBdPerson, goApp.PathFile))
IF Not '\' $ .CursorSource
lc_Table = JUSTFNAME(.Database)
lc_Cursor = UPPER(.name)
.Database = lcPathFile+lc_Table
ELSE
lc_Table = JUSTFNAME(.CursorSource)
.CursorSource = lcPathFile+lc_Table
ENDIF
ENDIF
ENDWITH
ENDFOR
Код, от моего первоначального, намного сократился и обошлось без макроподстановок.
Вот что значит пинок в нужную сторону!
Только должно быть
LOCAL lcPathFile as String
На работу кода не влияет, но для порядку в самый раз.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
Каратаев

Сообщений: 3974
Откуда: Алматы
Дата регистрации: 04.12.2001
ssa
Только должно быть
LOCAL lcPathFile as String
На работу кода не влияет, но для порядку в самый раз.
Для порядку учёл Спасибо...


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
akvvohinc
Автор

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
LOCAL lcPathFile as String
На работу кода не влияет, но для порядку в самый раз.
А что за порядок (или с какой целью?) использовать для переменной название типа String, если сам Фокс называет такой тип Character?
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
akvvohinc
Цитата:
LOCAL lcPathFile as String
На работу кода не влияет, но для порядку в самый раз.
А что за порядок (или с какой целью?) использовать для переменной название типа String, если сам Фокс называет такой тип Character?
Для Intellisence.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
akvvohinc
Автор

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Для Intellisence.
А Intellisence для кого?
Зачем где-то надо "вдруг" начать отличать Char от String, если Фокс называет этот тип Char?

Но даже если именно эту переменную почему-то надо видеть где-то как String, то почему бы тогда не обозвать её тип как Путь_к_чему_то_там?
От такого типа толку наверняка будет больше, чем от String, который не добавляет ничего нового по сравнению с Char.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
akvvohinc
Цитата:
Для Intellisence.
А Intellisence для кого?
Для писателей кода на фоксе.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
akvvohinc
Автор

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Там несколько переменных, и, судя по их именам, они тоже локальные и символьные.
Почему именно эту переменную надо описать с типом, и именно как String?

У писателя кода она была описана как Character, теперь будет описана как String.
Интеллисенсу всё равно, а цель исправления по-прежнему неясна.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
Каратаев

Сообщений: 3974
Откуда: Алматы
Дата регистрации: 04.12.2001
Intellisence предлагает и тот, и тот вариант. Принципиальной разницы нет. Можно вообще убрать этот AS...
akvvohinc
Там несколько переменных, и, судя по их именам, они тоже локальные и символьные
Да, это действительно так. По-хорошему - либо все надо объявлять как local, либо ничего не объявлять... Почему именно эту объявил? Ну перекочевало откуда-то вместе с моим изначальным кодом, уже не помню...


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
akvvohinc
Автор

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Принципиальной разницы нет.
А хоть какая-то есть?
Что для вас изменилось после исправления? Вы отличаете Character от String?

Цитата:
Да, это действительно так. По-хорошему - либо все надо объявлять как local, либо ничего не объявлять.
Локальные переменные не могут не быть объявлены как LOCAL.
Так что если их не описать как LOCAL, они будут считаться PRIVATE (если не были ранее описаны как PUBLIC) несмотря на префикс имени.

У вас сейчас только одна локальная переменная, остальные "псевдолокальные" - PRIVATE.
И если их не описать хоть как-то (как LOCAL или PRIVATE), то всегда есть шанс, что вы, используя здесь это имя, портите какую-то одноименную (PRIVATE или PUBLIC) уже существующую переменную.



Исправлено 5 раз(а). Последнее : akvvohinc, 14.03.23 12:44
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
Каратаев

Сообщений: 3974
Откуда: Алматы
Дата регистрации: 04.12.2001
akvvohinc
Что для вас изменилось после исправления? Вы отличаете Character от String?
Вопрос чисто риторический? Ведь понятно-же, что ничего ровным счётом.
akvvohinc
У вас сейчас только одна локальная переменная, остальные "псевдолокальные" - PRIVATE.
И если их не описать хоть как-то (как LOCAL или PRIVATE), то всегда есть шанс, что вы, используя здесь это имя, портите какую-то одноименную (PRIVATE или PUBLIC) уже существующую переменную.
Ну... это же азы... Не надо полагать, что я настолько безалаберно отношусь к переменным. Но в данном конкретном случае, даже PRIVATE-переменные за рамки метода BeforeOpenTables не вылезут. Хотя, конечно, с точки зрения общей, так сказать, концепции правильно будет объявить их все как локальные. В рабочем приложении так и сделано, а здесь-же просто показана идея переопределения путей к таблицам в DE. Идея, не более того.


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 20 vlgrech PaulWist  (Гостей: 18)

© 2000-2024 Fox Club 
Яндекс.Метрика