Rss & SiteMap

Foxtable(狐表) http://www.foxtable.com

新一代数据库软件,完美融合Access、Foxpro、Excel、vb.net之优势,人人都能掌握的快速软件开发工具!
共9 条记录, 每页显示 10 条, 页签: [1]
[浏览完整版]

标题:合同期为2021-03-01至2025-08-31,如何编程自动得出每年合同内是多少个月。

1楼
myredsun 发表于:2025/2/28 16:01:00
合同期为2021-03-01至2025-08-31,如何编程自动得出每年合同内是多少个月?请教。

2楼
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 用户进行轻量级数据管理。





3楼
myredsun 发表于:2025/2/28 16:26:00
太强大了,deepseek,刚想起它,用一下,真的出结果。图片点击可在新窗口打开查看
4楼
有点蓝 发表于:2025/2/28 16:39:00
http://www.foxtable.com/webhelp/topics/2648.htm
5楼
y2287958 发表于:2025/2/28 16:48:00
尽信deepseek,有时会误入歧途图片点击可在新窗口打开查看
6楼
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编辑过]
7楼
有点蓝 发表于: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编辑过]
8楼
myredsun 发表于:2025/3/1 16:37:00
我基础太差了,没有仔细看,是要不断学习,真惭愧。foxtable也太能了,给老师点赞。太谢谢你了。下一步我要挑战每份合同分解、定年份确认月数,用关联表的形式体现。
[此贴子已经被作者于2025/3/1 21:28:31编辑过]
9楼
有点蓝 发表于:2025/3/1 17:24:00
如果看不懂代码,建议还是先重头学一下编程基础。没有基础,给再多的代码也是白费
共9 条记录, 每页显示 10 条, 页签: [1]

Copyright © 2000 - 2018 foxtable.com Tel: 4000-810-820 粤ICP备11091905号

Powered By Dvbbs Version 8.3.0
Processed in .03125 s, 2 queries.