You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Delphi 11与Absolute Database实现患者就诊日期自动入库

感谢Marc_s帮我改写问题。抱歉我的英语水平有限。

我的问题

我有一些交替每日前来诊所的患者,希望按如下方式将他们的就诊日期记录到数据库中:

我创建了一个包含三个表的数据库:Patient、Calendar、Month:

  • Patient:Id, name, last-name, age ...
  • Calendar:Id, IdPatient, IdMonth, year
  • Month:Id, Month, day, Ord

如何自动分配日期并将其保存到数据库中?

如下表所示:

SatSunMonTuesWedThuFri
Day1day2day3X
day4day5day6X
day7day8day9X
Day10Day11Day12X
Day13Day14Day15X

我使用的是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);

关键注意事项

  1. 确保Patient、Month、Calendar表中的Id字段设置为自动增量(AutoInc),这样插入记录时会自动生成唯一ID。
  2. 如果Month表的Ord字段不是“当月第几个就诊日”,可根据实际需求修改函数中该字段的赋值逻辑。
  3. 批量处理多个患者时,循环调用GeneratePatientVisits并传入不同的APatientId即可。

内容的提问来源于stack exchange,提问作者Ahmed Samona

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:15:31