Office中国论坛/Access中国论坛

标题: 你为该字段输入的值无效——其错误号是多少[已解决] [打印本页]

作者: 简    时间: 2011-2-10 13:01
标题: 你为该字段输入的值无效——其错误号是多少[已解决]
本帖最后由 简 于 2011-2-12 12:57 编辑

我在输入时间时,需要将(小时:分钟)转化为小时,比如3:30转化为小时后就是3.5小时。我在文本框里采用中时间的格式,这时出现的问题是:当时间为3小时时,我想提高输入效率,省略后面的:00,直接回车,这时就出现错误提示,如下图所示:
[attach]44781[/attach]

我就想问,这个错误提示的错误号是多少,我想屏蔽它,应该怎么处理。

还有,如果我输入3:00时,有没有办法直接输入3而不弹出上面的错误提示呢。

作者: roych    时间: 2011-2-10 13:34
大体如此吧:

  1. Private Sub Txt_Input_LostFocus()
  2. If Not IsDate(Me.Txt_Input) Then
  3. Me.Txt_Input = Me.Txt_Input & ":00"
  4. Me.txt_Output = Round(Hour(Me.Txt_Input) + Minute(Me.Txt_Input) / 60, 1)
  5. End If
  6. Me.txt_Output = Round(Hour(Me.Txt_Input) + Minute(Me.Txt_Input) / 60, 1)
  7. End Sub
复制代码
[attach]44782[/attach]


作者: 红尘如烟    时间: 2011-2-10 13:43
屏蔽消息框的代码:
  1. Private Sub Form_Error(DataErr As Integer, Response As Integer)
  2.     Select Case DataErr
  3.     Case 2113
  4.         Response=acDataErrContinue
  5.     End Select
  6. End Sub
复制代码
至于自动补充数值的问题,没有什么太好的办法,因为这个错误是数据库引擎触发的,早于更新前事件,所以只能不把格式设为时间格式,然后在更新后或更新前判断是否输入完全,如果没有输入完全则补充完全,不过这种方式不是很理想
作者: 简    时间: 2011-2-10 17:57
我又遇到一个问题,当我采用短时间格式时,短时间的小时范围是0—23,当我输入的工时大于24时,就弹出错误提示。这怎么办呢,是不是只能取消短时间格式呢。


作者: roych    时间: 2011-2-10 18:31
Hoho,我和红尘版主的都没有采用日期格式的噢。
作者: 简    时间: 2011-2-10 19:27
我现在只能这样做了,取消日期格式,然后借助掩码“00:00;0;_”来保证输入格式。我的代码如下:

Private Sub Txt_Input _AfterUpdate()
Dim strtime
    strtime = Left(Me.Txt_Input , 2) + Right(Me.Txt_Input , 2) / 60
    Me.Txt_Output = Format(strtime, "0.00")
End Sub

我想我这样做比你那段代码似乎要简单些。

我顺便再问,这个错误提示的错误号是多少呢,我还是想屏蔽它,改为自己的提醒方式。
[attach]44790[/attach]


作者: 简    时间: 2011-2-11 17:45
我还想问,以这个问题为例,如果我要把小时转化为(小时:分钟),格式是hh:mm,同时又要考虑到小时>24的情况,那我又该怎么办呢。
作者: todaynew    时间: 2011-2-11 19:07
本帖最后由 todaynew 于 2011-2-11 19:10 编辑

