Файл arrayname prg не существует
У меня есть база данных visual fox pro 9, и я пытаюсь подключить ее из своего настольного приложения.
Я могу получить данные из почти всех таблиц, кроме одной таблицы.
когда я запускаю запрос для выбора данных из "test.dbf", он выдает исключение, говорящее
Я использую драйверы VFP OLEDB для подключения к базе данных.
Я получил его окончательно, кажется, что проблема с новым драйвером oledb, поэтому я использую драйвер ODBC "Microsoft Visual FoxPro Driver". это было трудно найти, но после многих поисков я нашел здесь этот драйвер. VFODBC
Спасибо за поддержку.
Раньше существовало дополнение для FoxPro под названием PhDbase, которое обеспечивало быстрый поиск в полях заметок и некоторых других функциях. Я почти уверен, что программа, которая его реализовала, называлась Phd.PRG, и для ее подключения требовался вызов этой программы (функции) в теге индекса.
Первая возможность заключается в том, что программа доступна, но в папке, которую вы не видите с OLEDB. Я не знаю, может ли OLEDB обрабатывать пользовательские функции в индексных тегах или нет. Но если вы можете найти файл в другой папке, попробуйте скопировать его в ту же папку, что и таблицы.
Вторая возможность: если это старые данные и приложение больше не используется, вы должны удалить соответствующий тег. Я предполагаю, что вам понадобится (или, по крайней мере, хочу) Visual FoxPro выполнить эту работу.
Третий вариант, хотя я не знаю, сработает ли он. Вы можете создать фиктивную программу с правильным именем файла и поместить ее в нужную папку. Я долгое время использовал PhdBase, поэтому я не помню его параметры и возвращаю значение точно, но вы можете попробовать функцию, которая принимает строку и возвращает ту же строку.
Надеюсь, что-то здесь помогает.
Если вы открываете таблицу из контейнера базы данных, я бы проверил, есть ли у этой таблицы какие-то триггеры, связанные с ней. Если эти триггеры ищут внешний файл phd.prg, который не отображается в пути, это может захлебывать его. Но вы делаете только select * from, так что это не должно быть проблемой. В любом случае, дважды проверьте его. Позволяет ли вам позвонить в phd.prg? Имеет ли база данных хранимые процедуры в ней по этой ссылке, она может вызвать проблему?
Во-первых, позвольте мне сказать, что я очень, очень новичок в FoxPro и для того, чтобы найти только основы, нужно немного научиться.
Я пытаюсь создать программный файл (.prg) с некоторыми общедоступными функциями, которые я могу вызывать из основного кода. Я добавил программный файл « publicfunctions.prg » и включил простую функцию, которая возвращает жестко закодированный литерал (просто пытаясь заставить механику работать)
Ошибка, которую я получаю, связана с оператором SET PROCEDURE TO publicfunctions.prg . Это: " Файл 'publicfunctions.prg" не существует. "
Я предполагаю, что он не может его найти, потому что каталог по умолчанию не установлен на путь, по которому существует файл. Я попытался добавить оператор SET DEFAULT TO перед оператором SET PROCEDURE TO, но результат не изменился.
Я не хочу жестко кодировать путь, поэтому думаю, что мои вопросы следующие:
- Верно ли мое предположение о каталоге по умолчанию?
- Если №1 верно, то как я могу установить каталог по умолчанию в каталог, в котором находится основной файл программы?
- Правильно ли я вызываю функцию? (Если, конечно, найдет)
ОБНОВЛЕНИЕ
Согласно приведенным ниже вопросам Хэнка я добавил эту дополнительную информацию: файл « publicfunctions.prg » был добавлен в проект с помощью кнопки « Создать » в Диспетчере проектов, а физический файл находится рядом с файлом « Main.prg ». в папке файловой системы.
Я использую Microsoft Visual FoxPro 9.0
Любая помощь будет по достоинству оценена.
VFP поддерживает путь поиска (который отделен от пути поиска Windows / DOS), по которому он будет искать любые PRG, DBF и т. Д., На которые вы ссылаетесь в своем коде.
Вы можете проверить его текущую настройку с помощью функции SET ('PATH') и установить ее с помощью SET PATH TO. Эти места ищутся в дополнение к текущему каталогу по умолчанию (который вы можете проверить с помощью функций SET ('DEFAULT') и CURDIR ().
Это покажет, что они собой представляют в настоящее время:
Они хорошо задокументированы в справке VFP - проверьте там более подробное объяснение.
ЛАК. . . спасибо за отличную информацию. Я уверен, что буду часто этим пользоваться. Есть ли способ определить каталог, в котором находится исполняемый файл программы? Если бы я мог это получить, я мог бы использовать оператор SET PATH TO, чтобы изменить его. Я запустил код, который вы предоставили, и в перечисленных каталогах не было никаких фактических исполняемых файлов PJX или PRG.
Я понимаю, что это может быть необязательно для компиляции программы, поскольку я могу добавить путь к настройке «Пути поиска» в параметрах, но это может быть очень полезно при попытке открыть таблицы и другие файлы.
Я просто понял, почему я получил те ценности, которыми был. Функция CURDIR () возвращала значения относительно текущего исполняемого файла. При запуске кода из среды FoxPro IDE этим файлом является FoxPro.exe, а не программный файл, который в данный момент выполняется в отладчике. Когда я скомпилировал приложение в exe, оно вернуло соответствующую информацию. Спасибо LAK за всю очень полезную информацию.
Я рад, что помог. На самом деле я не использую «Проекты» VFP (наше приложение разрабатывалось примерно с 1988 года, и мы никогда не использовали его в более современных способах работы VFP), поэтому я не дал конкретных советов о том, как они соотносятся с вашими проблема.
Еще один комментарий здесь. Поскольку вы новичок в VFP, вы можете начать с правильного пути. Большинство экспертов по VFP не рекомендуют использовать файлы процедур. Поместите каждую функцию или процедуру в отдельный файл PRG с именем процедуры в качестве имени файла. Например, ваша функция GetFieldValue должна находиться в GetFieldValue.PRG.
ПРОЦЕДУРА УСТАНОВКИ восходит к ранним временам Xbase, когда еще не было менеджера проекта.
Тамар. . . Спасибо за информацию. Мне всегда нравится знать общепринятые правила в хорошей форме в среде, которую я использую. На самом деле я просто пытаюсь выучить достаточно, чтобы держать несколько (очень плохо написанных) приложений FoxPro на плаву до тех пор, пока их нельзя будет заменить. Так что на самом деле я не буду заниматься «настоящей» разработкой. Но еще раз спасибо. Мне нравится знать как можно больше.
Поскольку Тамар упоминала о попытках избежать использования такого файла "SET PROCEDURE", я НАСТОЯТЕЛЬНО рекомендую иметь хорошо структурированный каталог для вашего проекта. Хранение всех файлов в одном месте может быть настоящей головной болью . Исторически я делал что-то вроде
Затем, соответственно, поместите свои файлы в соответствующие места. Вы добавляете их к своему менеджеру проекта таким же образом и сохраняете «относительный» путь к файлам.
Как отмечалось выше, разделение «данных» для приложения позволяет легко копировать / вставлять резервные копии, моделировать, отлаживать тестирование наборов данных снова и снова, когда это необходимо. При попытке открыть файлы вы можете ссылаться на открытие файлов на основе полного пути + имени таблицы ВМЕСТО использования «SET PATH». Слишком много раз в прошлом у меня были системы, которые полагались на "SET PATH", и они давили или находили файл, который был старой версией чего-то, а НЕ был ожидаемым. Мой подход . Если я не могу понять, ПОЧЕМУ. Найдите его, положите в нужное место и продолжайте.
Как упоминалось с данными, предположим, что у вас есть таблицы «клиенты» и «заказы» в каталоге «данные». У вас может быть переменная и ссылаться на нее как при запросе, так и при открытии файлов .
Если вы пытаетесь запросить, вы можете сделать что-то вроде
Таким образом, у вас НИКОГДА не будет неоднозначного ответа на вопрос, какая версия таблицы ДУМАЕТ, что пытается получить данные. Опять же, если он не может найти файл, вам нужно сначала решить более серьезную проблему.
@dscarr, я даже дам вам один шанс . Поскольку вы новичок в мире VFP, и это кривая обучения, если вы хотите, я бы предложил вам свой личный адрес электронной почты, чтобы помочь наставлять / руководить тем, что будет очевидно, превратился в подробный список находок . Дайте мне знать, и я отправлю свое электронное письмо и удалю его, как только вы его удалите.
Я был бы очень признателен. Я обещаю проявить должную осмотрительность, прежде чем связываться с вами. Кажется, я оказался в ситуации, когда поддерживаю где-то около 20 программ VFP, написанных конечным пользователем, которые раньше никогда не просматривали ни одной строчки кода. Я воспользуюсь любой помощью, которую смогу получить.
У меня есть база данных Visual Fox Pro 9, и я пытаюсь подключить ее из своего настольного приложения.
я могу получить данные почти из всех таблиц, кроме одной таблицы.
когда я запускаю запрос для выбора данных из "test.dbf", он выдает исключение, говорящее
Я использую драйверы VFP OLEDB для подключения к базе данных.
Поскольку вы открываете таблицу из контейнера базы данных, я бы проверил, есть ли у рассматриваемой таблицы какие-либо триггеры, связанные с ней. Если эти триггеры ищут какой-то внешний файл phd.prg, который не виден в пути, это может его задушить. Но вы делаете только выбор * из, так что это не должно быть проблемой. В любом случае перепроверьте. Вам знакомо название "phd.prg"? Есть ли в базе данных хранимые процедуры по этому имени, это может быть причиной проблемы?
Раньше для FoxPro существовала надстройка PhDbase, обеспечивающая быстрый поиск в полях заметок и некоторые другие функции. Я почти уверен, что программа, которая его реализовала, называлась Phd.PRG, и для ее подключения требовался вызов этой программы (функции) в индексном теге.
Первая возможность заключается в том, что программа доступна, но в папке, которую вы не видите в OLEDB. Я не знаю, может ли OLEDB обрабатывать пользовательские функции в индексных тегах или нет. Но если вы можете найти файл в другой папке, вы можете попробовать скопировать его в ту же папку, что и таблицы.
Второй вариант: если это старые данные и приложение больше не используется, вы сможете удалить соответствующий тег. Я предполагаю, что вам понадобится (или, по крайней мере, вы захотите) Visual FoxPro для выполнения этой работы.
Третий вариант, хотя я не знаю, сработает ли он. Вы можете создать фиктивную программу с правильным именем файла и поместить ее в нужную папку. Я давно не пользовался PhdBase, поэтому точно не помню его параметры и возвращаемое значение, но вы можете попробовать функцию, которая принимает строку и возвращает ту же строку.
Visual FoxPro 9.0 пишу текст проги:
SET PATH TO menus, data, reports, forms, progs
ON SHUTDOWN DO MyExitProcedure
DO topmenu.MPR
_screen.visible = .T.
READ events
PROCEDURE MyExitProcedure
CLEAR EVENTS
RETURN
Компилирую, запускаю exe-шник. Запускается окно с меню. Когда нажимаю на крестик чтобы закрыть окно вылазиет ошибка
Файл myexitprocedure.prg не существует и окно не закрывается.
В чем ошибка?
Попробуйте процедуру MyExitProcedure вынести в отдельный файл MyExitProcedure.prg.
По крайней мере у меня так работает.
первое что приходит в голову: процедуры наверное вынести в отдельную прогу до нажатия красного крестика и при шутдауне выполнить ее.
В отдельный файл тоже пробовал выносить, та же ошибка. А вообще если процедура описана в том же файле что и основная прога должно работать или нет?
Если пишу текст
SET PATH TO menus, data, reports, forms, progs
ON SHUTDOWN CLEAR EVENTS
DO topmenu.MPR
_screen.visible = .T.
READ events
То когда пытаюсь закрыть крестиком прога просто зависает и начинает мелькать.
Может visual studio кривой у меня?
Поиск дает многого вот кусок
fkn1088
ON SHUTDOWN DO MyExitProcedure
DO topmenu.MPR
_screen.visible = .T.
READ events
PROCEDURE MyExitProcedure
CLEAR EVENTS
RETURN
А что если поменять код на такой:
На все события прекращения работы программы (кнопки выхода, пункты меню, кресты и т.п.) повесить CLEAR EVENTS, который приведёт к выполнению кода после READ EVENTS.
Команда Quit нужна в том случае, если закрытие приложения осуществляется не манипуляциями пользователя, а какими-то системными событиями из вне собственно приложения. Например, закрыть приложение из диспетчера задач. Т.е. не просто завершение главной процедуры, а еще и принудительная повторная команда на закрытие приложения.
Можно уточнить в чем заключается "корректная реакция"?
fkn1088
Visual FoxPro 9.0 пишу текст проги:
SET PATH TO menus, data, reports, forms, progs
ON SHUTDOWN DO MyExitProcedure in MainFile && или как там у тебя главный файл
DO topmenu.MPR
_screen.visible = .T.
READ events
PROCEDURE MyExitProcedure
CLEAR EVENTS
RETURN
Компилирую, запускаю exe-шник. Запускается окно с меню. Когда нажимаю на крестик чтобы закрыть окно вылазиет ошибка
Файл myexitprocedure.prg не существует и окно не закрывается.
В чем ошибка?
Да Владимир, именно так - при закрытии сессии (это, к слову говоря, не только шатдаун) система сначала рассылает всем приложениям это самое WM_QUERYENDSESSION - и программы ДОЛЖНЫ отреагировать на него, при этом они запросто могут "отменить" операцию закрытия сессии. Потом уже, если все приложения "согласились", будет послано второе оповещение WM_ENDSESSION и далее сессия будет закрыта.
В фоксе есть нюанс - он как раз и состоит в том, что фокс не шлёт "положительного ответа" если в ON SHUTDOWN нету QUIT Можно попытаться самому перехватить это событие и "правильно" отреагировать - это если уж реально нужно чтобы исполнялся код ЗА CLEAR EVENTS при любых условиях (в т.ч. шатдаун/логофф системы).
Изредко такое можно наблюдать при использовании например HandyCache.exe, который иногда не реагирует на выключение компа, видимо запустив какой-то из своих рабочих потоков, и дожидаясь его корректного завершения.
При этом, OS выбрасывает диалог завершения проги с кнопкой "Прервать". Если прога упорствует/не завершается, то только после её нажатия, ситема продолжает процесс выключения компа.
- Относительно VFP кода - да, нормальное/корректное поведение при возникновения события ON SHUTDOWN . - это по концу всех завершающих действий, выдача команды QUIT.
- относительно
Стандартно в VFP, чтобы выполнилась команда DO . [IN . ] [WITH . ] , то
- либо используют SET PROCEDURE TO .
- либо опцию IN .
. читаем в документации:
DO Command
.
ProcedureName
Specifies the name of the procedure to execute. Visual FoxPro first looks for the procedure in the currently executing program. If the procedure is not located there, Visual FoxPro then looks for the procedure in the procedure files opened with SETPROCEDURE.
.
IN ProgramName2
Executes a procedure in the program file specified with ProgramName2.
When the file is located, the procedure is executed. If the program file cannot be located, the message "File does not exist" appears. If the program file is located but the specified procedure isn't in the program file, the message "Procedure is not found" appears.
.
MichaelD
При этом, OS выбрасывает диалог завершения проги с кнопкой "Прервать". Если прога упорствует/не завершается, то только после её нажатия, ситема продолжает процесс выключения компа.
Это происходит не всегда. Видимо зависит от того, как именно обрабатывается событие WM_QUERYENDSESSION в приложении.
MichaelD
- Относительно VFP кода - да, нормальное/корректное поведение при возникновения события ON SHUTDOWN . - это по концу всех завершающих действий, выдача команды QUIT.
- MS вроде как гордится, что protected override void OnClosing(CancelEventArgs e) возбуждается. но не больше.
- . и чтобы процесс "умирания" OS продолжился, нужны "явные доп.телодвижения" в коде.
Во-первых, позвольте мне сказать, что я очень, очень новичок в FoxPro и нахожу только основы немного кривой обучения.
Я пытаюсь создать программный файл (.prg), в котором есть некоторые общедоступные функции, которые я могу вызывать из своего основного кода. Я добавил файл программы "общественные функции.prg" и включил простую функцию, которая возвращает жестко закодированный литерал (просто пытаясь заставить работать механику)
Ошибка, которую я получаю, находится на 'УСТАНОВИТЕ ПРОЦЕДУРУ ДЛЯ publicfunctions.prg' утверждение. Это: "Файл «publicfunctions.prg» не существует."
Я предполагаю, что он не может его найти, потому что каталог по умолчанию не установлен на путь, по которому существует файл. Я попытался добавить "УСТАНОВИТЬ ПО УМОЛЧАНИЮ" Заявление перед "УСТАНОВИТЬ ПРОЦЕДУРУ", но это никак не повлияло на результат.
Я не хочу жестко кодировать путь, поэтому я думаю, что мои вопросы таковы:
ОБНОВИТЬ
На вопросы Хэнка ниже я добавил эту дополнительную информацию: файл "общественные функции.prg" был добавлен в проект с помощью "Новое" в менеджере проектов, а физический файл находится рядом с "Main.prg" файл в папке файловой системы.
Я использую Microsoft Visual FoxPro 9.0.
Любая помощь будет действительно оценена.
задан 02 мая '12, 15:05
5 ответы
VFP поддерживает путь поиска (отдельный от пути поиска Windows/DOS), по которому он будет искать любые PRG, DBF и т. д., на которые вы ссылаетесь в своем коде.
Вы можете проверить его текущую настройку с помощью функции SET('PATH') и установить ее с помощью SET PATH TO. Эти места ищутся в дополнение к любому текущему каталогу по умолчанию (что вы можете проверить с помощью функций SET('DEFAULT') и CURDIR().
Это покажет, какие они в настоящее время:
Они хорошо задокументированы в справке VFP — проверьте там гораздо лучшее объяснение.
ответ дан 02 мая '12, 18:05
ЛАК. . . спасибо вам за отличную информацию. Я буду использовать это много, я уверен. Есть ли способ определить каталог, в котором находится исполняемый в данный момент программный файл? Если бы я мог получить это, я мог бы использовать оператор SET PATH TO, чтобы изменить его. Я запустил предоставленный вами код, и перечисленные каталоги были далеки от реальных исполняемых файлов PJX или PRG. - дскарр
Я понимаю, что это может не понадобиться для компиляции программы, так как я могу добавить путь к параметру «Пути поиска» в параметрах, но это может быть очень полезно при попытке открыть таблицы и другие файлы. - дскарр
Я только что понял, почему я получаю те ценности, которые у меня были. Функция CURDIR() возвращала значения, относящиеся к текущему исполняемому файлу. При запуске кода из FoxPro IDE этим файлом является FoxPro.exe, а не программный файл, который в данный момент выполняется в отладчике. Когда я скомпилировал приложение в exe, оно вернуло соответствующую информацию. Спасибо LAK за очень полезную информацию. - дскарр
Я рад, что помог. На самом деле я не использую «Проекты» VFP (наше приложение разрабатывалось с 1988 года или около того, и мы никогда не адаптировали его к более современным способам ведения дел VFP), поэтому я не давал конкретных советов о том, как они соотносятся с вашими потребностями. проблема. - LAK
Еще один комментарий здесь. Поскольку вы новичок в VFP, вы можете начать с правильной ноги. Большинство экспертов VFP рекомендуют не использовать файлы процедур. Поместите каждую функцию или процедуру в отдельный файл PRG с именем процедуры в качестве имени файла. Например, ваша функция GetFieldValue должна находиться в GetFieldValue.PRG.
SET PROCEDURE восходит к ранним дням Xbase, когда еще не было руководителя проекта.
ответ дан 02 мая '12, 21:05
Тамар. . . Спасибо за информацию. Я всегда хотел бы знать общепринятые правила хорошей формы в среде, которую я использую. На самом деле я просто пытаюсь узнать достаточно, чтобы удержать на плаву несколько (очень плохо написанных) приложений FoxPro, пока их не заменят. Так что на самом деле я не буду заниматься «настоящей» разработкой. Но опять же, спасибо. Мне нравится знать как можно больше. - дскарр
Поскольку Тамар упомянула о попытке избежать использования такого файла «SET PROCEDURE», я НАСТОЯТЕЛЬНО рекомендую иметь хорошо структурированный каталог для вашего проекта. Наличие всех файлов в одном месте может быть полной болью. Исторически я делал что-то вроде
Затем, соответственно, поместите свои файлы в соответствующие места. Таким же образом вы добавляете их в свой менеджер проектов и сохраняете «относительный» путь к файлам.
Как отмечалось выше, наличие отдельных «данных» для приложения позволяет легко копировать/вставлять резервные копии, моделировать, отлаживать тестирование наборов данных снова и снова, когда это необходимо. При попытке открыть ваши файлы вы можете ссылаться на открытие файлов на основе квалифицированного пути + имени таблицы ВМЕСТО использования «SET PATH». Слишком много раз в прошлом у меня были системы, которые полагались на «SET PATH», и задыхались или находили файл, который был старой версией чего-то, а не тем, который ожидался. Мой подход таков. Если я не могу найти ПОЧЕМУ. Найдите его, поместите в нужное место и продолжайте.
Как упоминалось с данными, скажем, у вас есть таблицы «клиенты» и «заказы» в каталоге «данные». Вы можете иметь переменную и ссылаться на нее как при запросе, так и при открытии файлов.
Если вы пытаетесь сделать запрос, вы можете сделать что-то вроде
Таким образом, у вас НИКОГДА не будет неоднозначной версии, КАКАЯ версия таблицы ДУМАЕТ, что она пытается получить данные. Опять же, если он не может найти файл, у вас есть более серьезная проблема, которую нужно решить в первую очередь.
ответ дан 03 мая '12, 02:05
@dscarr, я даже поставлю вам плюс. Поскольку вы новичок в мире VFP, и это кривая обучения, если хотите, я бы предложил вам свою личную электронную почту, чтобы помочь в наставничестве / руководстве по тому, что будет очевидно, превратился в длинный список находок. Дайте мне знать, и я опубликую свою электронную почту и удалю ее, как только вы ее уберете. - ДРап
Я был бы очень признателен. Я обещаю проявить должную осмотрительность, прежде чем связаться с вами. Кажется, я оказался в ситуации, когда поддерживал где-то около 20 программ VFP, написанных конечными пользователями, никогда раньше не просматривая ни одной строки кода. Я приму всю помощь, которую смогу получить. - дскарр
Если вы хотите, чтобы ваше приложение запускалось где угодно, поместите в файлprograms и table.
Вы просто должны добавить это.
PS. Обратите внимание, что это вступит в силу только в том случае, если проект находится только в дистрибутивном (.exe) коде. Вы должны установить путь и значение по умолчанию на этапе разработки программы.
Читайте также:
- The bat и thunderbird сравнение
- Arma 3 файлы не подписаны ключом который принимается сервером
- Материнская плата nzxt n7 z490 обзор
- Правила которые используются для связи уровня n одного компьютера с уровнем n другого компьютера
- Win10 arduino ide esp8226 ошибка открытия последовательного порта com8 port not found