花了一天时间帮财务朋友开发了一个实用小工具

大家好,我是晓凡。

写在前面

不知道大家有没有做财务的朋友,我就有这么一位朋友就经常跟我抱怨。一到月底简直就是噩梦,总有加不完的班,熬不完的夜,做不完的报表。

来自朋友的抱怨

一听到这儿,这不就一活生生的一个“大表哥”么,这加班跟我们程序员有得一拼了,忍不住邪恶一笑,心里平衡了很多。

身为牛马,大家都不容易啊。我不羡慕你数钱数到手抽筋,你也别羡慕我整天写CRUD 写到手起老茧🤣

吐槽归吐槽,饭还得吃,工作还得继续干。于是乎,真好赶上周末,花了一天的时间,帮朋友写了个小工具

一、功能需求

跟朋友吹了半天牛,终于把需求确定下来了。就一个很简单的功能,通过名字,将表一和表二中相同名字的金额合计。

具体数据整合如下图所示

数据整合

虽然一个非常简单的功能,但如果不借助工具,数据太多,人工来核对,整合数据,还是需要非常消耗时间和体力的。

怪不得,这朋友到月底就消失了,原来时间都耗在这上面了。

二、技术选型

由于需求比较简单,只有excel导入导出,数据整合功能。不涉及数据库相关操作。

综合考虑之后选择了

  • PowerBuilder
  • Pbidea.dll

使用PowerBuilder开发桌面应用,虽然界面丑一点,但是开发效率挺高,简单拖拖拽拽就能完成界面(对于前端技术不熟的小伙伴很友好)

其次,由于不需要数据库,放弃web开发应用,又省去了云服务器费用。最终只需要打包成exe文件即可跑起来

Pbidea.dll 算是Powerbuilder最强辅助开发,没有之一。算是PBer们的福音吧

三、简单界面布局

界面布局1

界面布局2

界面布局3

四、核心代码

① 导入excel

string ls_pathName,ls_FileName //路径+文件名,文件名
long ll_Net
long rows
dw_1.reset()
uo_datawindowex dw
dw = create uo_datawindowex
dw_1.setredraw(false)
ll_Net = GetFileSaveName("请选择文件",ls_pathName,ls_FileName,"xlsx","Excel文(*.xlsx),*.xlsx")

rows = dw.ImportExcelSheet(dw_1,ls_pathName,1,0,0)
destroy dw
dw_1.setredraw(true)
MessageBox("提示信息","导入成功 " + string(rows) + "行数据")

② 数据整合

long ll_row,ll_sum1,ll_sum2
long ll_i,ll_j
long ll_yes

string ls_err

//重置表三数据

dw_3.reset()

//处理表一数据
ll_sum1 = dw_1.rowcount( )

if ll_sum1<=0 then
	ls_err = "表1 未导入数据,请先导入数据"
	goto err
end if

for ll_i=1 to ll_sum1
	ll_row = dw_3.insertrow(0)
	dw_3.object.num[ll_row] =ll_row                                                          //序号
	dw_3.object.name[ll_row]=dw_1.object.name[ll_i]                                 //姓名
	dw_3.object.salary[ll_row]=dw_1.object.salary[ll_i]                                //工资
	dw_3.object.endowment[ll_row]=dw_1.object.endowment[ll_i]               //养老
	dw_3.object.medical[ll_row]=dw_1.object.medical[ll_i]                          //医疗
	dw_3.object.injury[ll_row]=dw_1.object.injury[ll_i]                                        //工伤
	dw_3.object.unemployment[ll_row]=dw_1.object.unemployment[ll_i]      //失业
	dw_3.object.publicacc[ll_row]=dw_1.object.publicacc[ll_i]                      //公积金
	dw_3.object.annuity[ll_row]=dw_1.object.annuity[ll_i]                           //年金
	
next

//处理表二数据

ll_sum2 = dw_2.rowcount( )

if ll_sum2<=0 then
	ls_err = "表2未导入数据,请先导入数据"
	goto err
end if

for ll_j =1 to ll_sum2
	string ls_name 
	ls_name = dw_2.object.name[ll_j]
	
	ll_yes = dw_3.Find("name = '"+ ls_name +"'  ",1,dw_3.rowcount())
	
	if ll_yes<0 then
		ls_err = "查找失败!"+SQLCA.SQLErrText
		goto err
	end if
			
	if ll_yes = 0 then  //没有找到
			ll_row = dw_3.InsertRow (0)
			dw_3.ScrollToRow(ll_row)
			dw_3.object.num[ll_row]                   = ll_row                                                          //序号
			dw_3.object.name[ll_row]                 = dw_1.object.name[ll_j]                                 //姓名
			dw_3.object.salary[ll_row]                 = dw_1.object.salary[ll_j]                                //工资
			dw_3.object.endowment[ll_row]         = dw_1.object.endowment[ll_j]               //养老
			dw_3.object.medical[ll_row]              = dw_1.object.medical[ll_j]                          //医疗
			dw_3.object.injury[ll_row]                 = dw_1.object.injury[ll_j]                                        //工伤
			dw_3.object.unemployment[ll_row]    = dw_1.object.unemployment[ll_j]      //失业
			dw_3.object.publicacc[ll_row]            = dw_1.object.publicacc[ll_j]                      //公积金
			dw_3.object.annuity[ll_row]               = dw_1.object.annuity[ll_j]                           //年金
	end if
	
	if ll_yes >0 then  //找到        
			dec{2} ld_salary,ld_endowment,ld_medical,ld_injury,ld_unemployment,ld_publicacc,ld_annuity
			ld_salary = dw_3.object.salary[ll_yes] + dw_2.object.salary[ll_j]
			ld_endowment =  dw_3.object.endowment[ll_yes] + dw_2.object.endowment[ll_j]
			ld_medical = dw_3.object.medical[ll_yes] + dw_2.object.medical[ll_j]
			ld_injury = dw_3.object.injury[ll_yes] + dw_2.object.injury[ll_j]
			ld_unemployment = dw_3.object.unemployment[ll_yes] + dw_2.object.unemployment[ll_j]
			ld_publicacc = dw_3.object.publicacc[ll_yes] + dw_2.object.publicacc[ll_j]
			ld_annuity = dw_3.object.annuity[ll_yes] + dw_2.object.annuity[ll_j]
			
			dw_3.object.salary[ll_yes]=  ld_salary                             //工资
			dw_3.object.endowment[ll_yes]=ld_endowment               //养老
			dw_3.object.medical[ll_yes]=ld_medical                          //医疗
			dw_3.object.injury[ll_yes]=ld_injury                                     //工伤
			dw_3.object.unemployment[ll_yes]=ld_unemployment   //失业
			dw_3.object.publicacc[ll_yes]=ld_publicacc                    //公积金
			dw_3.object.annuity[ll_yes]=ld_publicacc                      //年金
		
	end if
	
