用VB实现班主任工作的电子化

来源:岁月联盟 作者:佚名 时间:2010-08-30

摘要:本文探讨了如何利用VB,读取数据库中的数据,通过Microsoft  MAPI  Controls 6.0控件,利用Outlook Express,从而实现成绩通知单以E-mail的形式自动寄发。

关键字:VB,E-mail, MAPI,自动寄发

一、问题提出
每期期未,寄发学生成绩通知单都是班主任的例行工作,然而,现在大多数人仍然还采用原始的平信寄发方式,并且由于平信很容易丢失而导致以前所做的工作(如抄录学生期末成绩、写出学生的学期鉴定,填写学生成绩通知单和写、写信封、寄发通知书等)前功尽弃,同时由于许多学生放假后并没有回家,如外去打工或因种种原因没有回家而无法收到信件。随着INTERNET技术的不断普及,邮件已经开始进入寻常百姓家,它以快速、方便、可以异地查阅而逐渐代替普通的信件,如果你的学生(或家长)都有E-mail,我们以E-mail来寄发学生的成绩通知单了,这样就可以减少上述弊端。但一个个填写每个学生的收件人地址和相关的数据(如各门功课的成绩、评语),既枯燥又烦锁,下面我们将探讨如何利用VB来读取学生成绩数据库中的数据,通过E-mail实现学生成绩通知单的自动寄发。
二、工作原理
学生成绩通知单各学校虽然有所不同,但大都大同小异,通常包括:学生各学科的成绩,操行分,班主任评语等内容(如上图)。如果这些内容都在数据库中,我们可以通过VB访问数据库来读取数据库中用户的E-mail地址、成绩及评语,再通过VB的Microsoft  MAPI  Controls 6.0控件中的MAPI Session和MAPI Messages两个控件进行电子邮件的管理,利用OutlookExpress。就能实现同时给班上所有学生用E-mail的自动发送通知书了。但由于各个学校成绩科目及多少不同,因此数据库中字段数就会不同,为使程序具有通用性,因此,在设计时我们使用了自动读取数据表中的字段个数和字段名,并自动在窗体上自动生成相对应的文本框和标签。
三、程序设计
1、      启动VB后,新建一个标准的EXE工程
2、      在“工具”菜单中选“部件”,在“控件”选项卡中选“Microsoft  MAPI  Controls 6.0”,在控件工具箱中将邮件控件MAPIMessages和MAPISession两个控件添加到窗体中。
2、添加两个命令按钮,将其CAPTION属性设计为“全部发送”和“退出”。
3、添加一个数据控件(Data1),并设置“Connect”、“DataBaseName”和“RecordSource”对应的属性。
上述三个控件最好放在窗体的下方。
4.编写源程序代码:将下面的代码添加到代码窗口中

Dim txtobject(20), lblObject(20)
Dim SendToText As String
Const M_Subject = "成绩通知单"

Private Sub Command2_Click()
Unload Me
End Sub
'定义一个用来回复(发送邮件)的函数
Public Function StarSend(T1, T2, T3)
        MAPIMessages1.MsgIndex = -1
        MAPIMessages1.RecipDisplayName = T1
        MAPIMessages1.MsgSubject = T2
        MAPIMessages1.MsgNoteText = T3
        MAPIMessages1.SessionID = MAPISession1.SessionID
        'MAPIMessages1.AttachmentPathName = "e:/My Documents/注意事项.htm"  ' 确定要发送的电子邮件的附件
        MAPIMessages1.Send
End Function

