VFP+Excel+SQLServer实例讲解(转)

VFP+Excel+SQLServer实例讲解  作者:红虎   来源:VFP精英站  
 
 

前言:

    说到这个实例,不知道各位读者有没有什么感想。微软公司的办公软件Office中的Excel和Word是大家都非常熟悉的办公应用软件,尤其是Excel这个软件在企业中的应用更为广泛及频繁。
至少我看到公司的很多同事用电脑主要都是用Excel来做一些报表之类的,凡是遇到有表格的,都会考虑用Excel,即使没有表格的也会用Excel,因为真正会熟练用Word的并不很多。而且对电脑操作不是很熟悉的人来讲,掌握Word的排版比在Excel中来的麻烦!在Word中我们可以用标尺来进行文字的定位,那些人宁可用空格在Excel的单元格中不停的用补空格的方法来“排”出他们满意的布局来...
感觉好像有点罗嗦哦,Excel的确是个好东东,尤其他能被我们进行二次开发。用他做一个简单的进销存、财务软件并不是有太大的难度。这些技巧性之类的东西,大家可以去看看他的帮助文件,以及他所带的示例文件,非常的不错!微软的这点我是非常看好的,似乎没有比微软公司做的更好的帮助系统、技术支持,MSDN就是一个典型的例子...好像又扯远了...:)

为什么要讲该课题:
发表一些东西,总得需要点理由。也许有人会说,没有必要用Excel去做个什么系统,他们所用的开发语言已经够不错的了。那么我需要说明的是:在此,我只是介绍一个例子,来表明我可以这么做,并不是说一定要这么做!
不管我们的软件多么完善,而且作为象我目前在一个企业中做软件开发,也不太可能将一个软件做的很完善。一方面,工作需求并没有这么要求;另一方面,也没这个必要嘛,没有人在跟你争!有能力做的东西并不是一定要做出来才表明自己的能力,尤其在做一些极为简单的报表或查询、统计上。如果是一个极为复杂一般人觉得难以电脑自动做到的东西(我不知道连身份证号码只能输入17位算不算是电脑做不到),那也许还有点挑战性的去研究一下吧。
就算如此,很多用户的要求也是需要你的程序能够导出到Excel进行“二次编辑”,那么我们也能作到,但是容易嘛?很有可能某位领导的某个要求在你花了大半天的时间搞出来并能得到正确的结果时,他觉得这份报表也许不重要了,于是就不再用了,作为设计这份报表的人应该持怎样的心态呢?!
在写VFP的程序时,也做过较多的由VFP的数据往EXCEL导出的操作,如果要导出一个需要进行格式编排的效果的话,还是那句话,没有做不到的,只有想不到!但为此需要付出较多的代码进行格式编排,所以二个字:累!
不知咋搞的,这次居然这么多废话啊。。。(要是写书还能赚稿费呢!)

本程序的功能很简单:就是输入员工的工号、工资的年月度即从后台的SQL-Server数据库中进行数据查找,然后将找到的数据返回,并在指定的单元格中显示。
员工的基本信息一栏是固定的格式,当然还可以进行扩充显示员工的其他相关信息。工资项目列表一栏的数据是动态数据,包括名称以及合计栏,并且合计栏的数据也是用公式计算的。因为每个人的工资项目是不一定相同的。比如,当应扣税部分的数据全部合计在一起小于基数800元时就不用计算个人所得税,那么就不会显示那栏了!
这些工资的相关数据都是由后台的各个基表进行关联得到的视图由存储过程进行处理得到,作为前台的Excel,其实不管前台在什么环境也好,如果前台用来显示的是一个ListView控件或是一个Grid表格控件,那么将数据套进去还是很简单,不用做任何的计算了(除了那个合计)。
因为后台用SQL-Server,所以可以做到不管在哪个地方,只要能连上互联网,打开Excel文件就能查询到工资数据,岂不爽哉!
本想进行用邮件来接收这份数据的,可是因为MAPI的设置一直没搞定,也就一直没得试!如果那样就更爽了,其基本操作是:不管在何地,用任何软件发送一个电子邮件到一个指定的地址,并指定邮件的内容,在N时间过后就能收到一份数据,显示着所需的内容!这种操作就完全降低了客户端的要求,唯一的要求只要能收发个电子邮件。尽管Excel很多地方都有,但是ADO的版本不一定有啊!

