将R连接到Mac上的Filemaker Pro 15

时间:2017-04-29 21:30:18

标签: r macos rstudio filemaker rodbc

我试图在R(3.3.3)使用RStudio(1.0.143)和Filemaker Pro Advanced 15(15.0.3.305)之间建立连接。我尝试使用RODBC(1.3-15)创建连接。

到目前为止我:

http://www.popotojs.com/live/graph-results/index.html

  • 用户ID:Admin
  • 密码:密码

Created a toy FM Pro database for testing

为我的玩具FM Pro数据库创建了一个名为test_r

的DSN

Followed these instructions for creating a DSN

成功测试了与test_r的连接

enter image description here

尝试通过以下两种方式连接到RStudio中的DSN失败:

fm_connection <- odbcConnect(dsn="test_r", uid="Admin", pwd="password")

返回以下错误:

[RODBC] ERROR: state IM002, code 0, message [unixODBC][Driver Manager]Data source name not found, and no default driver specifiedODBC connection failed

constr <- paste("driver={FileMaker ODBC}",
               "server=127.0.0.1",
               "database=test_r",
               "uid=Admin",
               "pwd=password",
               sep=";")

fm_connection <- odbcDriverConnect(constr)

返回以下错误:

[RODBC] ERROR: state 01000, code 0, message [unixODBC][Driver Manager]Can't open lib 'FileMaker ODBC' : file not foundODBC connection failed

但是,您可以看到驱动程序在那里:enter image description here

最后,我尝试使用这些(和其他)引用来解决此问题但未成功:

  1. enter image description here
  2. https://cran.r-project.org/web/packages/RODBC/vignettes/RODBC.pdf
  3. 到目前为止似乎没有任何作用。我并不依赖于RODBC,但我确实需要一个适用于 Mac OS 的解决方案。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

以下是MacOS的一些重要的故障排除步骤。我在R中遇到了同样的错误,因此我觉得这个问题很有可能。 ODBC的设置可能相当复杂,因为涉及多个版本的软件组件。您已经在此特定FileMaker数据库中验证了ODBC共享。

验证unixodbc的安装:

ODBC管理器实际上是可选的。它管理下面描述的ini文件。但是在安装unixodbc之后,您还可以在没有ODBC管理器的文本编辑器中编辑这些ini文件。

要安装Homebrew,请执行此命令。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="10dp">



<LinearLayout
android:id="@+id/anim_layout"
android:layout_width="280dp"
android:layout_height="200dp"
android:background="@color/grayBackground"
android:gravity="center"
android:layout_marginTop="75dp"
android:orientation="vertical"
android:padding="5dp">

<TextView
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_marginTop="25dp"
    android:layout_weight="1.5"
    android:gravity="center_horizontal"
    android:text="Success"
    android:textColor="@color/lightFont"
    android:textSize="35sp"
    android:textStyle="bold" />

<TextView
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_marginTop="10dp"
    android:layout_weight="2"
    android:gravity="center_horizontal"
    android:text="Check you email for booking\nconfirmation We'll see you soon"
    android:textSize="18sp" />

<Button
    android:layout_width="150dp"
    android:layout_height="wrap_content"
    android:background="@color/cardview_dark_background"
    android:text="OK"
    android:textColor="@color/progressWhite"
    android:textSize="16dp" />


</LinearLayout>

<ImageView
android:id="@+id/anim_image"
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_centerHorizontal="true"
android:src="@drawable/success_icon" />
</RelativeLayout>

然后,安装unixodbc。这提供了系统级别的ODBC连接。

brew更新 brew install unixodbc

验证驱动程序:

驱动程序应安装在此处:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

该文件夹将包含以下两个文件:

/Library/ODBC/FileMaker\ ODBC.bundle/Contents/MacOS 

这是完整的驱动程序路径:

SetupToolTemplate   fmodbc.so

验证配置文件:

文件夹

/Library/ODBC/FileMaker\ ODBC.bundle/Contents/MacOS/fmodbc.so

应包含以下文件:

/Library/ODBC

此外,unixodbc应仅包含最新版本。如果您有早期版本,请将其删除。现在,只有2.3.4。

FileMaker ODBC.bundle   odbc.ini        odbcinst.ini

还包含

/usr/local/Cellar/unixodbc/2.3.4

镜像odbc.ini和odbcinst.ini文件:

如上所述,这两个文件在两个不同的位置有两个副本。确保两者的内容相等。这意味着odbcinst.ini的两个副本都将定义驱动程序。 odbc.ini的两个副本都将包含连接。也许这不是100%必要的,但这是我需要做的。

使用isql进行测试:

odbc.ini        odbcinst.ini

如果您在完成这些步骤后仍有任何问题,请分享其他详细信息,以便我可以更新答案。

答案 1 :(得分:0)

我使用odbc代替RODBC使用了一些新的R代码:

var cvs = ['div#cv0 p', 'div#cv1 p', 'div#cv2 p', 'div#cv3 p'];
for (i = 0; i < losotro.length; i++) {
   console.log(cvs[i]);
   var bindedFunc = (function(i) {
      return function() {
         console.log(i)
      }
   })(i)
   jQuery(losotro[i]).click(bindedFunc);
}