输入:Str1(一个字符串变量), Str2(一个字符串变量) 返回一个字符串
例如:
Str1:='PRD_NO',Str2:='01:ABC;BCD,02:EFG;DWS'返回一个字符串作为SQL语句:
: B.PRD_NO In (Select PRD_NO From PRDT_DSC
Where ((DSC_NO = '01' And DSC_REM In ('ABC', 'BCD')) or
(DSC_NO = '02' And DSC_REM In ('EFG', 'DWS')) Group By PRD_NO Having Count(PRD_NO) = 2)
其中PRD_NO,PRD_DSC,DSC_NO,DSC_REM是固定的,其实就是分解str2
注意Str2里的,;:依据这三个符号了进行分解。
我现在想找个最好的算法,我写的用了100行,2个函数。
请各位帮写了好的算法,
给300分星期一结帐。
例如:
Str1:='PRD_NO',Str2:='01:ABC;BCD,02:EFG;DWS'返回一个字符串作为SQL语句:
: B.PRD_NO In (Select PRD_NO From PRDT_DSC
Where ((DSC_NO = '01' And DSC_REM In ('ABC', 'BCD')) or
(DSC_NO = '02' And DSC_REM In ('EFG', 'DWS')) Group By PRD_NO Having Count(PRD_NO) = 2)
其中PRD_NO,PRD_DSC,DSC_NO,DSC_REM是固定的,其实就是分解str2
注意Str2里的,;:依据这三个符号了进行分解。
我现在想找个最好的算法,我写的用了100行,2个函数。
请各位帮写了好的算法,
给300分星期一结帐。
Str2:
01=ABC;BCD
02=EFG;DWS'
这样可以用StringList.TExt := Str2;
然后使用Names[0] 得出'01'
Values['01'] 得出'ABC;BCD'
{ ÌØÉ«Ìõ¼þµÄ¸ñʽ:
// ÌØÉ«´úºÅ1:ÌØÉ«ÃèÊö1;ÌØÉ«ÃèÊö2;..ÌØÉ«ÃèÊön,ÌØÉ«´úºÅ2:ÌØÉ«ÃèÊö1;....;ÌØÉ«ÃèÊön
// Êä³öΪ×éºÏºóµÄ SQL Óï¾ä, Èç:
{ ÊäÈëΪ: B.PRD_NO, '01:ABC;BCD,02:EFG;DWS'
Êä³öΪ: B.PRD_NO In (Select PRD_NO From PRDT_DSC
Where ((DSC_NO = '01' And DSC_REM In ('ABC', 'BCD')) or
(DSC_NO = '02' And DSC_REM In ('EFG', 'DWS'))
Group By PRD_NO
Having Count(PRD_NO) = 2)}
//Writed by yzj 2002-9-13 ×¢Ò⣺this code is different with Moritenw's but
//result is same;unit GetDscSql;interface
Uses SysUtils,Windows,Classes;function GetDsc_Sql(PrdStr,Dscno:String):String;implementationfunction GetDscArray(ADscno,sim: String;var StringList:TStringList): integer;
var
Position:integer;
LeftStr:String;
begin
LeftStr:=Trim(ADscno);
if Trim(LeftStr)='' then
begin
Result:=0;
Exit;
end
else
begin //A001:B¿Í»§;A¿Í»§,A:ÄÚÈÝB
Position:=Pos(Sim,LeftStr);
if Position<>0 then
begin
while Position>0 do
begin
StringList.Add(Trim(Copy(LeftStr,1,Position-1)));
LeftStr:=Trim(Copy(LeftStr,Position+1,255));
Position:=Pos(Sim,LeftStr);
end;
StringList.Add(LeftStr);
end
else
StringList.Add(LeftStr);
Result:=StringList.Count;
end;
end;function GetDsc_Sql(PrdStr, Dscno: String): String;
var
B_Str:String;
E_Str,EE_Str:String;
A_StringList,B_StringList:TStringList;
I:integer;
Position:integer;
ArrayStr:String;
PartStr1:String;
PartStr2:String;
Simb:String;
S:integer;
begin
A_StringList:=TStringList.Create;
B_StringList:=TStringList.Create;
B_Str:=PrdStr+' IN '+'( '+
'SELECT PRD_NO FROM PRDT_DSC ';
if Trim(Dscno)='' then
begin
Result:=B_Str+' )';
exit;
end
else
begin
Simb:=',';
B_Str:=B_Str+' WHERE ' ;
for i:=0 to GetDscArray(Dscno,Simb,A_StringList)-1 do
begin
if (I=0) then
E_Str:=E_Str+' ( '
else
E_Str:=E_Str+') OR ( ';
Simb:=';';
ArrayStr:=A_StringList[I];
Position:=Pos(':',ArrayStr);
if Position=0 then
begin
PartStr1:=ArrayStr;
E_Str:=E_Str+'DSC_NO='''+PartStr1+''''
end
else
begin
PartStr1:=Trim(Copy(ArrayStr,1,Position-1));
PartStr2:=Trim(Copy(ArrayStr,Position+1,255));
B_StringList.Clear;
GetDscArray(PartStr2,Simb,B_StringList);
E_Str:=E_Str+'DSC_NO='''+PartStr1+''''+' AND DSC_REM IN (';
EE_Str:='';
for S:=0 to B_StringList.Count-1 do
begin
if (S=B_StringList.Count-1) then
EE_Str:=EE_Str+''''+B_StringList[S]+''''
else
EE_Str:=EE_Str+''''+B_StringList[S]+''''+',';
end;
E_Str:=E_Str+EE_Str+' ) ';
end;
end;
end;
Result:=B_Str+E_Str+')'+' GROUP BY PRD_NO HAVING COUNT(PRD_NO)='+inttostr(A_StringList.Count)+')';
end;
end.