主要技术:
制作本程序需要以下的知识:(再次强调,这里他只是个例子,虽然他在实际工作是开始服役了的!)
Excel的简单操作
这个是当然的,也是最基本的!
对工作薄的锁定,设定密码以防止用户随便修改,该密码可以放权给实际操作员。
对文件的密码,可以防止未授权的人随便打开使用,相当于用户登录界面了,当然这也可以在Excel的界面中制作登录界面,然后调用数据库中的用户名表进行验证!

Excel的高级应用
起码需要会用VBA呀,宏什么的!
以及为了美化界面而隐藏不需要的工具条、菜单等。
至于用不用Office助手只是界面上的一种美化!
工程文件的密码设定,相当于保护源代码!使不能让未授权的人随意修改代码!

ADO的应用
想做数据库就不能不会他了!
在此需要通过ADO来连接SQL-Server数据库,并通过ADO的RecordSet来返回记录集!
在VFP中不管SPT也好、远程视图也好用的再熟练都不能说明能将ADO用的如何!

SQL-Server 数据库的熟练应用
为什么说要熟练应用呢,我发现不少的人只是拿SQL的数据库中的表来用而已!
最起码建几个视图,写上一些存储过程来提高效率嘛!


代码分析:

开始查询按钮

Private Sub cmdSearch_Click()
On Error GoTo ErrorHandler
ShowBallon "正在查找,请稍侯..."
If Assistant.Visible = False Then Assistant.Visible = True
Assistant.Animation = msoAnimationSearching

'清除数据
ClearData

Dim strPerCode As String
Dim intYear As Integer, intMonth As Integer
Dim strSQL As String, strConnectString As String
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim n As Integer
Dim strExp As String

cmdSearch.Enabled = False

strPerCode = Range("C" & StartRow + 1).Value '工号
intYear = Range("C" & StartRow + 2).Value '年
intMonth = Range("C" & StartRow + 3).Value '月
'查询命令
strSQL = "usp_GetPayroll '" & strPerCode & "'," & intYear & "," & intMonth
'连接串
strConnectString = "Driver={SQL Server};Server=redtiger;UID=sa;PWD=;DataBase=hr2000"

cn.Open strConnectString
rs.Open strSQL, cn, 2, 3

n = 0
Do While Not rs.EOF
    Range("G" & StartRow + 1).Value = rs("nYear").Value
    Range("G" & StartRow + 2).Value = rs("nMonth").Value
    Range("G" & StartRow + 3).Value = rs("cDptCode").Value
    Range("G" & StartRow + 4).Value = rs("cDptName").Value
    Range("G" & StartRow + 5).Value = rs("per_code").Value
    Range("G" & StartRow + 6).Value = rs("per_name").Value

'-- 以下需要循环
' 从4行开始循环 30 下(考虑不会超过30个工资项目)
    n = n + 1
    Range("I" & StartRow + n).Value = n
    Range("J" & StartRow + n).Value = rs("cItemName").Value
    Range("K" & StartRow + n).Value = rs("nAmount").Value
    rs.MoveNext
Loop

Assistant.Animation = msoAnimationCheckingSomething

cmdSearch.Enabled = True
If n = 0 Then
    MsgBox "对不起,根据你的条件找不到相关数据,请重新查询!", _
    vbExclamation, "查询结果"
Else
    With Range("J" & StartRow + n + 1)
        .Value = "合 计"
    End With
    With Range("K" & StartRow + n + 1)
        strExp = "K" & StartRow + 1 & ":K" & StartRow + n
        .Value = "=sum(" + strExp + ")"
    End With
End If

ShowBallon "查询完毕,请核对工资项目,如有问题请及时联系管理员!"

Exit Sub

ErrorHandler:
'-- 错误处理
    MsgBox "执行有错:(" & Err.Number & ") " & Err.Description, vbCritical, "执行错误"
    ShowBallon "查询错误!"
End Sub

重新设置按钮

Public Sub cmdReset_Click()
Dim n As Integer

Range("C5").Select
cmdSearch.Enabled = True
ShowBallon "就绪"

'清除数据
ClearData

