百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Excel VBA 收费结算模块一步一步带你设计【收费管理系统】06

toyiye 2024-06-21 12:34 10 浏览 0 评论

本文于2023年5月21日首发于本人同名公众号:Excel活学活用,更多文章案例请搜索关注!

☆本期内容概要☆

  • 用户窗体设置:收费结算模块设置(上)
  • Excel VBA 操作ACCESS数据库表,更新、删除、添加记录。
  • 数组赋值给Combox控件的List
  • 用透明标签覆盖文本框限制修改

上期我们分享了【收费管理系统】部门、人员等项目的设计【Excel VBA 部门、人员、收费项目分类设置/一步一步带你设计【收费管理系统】05】,本期我们将设计【收费结算】模块功能!由于该模块功能相对复杂,今天只能完成一部分。

下面我们就开始:

1、首先在Access数据库中创建新表,重命名为“tb收费明细”。

该表用于存放收费明细数据,所以是非常重要的一张表。这里我先手工增加一条记录。(注:字段后面有修改,图就不更新了。

2、打开VBA编辑器,在用户窗体Usf_Main上增加命令按钮CmdCollection,Caption收费结算。

3、双击“收费设置”按钮,进入代码区,复制CmdUsers命令按钮的代码,把“tb用户”改为“tb收费明细”:

(注:代码后面有修改、图也不更新了。)

4、修改窗体“Usf_AddAndModify”启动代码,

(1)初始设置部分:

 ElseIf currTable = "tb收费明细" Then
        initSQL = "select top 1 * from " & currTable
        arrWidth = Array(40, 0, 0, 0, 0, 0, 0, 200, 120, 80, 0, 200, 60, 60, 60, 60)
        Me.LbTitle = "收费结算单"
        EditableField = "All"
        strRequiredField = "All"
Else

代码简析:

(A)SQL语句,这里只选1条记录,因为收费明细项目我们主要是增加新记录,不需要查询所有已存在的记录,这里选1条记录,是为了取得tb收费明细表的字段名称。

(B)arrWidth,字段宽度,有些设为0,在ListView中我们就看不到(实际上是可以看到的,拖动ListView表头即可显示,为了使得Listview的表头不能随便拖动,我采用了一个替代方法:

(2)针对“tb收费明细”设置数组aData():

If currTable = "tb收费明细" Then
        ReDim aData(0 To UBound(tbTitle, 1) - 1, 0 To 5)
        '把金额预填0
        For i = 0 To UBound(aData, 2)
            aData(Pxy(tbTitle, "金额") - 1, i) = Format(0, "Standard")
        Next
    Else
        If RecordValue(dataFile, "select count(*) from " & currTable) > 0 Then
            aData = GetData(dataFile, initSQL)
        End If
    End If

代码简析:如果是tb收费明细,我们把数组直接定义为6条空记录,把金额预填0。因为收费结算时,我们需要的是录入新记录,不需要修改旧记录。

(3)针对“tb收费明细”设置部分控件的属性,这里我们增加了一个Frame1(其实它一直都在,只是在操作其他表的时候,它是隐藏的,在操作tb收费明细时,需要它显示出来。),上面加了一些标签控件、文本框控件、复合框控件等,具体就不列了,参见前图。

(4)针对“tb收费明细”,增加了一些代码:

'取得最近日期,按日期降序排列,取最大,如果没有记录,则为当前日期
SQL = "Select top 1 日期 from tb收费明细 order by 日期 DESC"
If RecordValue(dataFile, "select count(*) from tb收费明细") > 0 Then
    iDate = RecordValue(dataFile, SQL)
Else
    iDate = Format(Date, "YYYY/MM/DD")
End If
.TxbDate = iDate
'取最大单号,加上1,为当前单号。如果没有记录,当前单号为1
'单号规则:字母D+日期(YYYYMMDD)+3位顺序号,即一天最多999号。
If VoucherProcType = "结算制单" Then
    Dim preNumber As String
    SQL = "Select top 1 单号 from tb收费明细 order by 单号 DESC"
    If RecordValue(dataFile, "select count(*) from tb收费明细") > 0 Then
        preNumber = RecordValue(dataFile, SQL)
        If Mid(preNumber, 2, 8) = CStr(Format(iDate, "YYYYMMDD")) Then
            .TxbNumber = Left(preNumber, 9) & Format(Right(preNumber, 3) + 1, "000")
        Else
            .TxbNumber = "D" & Format(iDate, "YYYYMMDD") & "001"
        End If
        '客户、渠道、医生、科目从数据库取出记录,作为复合框的List
        arrCustomer = GetData(dataFile, "Select distinct 客户 from tb收费明细")
        Me.CmbCustomer.List = arrCustomer
        arrSource = GetData(dataFile, "Select distinct 渠道 from tb收费明细")
        Me.CmbSource.List = arrSource
        Me.CmbSource.Text = "无"
        arrDoctor = GetData(dataFile, "Select distinct 医生 from tb收费明细")
        Me.CmbDoctor.List = arrDoctor
        arrDepartment = GetData(dataFile, "Select distinct 科室 from tb收费明细")
        Me.CmbDepartment.List = arrDepartment
    Else
        .TxbNumber = "D" & Format(iDate, "YYYYMMDD") & "001"
        Me.CmbSource = "无"
    End If
    Me.CmdVoucherProcess.Caption = "单据修改"
Else
    Me.CmdVoucherProcess.Caption = "结算制单"
End If
'日期遮盖层,防止手工修改日期,造成日期格式不对,数据错误
'通过LbTopDate标签的双击事件,调用输入日期的窗体Usf_ChangeDate
With .LbTopDate
    .Visible = True
    .Top = Me.TxbDate.Top - 1
    .Left = Me.TxbDate.Left - 1
    .Width = Me.TxbDate.Width + 2
    .Height = Me.TxbDate.Height + 2
    .Caption = ""
    .BackStyle = fmBackStyleTransparent
    .ZOrder 0
End With
If VoucherProcType = "单据修改" Then
    Me.CmdVoucherCopy.Caption = "修改"
    Me.CmdVoucherCopy.ForeColor = vbRed
    Me.TxbDate = ""
    Me.TxbNumber = ""
    Me.BackColor = RGB(204, 204, 255)
    '.Frame1.BackColor = Usf_AddAndModify.BackColor
End If

代码解析:

(1)取得数据库中tb收费明细表的最大日期,赋值给TxbDate

(2)取得最大单号,加上1,赋值给TxbNumber。这里代码还有个单号中的日期与当前日期的比较,其实没必要,它们必然是相等的,时间关系暂时先这么着吧。后面再改。

(3)单号的规则是,字母D加上8位日期(YYYYMMDD),这里用Format函数转换格式,再加上3位顺序号。比如:D20230520001。

(4)客户、渠道、医生、科目从数据库取出记录,作为复合框的List,这里运用我们的自定义函数GetData(dataFile,SQL)。这些复合框如果没有可选择的,则可直接手工输入,相当于新增了。

(5)防止手工修改日期,在其上增加一层透明的标签。只有双击其上的标签、或者点左右的箭头才能修改。单号也类似,一般情况下单号不需要修改。

(6)这里有个public 变量VoucherProcType,凭证处理类型,作为区分是要新增记录(结算制单)还是要修改记录(单据修改)。看上去有点别扭,原因我在前期也说过,这个收费系统是参照我已经完成的一个小项目《财务管理系统》来的,用户窗体都是直接复制来的,代码也有很多复制成分。这里的“收费明细”对应那边的“凭证”。有些变量还是保持原样吧,省得改乱了。

(7)由于时间关系,还有一些需要完善的地方,比如“收费项目”的选择,日期的Change事件(影响单号),医生的Change事件(影响部门\科室)等,我们后期再做。

今天的内容就这么多,后面会继续,敬请关注!还请大家多多点赞、留言、分享,谢谢大家,我们下期再会!


☆猜你喜欢☆

【重磅】Excel VBA 应用分享/中医诊所收费系统/Excel+ListBox版

Excel VBA 动态添加控件/学生成绩筛选

Excel VBA 这样酷炫的日期控件,你不想要吗?

Excel 公式函数/数据透视表/固定资产折旧计提表!

Excel VBA 自定义函数/数组字段定位/数组字段排序

Excel 功能/公式函数/VBA/多种姿势处理重复值

Excel VBA 最简单的收发存登记系统

Excel 公式函数/查找函数之LOOKUP

Excel VBA 文件批量改名

Excel 公式函数/数据验证/动态下拉列表

Excel VBA 输入逐步提示/TextBox+ListBox

Excel 基础功能【数据验证】,你会怎么用?


本文于2023年5月21日首发于本人同名公众号:Excel活学活用,更多文章案例请搜索关注!

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码