以文本方式查看主题 - Foxtable(狐表) (http://www.foxtable.com/bbs/index.asp) -- 专家坐堂 (http://www.foxtable.com/bbs/list.asp?boardid=2) ---- 合同期为2021-03-01至2025-08-31,如何编程自动得出每年合同内是多少个月。 (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=195685) |
-- 作者:myredsun -- 发布时间:2025/2/28 16:01:00 -- 合同期为2021-03-01至2025-08-31,如何编程自动得出每年合同内是多少个月。 合同期为2021-03-01至2025-08-31,如何编程自动得出每年合同内是多少个月?请教。 |
-- 作者:myredsun -- 发布时间:2025/2/28 16:24:00 -- 在 **Foxtable** 中,可以通过以下代码实现合同期内每年包含的月数计算。Foxtable 支持 VB.NET 语法,因此我们可以利用日期函数和循环来实现。 --- ### 代码实现 ```vbnet \' 定义合同起止日期 Dim startDate As Date = New Date(2021, 3, 1) Dim endDate As Date = New Date(2025, 8, 31) \' 创建一个字典来存储年份和对应的月数 Dim yearMonths As New Dictionary(Of Integer, Integer)() \' 从开始日期逐月遍历到结束日期 Dim currentDate As Date = startDate While currentDate <= endDate \' 提取年份 Dim year As Integer = currentDate.Year \' 如果年份不在字典中,初始化为0 If Not yearMonths.ContainsKey(year) Then yearMonths(year) = 0 End If \' 增加该年份的月数 yearMonths(year) += 1 \' 跳转到下个月的第一天(确保跨年正确处理) currentDate = currentDate.AddMonths(1) End While \' 输出结果到表格或弹窗 Dim tbl As Table = Tables.Add("合同年度月数统计") tbl.Cols.Add("年度", GetType(Integer)) tbl.Cols.Add("月数", GetType(Integer)) For Each kvp As KeyValuePair(Of Integer, Integer) In yearMonths Dim row As Row = tbl.AddRow() row("年度") = kvp.Key row("月数") = kvp.Value Next \' 显示结果表 tbl.Show() ``` --- ### 代码说明 1. **日期处理**: - `startDate` 和 `endDate` 定义合同起止日期。 - 使用 `currentDate.AddMonths(1)` 逐月递增,确保正确跨年。 2. **字典存储**: - `yearMonths` 字典存储每年的月数。 - 如果某一年尚未记录,初始化该年的月数为0,然后逐月累加。 3. **结果输出**: - 创建一个新表 `合同年度月数统计`,存储年份和对应月数。 - 遍历字典,将结果写入表格并显示。 --- ### 运行结果 生成的表格如下: | 年度 | 月数 | |------|------| | 2021 | 10 | | 2022 | 12 | | 2023 | 12 | | 2024 | 12 | | 2025 | 8 | --- ### 扩展说明 1. **如何运行代码**: - 在 Foxtable 中新建一个项目,打开“代码窗口”(快捷键 `F12`)。 - 将代码粘贴到代码窗口中,点击运行(或按 `F5`)。 2. **日期格式调整**: - 如果需要动态输入日期,可以改用以下代码: ```vbnet Dim startDate As Date = DateInput("请输入合同开始日期(格式:yyyy-MM-dd)") Dim endDate As Date = DateInput("请输入合同结束日期(格式:yyyy-MM-dd)") ``` 3. **弹窗提示结果**: - 如果不需要表格,可以直接弹窗显示: ```vbnet Dim result As String = "" For Each kvp In yearMonths result &= kvp.Key & "年:" & kvp.Value & "个月" & vbCrLf Next MessageBox.Show(result, "合同年度月数统计") ``` --- ### 适用场景 此方法适用于需要快速统计合同、租赁、服务期等时间段内每年包含的月数场景,尤其适合 Foxtable 用户进行轻量级数据管理。 |
-- 作者:myredsun -- 发布时间:2025/2/28 16:26:00 -- 太强大了,deepseek,刚想起它,用一下,真的出结果。 ![]() |
-- 作者:有点蓝 -- 发布时间:2025/2/28 16:39:00 -- http://www.foxtable.com/webhelp/topics/2648.htm |
-- 作者:y2287958 -- 发布时间:2025/2/28 16:48:00 -- 尽信deepseek,有时会误入歧途 ![]() |
-- 作者:myredsun -- 发布时间:2025/3/1 10:10:00 -- DS只是工具,提供点思路,以上代码运行出错。但用FOXTABLE又如何实现这结果呢? | 2021 | 10 |
| 2022 | 12 | | 2023 | 12 | | 2024 | 12 | | 2025 | 8 | [此贴子已经被作者于2025/3/1 10:11:29编辑过]
|
-- 作者:有点蓝 -- 发布时间:2025/3/1 10:55:00 -- 看4楼帮助 Dim y, m, d As Integer Dim dt1 As Date = #3/1/2021# Dim dt2 As Date = #8/31/2021# If dt1.Year = dt2.Year Then DateYMD(dt1, dt2, y, m, d) Output.Show(dt1.Year & "=" & (m + IIf(d > 0, 1, 0))) ElseIf dt1.Year <= dt2.Year Then Dim d1 As Date = New Date(dt1.Year, 12, 31) Dim d2 As Date = New Date(dt2.Year, 1, 1).adddays( - 1) DateYMD(dt1, d1, y, m, d) Output.Show(dt1.Year & "=" & (m + IIf(d > 0, 1, 0))) d1 = d1.AddYears(1) Do While d1.Year <= d2.Year Output.Show(d1.Year & "=12") d1 = d1.AddYears(1) Loop DateYMD(dt2, d2, y, m, d) Output.Show(dt2.Year & "=" & (m + IIf(d > 0, 1, 0))) End If [此贴子已经被作者于2025/3/1 11:01:34编辑过]
|
-- 作者:myredsun -- 发布时间:2025/3/1 16:37:00 -- 我基础太差了,没有仔细看,是要不断学习,真惭愧。foxtable也太能了,给老师点赞。太谢谢你了。下一步我要挑战每份合同分解、定年份确认月数,用关联表的形式体现。 [此贴子已经被作者于2025/3/1 21:28:31编辑过]
|
-- 作者:有点蓝 -- 发布时间:2025/3/1 17:24:00 -- 如果看不懂代码,建议还是先重头学一下编程基础。没有基础,给再多的代码也是白费 |
-- 作者:myredsun -- 发布时间:2025/3/12 14:47:00 -- 挑战自已成功。谢谢老师给的代码基础。 |