关于设计时录入ADOQUERY语句 |
答題得分者是:cashxin2002
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
各位前辈好,我有一段代码如下:在程序编绎与运行时完全正常
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select 项目类型,Sum(单项累计) from tb_sf where 收费日期 between :Date1 and :Date2')
ADOQuery1.Parameters.ParamByName('Date1').Value := formatdatetime('yy-m-d',DateTimePicker1.Date);
ADOQuery1.Parameters.ParamByName('Date2').Value := formatdatetime('yy-m-d',DateTimePicker2.Date);
ADOQuery1.Open;
现在我改为SQL语句在设计时就录入,SQL中就录入 'select 项目类型,Sum(单项累计) from tb_sf where 收费日期 between :Date1 and :Date2')
然后parameters中填入formatdatetime('yy-m-d',DateTimePicker1.Date);
如图:
为什么将ACTIVE设为TRUE时提示标准表达式中数据类型不匹配,(前辈们注意我问题中的代码如果不在设计时录入,而在运行时执行的话,是没有任何问题的。)
------
我的编程起步于ktop,我将永远支持ktop |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
我的另一段代码,是写在ADOquery属性中SQL里的:
select 医生姓名,
sum(iif(项目类型 = '西药费',单项累计,0)) as 西药费,
sum(iif(项目类型 = '中成药费',单项累计,0)) as 中成药费,
sum(iif(项目类型 = '中草药费',单项累计,0)) as 中草药费,
sum(单项累计) as total
from tb_sf
group by
医生姓名
union all
select '合計' as 医生姓名,
sum(iif(项目类型 = '西药费',单项累计,0)) as 西药费,
sum(iif(项目类型 = '中成药费',单项累计,0)) as 中成药费,
sum(iif(项目类型 = '中草药费',单项累计,0)) as 中草药费,
sum(单项累计) as total
from tb_sf
运行也完全正常,哪位高手指点一下,如何在上述代码中插入“收费日期 between :date1 and date2"这个条件,ADOQuery1.Parameters.ParamByName('Date1').Value 这个写在何处?上面的问题其实和我问的这个问题是一个意思
------
我的编程起步于ktop,我将永远支持ktop |
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗
begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select 医生姓名, '); ADOQuery1.SQL.Add(' sum(iif(项目类型 = "西药费",单项累计,0)) as 西药费,'); ADOQuery1.SQL.Add(' sum(iif(项目类型 = "中成药费",单项累计,0)) as 中成药费,'); ADOQuery1.SQL.Add(' sum(iif(项目类型 = "中草药费",单项累计,0)) as 中草药费,'); ADOQuery1.SQL.Add(' sum(单项累计) as total'); ADOQuery1.SQL.Add(' from tb_sf group by 医生姓名'); union all ADOQuery1.SQL.Add('select '合計' as 医生姓名, '); ADOQuery1.SQL.Add(' sum(iif(项目类型 = "西药费",单项累计,0)) as 西药费,'); ADOQuery1.SQL.Add(' sum(iif(项目类型 = "中成药费",单项累计,0)) as 中成药费,'); ADOQuery1.SQL.Add(' sum(iif(项目类型 = "中草药费",单项累计,0)) as 中草药费,'); ADOQuery1.SQL.Add(' sum(单项累计) as total'); from tb_sf ADOQuery1.open; end; //SQL原本就是字串形態﹐在字串中包含字串時(如西藥費)﹐需要在此字串左右再各加一個引號================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟 |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗ 試試這樣﹕
begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select 医生姓名, '); ADOQuery1.SQL.Add(' sum(iif(项目类型 = "西药费",单项累计,0)) as 西药费,'); ADOQuery1.SQL.Add(' sum(iif(项目类型 = "中成药费",单项累计,0)) as 中成药费,'); ADOQuery1.SQL.Add(' sum(iif(项目类型 = "中草药费",单项累计,0)) as 中草药费,'); ADOQuery1.SQL.Add(' sum(单项累计) as total'); ADOQuery1.SQL.Add(' from tb_sf group by 医生姓名 union '); ADOQuery1.SQL.Add('select '合計' as 医生姓名, '); ADOQuery1.SQL.Add(' sum(iif(项目类型 = "西药费",单项累计,0)) as 西药费,'); ADOQuery1.SQL.Add(' sum(iif(项目类型 = "中成药费",单项累计,0)) as 中成药费,'); ADOQuery1.SQL.Add(' sum(iif(项目类型 = "中草药费",单项累计,0)) as 中草药费,'); ADOQuery1.SQL.Add(' sum(单项累计) as total from tb_sf'); ADOQuery1.open; end;================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟 |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
JustinShen
中階會員 發表:22 回覆:104 積分:80 註冊:2003-09-20 發送簡訊給我 |
引言: ADOQuery1.SQL.Add('select '合計' as 医生姓名, '); 这一句在编绎时无法通过,我后来将合计又加了两个引号变成了''合計'',后来编绎就通过了,但运行时还是出现上面的如图错误,我点了OK后,再点步越到下一步,统计结果就正确无误地出来了,一切正常。不知道这个错误错在哪里?我不知道用IIF要不要引用什么单元的? 發表人 - ntjrr 於 2005/07/11 18:19:23我觉得您的SQL语句不完整,虽然出来结果却是容错之后的,原来在Query里的语句为什么要删除呢? union all ADOQuery1.SQL.Add('select '合計' as 医生姓名, '); ADOQuery1.SQL.Add(' sum(iif(项目类型 = '西药费',单项累计,0)) as 西药费,'); ADOQuery1.SQL.Add(' sum(iif(项目类型 = '中成药费',单项累计,0)) as 中成药费,'); ADOQuery1.SQL.Add(' sum(iif(项目类型 = '中草药费',单项累计,0)) as 中草药费,'); ADOQuery1.SQL.Add(' sum(单项累计) as total'); from tb_sf 红色的两句为什么不Add进去? 字符串当然要加引号了。 IIF使用在SQL语句中由数据库引擎执行,不需要use任何单元。 另外,对于日期型参数使用DateTimeToStr转换成字符串加到Where子句中就可以了。 当然也要加引号,最好这样: QuotedStr(DateTimeToStr(Datetimepicker1.Date)) 加进去就好了 Justin Shen
------
==================== 我为一切作努力! Justin Shen |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
deity
尊榮會員 發表:90 回覆:876 積分:678 註冊:2003-05-09 發送簡訊給我 |
插个花:
begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select 医生姓名, '); ADOQuery1.SQL.Add(' sum(iif(项目类型 = "西药费",单项累计,0)) as 西药费,'); ADOQuery1.SQL.Add(' sum(iif(项目类型 = "中成药费",单项累计,0)) as 中成药费,'); ADOQuery1.SQL.Add(' sum(iif(项目类型 = "中草药费",单项累计,0)) as 中草药费,'); ADOQuery1.SQL.Add(' sum(单项累计) as total'); ADOQuery1.SQL.Add(' from tb_sf'); ADOQuery1.SQL.Add(' Where THETIME between:date1 and :date2); ADOQuery1.SQL.Add(' group by 医生姓名'); ADOQuery1.SQL.Add(' union all'); ADOQuery1.SQL.Add(' select "合計" as 医生姓名,'); ADOQuery1.SQL.Add(' sum(iif(项目类型 = "西药费",单项累计,0)) as 西药费,'); ADOQuery1.SQL.Add(' sum(iif(项目类型 = "中成药费",单项累计,0)) as 中成药费,'); ADOQuery1.SQL.Add(' sum(iif(项目类型 = "中草药费",单项累计,0)) as 中草药费,'); ADOQuery1.SQL.Add(' sum(单项累计) as total'); ADOQuery1.SQL.Add(' from tb_sf '); ADOQuery1.SQL.Add(' Where THETIME between:date1 and :date2); ADOQuery1.Parameters.ParamByName('Date1').DataType:=ftDate;//或ftDateTime ADOQuery1.Parameters.ParamByName('date1').Value :=DateTimePicker1.datetime; ADOQuery1.Parameters.ParamByName('Date2').DataType:=ftDate;//或ftDateTime ADOQuery1.Parameters.ParamByName('date2').Value :=DateTimePicker2.datetime; ADOQuery1.open; end;试试看吧,注意空格及“”符号。 ============================ 为什么经过多年以后,得失的过程如此冷漠 ============================ |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
deity
尊榮會員 發表:90 回覆:876 積分:678 註冊:2003-05-09 發送簡訊給我 |
|
JustinShen
中階會員 發表:22 回覆:104 積分:80 註冊:2003-09-20 發送簡訊給我 |
引言: deity 大大的程式编绎能通过,运行时日期条件也能生效,但合计一行没有数字产生。另外,我上面提到的问题不懂为什么还是存在,我仔细一步一步测试了看一下,运行到ADOQuery1.SQL.Add(' sum(单项累计) as total');能正常通过,运行到 ADOQuery1.SQL.Add(' from tb_sf');就出现了如图错误:您看看我做的源码能不能用,我用了两种方法执行您的Query。 源码:http://delphi.ktop.com.tw/topic.php?TOPIC_ID=74810 Justin Shen ================================= 如果能帮到您,我会很开心;如果能得到您的帮助,是我的荣幸 =================================
------
==================== 我为一切作努力! Justin Shen |
deity
尊榮會員 發表:90 回覆:876 積分:678 註冊:2003-05-09 發送簡訊給我 |
ntjrr您好:
1、求不到Total的值,是因为共用同一个参数传值,所以不行。
2、报那个错误信息,疑为字串太长?改为如下这种写法,即可
procedure TForm1.Button1Click(Sender: TObject); begin ADOQuery2.Close; ADOQuery2.SQL.Clear; ADOQuery2.SQL.Text:='select 医生姓名,' ' sum(iif(项目类型 = "西药费",单项累计,0)) as 西药费,' ' sum(iif(项目类型 = "中成药费",单项累计,0)) as 中成药费,' ' sum(iif(项目类型 = "中草药费",单项累计,0)) as 中草药费,' ' sum(单项累计) as total' ' from tb_sf' ' where (TheDate between :d1 and :d2)' ' group by 医生姓名' ' union all' ' select "合計" as 医生姓名,' ' sum(iif(项目类型 = "西药费",单项累计,0)) as 西药费,' ' sum(iif(项目类型 = "中成药费",单项累计,0)) as 中成药费,' ' sum(iif(项目类型 = "中草药费",单项累计,0)) as 中草药费,' ' sum(单项累计) as total' ' from tb_sf' ' where (TheDate between :d3 and :d4)' ; ADOQuery2.Parameters.ParamByName('d1').DataType:=ftDate;//或ftDateTime ADOQuery2.Parameters.ParamByName('d1').Value :=DateTimePicker1.datetime; ADOQuery2.Parameters.ParamByName('d2').DataType:=ftDate;//或ftDateTime ADOQuery2.Parameters.ParamByName('d2').Value :=DateTimePicker2.datetime; ADOQuery2.Parameters.ParamByName('d3').DataType:=ftDate;//或ftDateTime ADOQuery2.Parameters.ParamByName('d3').Value :=DateTimePicker1.datetime; ADOQuery2.Parameters.ParamByName('d4').DataType:=ftDate;//或ftDateTime ADOQuery2.Parameters.ParamByName('d4').Value :=DateTimePicker2.datetime; ADOQuery2.Active:=True; end;============================ 为什么经过多年以后,得失的过程如此冷漠 ============================ |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
deity 大大,您所说的我在其它版面FISHMAN大大给我的指点是存在的,因为FISHMAN大大想法设法已经解决了我所提出的那个问题,所以我就结了案,这次的问题是那个问题的延续,因为他的查询是在ADOQUERY中的SQL属性中的,当然查询结果完全正常,但我不懂如何写在事件中直接运行,所以才到此再次提问的。您这次为我的问题实在也费了不少心,最终小弟用您的代码解决了我所提出的所有问题,谢谢您的指点。您的代码最终我只变换了一点点 adoquery1.Parameters.ParamByName('d1').Value :=formatdatetime('yy-m-d',DateTimePicker1.Date);如果不这样改的话查询结果不精确,如今天是12号,我收了一个费,如果我查12到12号查不到结果,但查11号到12号就查到了,如果改成我上面那一行代码,不懂怎么的就全部好了。感谢DEITY大大,及本次给小弟指点的各位大大。
------
我的编程起步于ktop,我将永远支持ktop |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |