您的位置:首页 > 编程语言 > C#

C#取SAP-RFC数据发邮件 自动提交BASIS指标(流星程序集之十二)

2014-12-28 09:01 453 查看
一、ERP系统ORACLE数据库增长的收集。

公司要求信息化人员统计ERP系统指标,我也分到几个,都是BASIS相关的。

关于数据库增长的统计,我很早就想做这个,一直没有进展,且DB02不是用的透明表,我的ABAP功力不够,短时间内无法从DB02中取数据库数据。

于是夫,我想了一个简单点的方法:

写一个程序,用NATIVE SQL读取ORACLE的系统管理视图,得到数据库空间大小。 每天晚上运行一次,把统计数据放入自定义表中。



*&---------------------------------------------------------------------*
*& REPORT ZBA_008
*& DB02不准确也无法自动化,取ORACLE表空间使用情况,每天执行一次放到ZORACLEFREE表中
*&---------------------------------------------------------------------*
*& 刘欣
*& 潍柴项目 2014-11-27
*&---------------------------------------------------------------------*

REPORT ZBA_008.
DATA WA LIKE ZORACLEFREE.
DATA ITAB LIKE TABLE OF ZORACLEFREE WITH HEADER LINE.

INITIALIZATION.

START-OF-SELECTION.

EXEC SQL PERFORMING APPEND_ITAB.

SELECT
TOTAL.TABLESPACE_NAME,
ROUND( TOTAL.MB, 0 ) AS TOTAL_MB,
ROUND( TOTAL.MB - ZFREE.MB, 0 ) AS USED_MB,
ROUND( ZFREE.MB, 0 ) AS ZFREE_MB,
ROUND( ( 1 - ZFREE.MB / TOTAL.MB ) * 100, 0 ) AS USED_PCT

INTO :WA-TABLESPACE_NAME, :WA-TOTAL_MB, :WA-USED_MB, :WA-FREE_MB, :WA-USED_PCT

FROM

( SELECT TABLESPACE_NAME, SUM ( BYTES ) / 1024 / 1024 AS MB FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME ) ZFREE,
( SELECT TABLESPACE_NAME, SUM ( BYTES ) / 1024 / 1024 AS MB FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME ) TOTAL

WHERE

ZFREE.TABLESPACE_NAME = TOTAL.TABLESPACE_NAME

ENDEXEC.

END-OF-SELECTION.

*------------------------------------------------
*--------------写日志表--------------------------
*------------------------------------------------
MODIFY ZORACLEFREE FROM TABLE ITAB.

IF SY-SUBRC = 0.
COMMIT WORK.
ENDIF.

FORM APPEND_ITAB.

WA-MANDT = SY-MANDT.
WA-ZDATE = SY-DATUM.
WA-ZTIME = SY-UZEIT.

APPEND WA TO ITAB .
ENDFORM.

后台程序跑起来之前,要自己建一张表,用来存放数据库增长的数据。

二、RFC 函数:

在SAP端,需要一个REMOTE CALL FUNCTION,读取表中的数据,发回给外围程序。

FUNCTION ZBA_IF_FM005.
*"----------------------------------------------------------------------
*"*"本地接口:
*" TABLES
*" GT_RETURN STRUCTURE BAPIRETURN
*"----------------------------------------------------------------------

*DATA GT_RETURN LIKE TABLE OF BAPIRETURN1 WITH HEADER LINE.

DATA USED_MB LIKE ZORACLEFREE-USED_MB.

DATA GD_ENDDAY LIKE SY-DATUM.
DATA GD_FRONTDAY LIKE SY-DATUM.

DATA GD_ENDWEEK LIKE SY-DATUM.
DATA GD_FRONTWEEK LIKE SY-DATUM.
DATA GD_WEEK LIKE SCAL-WEEK.

DATA GD_TEMP LIKE SY-DATUM.

DATA GD_FRONT_C(12) TYPE C.
DATA GD_END_C(12) TYPE C.
DATA GD_MB_C(8) TYPE C.
DATA GD_MONTH_C(2) TYPE C.

GT_RETURN-MESSAGE = '每日数据库增长:'.
APPEND GT_RETURN.

DO 14 TIMES.

GD_ENDDAY = SY-DATUM - SY-INDEX.
GD_FRONTDAY = SY-DATUM - 1 - SY-INDEX.

CALL FUNCTION 'ZBA_IF_FM004'
EXPORTING
GD_ENDDAY = GD_ENDDAY
GD_FRONTDAY = GD_FRONTDAY
IMPORTING
USED_MB = USED_MB .

GD_MB_C = USED_MB / 1000.
WRITE GD_ENDDAY DD/MM/YYYY TO GD_END_C.

CONCATENATE GD_END_C GD_MB_C ' GB' INTO GT_RETURN-MESSAGE.

APPEND GT_RETURN.

ENDDO.

GT_RETURN-MESSAGE = ' '.
APPEND GT_RETURN.

GT_RETURN-MESSAGE = '每周数据库增长:'.
APPEND GT_RETURN.

DO 4 TIMES.

