一个问题SQL中的WHERE(50分)

Z

zytzjx

Unregistered / Unconfirmed
GUEST, unregistred user!
我想请教一个问题:就是Select * from TableName where 这个后面怎么写的问题:我的表中有一个字段叫编号
用户可以增加。也就是where 编号= x1 or 编号 = x2 or 编号=xn;有n个,这完全是用户来定的。怎么写最简单呀。
我现在是把用用户要查的编号先放在TLIST中,然后用循环来把这个SQL语句写完整的。有没有别的好的方法。这个方法真是笨的。
 
你可以这样写:
select * from TableName where 编号 in (x1,x2,x3,...,xn)
把(x1,x2,x3,...,xn)用一个字符串变量代替,这个字符串变量的赋傎应该不难了。
 
select * from TableName where 编号 in :)x1,:x2,:x3,...,:xn),能这样用吗,
还有,可以用一个数组就好了,可以吗
 
对, 用in, 但如果你不只编号这一个字段需要这样做的话就比较麻烦了
可以用逐级筛选的方法。
另外告诉你一个方法:
在写动态SQL语句时,最好这样写
Select 。。。。From 。。。 where 1=1
这样你以后添加where子句时,就直接添加 ‘ and 。。。。’
就可以了
 
这儿还有一个问题:就是我有一个客户表,主表,还有一个销售表,是子表,这两个表中都
有一个字段"编号",一个客户要是来买东西了,那么我要是打印他买东西的呢,不要把以前
买过的也打印,还要能保存到子表中,以后可以查。怎么做呀,最好不用时间,因为可能给一个
客户打单有一小时,或几小时的,有的上午来了,下午又来了,我想用一临时表,但不知道怎么用的。
我的子表中有一个ID是自增段。请帮助.
 
上午买的,下午再买当然是不能打单的。
 
那就给子表加个状态字段了,很多公司都是这样做的
比如给销售子表加个status,当给客户打印过之后就改为P,没有打印的为N,这
样就很容易区分开了
 
谢谢,这个方法好呀
 
还有一个问题,就是我LOCATE之后定位了一条记录,我要在DBGRID中,把这条记录作为
显示的第一条,怎么做,也就是让DBGRID滚一下,还有滚动时的刷新问题。
 
Locate之后,DBGrid会自动滚到该行呀
 
但是在DBGrid中不是看不是第一行呀,会在表的中间的。我的要求是如果要是表的记录有顺序的
话,在DBGrid中看不一条比这个这记录前的。如果要看就只能用滚动条,或者是UP才可以。
而LOCATE之后,只是定位到这条记录,还是在DBGrid的中间的。
 
哦,这个就比较难了,给你一段VCL源程序,你先琢磨着吧
procedure TCustomDBGrid.UpdateScrollBar;
var
SIOld, SINew: TScrollInfo;
begin
if FDatalink.Active and HandleAllocated then
with FDatalink.DataSet do
begin
SIOld.cbSize := sizeof(SIOld);
SIOld.fMask := SIF_ALL;
GetScrollInfo(Self.Handle, SB_VERT, SIOld);
SINew := SIOld;
if IsSequenced then
begin
SINew.nMin := 1;
SINew.nPage := Self.VisibleRowCount;
SINew.nMax := Integer(DWORD(RecordCount) + SINew.nPage - 1);
if State in [dsInactive, dsBrowse, dsEdit] then
SINew.nPos := RecNo; // else keep old pos
end
else
begin
SINew.nMin := 0;
SINew.nPage := 0;
SINew.nMax := 4;
if FDataLink.BOF then SINew.nPos := 0
else if FDataLink.EOF then SINew.nPos := 4
else SINew.nPos := 2;
end;
if (SINew.nMin <> SIOld.nMin) or (SINew.nMax <> SIOld.nMax) or
(SINew.nPage <> SIOld.nPage) or (SINew.nPos <> SIOld.nPos) then
SetScrollInfo(Self.Handle, SB_VERT, SINew, True);
end;
end;
 
每用一个
在后面加一个' or'
最后,加上一个恒等式就好了
如: 编号= x1 or
 
用循环放到In (...,...,...)中也可以吧,至少SQL要短一些
 
DBGRid的问题,Show?????????????
 
多人接受答案了。
 
顶部