难题!在线等待!高分!家底了!(50分)

  • 主题发起人 主题发起人 jenemery
  • 开始时间 开始时间
J

jenemery

Unregistered / Unconfirmed
GUEST, unregistred user!
有9个编辑框,现要对一个数据表进行查询操作。

但是查询条件可以是9项输入的任意组合,也可以是任意单独的一项!!

请问有没有什么好的算法?

虚心请教!!!!!!!
 
咳,大家加把劲想啊!在线等待了!
 
写一个函数,从第一个最后一个都楼一遍

if edit1.text<>'' then
.....
if edit2.text<>'' then
.....
 
这不是什么难题,
我做过类似的东东,
很简单的,
不过没明白你的要求。
只要说清楚点,
大家都可以告诉你的。
 
var
str : array[0..1] of string
sql : string ;

begin
sql := '' ;
str1 :=edit1.text ;
str2:=......
.......
for i := 0 to 8 do
if str = '' then
exit
else
sql := sql + str
end;
符合不符合你的要求
 
简单
给你一段 注意注释:最重要一句
var
ssql, tiaojian, tiaojianpr: string;
begin
tiaojianpr := '';
tiaojian := '';
if Edit7.Text <> '' then
begin
tiaojian := tiaojian + ' ( 全宗号=''' + EDit7.Text + ''' ) and';
tiaojianpr := tiaojianpr + ' 全宗号=' + EDit7.Text;
end;
if Edit8.Text <> '' then
begin
tiaojian := tiaojian + ' ( 目录号=''' + Edit8.Text + ''') and';
tiaojianpr := tiaojianpr + ' 目录号=' + Edit8.Text;
end;
if Edit9.Text <> '' then
begin
tiaojian := tiaojian + ' ( 起始日期>= ' + Edit9.Text + ' ) and';
tiaojianpr := tiaojianpr + ' 起始日期>= ' + Edit9.Text;
end
else
tiaojian := tiaojian + ' ( 起始日期>=0) and';

if Edit10.Text <> '' then
begin
tiaojian := tiaojian + ' ( 起始日期<= ' + Edit10.Text + ' ) and';
tiaojianpr := tiaojianpr + ' 起始日期<= ' + Edit10.Text;
end;
tiaojian := copy(tiaojian, 1, length(tiaojian) - 3); //最重要一句


ssql := '';
ssql := 'select * from mainanjuan where (' + tiaojian +
') order by 系统编号 ';
doadosql(dm1.queryanjuan, ssql);
 
tiaojian := copy(tiaojian, 1, length(tiaojian) - 3); //最重要一句
这句话好像看不懂,还有,你定义了两个变量:tiaojian, tiaojianpr: string;

虽然你前面用到了tiaojianpr,但是好像这个变量到最后没有什么用,你是不是帖错了?

麻烦你再看看吧。
 
不知道你的组合是and还是or还是含有and或or
如果仅仅有and或仅仅有or我倒做的来,要不是的话就麻烦多了
strSQL:AnsiString;
strSQL:='select * from tablename where 1=1 '
if(Trim(Edit1.Text)<>'') then
strSQL:=strSQL+' and Field1='+Trim(Edit1.Text); //注意字符类型的写法
if(Trim(Edit2.Text)<>'') then
strSQL:=strSQL+' and Field2='+Trim(Edit2.Text); //注意字符类型的写法
if(Trim(Edit3.Text)<>'') then
strSQL:=strSQL+' and Field3='+Trim(Edit3.Text); //注意字符类型的写法
if(Trim(Edit4.Text)<>'') then
strSQL:=strSQL+' and Field4='+Trim(Edit4.Text); //注意字符类型的写法
......
......
......


 
告诉你:我的即可能有and,也可能有or,也可能两个都有,也可能两个都没有,就是这么麻烦。
 
这太正常了,我做过一个可以有任意多个字段——不过不是用Edit来做的
 
用 or 或 and 进行组合一下。
or 第一个条件可以是 1=1
and第一个条件可以是 1=0
 
to 楼主
你要的不就是一个组合查询吗,
看看我的!
procedure TForm_EmployeeInfo.btb_StartQueryClick(Sender: TObject);
var
TmpSQL, TmpIDCardNo: string;
TmpCondition, LeaveDateStr, EnterDateStr: string;
begin
TmpIDCardNo := Self.qme_IDCardNo.Text;
TmpSQL := 'Select * from EmployeeInfo';
LeaveDateStr := SummarizeDateCondition(qme_LeaveDateStart.Text, qme_LeaveDateEnd.Text, 'LeaveDate');
EnterDateStr := SummarizeDateCondition(qme_EnterDateStart.Text, qme_EnterDateEnd.Text, 'EnterDate');
if qckb_IsLeave.Checked then TmpCondition := TmpCondition + ' and IsLeave' else TmpCondition := ' and Not IsLeave';
if Trim(ed_Name.Text) <> '' then TmpCondition := TmpCondition + ' and EmployeeName=''' + ed_Name.Text + '''';
if Trim(ed_JobNo.Text) <> '' then TmpCondition := TmpCondition + ' and Job_no=''' + ed_JobNo.Text + '''';
if Trim(qcb_Marriage.Text) <> '' then TmpCondition := TmpCondition + ' and Marriage=''' + qcb_Marriage.Text + '''';
if Trim(qcb_WageProject.Text) <> '' then TmpCondition := TmpCondition + ' and Wage_Project=''' + qcb_WageProject.Text + '''';
if Trim(qcb_Sex.Text) <> '' then TmpCondition := TmpCondition + ' and Sex=''' + qcb_Sex.Text + '''';
if Trim(qcb_NativePlace.Text) <> '' then TmpCondition := TmpCondition + ' and NativePlace=''' + qcb_NativePlace.Text + '''';
if Trim(qcb_EduBackGround.Text) <> '' then TmpCondition := TmpCondition + ' and EduBackGround=''' + qcb_EduBackGround.Text + '''';
if Trim(qcb_Dept.Text) <> '' then TmpCondition := TmpCondition + ' and Dept=''' + qcb_Dept.Text + '''';
if Trim(qcb_Position.Text) <> '' then TmpCondition := TmpCondition + ' and Position=''' + qcb_Position.Text + '''';
if Trim(qme_IDCardNo.Text) <> '' then TmpCondition := TmpCondition + ' and ID_CardNo=''' + qme_IDCardNo.Text + '''';
if Trim(qme_WageAccount.Text) <> '- - - -' then TmpCondition := TmpCondition + ' and qme_WageAccount=''' + qme_WageAccount.Text + '''';
TmpCondition := TmpCondition + LeaveDateStr + EnterDateStr;
if TmpCondition <> '' then
begin
TmpCondition := Copy(TmpCondition, 5, Length(TmpCondition));
TmpSQL := TmpSQL + ' Where ' + TmpCondition;
end;
Self.ado_Show.SQL.Clear;
Self.ado_Show.SQL.Add(TmpSQL);
Self.ado_Show.Active := true;
end;
 
给你一个我作练习时的过程,我觉得应该满足你的要求。
procedure Tcxform.Button5Click(Sender: TObject);
var
f:treplaceflags;
currentD,birthd1,birthd2:tdate;
ls_sql:string;
begin
f:=[];
reccnt:=0;
with query1 do begin
close;
with sql do begin
clear;
ls_sql := 'select * from hyzl where id <> ''0''';
add('select * from hyzl');
add(' where id <> ''0''');
if edit1.Text<>'' then
add(' and id = '''+edit1.Text+'''');
if combobox2.Text <> '不限' then
add(' and people = '''+combobox2.Text+'''');
if combobox3.Text<>'不限' then
add(' and hukou='''+combobox3.Text+''' ');
if combobox1.Text = '男' then
add('and sex = ''男''')
else
Add(' and sex = ''女''') ;
// add(' and to_int(height) >' + combobox4.Text+' and to_int(height)<='+combobox5.Text);

