数据库查询(要求复杂和精确都能做到),谁能帮忙!?着急!(200分)

  • 主题发起人 主题发起人 lyxqw3181
  • 开始时间 开始时间
L

lyxqw3181

Unregistered / Unconfirmed
GUEST, unregistred user!
对于一张telcase_log的SQL数据表,想做一个查询模块。
表结构如下:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TelCase_Log]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[TelCase_Log]
GO

CREATE TABLE [dbo].[TelCase_Log] (
[CaseID] [int] IDENTITY (1, 1) NOT NULL ,
[EmployeeID] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[EquipmentID] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[AcceptTime] [datetime] NOT NULL ,
[TelNum] [varchar] (8) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[ServeType] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[ServeChildType] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[AcceptMan] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Engineer] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[finish] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[UserOpinion] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
想按下面条件进行查询:
按case编号caseID
按员工编号EmployeeID
按固定资产编号EquipmentID
按日期时间AcceptTime
按服务类型ServeType
按服务子类型ServeChildType
按受理人AcceptMan
按工程师
按完成情况
按用户反馈

设想用户可以自己选择上面的条件,自己在combobox里面选择运算符(<,>,=,<>,<=,>=,like)
在edit里面输入一个数字或者字符再进行查询。
大家帮帮忙啊!谢谢了
我用ado数据库访问主件+SQL2000。
 
自己写个窗体,让用户自定义查询条件。
可以看看我的软件www.51erp.net,上面的需求很容易搞订的。
 
什么东西啊,都是介绍。
 
在ComboBox.Items中加入你所需的字段,在其OnChange事件中根据不同的字段
设定运算符...
var
cbFields, cbLogic: TComboBox;
...
cbFields.Items.Clear;
cbFields.Items.Add('case编号');
cbFields.Items.Add('员工编号');
...
cbFields.ItemIndex:=-1;
cbLogic.Items.Clear;
...

procedure TGCSelectForm.cbFieldsChange(Sender: TObject);
var
i: integer;
begin
i:=cbFields.ItemIndex;
Case i of
0,1,2,3,4: begin //字符
cbLogic.Items.Clear;
cbLogic.Items.Add('=');
cbLogic.Items.Add('<>');
cbLogic.Items.Add('Like');
end;
5,6,7,8: begin //数字
cbLogic.Items.Clear;
cbLogic.Items.Add('=');
cbLogic.Items.Add('<>');
cbLogic.Items.Add('>');
cbLogic.Items.Add('>=');
cbLogic.Items.Add('<');
cbLogic.Items.Add('<=');
end;
end;
end;
根据不同cbFields及cbLogic组合形成相应的SQL语句
 
你可以建立一个字符串数组,其内容是库的字段实际名称,
将ComboBox显示的内容与之对应起来这样,你可以更方便
地控制...
 
很简单的,刚做完一个类似的查询模块。:)
你可以先建立两个通用函数,进行字段名和连接运算符的转换功能。
在查询时,只需要调用这两个函数,再进行SQL语句上的连接就可以了。
建议,最好再加上字段间的逻辑关系(and,or),这样的查询功能才更强大。
 
1、用 CheckBox 控制复合条件。
2、用户在 ComboBox 中选择不同的运算符触发 OnChange 事件,得到用户所选择的运算符。
3、可以考虑用 DataComboBox 对应库中的字段。
从而生成不同的SQL语句,可以达到你的目的。
 
{*******************************************************}
{ }
{ 缴款通知书查询条件选择 }
{ 作者:antic_ant }
{ }
{ 日期:2002-08-08 }
{ 在FormCreate事件中可以增加查询条件 }
{ 其它的地方不需改动 }
{ }
{*******************************************************}
unit UNoticeFindCondition;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons,DB,ADODB, StdCtrls;

type
PFieldInfo=^RFieldInfo;
RFieldInfo=record
FieldName:string;
DataType:TFieldType;
ListTable:string;
KeyField:string;
ListFeild:string;
ListStyle:Tcomboboxstyle; // csSimple编辑框 csDropDownlist//列表框
end;

PValue=^Rvalue;
Rvalue=record
ListValue:string;
end;
TFrmNoticeFindCondition = class(TForm)
grpbxSelect: TGroupBox;
lblName: TLabel;
lblCompare: TLabel;
lblValue: TLabel;
lblLogic: TLabel;
cmbxLogic: TComboBox;
cmbxCompare: TComboBox;
cmbxNameLst: TComboBox;
cmbxValuelst: TComboBox;
grpbxCondition: TGroupBox;
lstbxCondition: TListBox;
grpbxOperate: TGroupBox;
sbtnAdd: TSpeedButton;
sbtnDel: TSpeedButton;
sbtnFind: TSpeedButton;
sbtnExit: TSpeedButton;
procedure FormCreate(Sender: TObject);
procedure cmbxNameLstChange(Sender: TObject);
procedure sbtnAddClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure sbtnDelClick(Sender: TObject);
procedure sbtnFindClick(Sender: TObject);
procedure sbtnExitClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
SCondition, SShowCondition: TStrings;
Str_condition:string;
end;

