基于Delphi 11与Absolute Database实现患者就诊日期自动入库
感谢Marc_s帮我改写问题。抱歉我的英语水平有限。
我的问题
我有一些交替每日前来诊所的患者,希望按如下方式将他们的就诊日期记录到数据库中:
我创建了一个包含三个表的数据库:Patient、Calendar、Month:
Patient:Id, name, last-name, age ...Calendar:Id, IdPatient, IdMonth, yearMonth:Id, Month, day, Ord
如何自动分配日期并将其保存到数据库中?
如下表所示:
| Sat | Sun | Mon | Tues | Wed | Thu | Fri |
|---|---|---|---|---|---|---|
| Day1 | day2 | day3 | X | |||
| day4 | day5 | day6 | X | |||
| day7 | day8 | day9 | X | |||
| Day10 | Day11 | Day12 | X | |||
| Day13 | Day14 | Day15 | X |
我使用的是Absolute database 7.93和Delphi 11,恳请提供解决该问题的过程或函数。
感谢您阅读我的问题。
解决方案
步骤1:明确日期规则
从日历表可以看出,患者的有效就诊日期为周六、周一、周三,周五及周日、周二、周四不安排就诊,我们将基于这个规则生成对应月份的就诊日期。
步骤2:编写Delphi生成并写入数据的函数
以下是适配Absolute Database的Delphi函数,可生成指定年月的有效就诊日期,并自动写入Month和Calendar表:
uses SysUtils, DateUtils, AbsMain; // 为指定患者生成指定年月的就诊记录并写入数据库 procedure GeneratePatientVisits(const APatientId: Integer; const AYear, AMonth: Integer; ADatabase: TAbsDatabase); var FirstDay, CurrentDay: TDate; DaysInMonth, VisitOrd, MonthId: Integer; MonthTable, CalendarTable: TAbsTable; begin MonthTable := TAbsTable.Create(nil); CalendarTable := TAbsTable.Create(nil); try MonthTable.Database := ADatabase; CalendarTable.Database := ADatabase; // 获取当月第一天和总天数 FirstDay := EncodeDate(AYear, AMonth, 1); DaysInMonth := DaysInAMonth(AYear, AMonth); VisitOrd := 0; // 记录当月第几个就诊日 // 遍历当月每一天 for CurrentDay := FirstDay to FirstDay + DaysInMonth - 1 do begin // 判断是否为有效就诊日:DayOfWeek返回值1=周一,3=周三,6=周六 case DayOfWeek(CurrentDay) of 1, 3, 6: begin Inc(VisitOrd); // 写入Month表 MonthTable.TableName := 'Month'; MonthTable.Open; MonthTable.Append; MonthTable.FieldByName('Month').AsInteger := AMonth; MonthTable.FieldByName('day').AsInteger := DayOf(CurrentDay); MonthTable.FieldByName('Ord').AsInteger := VisitOrd; MonthTable.Post; MonthId := MonthTable.FieldByName('Id').AsInteger; MonthTable.Close; // 写入Calendar表 CalendarTable.TableName := 'Calendar'; CalendarTable.Open; CalendarTable.Append; CalendarTable.FieldByName('IdPatient').AsInteger := APatientId; CalendarTable.FieldByName('IdMonth').AsInteger := MonthId; CalendarTable.FieldByName('year').AsInteger := AYear; CalendarTable.Post; CalendarTable.Close; end; end; end; finally MonthTable.Free; CalendarTable.Free; end; end;
步骤3:调用函数示例
在你的Delphi项目中,确保已连接好Absolute Database实例,然后直接调用函数即可,比如为ID为1的患者生成2024年5月的就诊记录:
// 假设ADb是已初始化并连接好的TAbsDatabase对象 GeneratePatientVisits(1, 2024, 5, ADb);
关键注意事项
- 确保
Patient、Month、Calendar表中的Id字段设置为自动增量(AutoInc),这样插入记录时会自动生成唯一ID。 - 如果
Month表的Ord字段不是“当月第几个就诊日”,可根据实际需求修改函数中该字段的赋值逻辑。 - 批量处理多个患者时,循环调用
GeneratePatientVisits并传入不同的APatientId即可。
内容的提问来源于stack exchange,提问作者Ahmed Samona
相关产品推荐
相关产品推荐