next

return 0

err:
messagebox('错误信息',ls_err)

③ excel导出

string ls_err
string ls_pathName,ls_FileName //路径+文件名,文件名
long ll_Net

if dw_3.rowcount() = 0 then 
	ls_err = "整合数据为空,不能导出"
	goto err
end if

uo_wait_box luo_waitbox
luo_waitbox = create uo_wait_box
luo_waitBox.OpenWait(64,RGB(220,220,220),RGB(20,20,20),TRUE,"正在导出 ", 8,rand(6) - 1)

long rows
CreateDirectory("tmp")
uo_datawindowex dw
dw = create uo_datawindowex

ll_Net = GetFileSaveName("选择路径",ls_pathName,ls_FileName,"xlsx","Excel文(*.xlsx),*.xlsx")

rows = dw.ExportExcelSheet(dw_3,ls_pathName,true,true)
destroy dw
destroy luo_waitbox
MessageBox("提示信息","成功导出 " + string(rows) + " 行数据")

return 0

err:
messagebox('错误信息',ls_err)

五、最终效果

财务辅助系统

这次分享就到这吧,★,°:.☆( ̄▽ ̄)/$:.°★ 。希望对您有所帮助,也希望多来几个这样的朋友,不多说了, 蹭饭去了

我们下期再见ヾ(•ω•`)o (●’◡’●)

内容概要:本文详细介绍了一个基于C++的养老院管理系统的设计与实现,旨在应对人口老龄化带来的管理挑战。系统通过整合住户档案、健康监测、护理计划、任务调度等核心功能,构建了从数据采集、清洗、AI风险预测到服务调度与可视化的完整技术架构。采用C++高性能服务端结合消息队列、规则引擎和机器学习模型,实现了健康状态实时监控、智能任务分配、异常告警推送等功能,并解决了多源数据整合、权限安全、老旧硬件兼容等实际问题。系统支持模块化扩展与流程自定义,提升了养老服务效率、医护协同水平和住户安全保障,同时为运营决策提供数据支持。文中还提供了关键模块的代码示例,如健康指数算法、任务调度器和日志记录组件。; 适合人群:具备C++编程基础,从事软件开发或系统设计工作1-3年的研发人员,尤其是关注智慧养老、医疗信息系统开发的技术人员。; 使用场景及目标:①学习如何在真实项目中应用C++构建高性能、可扩展的管理系统;②掌握多源数据整合、实时健康监控、任务调度与权限控制等复杂业务的技术实现方案;③了解AI模型在养老场景中的落地方式及系统架构设计思路。; 阅读建议:此资源不仅包含系统架构与模型描述,还附有核心代码片段,建议结合整体设计逻辑深入理解各模块之间的协同机制,并可通过重构或扩展代码来加深对系统工程实践的掌握。
内容概要:本文详细介绍了一个基于C++的城市交通流量数据可视化分析系统的设计与实现。系统涵盖数据采集与预处理、存储与管理、分析建模、可视化展示、系统集成扩展以及数据安全与隐私保护六大核心模块。通过多源异构数据融合、高效存储检索、实时处理分析、高交互性可视化界面及模块化架构设计,实现了对城市交通流量的实时监控、历史趋势分析与智能决策支持。文中还提供了关键模块的C++代码示例,如数据采集、清洗、CSV读写、流量统计、异常检测及基于SFML的柱状图绘制,增强了系统的可实现性与实用性。; 适合人群:具备C++编程基础,熟悉数据结构与算法,有一定项目开发经验的高校学生、研究人员及从事智能交通系统开发的工程师;适合对大数据处理、可视化技术和智慧城市应用感兴趣的技术人员。; 使用场景及目标:①应用于城市交通管理部门,实现交通流量实时监测与拥堵预警;②为市民出行提供路径优化建议;③支持交通政策制定与信号灯配时优化;④作为智慧城市建设中的智能交通子系统,实现与其他城市系统的数据协同。; 阅读建议:建议结合文中代码示例搭建开发环境进行实践,重点关注多线程数据采集、异常检测算法与可视化实现细节;可进一步扩展机器学习模型用于流量预测,并集成真实交通数据源进行系统验证。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员晓凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值