var
FrmNoticeFindCondition: TFrmNoticeFindCondition;

implementation

uses Udm_main;

{$R *.dfm}

procedure TFrmNoticeFindCondition.FormCreate(Sender: TObject);
var
FInfo:PFieldInfo;
begin
cmbxNameLst.Clear;
New(FInfo);

FInfo.FieldName:='FNTypeId';
FInfo.DataType:=ftString;
FInfo.ListTable:='FeeVoucherType';
FInfo.KeyField:='FVTypeId';
FInfo.ListFeild:='FVTypeName';
FInfo.ListStyle:=csDropDownList;

cmbxNameLst.Items.AddObject('票据种类',Tobject(FInfo));

New(FInfo);
FInfo.FieldName:='FNId';
Finfo.DataType:=ftString;
FInfo.ListStyle:=csSimple;
cmbxNameLst.Items.AddObject('票据号码',Tobject(FInfo));

New(FInfo);
FInfo.FieldName:='Date_Notice';
Finfo.DataType:=ftDatetime;
FInfo.ListStyle:=csSimple;
cmbxNameLst.Items.AddObject('开票日期',Tobject(FInfo));

New(FInfo);
FInfo.FieldName:='PayerName';
Finfo.DataType:=ftString;
FInfo.ListStyle:=csSimple;
cmbxNameLst.Items.AddObject('付款单位(人)',Tobject(FInfo));

New(FInfo);
FInfo.FieldName:='PayMode';
Finfo.DataType:=ftInteger;
FInfo.ListStyle:=csDropDownList;
cmbxNameLst.Items.AddObject('付款方式',Tobject(FInfo));

New(FInfo);

FInfo.FieldName:='MakerId';
FInfo.DataType:=ftString;
FInfo.ListTable:='sysuser';
FInfo.KeyField:='userid';
FInfo.ListFeild:='userName';
FInfo.ListStyle:=csDropDownList;

cmbxNameLst.Items.AddObject('开票人',Tobject(FInfo));

New(FInfo);

FInfo.FieldName:='OperatorID';
FInfo.DataType:=ftString;
FInfo.ListTable:='sysuser';
FInfo.KeyField:='userid';
FInfo.ListFeild:='userName';
FInfo.ListStyle:=csDropDownList;

cmbxNameLst.Items.AddObject('操作员',Tobject(FInfo));

cmbxNameLst.ItemIndex:=0;
cmbxNameLstChange(sender);
if cmbxvaluelst.Items.Count>0 then cmbxvaluelst.ItemIndex:=0;
cmbxCompare.ItemIndex:=0;
cmbxLogic.ItemIndex:=0;
SCondition:=Tstringlist.Create;
SShowCondition:=Tstringlist.Create;
end;

procedure TFrmNoticeFindCondition.cmbxNameLstChange(Sender: TObject);
var
qry:Tadoquery;
FieldName:string;
ListTable:string;
KeyField:string;
ListFeild:string;
ListStyle:Tcomboboxstyle;
valuelst:Pvalue;
begin
cmbxValuelst.Clear;
FieldName:=PFieldInfo(cmbxNameLst.Items.Objects[cmbxNameLst.ItemIndex])^.FieldName;
ListTable:=PFieldInfo(cmbxNameLst.Items.Objects[cmbxNameLst.ItemIndex])^.ListTable;
KeyField:=PFieldInfo(cmbxNameLst.Items.Objects[cmbxNameLst.ItemIndex])^.KeyField;
ListFeild:=PFieldInfo(cmbxNameLst.Items.Objects[cmbxNameLst.ItemIndex])^.ListFeild;
ListStyle:=PFieldInfo(cmbxNameLst.Items.Objects[cmbxNameLst.ItemIndex])^.ListStyle;
cmbxValuelst.Style:=ListStyle;
if FieldName='PayMode' then
begin
New(valuelst);
valuelst.ListValue:='1';
cmbxValuelst.Items.AddObject('现金',tobject(valuelst));
New(valuelst);
valuelst.ListValue:='2';
cmbxValuelst.Items.AddObject('转帐',tobject(valuelst));
end
else
begin
if ListStyle=csDropDownList then
begin
qry:=createadoqry(dtmdl_main.ADOCnction_main.ConnectionString);
qry.SQL.Clear;
qry.SQL.Add('select * from '+ListTable);
qry.Open;
while not qry.Eof do
begin
New(valuelst);
valuelst.ListValue:=qry.fieldbyname(KeyField).AsString;
cmbxValuelst.Items.AddObject(qry.fieldbyname(ListFeild).AsString ,tobject(valuelst));
qry.Next;
end;
if cmbxValuelst.Items.Count>0 then cmbxValuelst.ItemIndex:=0;
end;
end;
end;

