现在的位置: 首页 > 综合 > 正文

在一个窗体中调用另一个窗体的数据

2017年08月06日 ⁄ 综合 ⁄ 共 2633字 ⁄ 字号 评论关闭

            在做机房收费系统时我们经常会遇到一个数据或是某个功能,可能多个窗体中都要用到,应对这个问题我们最先想到的方法,就是先在模块中声明一个变量或是自己定义一个函数或是过程。这就好像在生活中有些东西是公用的有些东西是私用的,在模块中所声明的函数过程以及变量就都是公用的,在我们工程中的成员也就是窗体都可以拿过来用。比如相信大家在做机房时都在模块中声明了UserName这个变量因为它在登录和修改密码时都要用到。

再比如我们在敲机房收费系统时几乎每个窗体都用到这么几行代码

    Dim txtSQL As String
    Dim MsgText As String
    Dim mrc As ADODB.Recordset
    
    txtSQL = "select * from 某张表 where 字段 = '" & 内容 & "'"
    Set mrc = ExecuteSQL(txtSQL, MsgText)

就是说每个窗体都调用了ExecuteSQL( ),这个函数,如下代码

Public Function ExecuteSQL(ByVal SQL As String, MsgString As String) As ADODB.Recordset
    Dim cnn  As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim sTokens() As String

    On Error GoTo ExecuteSQL_Error

    sTokens = Split(SQL)
    Set cnn = New ADODB.Connection
    cnn.Open ConnectString

    If InStr("INSERT,DELETE,UPDATE", UCase$(sTokens(0))) Then '非Select语句
        cnn.Execute SQL '数据量不大时,可以在连接上,直接执行SQL语句
        MsgString = sTokens(0) & " query successful"
    Else '虽然MsgString 不是返回值,但传递方式是ByRef,实参地址和这个地址相同
        Set rst = New ADODB.Recordset
        rst.Open Trim$(SQL), cnn, adOpenKeyset, adLockOptimistic 'select 语句
        '得到临时表,游标指向第一条记录
        'get recordCount
        Set ExecuteSQL = rst
        MsgString = "查询到" & rst.RecordCount & _
                    " 条记录"
    End If

ExecuteSQL_Exit:
    Set rst = Nothing
    Set cnn = Nothing
    Exit Function

ExecuteSQL_Error:
    MsgString = "查询错误:" & _
        Err.Description<pre name="code" class="vb">txtCardno.Text = Trim(frmCMainteSBasic.MSHFlexGrid1.TextMatrix(frmCMainteSBasic.MSHFlexGrid1.Row, 0))
    txtSQL = "SELECT * From Student_Info where cardno='" & Trim(txtCardno.Text) & "'"

Resume ExecuteSQL_ExitEnd Function


在敲学生时就遇到了这个函数但是以前就直接照原代码敲也没有去想这个函数是什么意思,但是在敲机房时我想第二次遇见就不能这么稀里糊涂过去了,查查它是什么意思吧。于是我直接将ExecuteSQL(
)输入到了百度的搜索框里。结果出来的出来的是ExecuteSQL函
数的介绍,这个函数可以直接执行SQL语句获取FileMaker中的数据,我想这应该不是我要找的内容,其实这就是我们自己敲代码时定义的一个函数。这个函数的功能就是存储SQL语句类似存储过程,返回SQL记录。后来我就又查了一下什么是存储过程并通过度娘了解到:

存储过程是一组予编译的SQL语句
    它的优点:1.允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次。
            2.允许更快执行,如果某操作需要执行大量SQL语句或重复执行,存储过程比SQL语句执行的要快。
             3.减少网络流量,例如一个需要数百行的SQL代码的操作有一条执行语句完成,不需要在网络中发送数百行代码。
        4.更好的安全机制,对于没有权限执行存储过程的用户,也可授权他们执行存储过程。

其实存储过程就是可以用来执行多次的SQL语句。其实图也可以理解成我们自己定义编写的函数,知道了split()是切割字段函数……后来又查了其中的Instr()函数解释如下

返回子串在整个字符串中第一次出现的位置
InStr(4, "abcabca", "c")返回6,可以这样理解,从第4个字符开始查找"c",找到之后返回它的位置,对于整个 "abcabca"来说,第一个"c"被忽略,因为是从第四个字符开始,找到"c"后发现它在整个字符串的第六位,所以返回6

后来总算明白点儿代码中利用游标指向记录,rst就是SQL中连接上的语句,付给了executeSQL,具体每句的意思还是不懂~~(相信以后我一定会把每一句都弄懂的)

说到这里好像有点儿跑远了,说回正题,我在敲机房中的学生基本信息维护窗体时,选择好要修改的学生信息,点击修改按钮并出现修改学生信息窗体,并且要修改的学生信息显示在这个窗体相对应的文本框中。本来我想先在模块中声明一个卡号变量,先将MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 0)中的值付给CardNo。可是不知道为什么就是其中的值就是付不过去,显示数据库连接不上我只能选择了另一种方法。直接将代码写成所需要使用的窗体.控件.属性,代码如下

<span style="font-family:Microsoft YaHei;font-size:18px;">txtCardno.Text = Trim(frmCMainteSBasic.MSHFlexGrid1.TextMatrix(frmCMainteSBasic.MSHFlexGrid1.Row, 0))
txtSQL = "SELECT * From Student_Info where cardno='" & Trim(txtCardno.Text) & "'"</span>

问题总算解决。

总结:

通过这次遇到的问题我了解到,我们在做事情时不要认死理,要学会变通,用多种方法解决问题,要知道,方法总比困难多!

抱歉!评论已关闭.