我做的是一个医院系统
想要实现在 门诊排班 模块中单击某个医生的工号 就显示他的具体信息
代码如下
unit OutArra;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, DB, ADODB, Buttons, ComCtrls, StdCtrls, ExtCtrls;type
  TOutArraForm = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    ComboBox1: TComboBox;
    DateTimePicker1: TDateTimePicker;
    SpeedButton1: TSpeedButton;
    ADOQuery1: TADOQuery;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    procedure FormActivate(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure DBGrid1CellClick(Column: TColumn);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  OutArraForm: TOutArraForm;implementation
uses MainDataModu,DateUtils,DoctBrie;
{$R *.dfm}procedure TOutArraForm.FormActivate(Sender: TObject);
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select distinct 科室 from 医师,门诊排班 where 医师.工号=门诊排班.医师工号');
ADOQuery1.Open;
ComboBox1.Clear;
while not ADOQuery1.eof do
begin
ComboBox1.Items.Add(ADOQuery1.fieldByname('科室').asstring);
ADOQuery1.Next;
end;
Datetimepicker1.date:=now();
end;procedure TOutArraForm.SpeedButton1Click(Sender: TObject);
var s,t:string;
var ind:integer;
begin
  s:='select 午别,医师工号,姓名,看诊限额,已挂人数,是否停诊 from 医师,门诊排班 where 医师.工号=门诊排班.医师工号';
  if ComboBox1.ItemIndex>=0 then s:=s+' and 医师.科室='''+ComboBox1.Items.Strings[ComboBox1.ItemIndex]+'''';
  ind:=DayOfTheWeek(DateTimePicker1.DateTime);
  case ind of
    1:t:='星期一';
    2:t:='星期二';
    3:t:='星期三';
    4:t:='星期四';
    5:t:='星期五';
    6:t:='星期六';
    7:t:='星期天';
  end;
  s:=s+' and 门诊排班.午别 like '''+t+'%''';
  DBGrid1.DataSource:= DataSource1;
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add(s);
  ADOQuery1.Open;end;procedure TOutArraForm.DBGrid1CellClick(Column: TColumn);
begin
  DoctBrie.ss:= DBGrid1.SelectedField.FieldName;
  DoctBrie.tt:= DBGrid1.SelectedField.AsString;
  Application.createForm(TDoctBrieForm,DoctBrieForm);
  DoctBrieForm.ShowModal;
  DoctBrieForm.Free;
end;end.
unit DoctBrie;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, ExtCtrls;type
  TDoctBrieForm = class(TForm)
    Image1: TImage;
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Label4: TLabel;
    Label5: TLabel;
    DataSource1: TDataSource;
    ADOQuery1: TADOQuery;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  DoctBrieForm: TDoctBrieForm;
var
    ss,tt:string;
implementation
uses MainDataModu,OutArra,dateUtils;
{$R *.dfm}procedure TDoctBrieForm.FormCreate(Sender: TObject);
begin
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('select * from 医师 where ');
  if ss='医师工号' then
    begin
      ADOQuery1.SQL.Add('工号='''+tt+'''');
    end
  else
    begin
      ADOQuery1.SQL.Add('姓名='''+tt+'''');
    end;
  ADOQuery1.Open;
  Edit1.Text:=ADOQuery1.FieldValues['工号'];
  Edit2.Text:=ADOQuery1.FieldValues['姓名'];
  Edit3.Text:=IntTostr(yearof(now)-yearof(ADOQuery1.FieldValues['出生日期']));
  Edit4.Text:=ADOQuery1.FieldValues['科室'];
  Edit5.Text:=ADOQuery1.FieldValues['职称'];
end;end.
但是运行的时候  查询出的记录为空,错误信息为  couid convert variant of type null into type string
请高手指点  

解决方案 »

  1.   

    sql中有结果值为null,不能赋给edit.text,如果不是数据表没有建约束的话,就是年龄计算那里出了问题。
      

  2.   

    ADOQuery1.FieldValues['工号']; 
    FieldValues地方全都改成ADOQuery1.filename('字段名').asstring;
      

  3.   

    ADOQuery.FieldByName('字段名').AsString
      

  4.   

    好像fieldvalues[]的地方没问题吧
      

  5.   

      ADOQuery1.Open; 
      Edit1.Text:=ADOQuery1.FieldValues['工号']; 
      Edit2.Text:=ADOQuery1.FieldValues['姓名']; 
      Edit3.Text:=IntTostr(yearof(now)-yearof(ADOQuery1.FieldValues['出生日期'])); 
      Edit4.Text:=ADOQuery1.FieldValues['科室']; 
      Edit5.Text:=ADOQuery1.FieldValues['职称']; 一定是这里转换的问题,都换成 ADOQuery.FieldByName('工号').AsString 等的形式。
    最好ADOQuery.Open后判断下ADOQuery.RecordCount再处理。