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

本文介绍了一种ERP系统指标统计方法,通过ABAP程序自动收集Oracle数据库的增长数据,并通过RFC函数将这些数据发送给外围程序。此外,还提供了一个C#示例,展示如何利用SAP NCO库获取这些数据并通过邮件发送给相关人员。
一、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(); 
            }
    }
}


日志文件:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘欣的博客

你将成为第一个打赏博主的人!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值