在一個窗體中調用另一個窗體的數據

            在做機房收費系統時我們經常會遇到一個數據或是某個功能,可能多個窗體中都要用到,應對這個問題我們最先想到的方法,就是先在模塊中聲明一個變量或是自己定義一個函數或是過程。這就好像在生活中有些東西是公用的有些東西是私用的,在模塊中所聲明的函數過程以及變量就都是公用的,在我們工程中的成員也就是窗體都可以拿過來用。比如相信大家在做機房時都在模塊中聲明瞭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>

問題總算解決。

總結:

通過這次遇到的問題我瞭解到,我們在做事情時不要認死理,要學會變通,用多種方法解決問題,要知道,方法總比困難多!


發佈了28 篇原創文章 · 獲贊 6 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章