进位制问题,有何难哉?
假设变量h中存小时数据,则:
str=format(int(h) mod 24,"00") & ":" & format(int((h-int(h))*60 ),"00")
作者: 简    时间: 2011-2-11 20:21
本帖最后由 简 于 2011-2-11 20:22 编辑
todaynew 发表于 2011-2-11 19:07
进位制问题,有何难哉?
假设变量h中存小时数据,则:
str=format(int(h) mod 24,"00") & ":" & format(i ...


原来如此,多谢多谢哈~~~~

另外,你能告诉我掩码输入错误时的错误号不,见6楼的图片。
作者: todaynew    时间: 2011-2-11 20:27
本帖最后由 todaynew 于 2011-2-11 20:33 编辑
简 发表于 2011-2-11 20:21
原来如此,多谢多谢哈~~~~

另外,你能告诉我掩码输入错误时的错误号不,见6楼的图片。


不知道,对错误号没有研究。因为我原则是不给同志们犯错误的机会。
作者: 简    时间: 2011-2-11 20:37
todaynew 发表于 2011-2-11 20:27
不知道,对错误号没有研究。因为我原则是不给同志们犯错误的机会。

我是觉得系统自带的错误提示内容太生硬,所以想屏蔽,然后自己添加错误提示。
作者: todaynew    时间: 2011-2-11 21:56
简 发表于 2011-2-11 20:37
我是觉得系统自带的错误提示内容太生硬,所以想屏蔽,然后自己添加错误提示。

我的意思是用代码避免这个错误出现就可以了。
作者: 简    时间: 2011-2-12 07:33
todaynew 发表于 2011-2-11 21:56
我的意思是用代码避免这个错误出现就可以了。

我就是这个意思,但我以为,用代码来避免这个错误的出现,首先要先屏蔽系统自带的错误提示。不然你说用代码来怎么写,才能避免这个错误的出现呢。
作者: t小宝    时间: 2011-2-12 11:19
本帖最后由 t小宝 于 2011-2-12 11:19 编辑

看了3楼的代码就应该想到错误怎么取
Private Sub Form_Error(DataErr As Integer, Response As Integer)
    Msgbox DataErr
End Sub

作者: 简    时间: 2011-2-12 12:56
t小宝 发表于 2011-2-12 11:19
看了3楼的代码就应该想到错误怎么取
Private Sub Form_Error(DataErr As Integer, Response As Integer)
...

OK,多谢楼上的各位朋友,这个问题在大家的帮助指点下,总算解决了,我又学到了一点东西,好高兴。
作者: 简    时间: 2011-2-19 22:13
本帖最后由 简 于 2011-2-19 22:43 编辑

在工时累加中,我需要显示大于24小时的时间形式hh:mm,比如35:05,我原来设置的时间格式是短时间,现在看来,不能用短时间,如果用字符,又做不起交叉查询的工时统计,怎么办呢。
作者: 简    时间: 2011-2-19 22:31
本帖最后由 简 于 2011-2-19 22:53 编辑
todaynew 发表于 2011-2-11 19:07
进位制问题,有何难哉?
假设变量h中存小时数据,则:
str=format(int(h) mod 24,"00") & ":" & format(i ...


你这段代码不能解决大于24小时的工时,比如25:10;
要解决的话,代码就应该是str=format(int(h) ,"00") & ":" & format(int((h-int(h))*60 ),"00")

而且这个形式只能存为文本,不能存为时间格式,如果存为时间格式,25:10就变成1:10了。如果存为文本格式,交叉查询就会出错,郁闷呀。

作者: todaynew    时间: 2011-2-20 08:30
本帖最后由 todaynew 于 2011-2-20 08:37 编辑
简 发表于 2011-2-19 22:31
你这段代码不能解决大于24小时的工时,比如25:10;
要解决的话,代码就应该是str=format(int(h) ,"00" ...


如果计算的结果为一个字段那么交叉查询出不出错没什么关系;如果计算的结果作为查询的准则,那么将原先使用#号处改为单引号就完事了。
简言之,数据类型不是导致查询出错的根本,查询书写错误才是真正的原因。

作者: 简    时间: 2011-2-20 09:21
todaynew 发表于 2011-2-20 08:30
如果计算的结果为一个字段那么交叉查询出不出错没什么关系;如果计算的结果作为查询的准则,那么将原先 ...

我并没有用到有“#”之类的地方呀,而且“#”也只是代表日期,与文本,数字类型无关。而且我的交叉查询是采用系统向导方式生成的,具体实例可以见http://www.office-cn.net/thread-96172-1-1.html,将附件中的工时改为文本字符,这时再看交叉查询,就失效了。
作者: todaynew    时间: 2011-2-20 10:00
本帖最后由 todaynew 于 2011-2-20 10:05 编辑
简 发表于 2011-2-20 09:21
我并没有用到有“#”之类的地方呀,而且“#”也只是代表日期,与文本,数字类型无关。而且我的交叉查询是 ...


这只是算法问题而已。你总不能指望Access能直接算出"2:30" + "1:15"="3:45"吧?

所以这是在哪个环节将小数转换为时间格式的问题,与交叉查询何干?

你欺负交叉查询不会说话,这是不对的。



作者: todaynew    时间: 2011-2-20 10:39
简 发表于 2011-2-20 09:21
我并没有用到有“#”之类的地方呀,而且“#”也只是代表日期,与文本,数字类型无关。而且我的交叉查询是 ...

在原例的基础上,按以下步骤进行即可:

1、在模块中写一个自定义函数:

Function hhmm(h As Single)
    hhmm = Format(Int(h), "00") & ":" & Format(Int((h - Int(h)) * 60), "00")
End Function

2、以原交叉查询为基础,做一选择查询:

SELECT qryGrLb.工序, qryGrLb.操作工, hhmm(nz([总计 工时],0)) AS 总计, hhmm(nz(qryGrLb.刨普通,0)) AS 刨普通, hhmm(nz(qryGrLb.刨下模,0)) AS 刨下模, hhmm(nz(qryGrLb.普通,0)) AS 普通
FROM qryGrLb;

作者: 简    时间: 2011-2-20 19:23
本帖最后由 简 于 2011-2-20 20:15 编辑
todaynew 发表于 2011-2-20 10:39
在原例的基础上,按以下步骤进行即可:

1、在模块中写一个自定义函数:
我将你的代码加入我的数据库中,运行却是错误,不能正常运行。

另外,我想了想,从你的代码上来看,你是把字段的类型设置为数字型,保存的是小时形式,而不是(小时:分),然后再在SQL的查询语句中通过hhmm()函数来转换,使之在查询中显示为(小时:分)。

你的SQL我想到一个问题,你的列标题即工时类别的值是固定的,如果以后在工时类别上增加或删除或修改了某个值,比如把刨下模改成刨凹模,那代码上是不是也要相应的修改呢?后期的维护又如何考虑这个问题呢。

作者: todaynew    时间: 2011-2-20 20:33
本帖最后由 todaynew 于 2011-2-20 21:09 编辑
简 发表于 2011-2-20 19:23
我将你的代码加入我的数据库中,运行却是错误,不能正常运行。

另外,我想了想,从你的代码上来看,你是 ...


可以根据交叉查询动态设置选择查询,具体方法可参见以下示例中窗体1中的代码:

[attach]44885[/attach]
作者: zhaoqs3    时间: 2011-9-6 15:02
高手们,能留下联系方式吗??我有问题解决不了,5555555




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3