// add(ls_sql);
end;
// showmessage(sql.Text);
open;
end;
query1.First;
while not(query1.Eof) do
begin
query1.Next;
reccnt:=reccnt+1;
end;
query1.first;
edit2.text:=inttostr(reccnt);
if ishy then
begin
chgpass.enabled:=true;
ckyj.enabled:=true;
end
else
begin
chgpass.enabled:=false;
ckyj.enabled:=false;
end;
if (reccnt > 0) and ishy then
yjb.Enabled:=true
else
yjb.Enabled:=false;
end;
 
给你一个我作练习时的过程,应该满足你的要求,特简单
procedure Tcxform.Button5Click(Sender: TObject);
var
f:treplaceflags;
currentD,birthd1,birthd2:tdate;
ls_sql:string;
begin
f:=[];
reccnt:=0;
with query1 do begin
close;
with sql do begin
clear;
ls_sql := 'select * from hyzl where id <> ''0''';
add('select * from hyzl');
add(' where id <> ''0''');
if edit1.Text<>'' then
add(' and id = '''+edit1.Text+'''');
if combobox2.Text <> '不限' then
add(' and people = '''+combobox2.Text+'''');
if combobox3.Text<>'不限' then
add(' and hukou='''+combobox3.Text+''' ');
if combobox1.Text = '男' then
add('and sex = ''男''')
else
Add(' and sex = ''女''') ;
// add(' and to_int(height) >' + combobox4.Text+' and to_int(height)<='+combobox5.Text);

