sql组合查询问题?!? (50分)

  • 主题发起人 主题发起人 hunter2002
  • 开始时间 开始时间
H

hunter2002

Unregistered / Unconfirmed
GUEST, unregistred user!
程序用到SQL组合查询
假设用到两到三个combobox作为SQL的选择条件,加一个按纽来执行筛选。
如一个学生库,有性别,班级两个选择框,如何精练的编程判断两个选择框是否选中,然后
执行SQL,将上面有值的选择作为WHERE条件参数??我试了试,总是不好解决两个以上参数
间AND 的放置和判断选择问题?!
 
这算什么问题?自已试试,很简单的。
 
ssql:='select * from student where 条件'//有个基本条件
if radiogroup.intemindex=0 then ssql:=ssql+' and 条件1 '
if radiogroup.intemindex=0 then ssql :=ssql+ ' and 条件2'
 
procedure TFORM1.FilterData;
var
BCode, SCode,
oldSQL, SQL:String;

Function EnCodeFilter(FieldName, Value:String):String;
begin//关键在组合第二个参数的时候判断有没有第一个参数存在,如果没有则此参数前要加WHERE,否则加AND
if SQL <> '' then
SQL:= SQL+ ' AND %S=''%S'''
else
SQL:= 'WHERE %S=''%S''';
SQL:= Format(SQL, [FieldName, Value]);
end;
begin
SQL := 'SELECT * FROM tablename ';
SCode := Trim(edtSCode.Text);
Filter := '';

if SCode <> '' then
EnCodeFilter('SCode', SCode);
CCode := Trim(edtCCode.Text);
if CCode <> '' then
EnCodeFilter('CCode', CCode);

CDSS.Close;
CDSS.SQL.Text := SQL;
CDSS.Open;
end;
 
主意字符串要用'',试试看应该没问题
 
query1.close;
query1.sql.clear;
query1.sql.add('select * from 表名 where 姓名<>''');//这句没有实际作用,只是为了后面的语句通顺。
query1.sql.add('and 性别=combobox1.text');
query1.sql.add('and 班级=combobox2.text');
query1.sql.add('and ...........');//此处可加入n个条件。
query1.open;
这种思路简单明了,最主要是为了sql语句的全文通顺。
 
我的一个Unit,可惜不能贴图。//调拨的管理窗体。
//实现了查询,报表,编辑修改,新增。
//
//

unit HarManagerUnt;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, Grids, DBGrids, StdCtrls,Dbclient, DBCtrls,Buttons, ExtCtrls,w_basewindow,
ComCtrls, Menus, Mask;

