我有一个表里面有个日期类型定义为datetime(SQL SERVER的表)
我在DBGRID中调入表,输入 2003-4是系统报错,说无效的日期格式(有效的日期格式应该是如2003-4-4的格式)我想变相的输入2003-4就写了如下的代码procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
varbegin
  if (Key = #13) then
    with dbgrid1 do
      begin
        if (ADOQuery1.State in [dsEdit]) then
          begin              adoquery1.FieldbyName('日期').AsDateTime:=strtodate(DBGRID1.DataSource.DataSet.Fields[0].AsString+'-1');
              //想通过后面加'-1'来使格式吻合日期类型
          end;
         ADOQuery1.Post;
        
      end;
end;可是输入2003-4系统依旧报错,输入正确的格式2003-4-1,系统又提示2003-4-1-1
无效,天哪,什么问题呢?????????
我怎么样才能输入2003-4呢,前提是该字段还是datetime类型(变成字符型的固然简单,但不好检查输入的是否是日期类型)

解决方案 »

  1.   

    我建议你在DBGrid中得日期字段设置成选择得,这就比较科学,也可以避免你遇到得问题
      

  2.   


    adoquery1.FieldbyName('日期').AsDateTime:=strtodate(DBGRID1.DataSource.DataSet.Fields[0].AsString+'-1');
    改为
    adoquery1.FieldbyName('日期').AsDateTime:=strtodate(DBGRID1.DataSource.DataSet.Fields[0].AsString+'''+'-1'+''');
      

  3.   

    adoquery1.FieldbyName('日期').AsDateTime:=strtodate(DBGRID1.DataSource.DataSet.Fields[0].AsString);
    如果要取一个月的头一天等,用日期函数
      

  4.   

    呵呵,报错是因为在类型检查时没有通过。keypress事件发生后focus可是移动了的只要一移动了系统就会自动检查你的数据类型。你要想使用你的办法,应该发生在focus移动之前,所以你在keydown中写一下试试?
      

  5.   

    这个办法最简单:在日期那个字段的editmask中输入:9999-99-1。用户只需输入2003-04就行了。系统会自动转换成2003-04-01
      

  6.   

    sql server中定义的datetime数据类型好象要用strtodatetime,用strtodate会出错