GD_TEMP = SY-DATUM - ( 7 * SY-INDEX ).

DATA WEEK LIKE SCAL-WEEK.

CALL FUNCTION 'DATE_GET_WEEK'
EXPORTING
DATE = GD_TEMP "输入日期,如:‘20110402’
IMPORTING
WEEK = WEEK. "返回输入日期为该年第几周。如:‘201113’。表示为2011年的第13周。

CALL FUNCTION 'WEEK_GET_FIRST_DAY'
EXPORTING
WEEK = WEEK "表示2011年的第13周
IMPORTING
DATE = GD_FRONTDAY. "返回的DATE值为20110328,既2011年第13周的第一天是3月28日。

GD_ENDDAY = GD_FRONTDAY + 5 .

CALL FUNCTION 'ZBA_IF_FM004'
EXPORTING
GD_ENDDAY = GD_ENDDAY
GD_FRONTDAY = GD_FRONTDAY
IMPORTING
USED_MB = USED_MB.

GD_MB_C = USED_MB / 1000.
WRITE GD_ENDDAY DD/MM/YYYY TO GD_END_C.
WRITE GD_FRONTDAY DD/MM/YYYY TO GD_FRONT_C.

CONCATENATE GD_FRONT_C '---' GD_END_C GD_MB_C ' GB' INTO GT_RETURN-MESSAGE .
APPEND GT_RETURN.

ENDDO.

GT_RETURN-MESSAGE = ' '.
APPEND GT_RETURN.
GT_RETURN-MESSAGE = '每月数据库增长:'.
APPEND GT_RETURN.

DO 4 TIMES.

DATA MONTH_FIRST_DAY LIKE SY-DATUM.
DATA MONTH_END_DAY LIKE SY-DATUM.
DATA MONTH_MM TYPE I .

DATA DATE_MM TYPE I . "得到一个负数

DATE_MM = '-' && SY-INDEX. "得到一个负数

* 求上月最后一天
CALL FUNCTION 'FIMA_DATE_CREATE'
EXPORTING
I_DATE = SY-DATUM
I_MONTHS = DATE_MM
I_SET_LAST_DAY_OF_MONTH = 'X'
IMPORTING
E_DATE = MONTH_END_DAY.

* 求上月第一天
CONCATENATE MONTH_END_DAY+0(6) '01' INTO MONTH_FIRST_DAY.

CALL FUNCTION 'ZBA_IF_FM004'
EXPORTING
GD_ENDDAY = MONTH_END_DAY
GD_FRONTDAY = MONTH_FIRST_DAY
IMPORTING
USED_MB = USED_MB.

GD_MB_C = USED_MB / 1000.
GD_MONTH_C = SY-DATUM+4(2) + DATE_MM .

CONCATENATE '2014年' GD_MONTH_C '月' GD_MB_C ' GB' INTO GT_RETURN-MESSAGE .
APPEND GT_RETURN.

ENDDO.

DATA TMP TYPE I.
DATA INPUT_1(4) TYPE C.
DATA GD_Y_C(10) TYPE C.

DATA YESTERDAY LIKE SY-DATUM.

YESTERDAY = SY-DATUM - 1.

WRITE YESTERDAY DD/MM/YYYY TO GD_Y_C.

SELECT COUNT(*) INTO TMP FROM ZUSERLOGONDAY WHERE TRDAT = YESTERDAY.

INPUT_1 = TMP.

GT_RETURN-MESSAGE = ' '.
APPEND GT_RETURN.

CONCATENATE GD_Y_C ' ERP系统登陆人数:' INPUT_1 INTO GT_RETURN-MESSAGE .
APPEND GT_RETURN.

GT_RETURN-MESSAGE = ' '.
APPEND GT_RETURN.

CONCATENATE GD_Y_C ' ERP系统运行异常次数:0' INTO GT_RETURN-MESSAGE .
APPEND GT_RETURN.

*
*
* LOOP AT GT_RETURN.
*
* WRITE / GT_RETURN-MESSAGE.
*
* ENDLOOP.

ENDFUNCTION.

函数输出我们统计的指标数据,一大串文本(在ABAP中用大文本一定要用内表,不然很会很悲催):



这个RFC函数还调用了一个内部函数,一并奉上:

FUNCTION ZBA_IF_FM004.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" REFERENCE(GD_FRONTDAY) LIKE SY-DATUM
*" REFERENCE(GD_ENDDAY) LIKE SY-DATUM
*" EXPORTING
*" REFERENCE(USED_MB) LIKE ZORACLEFREE-USED_MB
*"----------------------------------------------------------------------

DATA GS_LINE TYPE ZORACLEFREE.
DATA GD_END LIKE ZORACLEFREE-USED_MB.
DATA GD_FRONT LIKE ZORACLEFREE-USED_MB.
*-----------------取数据库增长表某一天的数据----------------

SELECT SINGLE *
INTO GS_LINE
FROM ZORACLEFREE AS A
WHERE A~TABLESPACE_NAME = 'PSAPSR3' AND ZDATE = GD_ENDDAY.
GD_END = GS_LINE-USED_MB.