type
TFrmHarManager = class(TfrmBaseWindow)
Panel6: TPanel;
Bevel5: TBevel;
Bevel2: TBevel;
sbt3: TSpeedButton;
sbt4: TSpeedButton;
sbt5: TSpeedButton;
sbt6: TSpeedButton;
sbt7: TSpeedButton;
Panel3: TPanel;
PanelM: TPanel;
Dbn: TDBNavigator;
ScrollBox1: TScrollBox;
Label1: TLabel;
Label2: TLabel;
DBGrid1: TDBGrid;
dsM: TDataSource;
Sbt1: TSpeedButton;
Bevel1: TBevel;
GroupBox1: TGroupBox;
Splitter1: TSplitter;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label7: TLabel;
Label8: TLabel;
edtGoodsID: TEdit;
cmbUser: TComboBox;
dtpfrom: TDateTimePicker;
dtpTo: TDateTimePicker;
Bevel3: TBevel;
cmbinChkFlag: TComboBox;
edtoperNO: TEdit;
Label6: TLabel;
pomedit: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
sbt2: TSpeedButton;
cmbOutDepartNo: TComboBox;
Panel1: TPanel;
Label9: TLabel;
Label10: TLabel;
cmbInDepartNo: TComboBox;
cmbOutChkFlag: TComboBox;
procedure FormActivate(Sender: TObject);
procedure sbt7Click(Sender: TObject);
procedure sbt3Click(Sender: TObject);
procedure Sbt1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure sbt5Click(Sender: TObject);
procedure sbt6Click(Sender: TObject);
procedure sbt4Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure sbt2Click(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure DBGrid1EditButtonClick(Sender: TObject);
private
{ Private declarations }
fINFlag,fOutFlag:Tfield;
procedure GetUserName(Var cmb:Tcombobox);
procedure GetDepartNo(var cmb:Tcombobox);
procedure InitFace;
function ChechData():Boolean;
procedure GetText(Sender: TField;
var Text: String; DisplayText: Boolean);
public
{ Public declarations }
end;


var
FrmHarManager: TFrmHarManager;

implementation

uses DmStorageUnt, GlobalUnit, HarmonicUnt, RptHarmonicUnt, CheckUnitxhb,
RptSelectDepUnt;
{$R *.DFM}

{ TFrmDispenseManager }
{把部门的信息加到combobox中}
procedure TFrmHarManager.GetDepartNo(var cmb: Tcombobox);
const
str='select * from POSTLEASE.DEPARTMENT';
var P:PDepartInfo;
begin
with dmstorage.cdsGlobal do begin
commandText:=str;
close;
open;
cmb.Items.Clear;
cmb.Items.Add('所有网点');
while not eof do begin
New(P);
P^.DepartName:=FieldByname('DepartName').asstring;
P^.DepartNo:=FieldByname('DepartID').asstring;
cmb.Items.AddObject(P^.DepartNo+'--'+P^.DepartName,Tobject(P));
next;
end;
cmb.ItemIndex:=0;
end;
end;

{把用户的信息加到combobox中}
procedure TFrmHarManager.GetUserName(var cmb: Tcombobox);
const str='select * from userinfo';
begin
with dmstorage.cdsGlobal do begin
close;
commandText:=str;
open;
cmb.Items.Clear;
cmb.items.Add('所有用户');
while not eof do begin
cmb.Items.Add(FieldByname('UserName').asstring);
next;
end;
cmb.ItemIndex:=0;
end;
end;

{初始化窗口}
procedure TFrmHarManager.InitFace;
begin
edtGoodsId.text:='';
dtpfrom.date:=date-7;
dtpto.date:=date;
label1.Caption:=caption;
label2.Caption:=caption;
edtoperNo.Text:='';
label1.Left:=Trunc((panelM.Width-label1.Width)/2);
label2.Left:=label1.Left-1;
end;

procedure TFrmHarManager.FormActivate(Sender: TObject);
begin
InitFace;
GetUserName(cmbUser);
GetDepartNO(cmbOutDepartNo);
cmbInDepartNo.Items.Assign(cmbOutDepartNo.Items);
cmbInDepartNo.ItemIndex:=0;
end;

{关闭窗口}
procedure TFrmHarManager.sbt7Click(Sender: TObject);
begin
close;
end;

{把两个日期控件的日期作为条件}
function TFrmHarManager.ChechData: boolean;
begin
result:=False;
if dtpTo.Date<dtpFrom.date then begin
gf_warn('结束日期要小于开始日期!');
result:=False;
abort;
end;
result:=true;
end;

{查询}
procedure TFrmHarManager.sbt3Click(Sender: TObject);
const
str=' AND TO_char(A.ATTDATE,''YYYY-MM-DD'') BETWEEN ''%S'' AND ''%S''';
msg='共 %D 条记录,分配总量合计为:%S';
var s:string;
begin
if not ChechData then exit;
strSQl:=Format(str,[formatdatetime('yyyy-mm-dd',dtpFrom.date),Formatdatetime('yyyy-mm-dd',dtpTo.date)]);
if trim(edtGoodsID.Text)<>'' then
strSql:=strSQl+' and goodsid like ''%'+trim(edtgoodsid.text)+'%''';
with cmbOutdepartNO DO BEGIN
if ItemIndex>0 then
strSql:=strsql+' and OutDepNO like '''+
PdepartInfo(Items.Objects[itemindex])^.departNO+'''';
end;
with cmbIndepartNO DO BEGIN
if ItemIndex>0 then
strSql:=strsql+' and InDepNO like '''+
PdepartInfo(Items.Objects[itemindex])^.departNO+'''';
end;
if cmbuser.ItemIndex>0 then
strsql:=strsql+' and attman like '''+cmbuser.items.Strings[cmbuser.itemindex]+'''';
if cmbInChkFlag.ItemIndex=1 then
strsql:=strsql+' and INflag like ''T''';
if cmbInchkflag.ItemIndex=2 then
strsql:=strsql+' and INflag like ''F''';
if cmbOutChkFlag.ItemIndex=1 then
strsql:=strsql+' and Outflag like ''T''';
if cmbOutchkflag.ItemIndex=2 then
strsql:=strsql+' and Outflag like ''F''';

if Length(Trim(edtoperNO.text))>0 then
strsql:=strsql+' and OPERATORNO='''+edtoperno.Text+'''';

strsql:=strsql+' order by OutdepNO';
with dsM.DataSet as tclientdataset do begin
//showmessage(strsql);
Data:=DataRequest(strSQL);
Filter:='';
Panel1.Caption:=Format(msg,[RecordCount,vartostr(FieldByname('sumAttnum').value)]);
//关联OngetText到DM的已有事件//
fInflag:=Fields.FindField('InFlag');
fOutflag:=Fields.FindField('OutFlag');
if assigned(fInflag) then
fInFlag.OnGetText:=GetText;//dmstorage.cdsCheckStorageMCHECKFLAGGetText;
if assigned(fOutflag) then
fOutFlag.OnGetText:=GetText;//dmstorage.cdsCheckStorageMCHECKFLAGGetText;
end;
end;

{新增一张调拔单}
procedure TFrmHarManager.Sbt1Click(Sender: TObject);
begin
with TFrmHarmonic.Create(self) do
Try
caption:=TBitbtn(sender).caption;
ShowModal;
Finally
free;
end;
end;

procedure TFrmHarManager.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
with dsM.dataset as Tclientdataset do
begin
if state in [dsedit,dsinsert] then
post;
if ChangeCount> 0 then
if gf_Question('目前有未更新的数据,要更新吗?') then
begin
ApplyUpdates (0);
end else
close
else
close;
end;
dbgrid1.ReadOnly:=True;
dbgrid1.Color:=$00E4FCEF;
Action:=caFree;
end;

{保存}
procedure TFrmHarManager.sbt5Click(Sender: TObject);
begin
with dsM.dataset as Tclientdataset do
begin
if state in [dsedit,dsinsert] then
post;
if ChangeCount> 0 then
ApplyUpdates (0);
end;
dbgrid1.ReadOnly:=True;
dbgrid1.PopupMenu:=nil;
dbgrid1.Color:=$00E4FCEF;
end;

{取消更新}
procedure TFrmHarManager.sbt6Click(Sender: TObject);
begin
with dsM.dataset as Tclientdataset do
if ChangeCount>0 then
CancelUpdates ;
end;

{打印调拔单}
procedure TFrmHarManager.sbt4Click(Sender: TObject);
var sFilter:string;
D:TClientDataset;
begin
D:=(Dbgrid1.DataSource.DataSet as TClientDataSet);
if (Not D.Active)or (D.IsEmpty) then exit;
if not Assigned(FrmRptSelectDep) then
FrmRptSelectDep:=TFrmRptSelectDep.Create(nil);
Try
sFilter:=D.Filter;
D.DisableControls;
if FrmRptSelectDep.ShowModal=mrOK then begin
D.Filter:=FrmRptSelectDep.GetSelectStr;
D.Filtered:=True;
with TFrmRptHarmonic.Create(self) do begin
Try
if FrmRptSelectDep.NeedPrv then QuickRep1.Preview else QuickRep1.Print;
Finally
free;
End;
End;
End;
Finally
D.Filter:=sFilter;
D.Filtered:=True;
D.EnableControls;
End;
end;

procedure TFrmHarManager.GetText(Sender: TField; var Text: String;
DisplayText: Boolean);
begin
if Sender.AsString='F' then text:='未确认' else
if Sender.AsString='T' then text:='已确认' else
Text:=Sender.AsString;
end;

{修改编辑}
procedure TFrmHarManager.N2Click(Sender: TObject);
begin
inherited;
with dsM.DataSet as TClientdataset do begin
if (FieldByname('OutFlag').asstring='T')or(FieldByname('InFlag').asstring='T') then begin
gf_warn('该记录已经审核,不能修改!');
abort;
end;
if FieldByname('AttMan').asstring<>userinfo.UserName then begin
gf_warn(' 只能修改本人调拨的记录!');
abort;
end;
dbgrid1.ReadOnly:=False;
//if dgRowSelect in Dbgrid1.Options then
// dbgrid1.Options:=dbgrid1.Options-[dgRowSelect];
//if dgEditing in Dbgrid1.Options then
// dbgrid1.Options:=dbgrid1.Options+[dgEditing];
if TMenuItem(sender).name='N1' then edit else delete;
//Post;
end;
end;

procedure TFrmHarManager.sbt2Click(Sender: TObject);
var i:integer;
begin
inherited;
with dbgrid1 do begin
Color:=$00FAECE7;
PopupMenu:=pomedit;
{for i:=0 to Columns.Count -1 do begin
if not ((i=1)or(i=5)) then dbgrid1.Columns.ReadOnly:=True;
end;}
end;
end;

procedure TFrmHarManager.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
inherited;
{TODO : 设置工具条的快键}
case key of
{vk_HOME: Sbt1.Click ;
vk_Up: Sbt2.Click ;
vk_DOWN: Sbt3.Click ;
vk_END: Sbt4.Click ;
vk_F2: SBt6.click;}
vk_F3: SBt1.click;
VK_F4: SBt2.Click;
//vk_f5: Sbt9.Click ;
//vk_f6: Sbt10.click;
//vk_F7: SBt11.Click;
vk_F9: SBt3.Click;
vk_F10: SBt4.Click;
vk_F11: SBt5.Click;
vk_F12: SBt6.Click;
vk_ESCAPE: Sbt7.Click ;
end;
end;

procedure TFrmHarManager.DBGrid1EditButtonClick(Sender: TObject);
var fGG,fPZMC,fLBMC,fPM,fDW,fDJ,fYXGSMC:TFIeld;
begin
inherited;
if Dbgrid1.ReadOnly then exit;
with TFrmcheckxhb.Create(self) do begin
Try
if ShowModal=MROK Then
if dsM.DataSet<> Nil then
with dsM.DataSet as TClientdataset do begin
fGG:=Fields.FindField('GG');
fPZMC:=Fields.FindField('PZMC');
fLBMC:=Fields.FindField('LBMC');
fPM:=Fields.FindField('PM');
fDW:=Fields.FindField('DW');
fDJ:=Fields.FindField('DJ');
fYXGSMC:=Fields.FindField('YXGSMC');
edit;
if Assigned(fGG) then
FieldByname('GG').asstring:=Dmstorage.cdsItem.fieldbyname('GG').asstring;
if Assigned(fPZMC) then
FieldByname('PZMC').asstring:=Dmstorage.cdsItem.fieldbyname('PZMC').asstring;
if Assigned(fLBMC) then
FieldByname('LBMC').asstring:=Dmstorage.cdsItem.fieldbyname('LBMC').asstring;
if Assigned(fPM) then
FieldByname('PM').asstring:=Dmstorage.cdsItem.fieldbyname('PM').asstring;
if Assigned(fDW) then
FieldByname('DW').asstring:=Dmstorage.cdsItem.fieldbyname('DW').asstring;
if Assigned(fDJ) then
FieldByname('DJ').asFloat:=Dmstorage.cdsItem.fieldbyname('DJ').asFloat;
if Assigned(fYXGSMC) then
FieldByname('YXGSMC').asstring:=Dmstorage.cdsItem.fieldbyname('YXGSMC').asstring;

FieldByname('GOODSID').asstring:=Dmstorage.cdsItem.fieldbyname('YXID').asstring;
end;
Finally
Frmcheckxhb.Free;
end;
end;
end;

end.
 
procedure TForm1.Button1Click(Sender: TObject);
var
strSql:string;
begin
//全没录入
if (ComboBox1.ItemIndex=-1) and (ComboBox2.ItemIndex=-1) then
strsql:='select * from table '
else
strsql:='select * from table where ';

//判断是否录入
if ComboBox1.ItemIndex<>-1 then
strsql:=strsql+' sex='+#39+ComboBox1.Text+#39;

//判断是否录入
if (ComboBox2.ItemIndex<>-1) and (ComboBox1.ItemIndex<>-1) then
strsql:=strsql+' and class='+#39+ComboBox2.Text+#39
else if (ComboBox2.ItemIndex<>-1) and (ComboBox1.ItemIndex=-1) then
strsql:=strsql+' class='+#39+ComboBox2.Text+#39;

//查询

end;
 
对于ugvanxk的答案,如果不设基本条件的话,有没有办法呢????其他朋友似乎没有考虑
AND的问题,WHERE可以先加在SQL串中,因为我写了判断语句,一定至少有一个条件被选择!
但是AND就不是很好处理了...
 
我上次就问了一个关于组合查询时要用对象的概念来做的问题!怎么这里没有一个
真正用呢?
 
老兄!给点提示啊~~~ 急啊!
 
用的着那么费尽??脑筋活一点好不好!!

var sqlstr:string;
sqlstr:='select xxx from xxx where (1=1)'
if comboboxn.text<>'' then sqlstr:=sqlstr+' and (xxx='''+comboboxn.text+''')';
''''''''''''
''''''''
where (1=1) 永远为true,但是凑齐语法,简化了问题

 
谢谢!!!!加分!!!!
 
后退
顶部