procedure TFrmNoticeFindCondition.sbtnAddClick(Sender: TObject);
var
Logic, ShowLogic, Gut, ShowGut, Compare, ShowCompare, Value, ShoWValue: string;
//valuelst:Pvalue;
begin
case cmbxLogic.ItemIndex of
0:
begin
Logic := ' and '; //占4个长
ShowLogic := '并且';
end;
1:
begin
Logic := ' or '; //占4个长
ShowLogic := '或者';
end;
end;
case cmbxCompare.ItemIndex of
0:
begin
Compare := ' = ';
ShowCompare := ' 为 ';
end;
1:
begin
Compare := ' <> ';
ShowCompare := ' 不为 ';
end;
2:
begin
Compare := ' > ';
ShowCompare := ' 大于 ';
end;
3:
begin
Compare := ' >= ';
ShowCompare := ' 大于等于 ';
end;
4:
begin
Compare := ' < ';
ShowCompare := ' 小于 ';
end;
5:
begin
Compare := ' <= ';
ShowCompare := ' 小于等于 ';
end;

end;
Gut:=PFieldInfo(cmbxNameLst.Items.Objects[cmbxNameLst.ItemIndex])^.FieldName;
showGut:=cmbxNameLst.Text;
case PFieldInfo(cmbxNameLst.Items.Objects[cmbxNameLst.ItemIndex])^.DataType of
ftString,
ftMemo,
ftFmtMemo,
ftFixedChar,
ftWideString:
begin
if cmbxValuelst.Style=csDropDownList then value:=' '''+Pvalue(cmbxValuelst.Items.Objects[cmbxvaluelst.itemindex])^.ListValue+''' '
else value:=' '''+cmbxvaluelst.Text+''' ';
end;
ftSmallint,
ftInteger,
ftWord,
ftAutoInc,
ftLargeInt,
ftArray:
begin
if cmbxValuelst.Style=csDropDownList then value:=Pvalue(cmbxValuelst.Items.Objects[cmbxvaluelst.itemindex])^.ListValue
else value:=cmbxvaluelst.Text;
end;
ftFloat,
ftCurrency,
ftBCD:
begin
if cmbxValuelst.Style=csDropDownList then value:=Pvalue(cmbxValuelst.Items.Objects[cmbxvaluelst.itemindex])^.ListValue
else value:=cmbxvaluelst.Text;
end;
ftDate,
ftDateTime:
begin
if cmbxValuelst.Style=csDropDownList then value:=Pvalue(cmbxValuelst.Items.Objects[cmbxvaluelst.itemindex])^.ListValue
else value:=cmbxvaluelst.Text;
end;
end;
showvalue:=cmbxvaluelst.Text;

SCondition.Add (Logic + Gut + Compare + Value);
SShowCondition.Add (ShowLogic + ShowGut + ShowCompare + ShowValue);
lstbxCondition.Items.Text := copy(SShowCondition.Text, 5, Length(SShowCondition.Text));
end;

procedure TFrmNoticeFindCondition.FormDestroy(Sender: TObject);
begin
SCondition.Free;
SShowCondition.Free;
end;

procedure TFrmNoticeFindCondition.sbtnDelClick(Sender: TObject);
var
i: Integer;
begin
for i := (lstbxCondition.Items.Count - 1) downto 0 do
begin
if lstbxCondition.Selected then
begin
SCondition.Delete(i);
SShowCondition.Delete(i);
if lstbxCondition.Items.Count <> 0 then
lstbxCondition.Items.Text := copy(SShowCondition.Text, 5, Length(SShowCondition.Text))
else
lstbxCondition.Items.Text := '';
end;

end;
end;

procedure TFrmNoticeFindCondition.sbtnFindClick(Sender: TObject);
var
i:integer;
begin
Str_condition:='';
for i:=0 to SCondition.Count-1 do
begin
Str_condition:= Str_condition+SCondition;
end;
Str_condition:=copy(Str_condition,5,length(Str_condition));
if Str_condition='' then Str_condition:='1=1';
Close;
ModalResult:=mrOK;
end;

procedure TFrmNoticeFindCondition.sbtnExitClick(Sender: TObject);
begin
close;
ModalResult:=mrCancel;
end;

end.
 
后退
顶部