小白是这样打造图书管理系统的(三)

行百里者半九十,界面设计及程序实现~

在前文书中,我们介绍了一些前期需要准备的环境及数据结构。

前文回顾:


手中有粮,心中不慌,我们有了数据库测试数据,接下来就可以稳扎稳打继续下一步的内容啦!

我们说实现程序设计和操作,实际上就是实现对这些数据具体操作的体现。

比如,来了一本新书《网管小贾谈如何成为时间管理大师》。

既然来了,那我们就把它录入到系统中吧,这时系统中就多了一条记录。

还有,有一位小伙伴对《智取天狼星计划》这本小说非常感兴趣,一口气就借了五本。

这时由于读者借阅动作,于是就触发了图书状态(被借阅)的变化。


但是,书被借走了,问题也来了,我们在操作这些数据的时候,如果在客户端工具上直接动手操作SQL语句,那么我可以把手按在圣经上保证,你不是被烦死的,就是被累死的。

有这么可怕喵?

好了,道理大家都懂,那么要怎么解救劳苦大众于水深火热之中呢?

答案很简单哈,我们需要通过一些简便易用的操作界面,给它赋予相应的操作数据的功能,来代替繁冗复杂的数据库后台操作。

这个时候估计会有小伙伴举起了小手,没错,那就是传说中的人与数据交互的应用程序界面了。


第三弹:程序界面设计

使用基于程序界面组件的VB构建界面是非常简单的事。

根据主要实现 CRUD (增删改查)的功能,可以分别设计各自的界面。

以下简单给出我设计的参考样图,不要嫌丑哦,我相信你的艺术欣赏水平一定比我高那么一点点,肯定能设计出更美的界面。


人要脸,树要皮,我的程序封面也差不离。


图书信息管理界面,以查询表格为主,添加删除等为辅。


图书借阅操作界面,主要用于处理借阅及归还流程操作。


图书借阅记录界面,方便查询、或进一步处理借阅状态数据。


第四弹:程序代码实现

终于来到了我们的重点实验区。

要说界面设计,我们可能天生艺术细胞稀缺,后天有机会再补也行,但功能实现是最最主要要解决的问题,就必须要真正的做好它。


一、前期环境配置

在VB开发环境中,我们需要添加一些 引用部件


首先是引用,依次点击菜单 工程(P) > 引用(N)...

需要使用到 Microsoft ActiveX Data Objects 2.5 LibraryMicrosoft Data Formatting Object Library 6.0 (SP6)

前者是用来连接 SQL Server 数据库的,后者是用来格式化数据的。


其次是部件,依次点击菜单 工程(P) > 部件(O)...

分别需要用到对话框、数据表格、选项卡等组件。


二、部分代码实现

我们以图书信息的增删改查为例,演示代码实现。


1、增
' ********添加图书,先判断是否已录入,如果已存在,则提示退出,否则添加新记录信息。********

    strSql = "SELECT TOP 1 book_ID FROM bms4l_Book WHERE book_ID='" & Trim(txtBookID.Text) & "'"
    Set rst = SelectSQL(strSql, strmsg)

    ' 如果bookID存在,则刷新使用最新时间做为ID编号
    If rst.RecordCount = 0 Then
        MsgBox "记录已存在!", vbCritical + vbOKOnly, "网管小贾的图书管理系统"
        Exit Sub
    End If

    ' 添加新记录
    strSql = "INSERT INTO dbo.bms4l_Book (book_ID,book_Title,book_Volume,book_Press,book_Author,book_ISBN,book_PublishTime,book_Price,book_DateStorage,book_BeLent,book_BeLentCounts,book_Remark)"
    strSql = strSql & " VALUES('" & Trim(txtBookID.Text) & "','" & Trim(txtBookTitle.Text) & "','" & Trim(txtBookVolume.Text) & "','" & Trim(txtBookPress.Text) & "','" & Trim(txtBookAuthor.Text) & "','" & Trim(txtBookISBN.Text)
    strSql = strSql & "','" & Trim(txtBookPublishTime.Text) & "','" & Trim(txtBookPrice.Text) & "','" & Trim(txtBookDateStorage.Text) & "','" & Trim(txtBookBeLent.Text) & "','0','" & Trim(txtBookRemark.Text) & "')"
    Call ExecuteSQL(strSql, strmsg)

    If InStr(1, strmsg, "执行成功") = 0 Then
        MsgBox "数据库操作失败!请稍后重试!", vbCritical + vbOKOnly, "网管小贾的图书管理系统"
    Else
        MsgBox "添加图书成功!!", vbInformation + vbOKOnly, "网管小贾的图书管理系统"
    End If
 