// add(ls_sql);
end;
// showmessage(sql.Text);
open;
end;
query1.First;
while not(query1.Eof) do
begin
query1.Next;
reccnt:=reccnt+1;
end;
query1.first;
edit2.text:=inttostr(reccnt);
if ishy then
begin
chgpass.enabled:=true;
ckyj.enabled:=true;
end
else
begin
chgpass.enabled:=false;
ckyj.enabled:=false;
end;
if (reccnt > 0) and ishy then
yjb.Enabled:=true
else
yjb.Enabled:=false;
end;
 
// tiaojian := copy(tiaojian, 1, length(tiaojian) - 3); //最重要一句
呵呵,这最重要的一句却是低效的一句,改为如下不是更好?:
System.Delete(tiaojian, Length(tiaojian) - 2);
这样不会分配临时空间。

要是你的几个字段都是字符串或 Memo 甚至时间(只要不包含整型),就可以这样:
const
FindFields: array [1..9] of string =
('m_name', 'm_ename', 'm_company', 'm_phone', 'm_email', 'm_homepage',
'm_qq', 'm_birth', 'm_caddress');
var
i: integer;
TheEdit: TEdit;
SQLStr: string;
begin
SQLStr := '';
for i := 1 to 11 do
begin
TheEdit := FindComponent('Edit' + inttostr(i)) as TEdit;
if Length(TheEdit.Text) > 0 then
begin
if Length(SQLStr) > 0 then
SQLStr := SQLStr + ' and ' + FindFields + ' like ''%' +
TheEdit.Text + '%''';
end;
end;

if Length(SQLStr) > 0 then
begin
SQLStr := 'select * from memoryTbl where' + SQLStr;
ADODataSet1.CommandText := SQLStr;
//Do find
ADODataSet1.Active := True;
//....
end
else
ShowMessage('你要找什么?');
end;

 
jenemery,
tiaojian := copy(tiaojian, 1, length(tiaojian) - 3); //最重要一句
作用是去掉tiaojian 最后的 ‘ and' 或者 是' or'这样就成为正确的sql语句
tiaojianpr这里对你来说没什么用,是我的程序copy过来附带的
另外 beta 说的很好,有水平,佩服!!

 
都是与操作会很难吗?
真是败家子。
 
多人接受答案了。
 
后退
顶部