Dúvida com select
04/02/2006
0
Tenho uma tabela2 com os campos composição1 (string) com apenas 1 palavra, composição2 (string) com apenas 1 palavra e o campo reação(string).
Agora a pesquisa: a pessoa digita num edit1 o nome1, e no edit2 o nome2, ao clicar um botão, deverá fazer o seguinte:
1) buscar o nome1 na tabela1, pegar todos as composições contidas no campo composição e montar uma matriz X de M elementos (de acordo com a quantidade de componentes contidos neste campo);
2) buscar o nome2 na tabela1, pegar todos as composições contidas no campo composição e montar uma matriz Y de N elementos (de acordo com a quantidade de componentes contidos neste campo);
3) montar uma combinação entre as duas matrizes, digamos uma matriz Z para jogar o resultado da pesquisa neste matriz;
4) pegar a matriz X[I] e buscar na tabela2 no campo composição1, se achar então pega a matriz Y[I] e busca na tabela2 no campo composição2, caso ache pega o resultado contido na tabela2, campo reação e joga na matriz Z[I].
Eu não tenho problema em criar as matrizes, nem em criar a combinação, o meu problema está em construir esta SQL
Edilcimar
Posts
05/02/2006
Edilcimar
05/02/2006
Edilcimar
http://forum.clubedelphi.net/viewtopic.php?t=71209
05/02/2006
Marco Salles
[b:c3cc88d1f6]Tabela 1 ; tabela2
Ver como esta a base de dados da Tabela 1 e da Tabela2 [/b:c3cc88d1f6]
[url=http://img488.imageshack.us/my.php?image=imagemparaedicilmar31ec.jpg][img=http://img488.imageshack.us/img488/4091/imagemparaedicilmar31ec.th.jpg][/url]
[URL=http://imageshack.us][img:c3cc88d1f6]http://img488.imageshack.us/img488/4091/imagemparaedicilmar31ec.jpg[/img:c3cc88d1f6][/URL]
[b:c3cc88d1f6]Executei agora os dois métodos ... Button1(Marco) o método que lhe passei , Button2(Edicilmar) o método que me passou [/b:c3cc88d1f6]
Execução do Button1(Marco).. O resultado no Memo1 Foi este ;
Talves o endereço lhe sirva , caso não de visualização
[url=http://img382.imageshack.us/my.php?image=imagemparaedicilmar41lu.jpg][img=http://img382.imageshack.us/img382/6742/imagemparaedicilmar41lu.th.jpg][/url]
[URL=http://imageshack.us][img:c3cc88d1f6]http://img382.imageshack.us/img382/6742/imagemparaedicilmar41lu.jpg[/img:c3cc88d1f6][/URL]
Execução do Button2(Edicilmar).. O resultado foi este ;
Talves o endereço lhe sirva , caso não de visualização
[url=http://img382.imageshack.us/my.php?image=imagemparaedicilmar50yn.jpg][img=http://img382.imageshack.us/img382/1271/imagemparaedicilmar50yn.th.jpg][/url]
[URL=http://imageshack.us][img:c3cc88d1f6]http://img382.imageshack.us/img382/1271/imagemparaedicilmar50yn.jpg[/img:c3cc88d1f6][/URL]
[b:c3cc88d1f6]Não to entendendo porque da diferença[/b:c3cc88d1f6] ????
05/02/2006
Edilcimar
05/02/2006
Edilcimar
[URL=http://img385.imageshack.us/my.php?image=imagemjog9md.jpg][img:48e99b939f]http://img385.imageshack.us/img385/8028/imagemjog9md.th.jpg[/img:48e99b939f][/URL]
05/02/2006
Marco Salles
Nãopode haver tamanha diferença ?????
05/02/2006
Marco Salles
os dois métodos estão de acordos
:oops: :oops: :oops:
é porque voce disse que a composição ia ser separadas pore [b:501e3f57cc]virgula[/b:501e3f57cc] e eu o fiz separados por [b:501e3f57cc]Ponto e virgula[/b:501e3f57cc]
Logo meu raciocineo e todo em função do Ponto e virgula e minha base de dados tb
Modifiquei sua instrução onde se tinha
If Texto[I] <> ´,´ then coloquei para If Texto[I] <> ´;´ then
Para ficar coerentre com minha base de dados
:arrow: :arrow: :arrow:
:P
e obtive os mesmos resultados
Se voce quiser testar o meu código , tem que alterar na procedure CriarMatriz e trocar o Ponto_Virgula por Ponto
Ja que a virgula e seu Limitador e o Ponto e virgula foi o usado por mim
Acho que é isso ai
05/02/2006
Edilcimar
05/02/2006
Edilcimar
rocedure TForm4.Button2Click(Sender: TObject);
var
I, J, K, TamanhoX, TamanhoY : Integer;
Texto, Temp : String;
X, Y, Z : array of string;
begin
Temp := ´´;
Memo1.Lines.Clear;
J := 1;
SetLength(X,1);
SetLength(Y,1);
With Table1 do
Begin
If Locate(´PRODUTO´,Edit1.Text,[]) then
Texto := Trim(FieldByName(´COMPOSICAO´).AsString)
Else
Begin
ShowMessage(´PRODUTO NÃO ENCONTRADO´);
Abort;
End;
End;
For I := 1 to Length(Texto) do
Begin
If Texto[I] <> ´,´ then
Begin
Temp := Temp + Texto[I];
If I = Length(Texto) then
Begin
X[J-1] := Trim(Temp);
SetLength(X, J);
End;
End
Else
Begin
X[J-1] := Trim(Temp);
J := J + 1;
SetLength(X, J);
Temp := ´´;
End;
End;
Temp := ´´;
With Table1 do
Begin
If Locate(´PRODUTO´,Edit2.Text,[]) then
Texto := Trim(FieldByName(´COMPOSICAO´).AsString)
Else
Begin
ShowMessage(´PRODUTO NÃO ENCONTRADO´);
Abort;
End;
End;
J := 1;
For I := 1 to Length(Texto) do
Begin
If Texto[I] <> ´,´ then
Begin
Temp := Temp + Texto[I];
If I = Length(Texto) then
Begin
Y[J-1] := Trim(Temp);
SetLength(Y, J);
End;
End
Else
Begin
Y[J-1] := Trim(Temp);
J := J + 1;
SetLength(Y, J);
Temp := ´´;
End;
End;
TamanhoX := Length(X);
TamanhoY := Length(Y);
K := 0;
SetLength(Z, TamanhoX * TamanhoY);
For I := 0 to TamanhoX - 1 do
Begin
For J := 0 to TamanhoY - 1 do
Begin
Z[K] := X[I] + ´+´ + Y[J] +´= ´;
K := K + 1;
End;
End;
K := 0;
For I := 0 to TamanhoX - 1 do
Begin
For J := 0 to TamanhoY - 1 do
Begin
Query1.Close;
Query1.SQL.Clear;
Query1.Sql.Add(´Select * From Reacao´);
Query1.Sql.Add(´Where (ELEMENTO1 = :Comp1 And ELEMENTO2 = :Comp2) ´);
Query1.Sql.Add(´Or (ELEMENTO1 = :Comp2 And ELEMENTO2 = :Comp1)´);
Query1.ParamByName(´Comp1´).AsString := X[I];
Query1.ParamByName(´Comp2´).AsString := Y[J];
Query1.Prepare;
Query1.Open;
If Query1.FieldByName(´RESULTADO´).AsString <> ´´ then
Z[K] := Z[K] + Query1.FieldByName(´RESULTADO´).AsString
Else
Z[K] := Z[K] + ´Sem Reação Conhecida´;
K := K + 1;
End;
End;
For I := 0 to High(Z) do
Memo1.Lines.Add(Z[I]);
end;
valeu pela força marcos
06/02/2006
Emerson Nascimento
segue a rotina modificada:
var I, J, TamanhoX, TamanhoY: Integer; Resultado: string; X, Y, Z: array of string; slStringListAux: TStrings; Encontrou: boolean; begin slStringListAux := TStringList.Create; slStringListAux.Delimiter := ´;´; // delimitador Memo1.Clear; Table1.First; for j := 1 to 2 do //numero de edit´s begin with Table1 do begin if j = 1 then Encontrou := Locate(´PRODUTO´,Edit1.Text,[]) else Encontrou := Locate(´PRODUTO´,Edit2.Text,[]); if not Encontrou then begin ShowMessage(´PRODUTO NÃO ENCONTRADO´); abort; end; end; slStringListAux.DelimitedText := Trim(Table1.FieldByName(´COMPOSICAO´).AsString); if j = 1 then SetLength(X,slStringListAux.Count) else SetLength(Y,slStringListAux.Count); for i := 0 to slStringListAux.Count-1 do if j = 1 then X[i] := slStringListAux[i] else Y[i] := slStringListAux[i]; end; TamanhoX := Length(X); TamanhoY := Length(Y); Query1.Close; Query1.SQL.Clear; Query1.Sql.Add(´Select * From Reacao´); Query1.Sql.Add(´Where (ELEMENTO1 = :Comp1 And ELEMENTO2 = :Comp2) ´); Query1.Sql.Add(´Or (ELEMENTO1 = :Comp2 And ELEMENTO2 = :Comp1)´); for I := 0 to TamanhoX - 1 do for J := 0 to TamanhoY - 1 do begin Query1.Close; Query1.ParamByName(´Comp1´).AsString := X[I]; Query1.ParamByName(´Comp2´).AsString := Y[J]; Query1.Prepare; Query1.Open; Resultado := Query1.FieldByName(´RESULTADO´).AsString; if Resultado = ´´ then Resultado := ´Sem Reação Conhecida´; SetLength(Z, Length(Z)+1); Z[High(Z)] := X[I] + ´+´ + Y[J] +´ = ´+Resultado; end; for I := 0 to High(Z) do Memo1.Lines.Add(Z[I]); slStringListAux.Free; end;
06/02/2006
Edilcimar
composição(A,B,C,D)
composição(A, B, C,D)
a sua rotina vai conseguir diferenciar os espaços (ou não) após a vírgula, pois no cadastramento das reações, não vai ter espaço antes das palavras?
Clique aqui para fazer login e interagir na Comunidade :)