2、删
' ******** 找出ID,删除记录 ********

    strSql = "SELECT TOP 1 book_Title FROM dbo.bms4l_Book WHERE book_ID='" & tmpMsfgBookText & "'"
    Set rst = SelectSQL(strSql, msg)

    If rst.RecordCount > 0 Then

        '如果选择的是存在的记录,则确认是否删除此记录
        If MsgBox("真的要删除该记录吗??", vbQuestion + vbYesNo + vbDefaultButton2, "网管小贾的图书管理系统") = vbYes Then
            strSql = "DELETE FROM dbo.bms4l_Book WHERE book_ID='" & tmpMsfgBookText & "'"
            Call ExecuteSQL(strSql, msg)

            If InStr(1, msg, "执行成功") = 0 Then
                MsgBox "数据库操作失败!请稍后重试!", vbCritical + vbOKOnly, "网管小贾的图书管理系统"
            Else
                MsgBox "指定图书删除成功!!", vbInformation + vbOKOnly, "网管小贾的图书管理系统"
            End If

            cmdBookDelete.Enabled = False

        End If

    End If
 


3、改
' ******** 修改记录分两步,一是显示要修改的记录,二才是修改记录后保存。 ********

` 一、选择需要修改的记录,然后显示记录内容
    strSql = "SELECT TOP 1 * FROM dbo.bms4l_Book WHERE book_ID='" & tmpMsfgBookText & "'"
    Set rst = SelectSQL(strSql, msg)

    If rst.RecordCount > 0 Then

        '如果选择的是存在的记录,则打开修改窗口
        With frmBookModify

            '加载当前记录到各项目文本框中
            .txtBookID.Text = Trim(rst("book_ID").value)
            .txtBookTitle.Text = Trim(rst("book_Title").value)
            .txtBookPress.Text = Trim(rst("book_Press").value)
            .txtBookAuthor.Text = Trim(rst("book_Author").value)
            .txtBookISBN.Text = Trim(rst("book_ISBN").value)
            .txtBookPublishTime.Text = Trim(rst("book_PublishTime").value)
            .txtBookPrice.Text = Trim(rst("book_Price").value)
            .txtBookDateStorage.Text = Trim(rst("book_DateStorage").value)
            .txtBookBeLent.Text = Trim(rst("book_BeLent").value)
            .txtBookBeLentCounts.Text = Trim(rst("book_BeLentCounts").value)
            .txtBookRemark.Text = Trim(rst("book_Remark").value)
            .Show vbModal, Me

        End With

    End If

' 二、修改记录并提交到数据库中
    strSql = "UPDATE bms_book "
    strSql = strSql & "SET book_Title='" & Trim(txtBookTitle)
    strSql = strSql & "', book_Volume='" & Trim(txtBookVolume)
    strSql = strSql & "', book_Press='" & Trim(txtBookPress)
    strSql = strSql & "', book_Author='" & Trim(txtBookAuthor)
    strSql = strSql & "', book_ISBN='" & Trim(txtBookISBN)
    strSql = strSql & "', book_PublishTime='" & Trim(txtBookPublishTime)
    strSql = strSql & "', book_Price='" & Trim(txtBookPrice)
    strSql = strSql & "', book_Remark='" & Trim(txtBookRemark)
    strSql = strSql & "' WHERE book_ID='" & Trim(txtBookID.Text) & "'"
    Call ExecuteSQL(strSql, strmsg)

    If InStr(1, strmsg, "执行成功") = 0 Then
        MsgBox "数据库操作失败!请稍后重试!", vbCritical + vbOKOnly, "网管小贾的图书管理系统"
    Else
        MsgBox "图书信息更新成功!", vbInformation + vbOKOnly, "网管小贾的图书管理系统"
    End If
 


4、查

看似简单,实际还是比较复杂的,因为要构建筛选条件。

利用SQL语句的拼接,把每个需要筛选的条件字段连接起来,最后再拼接到 Where 关键字的后面。

举例:

如果想查询 id 等于 1name 等于 sysadm.cctime 等于 2020-11-11 的所有记录。

原始SQL语句应该是:SELECT * WHERE id=1 AND name='sysadm.cc'

那么我们参照原始SQL语句构建WHERE后面的条件语句,可以这个样子来做:

' 1.定义一个字符串变量
Dim strSql AS String

' 2.把每个字段条件写出来,然后依次拼接。
'   注意,每一行最前面有个空格,用于拼接分隔的每个字段。
'   拼接完成的strSql应该是这个样子滴:
'   strSql = " id = 1 AND name = 'sysadm.cc' AND time = '2020-11-11'"
strSql = strsql & " id = 1"
strSql = strsql & " AND name = 'sysadm.cc'"
strSql = strsql & " AND time = '2020-11-11'"

' 3.最后拼接到 WHERE 关键字后就OK了
'   实际完整SQL查询语句:
'   strSql = "SELECT * FROM table WHERE id = 1 AND name = 'sysadm.cc' AND time = '2020-11-11'"
strSql = "SELECT * FROM table WHERE" & strSql
 


好理解吧?

回到我们的图书管理系统,具体代码可能是这个样子的。

' ******** 构建Where查询条件 ********
    If chkBookID.value = vbChecked Then
        If Trim(txtBookQueryBookID.Text) <> "" Then
            strSql = "book_ID LIKE '%" & Trim(txtBookQueryBookID.Text) & "%'"
        End If
    End If

    If chkBookTitle.value = vbChecked Then
        If Trim(txtBookTitle.Text) <> "" Then
            If Trim(strSql) <> "" Then
                strSql = strSql & " AND book_Title LIKE '%" & Trim(txtBookTitle.Text) & "%'"
            Else
                strSql = "book_Title LIKE '%" & Trim(txtBookTitle.Text) & "%'"
            End If
        End If
    End If

    If chkBookAuthor.value = vbChecked Then
        If Trim(txtBookAuthor.Text) <> "" Then
            If Trim(strSql) <> "" Then
                strSql = strSql & " AND book_Author LIKE '%" & Trim(txtBookAuthor.Text) & "%'"
            Else
                strSql = "book_Author LIKE '%" & Trim(txtBookAuthor.Text) & "%'"
            End If
        End If
    End If

    If chkBookDateStorage.value = vbChecked Then
        If Trim(txtBookDateStorage(0).Text) = "" Or Trim(txtBookDateStorage(1).Text) = "" Then
        Else
            If IsDate(Trim(txtBookDateStorage(0).Text)) And IsDate(Trim(txtBookDateStorage(1).Text)) Then
                If Trim(strSql) <> "" Then
                    strSql = strSql & " AND book_DateStorage BETWEEN '" & Trim(txtBookDateStorage(0).Text) & "' AND '" & Trim(txtBookDateStorage(1).Text) & "'"
                Else
                    strSql = " book_DateStorage BETWEEN '" & Trim(txtBookDateStorage(0).Text) & "' AND '" & Trim(txtBookDateStorage(1).Text) & "'"
                End If
            Else
                MsgBox "登记日期格式错误!", vbExclamation + vbOKOnly, ""
                cmdBookQuery.Enabled = True
                Exit Sub
            End If
        End If

    End If

    If chkBookPress.value = vbChecked Then
        If Trim(txtBookPress.Text) <> "" Then
            If Trim(strSql) <> "" Then
                strSql = strSql & " AND book_Press LIKE '%" & Trim(txtBookPress.Text) & "%'"
            Else
                strSql = "book_Press LIKE '%" & Trim(txtBookPress.Text) & "%'"
            End If
        End If
    End If

    If chkBookBeLent.value = vbChecked Then
        If Trim(cboBookBeLent.Text) <> "" Then
            If Trim(strSql) <> "" Then
                strSql = strSql & " AND book_BeLent='" & Trim(cboBookBeLent.Text) & "'"
            Else
                strSql = "book_BeLent='" & Trim(cboBookBeLent.Text) & "'"
            End If
        End If
    End If

    If chkBookBeLentCounts.value = vbChecked Then
        If Trim(txtBookBeLentCounts(0).Text) <> "" And Trim(txtBookBeLentCounts(1).Text) <> "" Then
            If IsNumeric(Trim(txtBookBeLentCounts(0).Text)) Or IsNumeric(Trim(txtBookBeLentCounts(1).Text)) Then
                If Trim(strSql) <> "" Then
                    strSql = strSql & " AND book_BeLentCounts BETWEEN '" & Trim(txtBookBeLentCounts(0).Text) & "' AND '" & Trim(txtBookBeLentCounts(1).Text) & "'"
                Else
                    strSql = "book_BeLentCounts BETWEEN '" & Trim(txtBookBeLentCounts(0).Text) & "' AND '" & Trim(txtBookBeLentCounts(1).Text) & "'"
                End If
            Else
                MsgBox "借阅次数不是数字!", vbExclamation + vbOKOnly, ""
                cmdBookQuery.Enabled = True
                Exit Sub
            End If
        End If
    End If

' ******** 筛选条件有了,则构建完整的查询语句 ********
    If strSql = "" Then
        If MsgBox("没有选择任何查询条件。确定要查询所有图书记录吗??", vbQuestion + vbYesNo + vbDefaultButton2, "网管小贾的图书管理系统") = vbNo Then
            cmdBookQuery.Enabled = True
            Exit Sub
        Else
            strSql = "SELECT TOP 10000 * FROM dbo.bms4l_Book ORDER BY book_ID ASC"
        End If
    Else
        strSql = "SELECT TOP 10000 * FROM dbo.bms4l_Book WHERE " & strSql & " ORDER BY book_ID ASC"
    End If

    msfgBook.Redraw = False
    msfgBook.Tag = ""
    Call fillGrid_Book(msfgBook, strSql)
    Call ChangeMsflexGridColor(msfgBook)
 


基本的操作就这些了,包括读者信息等的操作都是大同小异的。

当然,如果需要实现更加复杂的业务逻辑,那就需要编写更多的代码。

除了这些基本的CRUD以外,在一个相对完整的系统程序中,还有一些相关的功能也是必备的。

例如,信息分类、用户登录或数据备份等等。


实现这些与CRUD数据操作本身关系不大、但又是系统必备的功能,实际上还是离不开我们前面讲到的后台数据、界面设计以及代码实现这几大步骤。

那么对于新手小白来说,这些看似简单其实本质却很虐人的变态功能,可能自己动手做起来非常要命。

好了,不用担心,现在我出现了!

那个...灯光师傅麻烦给这边打个灯光,谢谢!

咳咳...我想说的是,咳...现今流行WEB形式程序,那么以后有机会,我会介绍 PHP+MySql 形式的程序实现。

OK!我要找流浪哥打牌去了,我们下次再见!

欢迎小伙伴们留言给我吧!


前文回顾:


WeChat @网管小贾 | www.sysadm.cc


提交评论

安全码
刷新

© 2020-present 网管小贾 | 微信公众号 @网管小贾
许可协议:CC-BY-NC 4.0 | 转载文章请注明作者出处及相关链接