使用SET PROCEDURE时出错

时间:2012-05-02 14:08:00

标签: foxpro visual-foxpro

首先让我说我对FoxPro非常非常新,并且只是找到了一些基本的学习曲线。

我正在尝试创建一个程序文件(.prg),它有一些我可以从主代码调用的公共函数。我添加了程序文件“ publicfunctions.prg ”并包含一个简单的函数,它返回一个硬编码的文字(只是试图使机制工作)

*!* This function is in the publicfunctions.prg file
FUNCTION GetFieldValue
    RETURN 'This is the value'
ENDFUNC

然后在我的主程序中我尝试使用它,但我收到文件不存在的错误。以下是主程序中的全部代码

*!* This is the main program logic    
SET PROCEDURE TO publicfunctions.prg

PRIVATE sFieldValue = ''

sFieldValue = GetFieldValue()

我得到的错误是在' SET PROCEDURE TO publicfunctions.prg '语句中。它是:“文件'publicfunctions.prg”不存在。

我猜它无法找到它,因为默认目录未设置为文件所在的路径。我尝试在“ SET PROCEDURE TO ”语句之前添加“ SET DEFAULT TO ”语句,但它根本没有改变结果。

我不想对路径进行硬编码,所以我想我的问题是这些:

  1. 我的假设是否正确默认目录?
  2. 如果#1为真,那么如何将默认目录设置为主程序文件所在的目录?
  3. 我是否正确调用了该功能? (如果它当然可以找到它)
  4. 更新
    Per Hank的问题如下,我添加了以下附加信息: 使用项目管理器上的“”按钮将文件“ publicfunctions.prg ”添加到项目中,物理文件就位于“旁边Main.prg “文件系统文件夹中的文件。

    enter image description here

    enter image description here

    我正在使用Microsoft Visual FoxPro 9.0

    任何和所有帮助都将得到真正的赞赏。

    谢谢,
    道格

5 个答案:

答案 0 :(得分:3)

VFP维护一个搜索路径(与Windows / DOS搜索路径分开),它将搜索您在代码中引用的任何PRG,DBF等。

您可以使用SET('PATH')功能检查其当前设置,并使用SET PATH TO进行设置。除了当前的默认目录(您可以使用SET('DEFAULT')和CURDIR()函数验证)之外,还会搜索这些位置。

这将显示目前的情况:

WAIT WINDOW 'Path: ' + SET('PATH') + CHR(13)+CHR(10) + 'Default drive: ' + SET('Default') + CHR(13)+CHR(10) + 'Current directory: ' + CURDIR()

这些都在VFP的帮助中得到了很好的记录 - 请在那里查看更好的解释。

答案 1 :(得分:3)

另有一条评论。既然你是VFP的新手,你也可以从右脚开始。大多数VFP专家建议不要使用过程文件。将每个函数或过程放在一个单独的PRG文件中,并将例程名称作为文件名。例如,您的GetFieldValue函数应该在GetFieldValue.PRG。

SET PROCEDURE可以追溯到有一个项目经理之前的Xbase早期。

答案 2 :(得分:2)

正如Tamar提到的那样,试图避免使用这种“SET PROCEDURE”文件,我强烈建议为你的项目提供一个结构良好的目录。将所有文件放在一个地方可能会让人痛苦不堪......从历史上看,我已经做过像

这样的事情了
C:\SomeFolder\MyProject
C:\SomeFolder\MyProject\classes
C:\SomeFolder\MyProject\data
C:\SomeFolder\MyProject\forms
C:\SomeFolder\MyProject\graphics
C:\SomeFolder\MyProject\prgs
C:\SomeFolder\MyProject\reports

然后,分别将您的文件放在各自的位置。您以相同的方式将它们添加到项目管理器中,并保留文件的“相对”路径。

如上所述,将应用程序的“数据”分开,可以在需要时轻松复制/粘贴备份,模拟,调试数据集的测试。尝试打开文件时,可以根据使用“SET PATH”的限定路径+表名INSTEAD引用打开文件。在过去太多次我有系统依赖于“设置路径”,并会窒息,或找到一个旧版本的文件,而不是预期的文件。我的方法是...如果我找不到为什么。找到它,把它放在适当的位置,然后继续。

如数据所述,假设您在“data”目录中有“customers”和“orders”表。你可以有一个变量,并在查询或打开文件中引用它......

PUBLIC myDataPath as String
myDataPath = "Data\"

use ( myDataPath + "Customers" )
select 0
use ( myDataPath + "Orders" )

如果尝试查询,您可以执行类似

的操作
select ;
      c.FirstName, ;
      c.LastName, ;
      o.OrderID, ;
      o.OrderDate ;
   from ;
      ( myDataPath + "Customers" ) c ;
         JOIN ( myDataPath + "Orders" ) o ;
            on c.CustomerID = o.CustomerID ;
   into ;
      cursor C_SomeSampleResult READWRITE

通过这种方式,你永远不会有一个模糊的WHICH表版本认为它试图从中获取数据。同样,如果找不到该文件,则首先需要解决更大的问题。

答案 3 :(得分:2)

如果您希望应用程序在您希望放入程序和表格的任何位置运行。

你只需添加这个......

SET DEFAULT TO SYS(5)+CURDIR()
SET PATH TO SYS(5)+CURDIR()

<强> PS 即可。请注意,这仅在项目仅处于分布式(.exe)代码时才会生效。您必须在程序的开发阶段设置路径和默认值。

答案 4 :(得分:1)

使用FoxPro,文件“必须”在搜索路径中。因此,如果您构建项目,请将文件publicfunctions.prg添加到代码选项卡下的项目文件中,如果您没有构建项目,请确保在Options中有可以看到prg所在的文件夹。

如果我们知道您正在使用的Fox版本,也会有所帮助。