Private Sub Command1_Click()
Data1.Recordset.MoveFirst
MAPISession1.SignOn
Do While Data1.Recordset.EOF = False
  Sum = Sum + 1
  ' SendToText指的是发送邮件的内容(邮件正文)
  SendToText = txtobject(1).Text + "同学" + Chr(13) + Chr(10) + "你好!" + Chr(13) + Chr(10)
  SendToText = SendToText + "现将你的成绩通知你,希望你在假期注意复习功课!" + Chr(13) + Chr(10)
  '下面将自动获得各学科的名称和成绩
    For i = 3 To Data1.Recordset.RecordCount
        SendToText = SendToText + lblObject(i).Caption + ":" + txtobject(i).Text + "分" + Chr(13) + Chr(10)
    Next
  SendToText = SendToText + "  班主任: 刘友生 " + Chr(13) + Chr(10)
  SendToText = SendToText + "湖南省衡阳贸易学校" + Chr(13) + Chr(10)
  SendToText = SendToText + "发信日期:" + Data$ + "  发信时间:" + Time$
  GetTxtName   ’调用函数
  Call StarSend(txtobject(2).Text, M_Subject, SendToText)
  Data1.Recordset.MoveNext
  If Data1.Recordset.EOF = True Then
      MsgBox Str(Sum) + "个人员的成绩通知单已经发送完毕!", , " 发 送 邮 件"
      End
  End If
Loop
End Sub
Private Sub GetFieldNum()
Data1.Recordset.MoveFirst
'自动获得数据表中字段数并在窗体中自动生成相应文本框和标签
For i = 1 To Data1.Recordset.Fields.Count
    b$ = "Text_" + LTrim(Str(i))
    b1$ = "Label_" + Trim(Str(i)
    Set txtobject(i) = Form1.Controls.Add("VB.TextBox", b$)
    Set lblObject(i) = Form1.Controls.Add("VB.Label", b1$)
’下面是用来确定标签和文本框中窗体中的位置  
       txtobject(i).Visible = True
    lblObject(i).Visible = True
    txtobject(i).Width = 2000
    lblObject(i).Width = 1200
    txtobject(i).Height = 350
    lblObject(i).Height = 350
    If i Mod 2 = 0 Then
        txtobject(i).Left = 4200
        lblObject(i).Left = 3400
    Else
        txtobject(i).Left = 1200
        lblObject(i).Left = 200
    End If
    If i > 1 Then
        txtobject(i).Top = txtobject(i - 1).Top + 400
        lblObject(i).Top = txtobject(i - 1).Top + 400
    Else
        txtobject(i).Top = 300
        lblObject(i).Top = 300
    End If
    If i Mod 2 = 0 Then
    txtobject(i).Top = txtobject(i - 1).Top
    lblObject(i).Top = txtobject(i - 1).Top
    End If
Next
txtobject(i - 1).Width = Form1.Width - 1500
If i Mod 2 = 1 Then
lblObject(i - 1).Left = 200
lblObject(i - 1).Top = lblObject(i - 1).Top + 400
txtobject(i - 1).Left = 1200
txtobject(i - 1).Top = txtobject(i - 1).Top + 400
End If
End Sub

Public Function GetLabelName()
For i = 1 To Data1.Recordset.Fields.Count
  txtobject(i).Text = Data1.Recordset.Fields(i - 1)
  lblObject(i).Caption = Data1.Recordset.Fields(i - 1).SourceField
Next
End Function

Public Function GetTxtName()
For i = 1 To Data1.Recordset.Fields.Count
  txtobject(i).Text = Data1.Recordset.Fields(i - 1)
Next
End Function

Private Sub Form_Activate()
Data1.Recordset.MoveFirst
GetFieldNum
GetLabelName
End Sub
四、几点说明
1、      本程序在WIN98、IE5.0、拨号上网下调 试通过。
2、      本程序具有许多自动功能,自动读取数据库中对应的字段,自动生成文本框、自动生成标签。程序实现了电子邮件的自动群发功能,与某些网站的群发不同,它又相对独立,因为每一个收信的对象并不知道发了多少封E-mail。如果将此功能扩充,可以应用到许多领域或部门,完全脱离一些网站为防止垃圾邮件的限制条件。
3、      与数据库中字段个数的多少无关,使程序的通用性增强。
4、      真正做到了班主任工作电子化(无纸化)管理。
5、      程序的功能还有待进一步完善和扩充。

 

 



1. 刘友生.VB实现Email的自动回复.北京.机世界报,2002.08.第29期
2.谭浩强,薛淑斌,袁玫编著.Visual BASIC程序设计.北京:清华大学出版社,2001.1
3. 刘友生.活用文本框.哈尔滨大学:电脑学习,2002.10

图片内容