开发大型的MIS系统,肯定是离不开第三方控件的,同时也要根据项目需要自己写几个。

MicroERP共用了以下几个控件:

第三方商业控件:

vsFlexGrid:大名鼎鼎的表格控件,不用多说,配合vsPrinter使用

开源的基础上修改和自己写的:

button按钮

cash会计凭证用的金额线

MDITabs MDI窗体

LeftMenu手风琴导航菜单

这里着重说一下vsFlexGrid、scriptControl的使用,以工资模块来说明表格运算及脚本编程示例。

这个控件也不是万能的,比如单元格没有change事件,很淡疼

在工资发放中,最难的就是工资表的自定义字段,某些成熟的软件用了内置上百个字段,然后由用户修改字段属性方式来完成,这里我用了“行转列”的方式,具体实现效果请参见MicroERP中的工资管理模块。

实现原理就是把预设的工资结构在填制工资表时,将表中的行转为工资表中的发放字段,某工资表数据行如下:

基本工资

岗位工资

养老保险

应发工资

应发工资=基本工资+岗位工资-养老保险

实发工资表时,显示为:

员工姓名|基本工资|岗位工资|养老保险|应发工资

员工一.......................

员工二.......................

以VB为例,实现代码如下,其它语言类似

'行转列
Public Sub SetFrame(frameID As Long)

Dim cn As New ADODB.Connection, rs As New ADODB.Recordset, sql As String
    Dim i As Long
    btnSelectEmployee.Enabled = True
   
    sql = "SELECT tbGZItem.ItemName "
    sql = sql & "FROM (tbGZFrame INNER JOIN tbGZFrameDetail ON
tbGZFrame.ID = tbGZFrameDetail.FrameID) INNER JOIN tbGZItem ON
tbGZFrameDetail.ItemID = tbGZItem.ID "
    sql = sql & "where tbGZFrameDetail.FrameID=" & frameID & " order by tbGZFrameDetail.FOrder"
    On Error GoTo err
    Set cn = GetConnection
    rs.CursorLocation = adUseClient
    rs.Open sql, cn, adOpenStatic, adLockReadOnly

With fg
        .Clear
        .Rows = 1
        .Cols = rs.RecordCount + 3
        For i = 3 To .Cols - 1
            .ColWidth(i) = 1300
            .ColAlignment(i) = flexAlignRightCenter
        Next i
        
        .TextMatrix(0, 1) = "EmpID"
        .TextMatrix(0, 2) = "员工姓名"

.Cell(flexcpAlignment, 0, 1, 0, .Cols - 1) = flexAlignCenterCenter
        .ColWidth(0) = 300
        .ColHidden(1) = True

For i = 0 To rs.RecordCount - 1
            .TextMatrix(0, i + 3) = rs.Fields("ItemName").Value
            .ColKey(i + 3) = rs.Fields("ItemName").Value
            rs.MoveNext
        Next i
    End With
    
    Exit Sub
err:
    If rs.State <> adStateClosed Then rs.Close
    Set rs = Nothing
    If cn.State <> adStateClosed Then cn.Close
    Set cn = Nothing

MsgBox err.Description, vbCritical, "SetFrame"
End Sub

注意,.ColKey(i + 3) = rs.Fields("ItemName").Value,这句是重点。

下在是在工资表编辑时,根据字段定义,来自动计算公式列和所得税列的值

Private Sub fg_BeforeEdit(ByVal Row As Long, ByVal Col As Long, Cancel As Boolean)
    Dim formula As String '公式
    Dim funCol As String '需要计算的列
    Dim i As Integer
    Dim s As Single
    Dim q As Single
    
    If Col = 2 Then Cancel = True
    On Error GoTo err
    If Row <> 0 Then

If GetEditMode(fg.ColKey(Col)) = "公式计算" Then
            funCol = "fg.TextMatrix(" & Row & "," & Col & ")="
            
            formula = GetFormula(mFrameID, GetItemID(fg.ColKey(Col)))
            
            '例:基本工资+补贴-保险
            '将公式替换成行列索引
            For i = 3 To fg.Cols - 1
                formula = Replace(formula, fg.ColKey(i),
"fg.ValueMatrix(" & Row & ", " & fg.colIndex(fg.ColKey(i))
& ")")
            Next i
            formula = funCol & formula
    
            ScriptControl1.Reset
            ScriptControl1.AddObject "fg", fg
            ScriptControl1.ExecuteStatement formula
            
        ElseIf GetEditMode(fg.ColKey(Col)) = "所得税" Then
            txtYF.Text = Trim(GetINIstr(gAppPath & "option.ini", "system", "yffield"))
            '应发工资
            s = Val(fg.TextMatrix(Row, fg.colIndex(txtYF.Text)))
            '起征点
            q = Val(GetINIstr(gAppPath & "option.ini", "system", "gztax"))
            If s <= q Then
                fg.TextMatrix(Row, Col) = "0"
            Else
            '全月应纳税所得额
                fg.TextMatrix(Row, Col) = GetTax(s - q)
            End If
            
            
        End If
    End If
    
    Exit Sub
err:
    MsgBox err.Description, vbExclamation, "fg_BeforeEdit"
End Sub

注意:formula = Replace(formula, fg.ColKey(i), "fg.ValueMatrix(" &
Row & ", " & fg.colIndex(fg.ColKey(i)) & ")"),这句是重点。

工资表结构预定义:

工资数据录入,下图的各列除基本工资和岗位工资外,其它列为自动计算出的数值:

有看不懂的或需要代码的可能联系我

http://www.tshuake.com/microerp

MicroERP开发技术分享:vsFlexGrid、scriptControl实现工资表自定义列与表间关系计算的更多相关文章

  1. MicroERP开发技术分享:技术选型

    为什么要想起开发一个近似一套完整的ERP软件呢,原因有二:一是想在空闲时间把以前的进销存软件丰富一下,结果越搞越大了:二是这些年光搞C#了,不想把VB6忘光了 非微软的东西还真没时间去学,也有主要原因 ...

  2. iOS开发技术分享(1)— iOS本地数据存储

    iOS开发技术分享(1)— iOS本地数据存储 前言: 我本是一名asp.net程序员,后来加入了iOS游戏开发队伍,到现在也有一年多的时间了.这一年来,每天都干到2.3点钟才睡觉,不为别的,只为了学 ...

  3. Docker原理(开发技术分享转发)

    Docker原理Docker是啥Docker是一个程序运行.测试.交付的开放平台,Docker被设计为能够使你快速地交付应用.在Docker中,你可以将你的程序分为不同的 基础部分,对于每一个基础部分 ...

  4. javac选项以递归方式编译给定目录下的所有Java文件 - IT屋-程序员软件开发技术分享社区

    http://www.it1352.com/539276.html #Linux $ find -name“* .java”> sources.txt $ javac @ sources.txt ...

  5. SDNLAB技术分享(四):利用ODL下发流表创建VxLAN网络

    邓晓涛,当前就职于江苏省未来网络创新研究院,是CDN团队的一名研发人员,主要从事SDN相关的研发相关工作.曾就职于三星电子于先行解决方案研发组任高级工程师.思科系统于云协作应用技术部(CCATG)任工 ...

  6. fir.im Weekly - 2016 移动开发技术大回顾

    2016 年是移动技术发展迅速的一年,认认真真回顾这一年必不可少.@移动开发前线 的 这篇 2016移动开发技术巡礼 ,精心盘点了 2016 年 移动开发技术大事件,分为 iOS/Android平台篇 ...

  7. 爱奇艺技术分享:爱奇艺Android客户端启动速度优化实践总结

    本文由爱奇艺技术团队原创分享,原题<爱奇艺Android客户端启动优化与分析>. 1.引言 互联网领域里有个八秒定律,如果网页打开时间超过8秒,便会有超过70%的用户放弃等待,对Andro ...

  8. fir.im Weekly - 新开发时代,需要什么样的技术分享

    "2016年,当我们迎来了如Xcode 8.Swift 3.SiriKit.Android N.Android Instant Apps.React Native等诸多移动开发技术.开发工具 ...

  9. Excel阅读模式/单元格行列指示/聚光灯开发 技术要点再分享

    1. 引言 文题中所谓技术要点再分享,本意是想在大神Charltsing Liu的博文“简单介绍Excel单元格行列指示的实现原理(俗称聚光灯功能)”的基础上写一点个人开发体会.写本文的初衷有三点,一 ...

随机推荐

  1. 一次U盘拯救的经历

    U盘拷资料,突然就弹出框框,复制终止了,然后U盘里面的只是编程可读的了. 倒是没有啥重要的资料,就是只有这一个U盘了,平时传资料都靠它,不能就这么垮了啊,于是就来了一次拯救行动. 一共有三个步骤 第一 ...

  2. Query Designer:Condition,根据KeyFigure值来过滤数据

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  3. 让Xcode 8.x能够调试iOS 7.x真机

    首先需要 Xcode 7.x.可以去 苹果开发者官网 下载. 打开Finder, 进入文件夹: Xcode .x.app/Contents/Developer/Platforms/iPhoneOS.p ...

  4. 已禁用对分布式事务管理器(MSDTC)的网络访问的解决方法之一

    C# ASP.NET项目提示上述错误,在代码中使用分布式事务提示添加或修改到数据库的时候.添加数据到数据库时,不会设置实体类的主键字段.

  5. Ajax --- 数据请求

    下面主要介绍(JS原生)数据请求的主要步骤: Ajax 数据请求步骤: 1.创建XMLHttpRequest对象 2.准备数据发送 3.执行发送 4.指定回掉函数 第一步:创建XMLHttpReque ...

  6. 关于win10连接不上ftp的解决方案

    win10系统连接ftp服务器的时候,会先出现假死,比如: 然后 就会报错: 面对这些问题:我们不需要关闭放火请,卸载杀毒软件等等无用的操作,只需要一步就能搞定: 把ftp:// 换成 file:\\ ...

  7. 个人psp

    排球计分程序 1.计划 通过对用户故事估计这个任务需要3~5d天. 2.开发 2.1需求分析 作为一个观众,我希望了解每场比赛的比分,以便了解比赛的情况. 作为一个观众,我希望输入球队名称查询球队比分 ...

  8. [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装

    [原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...

  9. zookeeper 应用

    一,启动一个zk客户端 zookeeper/bin/zkCli.sh ls /  查看根目录下所有节点 create /znode data  创建节点znode,并添加数据内容为data ls /z ...

  10. 强大的打印功能jatoolsPrinter使用总结

    最近功能做项目,需要实现打印条码标签的功能,对于第一次接触打印机的小白来说简直是折磨死我拉,公司采购的打印机是斑马的GK888T,其实,如果单纯的想实现能打印出来标签的话,直接用window.prin ...