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

Сообщений: 14
Дата регистрации: 05.02.2020

DataEnvirontment тянет таблицы из .\db\, хотя на загрузке формы четко прописано откуда их надо брать.
Стоит путь к базе, потом закрытие таблиц в de, присвоение им базы из переменной и имени курсора в бд, потом открытие. А оно всё равно лезет не туда (( Причем только на терминальном сервере программа так себя ведёт. Локально на компе пробовала - куда базу ни положи, при настройке пути все ок.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
Elsif
Автор

Сообщений: 14
Дата регистрации: 05.02.2020
А, нет, локально тоже тупит.
Памагити!
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
Elsif
Автор

Сообщений: 14
Дата регистрации: 05.02.2020
А теперь вообще если в load формы пытаться написать thisform.dataenv... - не выскакивает подсказка, как будто DE на форме нет.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
Elsif
Автор

Сообщений: 14
Дата регистрации: 05.02.2020
Elsif
А теперь вообще если в load формы пытаться написать thisform.dataenv... - не выскакивает подсказка, как будто DE на форме нет.
Но при этом я проверяю на ините формы какая бд у таблиц в de - присвоена правильная база данных, а таблицы открываются правильные. Неправильно открываются представления, а не таблицы, оказывается!
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
Владимир Максимов

Сообщений: 14041
Откуда: Москва
Дата регистрации: 02.09.2000
Когда Вы включаете таблицу в DataEnvironment, то Вы также записываете и путь доступа к этой таблице. Но! Путь доступа относительный. Относительно той директории, которая является текущей в момент включения таблицы в DataEnvironment

Когда Вы запускаете форму на выполнение, то FoxPro, предпринимает попытку найти указанную таблицу по тому пути, который оказался записан в DataEnvironment. Напоминаю, что это относительный путь. Но теперь относительно текущей директории в момент вызова формы

Если файл не найден, то далее выполняется поиск в следующих директориях

1. Внутри файла EXE или APP, который в настоящий момент выполняется (если таблицы в него включены)
2. В текущей на данный момент директории
3. В директориях, указанных в настройках SET PATH

Но! Это все работает, если речь идет о свободных таблицах DBF не включенных в контейнер базы данных (DBC). Если же таблицы включены в контейнер базы данных, то все описанное выше будет относится не к поиску самой таблицы (DBF), а к поиску именно контейнера базы данных (DBC).

После открытия контейнера базы данных таблицы будут найдены по относительным путям, которые записаны внутри контейнера базы данных. Там опять же относительные пути.

Есть вариант программного изменения путей доступа именно внутри DataEnvironment

forum.foxclub.ru

Но, на практике, проще сделать ряд организационных мероприятий

1. Файлы DBF, включенные в контейнер базы данных, физически всегда должны быть расположены в той же папке, что и сам контейнер базы данных (DBC).

2. При запуске приложения (еще до открытия каких-либо форм) желательно сразу открыть DBC по нужному пути доступа. Если форма запущена в Default DataSession, то этого будет достаточно. Если в Private DataSession, то организовать открытие DBC в Load-формы
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
Elsif
Автор

Сообщений: 14
Дата регистрации: 05.02.2020
Dbf и dbc вместе лежат, я прям выкинула таблицу и представление в таблицу на диск - таблица открыта правильная, а представление как будто построено на таблице по другому пути.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
Elsif
Автор

Сообщений: 14
Дата регистрации: 05.02.2020
Владимир Максимов
Когда Вы включаете таблицу в DataEnvironment, то Вы также записываете и путь доступа к этой таблице. Но! Путь доступа относительный. Относительно той директории, которая является текущей в момент включения таблицы в DataEnvironment
Когда Вы запускаете форму на выполнение, то FoxPro, предпринимает попытку найти указанную таблицу по тому пути, который оказался записан в DataEnvironment. Напоминаю, что это относительный путь. Но теперь относительно текущей директории в момент вызова формы

Если файл не найден, то далее выполняется поиск в следующих директориях

1. Внутри файла EXE или APP, который в настоящий момент выполняется (если таблицы в него включены)
2. В текущей на данный момент директории
3. В директориях, указанных в настройках SET PATH

Но! Это все работает, если речь идет о свободных таблицах DBF не включенных в контейнер базы данных (DBC). Если же таблицы включены в контейнер базы данных, то все описанное выше будет относится не к поиску самой таблицы (DBF), а к поиску именно контейнера базы данных (DBC).

После открытия контейнера базы данных таблицы будут найдены по относительным путям, которые записаны внутри контейнера базы данных. Там опять же относительные пути.

Есть вариант программного изменения путей доступа именно внутри DataEnvironment

forum.foxclub.ru

Но, на практике, проще сделать ряд организационных мероприятий

1. Файлы DBF, включенные в контейнер базы данных, физически всегда должны быть расположены в той же папке, что и сам контейнер базы данных (DBC).

2. При запуске приложения (еще до открытия каких-либо форм) желательно сразу открыть DBC по нужному пути доступа. Если форма запущена в Default DataSession, то этого будет достаточно. Если в Private DataSession, то организовать открытие DBC в Load-формы

В main.prg всегда пишу объявление глоб.переменных и открытие .dbc Так что это тоже написано уже.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
Владимир Максимов

Сообщений: 14041
Откуда: Москва
Дата регистрации: 02.09.2000
Речь идет о Local View? Надо смотреть, на сконструированный запрос. Что указано в качестве источника данных (опции FROM, JOIN)? Указан ли там путь доступа и расширение? Теоретически, должно быть только имя таблицы без пути доступа и без расширения

Но, для гарантии, лучше сделать следующее

1. Явным образом добавить в DataEnvironment таблицы-источники этого View. То, что указано в опциях FROM и JOIN
2. У самого View установить NoDataOnLoad = .T. - это настройка в DataEnvironment у курсора для View
3. Наполнение View данными через REQUERY( ) уже в init()-формы

Если версия Visual FoxPro 8 или старше, то лучше вместо Local View использовать объект CursorAdapter.

Если есть сомнения, что используются разные базы данных, то можно посмотреть список открытых баз через ADATABASES(). Второй столбец массива - это путь доступа к соответствующему DBC.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
Elsif
Автор

Сообщений: 14
Дата регистрации: 05.02.2020
Владимир Максимов
Речь идет о Local View? Надо смотреть, на сконструированный запрос. Что указано в качестве источника данных (опции FROM, JOIN)? Указан ли там путь доступа и расширение? Теоретически, должно быть только имя таблицы без пути доступа и без расширения
Но, для гарантии, лучше сделать следующее

1. Явным образом добавить в DataEnvironment таблицы-источники этого View. То, что указано в опциях FROM и JOIN
2. У самого View установить NoDataOnLoad = .T. - это настройка в DataEnvironment у курсора для View
3. Наполнение View данными через REQUERY( ) уже в init()-формы

Если версия Visual FoxPro 8 или старше, то лучше вместо Local View использовать объект CursorAdapter.

Если есть сомнения, что используются разные базы данных, то можно посмотреть список открытых баз через ADATABASES(). Второй столбец массива - это путь доступа к соответствующему DBC.
SELECT Razplan.guid, Razplan.rem, Razplan.god, Razplan.koddog,;
Razplan.shifrizd, Sn01pl.oboz AS izdob, Sn01pl.naim AS izdname,;
Razplan.shifr, Sn01pl2.oboz AS vhob, Sn01pl2.naim AS vhname,;
Razplan.kol AS kolpl, SUM(NVL(Runmake.kolm,0)) AS kolm,;
NVL(Razplan.kol-SUM(NVL(Runmake.kolm,0)),0) AS dost;
FROM ;
worktask!razplan ;
LEFT OUTER JOIN worktask!runmake ;
ON ( Razplan.koddog = Runmake.dog;
AND Razplan.shifrizd = Runmake.izdel );
AND Razplan.shifr = Runmake.vhod ;
LEFT OUTER JOIN worktask!sn01pl2 ;
ON Razplan.shifr = Sn01pl2.shifr ;
LEFT OUTER JOIN worktask!sn01pl ;
ON Razplan.shifrizd = Sn01pl.shifr;
GROUP BY Razplan.guid, Razplan.rem, Razplan.god, Razplan.koddog,;
Razplan.shifrizd, Sn01pl.oboz, Sn01pl.naim, Razplan.shifr, Sn01pl2.oboz,;
Sn01pl2.naim, Razplan.kol;
ORDER BY Razplan.god, Razplan.koddog, Sn01pl.oboz, Sn01pl2.oboz

1-3 - всё так

С Cursor Adapter не сталкивалась - пошлите куда-нибудь почитать, пожалуйста.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
Владимир Максимов

Сообщений: 14041
Откуда: Москва
Дата регистрации: 02.09.2000
С точки зрения путей доступа в Local View все корректно.

Как определили, что не по тем таблицам запрос выполнен? Пробовали сделать запрос напрямую к нужным таблицам?

Есть ряд функций, которые могут помочь идентифицировать именно сами файлы-источники. Надо в форме для целей отладки их выполнить и посмотреть, что вернут

ADATABASES() - возвращает массив открытых DBC. Там есть полный путь доступа к файлу. Можно будет понять какой DBC открыт
AUSED() - список открытых курсоров. Тоже массив. Для каждого алиаса использовать DBF(), чтобы узнать, какой файл DBF открыт под этим алиасом


CursorAdapter - это программная оболочка над запросами. Вот все то, что делает View делает и CursorAdapter (плюс еще сверху много чего), но объект не привязан к контейнеру базы данных. Это "внешний" по отношению к DBC объект.

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

Сообщений: 14
Дата регистрации: 05.02.2020
В представлении, которое из базы смотрю, записей намного больше (порядка 60тыс, как и в таблице на основе которой он сделан). А при запуске формы почему-то представление берёт таблицу, которая лежит в папке с экзешником, по пути .\db\ - там меньше записей (10 тыс) и некоторые из них я сознательно попортила, чтобы проверить откуда берутся данные.

В общем-то не первый раз такую схему использую в фоксовской программе. Но именно сейчас, когда сроки "горят" - Фокс решил меня свести с ума ((
Попробую завтра aused() проверить ещё
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
leonid

Сообщений: 3176
Откуда: Рига
Дата регистрации: 03.02.2006
Помнится когда-то давным давно для решения этой проблемы помещал в Projecthook в метод BeforeBuild примерно такой код

close data all
m.ln=adir(frms,"forms\*.scx")
for i=1 to ln
use ("forms\"+allt(frms(i,1)))
scan for "..\" $ properties
do while "..\" $ properties
m.pos1=at("..\",properties)
m.st1=substr(properties,m.pos1)
m.pos2=at(chr(13),m.st1)
if m.pos2>0
m.st1=left(m.st1,m.pos2-1)
endif
m.st2=justfname(allt(m.st1))
if m.pos2=0
replace properties with left(properties,m.pos1-1)+m.st2
else
replace properties with left(properties,m.pos1-1)+m.st2+substr(properties,m.pos1+m.pos2-1)
endif
enddo
endscan
use
next

P.S. Ну пути там вероятно нужно скорректировать



Исправлено 1 раз(а). Последнее : leonid, 02.03.23 20:17
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
of63

Сообщений: 24232
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
() в фоксе последовательность встроенных операций (выполнения методов, типа Init (экрана и обьектов)), и в случае DE тоже самое (тоже самое - просто надо узнать, когда и что происходит). Это можно узнать без "хелпа" (в нем совсем не все), но путем проведения опыта - поставьте точку останова в любом месте, или опертор "SET STEP ON", и в "отладчике" вы увидите (подведя мышку, и т.п.) значения переменных, "дефаулты", всё как в командном окне. Кстати, в окне значений переменных можно писать не только имена переменных, но и функции (не все), и макросы (с амперсанда если начать имя)

Да, забыл сказать слово "стек". Да, Фоксовый язык, раз имеет подпрограммы, то он в этом смысле обычный штатный Си-подобный язык...

Если вы явно не видите вызывающе программы в стеке (типа метода Init ), то она вызвана внутренним механизмомо фокса. Но Это внутренний механизм тоже немного описан (просто надо вьехать в приципы построения ООП фокса, в последовательность, идею инициализаций обьектов на форме в т.ч) Ребята сделали фокс простым и в ООП, много скрыли (сделали умолчательным) нарисовали хелп, который здешние ребята и девушки заботливо (идеально, ну, не везде, между нами) ) перевели.

() Если желания нет во все это вникать, то есть языки и поподатливее молоды умам. Фокс - уж очень немодный



Исправлено 2 раз(а). Последнее : of63, 02.03.23 21:47
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
Elsif
Автор

Сообщений: 14
Дата регистрации: 05.02.2020
Ну другой язык в данном случае не совсем уместен. Проект довольно большой, рабочий, написан на фоксе. Поддержку таких никто не отменял. Просто стрельнуло некоторым его изменить и как обычно "ещё вчера". Ну поменять то я поменяла, но давно уже практики не было и боюсь что забыла какую-то мелочь.
Ratings: 0 negative/1 positive
Re: Проблема с открытием таблиц в DE по заданному пути
Taran

Сообщений: 13522
Откуда: Красноярск
Дата регистрации: 16.01.2008
DE - пережиток прошлого. Открывать таблицы надо ручками при необходимости и явно указывать пути.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
Elsif
Автор

Сообщений: 14
Дата регистрации: 05.02.2020
А LocalView?

Кстати, именно на этой форме была проблема. Сначала я явно прописала пути к таблицам, без добавления их в DE (там были только представления). Но данные брались не оттуда и я решила и таблицы в DE засунуть. В общем мега странно себя в этот раз фокс ведет.
Когда стала на сервере тестировать, то сначала вообще выдавалась ошибка что по заданному пути таблицы новые не найдены. Хотя лежат там же, где и старые, пути берутся из одного и того же файла. Ерунда какая-то - открытие таблиц и представлений по нужному пути, а второй день бьюсь.



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

Сообщений: 13522
Откуда: Красноярск
Дата регистрации: 16.01.2008
Elsif
А LocalView?

Лично я отказался почти сразу, как только появился CursorAdapter.
Могу использовать в своих личных прикладных программах-пятиминутках.
Есть много причин, тянущихся с прошлого века.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
andrewk

Сообщений: 159
Откуда: Красноярск
Дата регистрации: 15.05.2005
Владимир Максимов
Когда Вы включаете таблицу в DataEnvironment, то Вы также записываете и путь доступа к этой таблице.
...
Если файл не найден, то далее выполняется поиск в следующих директориях
...
3. В директориях, указанных в настройках SET PATH
...
Но, на практике, проще сделать ряд организационных мероприятий
Как вариант. Где-нибудь (например, в ProjectHook.BeforeBuild) можно перебрать формы, открыть как DBF, удалить в поле Properties значения для "cursorsource=" пути – оставить только имя файла. Ну и на старте проги, конечно, SET PATH.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
akvvohinc

Сообщений: 3916
Откуда: Москва
Дата регистрации: 11.11.2008
Выше Леонид как раз и описал этот способ.
Ratings: 0 negative/0 positive
Re: Проблема с открытием таблиц в DE по заданному пути
Elsif
Автор

Сообщений: 14
Дата регистрации: 05.02.2020
andrewk
Владимир Максимов
Когда Вы включаете таблицу в DataEnvironment, то Вы также записываете и путь доступа к этой таблице.
...
Если файл не найден, то далее выполняется поиск в следующих директориях
...
3. В директориях, указанных в настройках SET PATH
...
Но, на практике, проще сделать ряд организационных мероприятий
Как вариант. Где-нибудь (например, в ProjectHook.BeforeBuild) можно перебрать формы, открыть как DBF, удалить в поле Properties значения для "" пути – оставить только имя файла. Ну и на старте проги, конечно, SET PATH.

ProjectHook не помог (как и в какой момент его надо запускать? не использовала раньше никогда - наверное что-то не так делаю. Создала класс на основе стандартного ProjHook, написала в beforeBuild замену "..", как здесь советовали со своими путями и указала его в ProjectClass проекта)
(( Смотрю формы в виде таблиц - нигде не осталось "cursorsource=..", а таблицы берет все равно не оттуда. Потом ребилд стала делать - так вообще на эту форму ругается, что она стала ReadOnly.
Теперь только локально на компе базу видит правильно, а на термин.сервере - все равно теряет таблицы.



Исправлено 5 раз(а). Последнее : Elsif, 06.03.23 09:17
Ratings: 0 negative/0 positive


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

On-line: 6 (Гостей: 6)

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