急!急!请问如何从一个表中任意挑选一些记录从报表中打印出来?(100分)

  • 主题发起人 主题发起人 xmboy
  • 开始时间 开始时间
X

xmboy

Unregistered / Unconfirmed
GUEST, unregistred user!
急!急!请问如何从一个表中任意挑选一些记录从报表中打印出来?
要求首先要设定一条件缩小范围(如年龄 学历 专业),再从中挑选记录。
Access97表DWRY结构如下:
姓名 XM CHAR(8)
性别 XB CHAR(2)
出生年月 CSNY DATE
身份证号 SFZH CHAR(18)
学历 XL CHAR(8)
学校 XX CHAR(40)
专业 ZY CHAR(40)

思路:用动态查询来缩小范围,设立标志位从中挑选记录。
SELECT false AS 是否打印,XM as 姓名,
XB AS 性别,CSNY AS 出生年月,
SFZH AS 身份证号,XL AS 学历,
XX AS 学校,ZY AS 专业
FROM DWRY
WHERE 学历=:XL AND 专业=:ZY
问题:在修改标志位(是否打印)时出现错误提示:
“General SQL Error.
由于别的用户或进程已经锁定相应的记录或表,不能更新字段。
Field.”
注:TQuery的RequestLive已设为True。没有别的用户或进程在使用该记录或表。
另:是否有更好的解决方法。
 
上面的错误是有"false"造成的,把false替换成别的即可。
 
SELECT 0 AS 是否打印,
XM as 姓名,
XB AS 性别,
CSNY AS 出生年月,
SFZH AS 身份证号,
XL AS 学历,
XX AS 学校,
ZY AS 专业FROM DWRY
WHERE 学历=:XL AND 专业=:ZY
 
我已经把false替换成别的了(0 '否' '0'),但是还是不行。在修改标志位(是否打印)时仍旧出现错误提示:“General SQL Error.由于别的用户或进程已经锁定相应的记录或表,不能更新字段。Field.”
是否有其它解决方法。


 
你要修改表?但你的基本表中没有这么一个标志位呀!!!!你准备修改哪个表中的此字段?
你用的这条语句相当创建了一个视图,其中一个字段是你自己赋的一个恒值。
我猜你的意思是要设一个标志位字段,已打印的设置为true,没打印的设置为false;那么你要改数据结构,在表中添一个标志位字段。如表结构为:
姓名 XM CHAR(8)
性别 XB CHAR(2)
出生年月 CSNY DATE
身份证号 SFZH CHAR(18)
学历 XL CHAR(8)
学校 XX CHAR(40)
专业 ZY CHAR(40)
是否打印 ifprint bit(sql server)
sql 语句应为:
SELECT ifprint AS 是否打印,
XM as 姓名,
XB AS 性别,
CSNY AS 出生年月,
SFZH AS 身份证号,
XL AS 学历,
XX AS 学校,
ZY AS 专业
FROM DWRY WHERE 学历=:XL AND 专业=:ZY
这样你把Query的RequestLive设为True,则可修改了。
 
别让别人才你想要做什么好不好.
如果是mdb数据库,你可以把视图,参数建立在库中,
利用tparament对象修改标志.
 
可能是我的意图表达得不够清楚,正如 sonie 所说我的意思就是要设一个标志位
字段,已打印的设置为true,没打印的设置为false;但是改变数据结构,在表中添
一个标志位字段,虽然可以实现以上功能,但是多人操作时则会出现问题。
g622的意思我没听明白,据我所知Access数据库的视图在Delphi的BDE中是看不到
的。能不能说得更具体些。
 
用TTOREDPROC控件,即可看见Access数据库中的视图了.
 
亲爱的,你的这个字段在基表中不存在,怎么改?放在内存中,关机以后,该值会怎么确定?
多人操作会出什么问题,可以探讨。
 
哈!突然发现 sonie 也误解了我的本意。我的本意是这样:
我有一个基表,现要从表中任意挑选一些记录从报表中打印出来,就好比一个菜单,
顾客点完菜后,把顾客所点的菜打一清单出来,我并不须要保留顾客所点菜单的细
目,只须把清单打出即可。同时有可能有多个顾客在点菜要求不他们之间不相互影
响。
请不要被我的思路所误导,基它解决方法也可。
另:To g622 where to download TTOREDPROC
 
我个人觉得这个问题似乎并不复杂,不用修改数据库里的数据,可以在选择是否打印的时候,重新定义SQL语句,再将重新定义SQL语句后选出的数据打印出来不就可以了吗?
 
Jack1能不能详细说明一下。
 
是啊,那就根本不存在要修改数据库的任何数据。
当然也可以create一个临时表,用户'点菜'把‘菜单'写进出,点完后打印并删除该记录。
我觉得你的流程没搞清楚。
 
我的看法是这样的:比如用QUERY控件,定义SQL来取出需要显示的记录,然后让用户去选择需要打印的字段,在用户选择完毕后,他需要按一个按钮,那就在按钮的事件里设置去检测用户选择的字段,定义新的SQL字符串,将这个SQL字符串发送给报表窗口中的QUERY控件里的SQL,让它去选择用户定义的字段进行打印。当然报表要事先设置得很灵活。不知行不行,你试一下再告诉我结果我们再讨论。
 
如象sonie所说,create一个临时表,用户'点菜'把‘菜单'写进出,点完后打
印并删除该记录,则用户在点菜过程中无法知到那些菜点了那些没点。
To jack1 我的目的不是选打印字段,而是任意不定序地选择要打印的记录。
如下图:用一DBGrid现示所有的记录
*****************************************************
是否打印 姓名 性别 出生年月 身份证号 学历 学校 专业
* 小张 男 ....
小李 女 ....
* 小王 女 ....
小黄 男 ....

*****************************************************

用户可根据需要将要打印的记录打上'*' 号,明的了吗?
 
好说好说。你早就应把上图贴出来了。
我碰到过同样的问题,是这样做的。
在FORM中放置两个DBGRID:一个显示所有记录,一个放置要打印的记录(对应一个临时表)。
当双浏览DBGRID中的某记录时,在一个临时表中增加此记录,显示在要打印的
DBGRID中,再双击则在临时表中删除表示不打印。打印后删除临时表即可。当然为
了不防碍其他用户,临时表处理上要下一点功夫,如:放在本地、以用户登录名命
名、放在内存等.....
 
sonie您好,谢谢你的解答。你的方法可以解决我的问题,但不是最好的,
我曾在一个VFoxpro编写的系统中看到类以的情况,它是在“是否打印”插入
一个CheckBox 这样用户就很容易知道那些记录已经选过的,那些是未选
的,而且不会重复选择,由于没源码我无法知道它的实现方法。我想
在Delphi 中应该也可以实现。
 
明天再说吧,要去睡觉了。要不....
 
TTOREDPROC 是 d5自带的控件。
考虑加入一个计算子段行不行。
 
这样:
1)本地建立一个临时表,两个字段:身份证号 是否打印标志
2)insert into 本地库:临时表 select 身份证号 from dwry
3)在tquery.sql中多库查询,注意 是否打印标志从本地取
不要用dbgrid,用dbctrlgrid+dblable+dbchexkbox
4)update标志后,在多库查询,条件中加上是否打印标志=true,
ok?

 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
843
import
I
S
回复
0
查看
928
SUNSTONE的Delphi笔记
S
I
回复
0
查看
811
import
I
后退
顶部