Delphi在SQL Server开发中的几个问题

cybercobra 2000-07-28 09:02:00
各位大虾,小弟刚刚入门,近日在做一个库存管理系统的开发,遇到以下问题,请各位大虾多多指点,多谢!!!

1.Query控件有Refresh过程,但是不能用,一执行就出错,我只好每次都先把Query关闭再打开;
2.我对一个Dbgrid控件进行了查询操作,采用的是修改其对应Query控件的Filter的办法,但是修改后得到的recordcount始终是表内记录的总数;
3.还是那个Query,在窗口打开时修改其Filter,却不起作用;
4.对Query和Table控件的Boolean型域如何设置使其在显示和输入时都显示为汉字,比如'1'对应'完成','0'对应'未完成';
5.在报表中能否设定Dbtext的对齐方式?
6.我的报表由主表数据和明细表数据组成,采取通过主表和明细表的'内部序号'域对应的办法输出,具体的说就是输出一条主表记录,同时输出内部序号与该主表记录相同的明细表记录,但是采取这一办法我发现在刚刚打开窗口的时候打印报表,输出的是明细表的全部记录,而查询后报表打印一切正常;

我用的是Delphi 3和SQL Server 6.5,有点赶不上潮流了 :-)
...全文
313 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cybercobra 2000-08-08
  • 打赏
  • 举报
回复
多谢各位!!!
huliao 2000-08-07
  • 打赏
  • 举报
回复
1. 你的表中应该有一个唯一字段,设为ID,可在Close时记录当前ID,然后Open之后再用Locate重新定位。
var ID: Variant;
begin
...
ID:=Query.FieldByName('id').AsVarinat;
Query.Close;
Query.Open;
Query.Locate('id',ID,[]);
...
end;

6.不知具体是什么情况,不过用一个Query一定可以解决这个问题。
cybercobra 2000-08-06
  • 打赏
  • 举报
回复
谢谢各位,,CSDN这几天上不来,急死我了,目前解决情况总结如下:
1.用关闭再打开的办法对Query进行刷新不会出错,但是每次刷新后就会显示第一条记录,这很麻烦,比如我在对第20条记录进行修改,一刷新就会回到第一条记录,再要显示第20条记录要翻页半天;请问有什么好办法?
2.我改用修改其 SQL 语句的办法,就没有这个问题了,huangshen朋友说的很对
3.同2
4.方法如下:
显示:设置要改变的域的OnGetText事件:
if Query.value='0' then text:='未完成';
if Query.value='1' then text:='已完成';
修改:设置要改变的域的ItemList属性,添加"未完成"和"已完成"两条",然后在OnSetText事件中如下:
if Query.text='未完成' then value:='0';
if Query.text='已完成' then value:='1';
5.如huliao朋友所说,设置QRDBText的Alignment属性
6.没有解决

huliao 2000-07-28
  • 打赏
  • 举报
回复
问题2:
select count(*) from 表 where 条件

问题5:
设置QRDBText的Alignment属性不行吗?

第三个问题没试过,不太清楚。

BTW:对于SQL Sever中Query的刷新,一般都是Close后再Open;
cybercobra 2000-07-28
  • 打赏
  • 举报
回复
to lowhand: 我可以肯定将Query的Filtered设为True了
cybercobra 2000-07-28
  • 打赏
  • 举报
回复
to wsf:
问题2:怎样实现用另一个Query求总?
问题5:我想在报表中的Dbtext能够实现靠左对齐,靠右对齐以及中对齐?
to meijg:
我不能修改库结构,现在我知道实现其显示的方法,就是对Query以及Table中的Boolean域的OnGetText事件写脚本如下即可:
if Query.value='0' then text:='未完成';
if Query.value='1' then text:='已完成';
但此方法对OnSetText事件好像无效,修改及添加记录时显示的仍然是'0'和'1'
meijg 2000-07-28
  • 打赏
  • 举报
回复
建议你直接用SQL语句来实现条件过滤,不要用filter,
要实现数字‘1’到汉字的转换,可以另建一个表,其中设置‘0’--〉‘未完成’,‘1'-->‘完成’,
强烈建议你使用纯SQL语句实现数据库功能
wsf 2000-07-28
  • 打赏
  • 举报
回复
1.query和table都有这样的问题,你的做法是对的.
2.recordcount的属性有问题,它记录的有点不准,你可以用另外一个query进行求总;
3.最好用sql语句;
4.有多种方法,如果你在table或query中的fields editor中加入字段,则可以在每个字段的onsettext事件中设置(不用我教你写吧),如果不加入字段,则可在table,query的afteropen事件中这样设置:
if table.fieldbyname('f1').asboolean then
table.fieldbyname('f1').displaylable;="完成"
5.说详细点.
6.刷新一边试试,即先close后open
lowhand 2000-07-28
  • 打赏
  • 举报
回复
query have a property named "filtered",have you set it to "true"?
huangshen 2000-07-28
  • 打赏
  • 举报
回复
回答第2个问题:
这并不是Delphi的Bug,而是TTable/TQuery的中filter属性的工作机理决定的,因为使用filter方式时先通过BDE先把所有数据取回,然后再作过滤;所以你虽然设置了filter,但recordcount值仍然是BDE中的数据记录数,所以始终是表内记录的总数。如果直接些TQuery的SQL属性,就不会有这个问题了。
wsf 2000-07-28
  • 打赏
  • 举报
回复
sorry,我当时将ongettext写成onsettext.
wsf 2000-07-28
  • 打赏
  • 举报
回复
1.query1:= tquery.create(application);
try
query1.close;
query1.sql.add('select count(*) from tbl1');
query1.open;
tmp:= query1.fields[0].value;
finally
query.free;
end;
2.因该可以,你找找.
3.我已经试过了,在ongettext中
if table1.fieldbyname('f1').boolean=true then
text:= '完成'
else
text:='不完成'

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