Linux 下使用 Go 调用 SAP RFC

1.下载/配置 Go

  • 下载个 1.9.2 版本的 go
wget https://dl.google.com/go/go1.9.2.linux-amd64.tar.gz
  • 解压 go
tar -xvf go1.9.2.linux-amd64.tar.gz
  • 移动 go 文件到系统目录
mv go/ /usr/local
  • 设置 go 环境变量
export GOROOT=/usr/local/go
export GOPATH=$HOME/Code/go
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH

2.测试 Go

  • 创建 go 测试目录
mkdir -p $GOPATH/src/test
  • 创建 go 测试文件
echo 'package main; import "fmt"; func main(){fmt.Println("Hello, Golang!")}' > $GOPATH/src/test/hello.go
  • 运行 go 测试文件
go run $GOPATH/src/test/hello.go

3.下载/配置 SAP RFC SDK

  • 进入 go src目录
cd $GOPATH/src
  • 克隆 gorfc 项目 ( 主要用到项目中的 nwrfcsdk/ )
git clone https://github.com/Sdu0/gorfc.git
  • 在系统中创建 SAP 依赖文件目录
mkdir -p /usr/local/sap/nwrfcsdk
  • 复制项目中 nwrfcsdk/ 目录中的所有文件到刚创建的目录中
cp -rp $GOPATH/src/gorfc/nwrfcsdk/* /usr/local/sap/nwrfcsdk/
  • 添加 SAP 依赖文件目录到系统环境变量中
export SAPNWRFC_HOME=/usr/local/sap/nwrfcsdk
  • 生成 SAP SDK 动态链接库
echo '/usr/local/sap/nwrfcsdk/lib' > /etc/ld.so.conf.d/nwrfcsdk.conf
ldconfig -v
ldconfig -p | grep sap
看到有类似上面那些动态链接库的信息就行

4.使用 Go 连接 SAP RFC

package main

import (
    "fmt"
    "gorfc/saprfc"
    "time"
)

// 这是连接的配置
func abapSystem() saprfc.ConnectionParameter {
    return saprfc.ConnectionParameter{
        Dest:      "",
        Client:    "800",
        User:      "HEX",
        Passwd:    "******",
        Lang:      "ZH",
        Ashost:    "127.0.0.1", # 选择你的rfc地址,我这里用了vpn,所以是本机
        Sysnr:     "00",
        Saprouter: "",
    }
}

func main() {
    // 获取一个连接
    c, err := saprfc.ConnectionFromParams(abapSystem())
    if err != nil {
        fmt.Printf("Connection Error: %#v \n", err)
    }
    
    // params: 查询参数。我这里基于时间查询 IN_DATE
    in_date, err := time.Parse("2019-04-15", "2019-04-15")
    params := map[string]interface{}{
        "IN_DATE": in_date,
    }
    
    // 调用 RFC,我这里的 RFC 叫 ZMM_MATNR
    r, err := c.Call("ZMM_MATNR", params)
    if err != nil {
        fmt.Printf("Call Error: %#v \n", err)
    }
    
    // 输出返回值,我这里是一个字典类型的数据。
    fmt.Printf("Response: %#v \n", r)

    // 关闭连接
    c.Close()
}

5.可能出现的问题

  • go build sap/saprfc: invalid flag in #cgo CFLAGS: -minline-all-stringops
  • 解决方案: go 版本切换为 go1.9.2

It's done!👻


参考文章:
Show Comments

Get the latest posts delivered right to your inbox.