SELECT SINGLE *
INTO GS_LINE
FROM ZORACLEFREE AS A
WHERE A~TABLESPACE_NAME = 'PSAPSR3' AND ZDATE = GD_FRONTDAY.

GD_FRONT = GS_LINE-USED_MB.
USED_MB = GD_END - GD_FRONT.

ENDFUNCTION.

三、C#用NCO库到SAP系统取RFC数据,然后发邮件给收集指标的人员邮箱。
C# 非常好用,比起原来的VC来,实现一个功能只需要简短的代码就可以搞定。
从远古走来,C为第一语言的我感到还没有白费,用得很开心。

SAP 同外围程序连接,有2种方式,CLIENT和SERVER,这里,我只需轻量级的CLIENT方式就可以了。
这次潍柴(重庆)汽车项目中,SERVER方式的应用我也深有体会,空了再来总结一篇,说到说到。

在MS VS2010中使用SAP NCO 3 准备工作如下:

环境:VS2010 WIN7 NCO3.0
1. 新建一个C#窗体应用程序,【引用】中放入NCO3 X86版本的3个DLL库:sapnco_utils.dll,sapnco.dll,rscp4n.dll。
2. 还有一个配置文件app.config.拖入【解决方案资源管理器】的项目名称中。
3. Form1.cs文件中加入NCO的头文件using SAP.Middleware.Connector.

4. .net发邮件的库需要应用4个文件:
using System.Net.Mail;
using System.Net.Mime;
using System.Net;
using System.IO;

5. 右击项目名称【T1】,点击“属性”,打开属性面板:将目标框架里默认的.NET Framework 4 Client Profile 改为:.NET Framework



程序第一步到RFC函数取数据,第二步发送邮件,第三步保存一下日志。C#代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

using SAP.Middleware.Connector;

using System.Net.Mail;
using System.Net.Mime;
using System.Net;
using System.IO;

namespace t1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
go();
}

private void timer1_Tick(object sender, EventArgs e)
{

string s = System.DateTime.Now.ToShortTimeString(); //得到现在的时间
if (s.Equals("9:00") )
{
go();
Thread.Sleep(1000*60);
}
}

private void label1_Click(object sender, EventArgs e)
{
string s = System.DateTime.Now.ToShortTimeString(); //得到现在的时间

MessageBox.Show(s);
}

private void go()

{

string who = "liuxin01";

if (textBox1.Text.Length > 0)
who = textBox1.Text;

//提供必要的登录参数和获得RfcDestination对象对应到SAP系统中,你要调用的fm。
RfcDestination SapRfcDestination = RfcDestinationManager.GetDestination("PRD");

//使用RfcDestination对象的repository属性创建一个IRfcFunction对象为fm提供调用
RfcRepository SapRfcRepository = SapRfcDestination.Repository;

IRfcFunction BapiGetTable = SapRfcRepository.CreateFunction("ZBA_IF_FM005");

//BapiGetTable.SetParameterActive(0, true);

BapiGetTable.Invoke(SapRfcDestination);
IRfcTable ztable = BapiGetTable.GetTable("GT_RETURN");

string tmp = "";

// 遍历返回列表,填充控件
for (int i = 0; i < ztable.RowCount; i++)
{
ztable.CurrentIndex = i;
tmp = tmp + ztable.GetString("MESSAGE") + "\r\n";

}

// MessageBox.Show(tmp);
//确定smtp服务器地址。实例化一个Smtp客户端
System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient("mail.weichaimotor.com");
//生成一个发送地址

//构造一个发件人地址对象
MailAddress from = new MailAddress("liuxin01@weichaimotor.com", "刘欣", Encoding.UTF8);
//构造一个收件人地址对象
MailAddress to = new MailAddress( who + "@weichaimotor.com", "刘欣", Encoding.UTF8);

//构造一个Email的Message对象
MailMessage message = new MailMessage(from, to);

//添加邮件主题和内容
message.Subject = "ERP系统每日指标统计 刘欣";
message.SubjectEncoding = Encoding.UTF8;
message.Body = tmp; //"邮件内容";
message.BodyEncoding = Encoding.UTF8;

//设置邮件的信息
client.DeliveryMethod = SmtpDeliveryMethod.Network;
message.BodyEncoding = System.Text.Encoding.UTF8;
message.IsBodyHtml = false;
client.EnableSsl = false;

//设置用户名和密码
client.UseDefaultCredentials = false;
string username = "liuxin01";
string passwd = "********";

//用户登陆信息
NetworkCredential myCredentials = new NetworkCredential(username, passwd);
client.Credentials = myCredentials;
//发送邮件
client.Send(message);
//提示发送成功
// MessageBox.Show("发送成功!");

//日志处理
StreamWriter sw = new StreamWriter("maillog.txt", true);
sw.WriteLine(" ");
sw.WriteLine("--------------------------------");
sw.WriteLine("发送时间:" + DateTime.Now);
sw.WriteLine("收件人:" + who + "@weichaimotor.com");
sw.WriteLine("--------------------------------");

sw.Write(tmp);
sw.Close();
}
}
}

日志文件:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: