MicroERP开发技术分享:vsFlexGrid、scriptControl实现工资表自定义列与表间关系计算
开发大型的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实现工资表自定义列与表间关系计算的更多相关文章
- MicroERP开发技术分享:技术选型
为什么要想起开发一个近似一套完整的ERP软件呢,原因有二:一是想在空闲时间把以前的进销存软件丰富一下,结果越搞越大了:二是这些年光搞C#了,不想把VB6忘光了 非微软的东西还真没时间去学,也有主要原因 ...
- iOS开发技术分享(1)— iOS本地数据存储
iOS开发技术分享(1)— iOS本地数据存储 前言: 我本是一名asp.net程序员,后来加入了iOS游戏开发队伍,到现在也有一年多的时间了.这一年来,每天都干到2.3点钟才睡觉,不为别的,只为了学 ...
- Docker原理(开发技术分享转发)
Docker原理Docker是啥Docker是一个程序运行.测试.交付的开放平台,Docker被设计为能够使你快速地交付应用.在Docker中,你可以将你的程序分为不同的 基础部分,对于每一个基础部分 ...
- javac选项以递归方式编译给定目录下的所有Java文件 - IT屋-程序员软件开发技术分享社区
http://www.it1352.com/539276.html #Linux $ find -name“* .java”> sources.txt $ javac @ sources.txt ...
- SDNLAB技术分享(四):利用ODL下发流表创建VxLAN网络
邓晓涛,当前就职于江苏省未来网络创新研究院,是CDN团队的一名研发人员,主要从事SDN相关的研发相关工作.曾就职于三星电子于先行解决方案研发组任高级工程师.思科系统于云协作应用技术部(CCATG)任工 ...
- fir.im Weekly - 2016 移动开发技术大回顾
2016 年是移动技术发展迅速的一年,认认真真回顾这一年必不可少.@移动开发前线 的 这篇 2016移动开发技术巡礼 ,精心盘点了 2016 年 移动开发技术大事件,分为 iOS/Android平台篇 ...
- 爱奇艺技术分享:爱奇艺Android客户端启动速度优化实践总结
本文由爱奇艺技术团队原创分享,原题<爱奇艺Android客户端启动优化与分析>. 1.引言 互联网领域里有个八秒定律,如果网页打开时间超过8秒,便会有超过70%的用户放弃等待,对Andro ...
- fir.im Weekly - 新开发时代,需要什么样的技术分享
"2016年,当我们迎来了如Xcode 8.Swift 3.SiriKit.Android N.Android Instant Apps.React Native等诸多移动开发技术.开发工具 ...
- Excel阅读模式/单元格行列指示/聚光灯开发 技术要点再分享
1. 引言 文题中所谓技术要点再分享,本意是想在大神Charltsing Liu的博文“简单介绍Excel单元格行列指示的实现原理(俗称聚光灯功能)”的基础上写一点个人开发体会.写本文的初衷有三点,一 ...
随机推荐
- Python控制window进行简单的消息弹窗
有人提到可以用easygui 稍后尝试一下
- LEfSe分析
LEfSe软件用于发现两组或两组以上的biomarker,主要是通过非参数因子Kruskal-Wallis秩和检验来实现的.运行LEfSe软件主要分三大步骤:第一步:需要把普通的物种.基因等等的丰度信 ...
- iOS自动化编译方案
本文主要来源以下Bryce Zhang博主的文章,感谢博主的无私分享,转载请注明出处,尊重原创 然,根据Bryce Zhang文章进行实践过程中遇到一些问题,解决后在此做相应的总结.大神请绕道,觉得低 ...
- angularjs 的笔记
angular.copy()深拷贝 angular提供了一个可以复制对象的api--copy(source,destination),它会对source对象执行深拷贝. 使用时需要注意下面几点: 如果 ...
- App分类
目前主流应用程序大体分为三类:Web App.Hybrid App. Native App.web app(网页应用)hybrid app(混合应用)native app(原生应用) 淘宝天猫这样的超 ...
- MemCache中的内存管理详解
MC的内存管理机制 1.内存的碎片化 当我们使用C语言或者其他语言进行malloc(申请内存),free(释放内存)等类似的命令操作内存的时候, 在不断的申请和释放的过程中,形成了一些很小的内存片段, ...
- unity自带寻路Navmesh入门教程(二)
上一节简单介绍了NavMesh寻路的基本用法,这次来介绍一下稍微复杂一点点的高低落差以及跳跃的做法,首先来看看这次的目标: 由于博客相册上传GIF有限制,所以我把整个过程切开了2部分上传,第一部分 ...
- C#获取CSV文件内容对逗号和引号分隔的处理
我们知道,使用excel工具保存成csv文件时有几个规则: 1.每一行的单元格内容之间用逗号分隔. 2.如果单元格的内容本身有逗号,这个单元格的内容将会用引号包含. 3.如果单元格的内容本身有引号 1 ...
- 构建高可用集群Keepalived+Haproxy负载均衡
重点概念vrrp_script中节点权重改变算法vrrp_script 里的script返回值为0时认为检测成功,其它值都会当成检测失败:weight 为正时,脚本检测成功时此weight会加到pri ...
- 配置appium 1.6.3 for MAC
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } 安装 ...