SAP Process Orchestration 是SAP公司推出的ESB中间件产品,就是本文的PO;
不是采购订单PO,也不是JAVA持久化对象PO。
C#连接SAP HANA数据库(永久保存SAP PO中间件消息之一)
SAP PO 消息监控里消息状态预览的设置(永久保存SAP PO中间件消息之二)
SAP PO 消息报文存储详解(永久保存SAP PO中间件消息之三)
一、C# ODBC 连接HANA读取其中的表:
C#对数据库的操作当然应该是用微软的EF框架,效率超高。
但是德国人的HANA和美国微软的EF框架配套还没有出现,只能先用ODBC:
1、在SAP官网下载HANA的client安装包(其中包含C#开发类库)
HDB_CLIENT_WINDOWS_X86_64_20190112.zip
链接:https://pan.baidu.com/s/1vQ0XOxwBThIidBFuQwys9g
提取码:8p00
安装完成后要重启动WIN10系统,然后ODBC里面才能看到HANA的驱动。
2、在系统ODBC里面,配一个连接出来。
3、打开VS2017,建一个WINFORM桌面程序,全部代码如下:
(注意项目用64位程序编译才能通过)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Odbc;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace forHana
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
try
{
//注意项目用64位编译
OdbcConnection conn = new OdbcConnection("DSN=POD;UID=;PWD=;DatabaseName=POD");
conn.Open();
listBox1.Items.Add($"当前HANA数据库状态{conn.State}");
listBox1.Items.Add($"当前连接的HANA数据库服务器的版本{conn.ServerVersion}");
OdbcCommand selectCmd = new OdbcCommand("SELECT * FROM BC_MSG_LOG", conn);
var adapter = new OdbcDataAdapter(selectCmd);
DataTable dt = new DataTable();
adapter.Fill(dt);
listBox1.Items.Add("表行数:"+dt.Rows.Count.ToString());
conn.Close();
dataGridView1.Columns.Add("RowState", "rowstate");//添加新列
foreach (DataColumn col in dt.Columns)
{
dataGridView1.Columns.Add(col.ColumnName, col.ColumnName);
}
dataGridView1.Rows.Clear();
dataGridView1.Rows.Add(dt.Rows.Count);//增加同等数量的行数
int i = 0;
foreach (DataRow row in dt.Rows)//逐个读取单元格的内容;
{
DataGridViewRow r1 = dataGridView1.Rows[i];
r1.Cells[0].Value = row.RowState.ToString();
for (int j = 0; j < dt.Columns.Count; j++)
{
r1.Cells[j + 1].Value = row[j].ToString();
}
i++;
}
}
catch (Exception e)
{
listBox1.Items.Add(e.Message);
}
}
}
}
我们到HANA数据库里读取BC_MSG_LOG表的数据,并显示出来:
HANA中的表和C#环境连接上了,我们可以对这张表出各种维度的指标统计,包括识别错误消息后的告警。
二、PO中接口运行日志存放于BC_MSG_LOG表:
Process Orchestration 使用的SAP HANA数据库,
平台上数据交换日志都写到BC_MSG_LOG这张表里,
注意要用SAPJAVA1用户登入数据库才能找到这张表:
PO的管理界面提供的功能很弱,无法基于这张表的数据做多维度的统计和展示。
如果我们想做一些指标的展示,例如下面,我们需要在HANA数据库中自己读出这张表的数据。
三、 BC_MSG_LOG_STAT表,记录 PO中消息的对错状态,可以用来监控平台接口运行:
四、2020.5.7补充:
上面PO的两张表PO系统会定期清理,并不好用。其实PO中有一张日志的视图 BC_MSG_LOG_VIEW,里面有日志也有错误消息,很好;不过这个取数设计需要每个小时把这些数据读取出来放到自己的数据库里。
所以需要自己的程序每小时工作,读PO日志数据:
注意这个关键的SQL每小时执行一次,把当前这一个小时的数据取走,日期时间也从UTC时间纠正为本地时间。
"select
MSG_ID,
LOG_LOCATION,
TO_SERVICE_NAME,
FROM_SERVICE_NAME,
ACTION_NAME,
MSG_PROTOCOL,
MSG_TYPE,
UTCTOLOCAL(LOG_TIME),
BYTES_LENGTH,
STATUS,
ERROR_CODE
from BC_MSG_LOG_VIEW
where HOUR(UTCTOLOCAL(LOG_TIME)) = "+ NowDT.Hour.ToString() + "
and to_date(UTCTOLOCAL(LOG_TIME)) = '" + NowDT.Date.ToString("yyyy-MM-dd") + "'"
一小时执行一次的函数实现全部代码:
//这个功能每个小时从PO服务器取消息日志数据
void EveryHourReadLog(DateTime NowDT)
{
OdbcConnection conn = new OdbcConnection("DSN=HAN;UID=SAPJAVA1;PWD=密码;DatabaseName=POP");
conn.Open();
//很好的代码,按小时取出PO的消息表
OdbcCommand selectCmd = new OdbcCommand("select MSG_ID,LOG_LOCATION,TO_SERVICE_NAME,FROM_SERVICE_NAME,ACTION_NAME,MSG_PROTOCOL,MSG_TYPE,UTCTOLOCAL(LOG_TIME),BYTES_LENGTH,STATUS,ERROR_CODE from BC_MSG_LOG_VIEW where HOUR(UTCTOLOCAL(LOG_TIME)) = "+ NowDT.Hour.ToString() + " and to_date(UTCTOLOCAL(LOG_TIME)) = '" + NowDT.Date.ToString("yyyy-MM-dd") + "'", conn);
var adapter = new OdbcDataAdapter(selectCmd);
DataTable dt = new DataTable();
adapter.Fill(dt);
ps(listBox1, "每小时从PO数据库读日志存放本地数据库: "+ NowDT.ToString("G") + " 条数:" + dt.Rows.Count.ToString());
PDAEntities db_sql = new PDAEntities();
foreach (DataRow row in dt.Rows)//逐个读取单元格的内容;
{
PO_MSG_LOG one = new PO_MSG_LOG();
one.MSG_ID = row[0].ToString();
one.LOG_LOCATION = row[1].ToString();
one.TO_SERVICE_NAME = row[2].ToString();
one.FROM_SERVICE_NAME = row[3].ToString();
one.ACTION_NAME = row[4].ToString();
one.MSG_PROTOCOL = row[5].ToString();
one.MSG_TYPE = row[6].ToString();
one.LOG_TIME = tt(row[7]);
one.BYTES_LENGTH = ii(row[8]);
one.STATUS = row[9].ToString();
one.ERROR_CODE = row[10].ToString();
db_sql.PO_MSG_LOG.Add(one);
}
db_sql.SaveChanges();
conn.Close();
}