在数据环境中更改路径

时间:2015-12-16 15:30:23

标签: visual-foxpro

我必须编写从公司主应用程序中提取数据的应用程序。它不使用数据库,只使用表,并且所有内容(exe,dbfs,frx)都在同一目录中。 我创建了一个测试目录,它是实时目录的副本。现在,如果我使用表单的数据环境而不是加载/卸载,那么每个表的属性中指示的路径当然指向我的测试目录。 当我将exe转移到实时目录时,有没有办法动态更改该路径?

3 个答案:

答案 0 :(得分:2)

如果您使用的是DataEnvironments,那么VFP会将完全路径(不是相对)保存到数据库和/或表中。然后:

如果该路径恰好存在于使用exe的机器上,则VFP将使用该路径中的表。 如果该路径不存在,那么它会使用“搜索路径”。

为了克服这种情况,多年前我写了一个名为UpdateDE.prg的小程序,我只是:

UpdateDE(this)

表格' DE BeforeOpenTables方法。这非常有效,您可以保留您的开发路径,如果您只想更改“路径”,您仍然可以测试客户的数据。在一个小dbf。这是UpdateDE.prg代码:

Lparameters toDE
Do setups && prg keeping common "set" entries
Local Array aDEMembers[1]
Local lnMembers,ix,lcMembers
If !(Type('oApp')='O' And !Isnull(m.oApp))
  Public oApp
  oApp = Createobject('myApp')
Endif
lnMembers = Amembers(aDEMembers,m.toDE,2)
For ix=1 To m.lnMembers
  With Evaluate('toDe.'+aDEMembers[m.ix])
    If Lower(.BaseClass) == 'cursor'
      If Atc(oApp.cAppDBC,.Database) > 0
        .Database = Addbs(oApp.cAppDataPath)+oApp.cAppDBC
      Else
        .CursorSource = Addbs(oApp.cAppDataPath)+Justfname(.CursorSource)
      Endif
    Endif
  Endwith
Endfor

Define Class myApp As Custom
  cAppDBC = 'myDatabase.dbc'
  cAppDataPath=Fullpath('data')
  cCurPath = ''
  Procedure Init
    This.cCurPath = Set('path')
    If File('dbparam.dbf') && a small dbf that holds path to current data folder
      Select dataLoc From dbparam Where locType == 'DATABASE' Into Array arrDataLoc
      If _Tally > 0
        This.cAppDataPath = arrDataLoc
        Set Path To (arrDataLoc[1]+';'+This.cCurPath)
      Endif
      Use In 'dbparam'
    Endif
  Endproc
  Procedure Destroy
    Set Path To (This.cCurPath)
  Endproc
Enddefine

答案 1 :(得分:1)

如果表单和表在开发环境和运行时环境中位于相同的文件夹或相同的文件夹中,则所有表单和表都可以按预期工作。

具体来说,DE包含你添加的表的相对路径(尽管看起来它是绝对的)。如果您打开表格作为表格(USE MyForm.SCX)并查看,您将看到相对路径。

如果您需要处理与运行时数据不同的相对位置的测试数据,请查看以下文章:http://fox.wikis.com/wc.dll?Wiki~HowToChangePathInDataEnvironment~WIN_COM_API

答案 2 :(得分:0)

不幸的是,Fox习惯在表单,报表等数据环境中存储相对或绝对路径。如果设计环境与用户环境相同(即几乎从不),这可能很方便,但大多数情况下它都是一个令人讨厌的细微错误来源。

如果具有正确名称的游标已经打开,Fox会忽略存储的路径;因此,如果您手动打开表格或创建合适的游标,您可以使Fox使用您想要的任何内容 - 无论存储的路径如何。如果你通过使用一个简单的脚本(我总是这样做)来破坏.frx / .scx备忘录来删除存储的路径组件,那么你可以消除一整类的Heisenbug。

通常,我使用上下文对象(环境管理器)或相对于DBC提供的显式路径打开所有表;除了在交互式Foxen(IDE)中,PATH中从未有任何数据。我们的工作非常有趣,我不需要任何与PATH相关的错误的干扰......