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();
}
}
}
日志文件:
公司要求信息化人员统计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();
}
}
}
日志文件:
相关文章推荐
- 如何做页面自动刷新,不用按回车键来提交数据
- Delphi实现网页表单数据的自动提交
- C#三种模拟自动登录和提交POST信息的实现方法
- 如何做页面自动刷新,又不用让用户按回车键来提交数据
- struts里面如何自动提交多行表单数据
- 以实例说明如何使用C#从数据库中提取数据,按要求自动生成定制的Excel表格?[转]
- ASP.NET AJAX客户端编程之旅(三)——让JavaScript和C#无障碍沟通:数据类型自动转换&序列化
- C#网页自动登录和提交POST信息的多种方法
- Delphi实现网页表单数据的自动提交
- shawl.qiu c# .net 自动生成 OleDb 数据操作语句小工具 Producing OleDbSql 1.1
- 页面自动刷新,又不用让用户按回车键来提交数据!
- Delphi实现网页表单数据的自动提交
- Delphi实现网页表单数据的自动提交
- 编程实现网页表单数据的自动提交
- 在C#中使用正则表达式自动匹配并获取所需要的数据
- 以实例说明如何使用C#从数据库中提取数据,按要求自动生成定制的Excel表格
- 页面自动刷新,不用按回车键来提交数据!
- 以实例说明如何使用C#从数据库中提取数据,按要求自动生成定制的Excel表格
- SAP ABAP OLE 输出数据到 Excel 无法自动保存的解决
- C#网页自动登录和提交POST信息的多种方法 [转载]