数据表名 sjb 字段 wl(物料编码) gg(规格)输入一个物料号查找出相应的规格
规格的格式 φ124×12×278 或 φ124×12
要求是搜索出所有规格相同的数据,问题是
φ124×12×278 相同规格例如 φ124×278×12 φ12×278×124
φ12×124×278 φ278×124×12 φ278×12×124φ124×12 相同规格例如 12×124
规格的格式 φ124×12×278 或 φ124×12
要求是搜索出所有规格相同的数据,问题是
φ124×12×278 相同规格例如 φ124×278×12 φ12×278×124
φ12×124×278 φ278×124×12 φ278×12×124φ124×12 相同规格例如 12×124
解决方案 »
- 有没有利用二分查找的Tstringlist.values['name']?
- win2000系统下用装mdac吗
- 寻找Delphi高手,共同创业
- 为什么用excel建的表无法跟tale控件连接上,老是说没有table name
- worm.tanatos.5632有谁认得这个病毒!!怎么彻底清除!!!
- Hide;无法关机问题
- 怎样将一个字符数组排列?
- 简单问题,送分
- 如何清除ClientDataSet1的缓存的所有数据?
- 控件DBGrid开发,如何随意修改title的caption?
- 关于一个协议中有多种编码方式内容在里面,晕了不知怎样一并合在一起并发送过去
- SendMessage(hwnd,WM_SYSCOMMAND, SC_CLOSE,0);//关闭窗体的问题
如φ124×12一律改为φ12×124,而φ12×124就无须改——因为124大于12(可以是数值大小9<10,也可以是字符串大小9>10)不过,我更感兴趣:为什么8年后还有delphi的活?
我本人的设想是 把规格分拆成124,12,278,然后再组合,最后用SQL写问题是现在忘了怎么把φ124×12×278拆成3个数字,求代码,分不够可再加。
DECLARE @str varchar(50),@str1 varchar(50),@str2 varchar(50),@str3 varchar(50),@xx intSET @str='φ124×12×278'
SELECT @str=LTRIM(REPLACE(@str,'φ',' '))SELECT @xx=charindex('×',@str)
SELECT @str1=Substring(@str,0,@xx)
SELECT @str=Substring(@str,@xx+1,Len(@Str)-@xx)SELECT @xx=charindex('×',@str)
SELECT @str2=Substring(@str,0,@xx)
SELECT @str3=Substring(@str,@xx+1,Len(@Str)-@xx)--print @str1
--print @str2
--print @str3
需要对查询条件做拆分组合, 如124×12×278, 可得以下因子(暂不考虑规格参数连接符的多样性, 只认可×)
124, 12, 278(A, B, C)
可得6种组合 ABC, ACB, BAC, BCA, CAB, CBA
以这六种组合为查询条件即可.
分拆规则可根据你的实际使用场景决定.
部分代码:
str:='φ124×12×278' ; // str=要查询的规格
if Copy(str,1,1)='φ' then str:=Copy(str,2,Length(str)-1); // 去掉前面的φ符号iPoint:=point('x',str); // 取第一个x的位置
if iPoint>0 then s1:=Copy(str,1,iPoint-1); // 第一个规格字符串str:=Copy(str,iPoint+1,Length(str)-iPoint);
iPoint:=point('x',str); // 取第二个x的位置
if iPoint>0 then
begin
s2:=Copy(str,1,iPoint-1); // 第二个规格字符串
s3:=Copy(str,iPoint+1,Length(str)-iPoint); // 第三个规格字符串
end
else
begin // 只有两个字符串的规格
s2:=str;
s3:='';
end;查询语句:
要分两种情况,一种是s3不为空,一种是s3为空
if s3<>'' then // 一共9种组合
sql.text:='select * from sjb where (gg like ''%'+s1+'x'+s2+'x'+s3+'%'') or (gg like ''%'+s1+'x'+s3+'x'+s2+'%'') or ...'
end
else // 2种组合
sql.text:='select * from sjb where (gg =''φ'+s1+'x'+s2+''') or (gg =''φ'+s2+'x'+s1+''')';
要分两种情况,一种是s3不为空,一种是s3为空
if s3<>'' then // 一共9种组合
sql.text:='select * from sjb where (gg like ''%'+s1+'x'+s2+'x'+s3+'%'') or (gg like ''%'+s1+'x'+s3+'x'+s2+'%'') or ...'
end
else // 2种组合
sql.text:='select * from sjb where (gg like '%''+s1+'x'+s2+'%'') or (gg like '%''+s2+'x'+s1+'%'')';
查询时,无论输入上述几种那一种都行。这样对用户特别方便(不要苛求用户非按什么格式、顺序输入)。编程者所要做的就是,在查询前将φ124×12×278拆分成所有可能的组合,好像有6种?再查询就行。
where (gg like ‘φ124×12×278’) or (gg like ‘φ124×278×12’) or (gg like ‘φ12×124×278’) or (gg like ...) or ...
譬如12X23X34,变成这么一个数组12, 23, 34,然后查询的时候就
where ...
( ('X'+field +'X') like ('%'+'X'+12+'X'+'%')
or ('X'+field +'X') like ('%'+'X'+23+'X'+'%')
or ('X'+field +'X') like ('%'+'X'+34+'X'+'%')
)
...