With Windows.Application
    .Caption = "工资查询子系统"
    .DisplayFormulaBar = False
    .DisplayNoteIndicator = False
    .DisplayCommentIndicator = xlNoIndicator
    .DisplayExcel4Menus = False
    .DisplayScrollBars = False
    .DisplayAlerts = False
    .DisplayFullScreen = False
    .EditDirectlyInCell = True
End With
With Windows.Item(1)
    .DisplayGridlines = False
    .DisplayFormulas = False
    .DisplayHeadings = False
    .DisplayHorizontalScrollBar = False
    .DisplayOutline = False
    .DisplayVerticalScrollBar = False
    .DisplayWorkbookTabs = False
End With

With Toolbars
    For n = 1 To .Count
        .Item(n).Visible = False
    Next
End With

With MenuBars
On Error Resume Next
    .Item("工资工具条").Delete
    .Add "工资工具条"

    For n = 1 To .Count
        .Item(n).Activate
    Next

On Error GoTo ErrorHandler
    With .Item("工资工具条")
        .Menus.Add "工资查询系统 Excel + SQL Server 前后台 版权所有(C) 红虎工作室(honghoo.NET) 1998-2003"
        .Menus(1).Enabled = False
'       .Menus.Add "帮助(&H)"
'       .Menus("我的菜单(&M)").MenuItems.Add "退出(&X)"
'       .Menus("帮助(&H)").MenuItems.Add "关于(&A)..."
        .Activate
    End With
End With

Exit Sub

ErrorHandler:
End Sub

退出系统按钮

Private Sub cmdExit_Click()

ShowBallon "退出工资查询系统..."
If MsgBox("是否要退出工资查询系统?", _
    vbQuestion + vbYesNo, _
    Windows.Application.Caption) = vbYes Then
'-- 退出 Excel
    Windows.Application.Quit
Else
    ShowBallon "欢迎您又回来了..."
End If

End Sub

清除数据的自定义过程

'-- 清除数据
Private Sub ClearData()
Dim n As Integer

'清除员工信息数据
For n = 1 To 6
    Range("G" & StartRow + n).Value = ""
Next

'清除工资项目数据
For n = 1 To 30
    Range("I" & StartRow + n).Value = ""
    Range("J" & StartRow + n).Value = ""
    Range("K" & StartRow + n).Value = ""
Next

End Sub

显示泡泡的自定义过程:

'-- 显示泡泡
Private Sub ShowBallon(strMessage As String)
Range("A2").Value = strMessage
Windows.Application.StatusBar = strMessage
Dim objBal As Balloon
Set objBal = Assistant.NewBalloon
With objBal
    .Heading = "工资查询小助手: " & Now() & Chr(13) & Chr(10)
    .Text = strMessage
    .BalloonType = msoBalloonTypeBullets
    .Mode = msoModeModeless
    .Icon = msoIconAlertInfo
    .Button = msoButtonSetNone
    .Show
End With
End Sub

当打开该文件时,ThisWorkbook 自动执行的代码(即进行“重新刷新”按钮的执行!):

Private Sub Workbook_Open()
Sheet1.cmdReset_Click
End Sub

全局定义:

Const StartRow = 4

存储过程的定义:

usp_GetPayroll

这里简单说明一下,具体代码省略!
工资表由 人事档案表、部门表、工资项目表、工资记录表四个表关联得到的一个视图。
工资项目表中明确了每种工资是属于应扣还是应发,因而又通过自定义函数返回正负号,这些又由存储过程usp_GetPayroll完成,并接受3个参数:工号、年、月,返回一个记录集。
比如图上所示个人所得税在数据库中是正数的,但工资项目中的设定决定了他是需要被减的,因此他的数要乘以-1得到一个负数。

 

总结:

以上便是该程序制作的总体思想,基本上已经说的很明朗了,当然也不太可能说的面面俱到,篇幅、时间、精力都是有限的。只是希望能通过此文给大家一点启发,从而使以后的工作中找到更好的解决方案!

总算也完成了此文的编排工作,不知道这种东西对大家的感觉如何,我也希望能收到一些反馈意见,使下次的工作中做的更好!
 
 

posted on 2007-12-18 15:25  LongSky  阅读(1168)  评论(0编辑  收藏  举报

导航