Dúvida com select

04/02/2006

0

Tenho uma tabela1 com os campos nome(string) e composição(string), no campo composição pode haver entre 1 e N componentes, separados por vírgula.
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

Edilcimar

Responder

Posts

05/02/2006

Edilcimar

não tem nada, tempos atrás também tive problemas ao colocar imagens com o imageshack, tentei diversas vezes até conseguir, mas é só escrever o que está acontecendo


Responder

05/02/2006

Edilcimar

está aqui olhe para ver quantas vezes tentei para conseguir colocar a imagem
http://forum.clubedelphi.net/viewtopic.php?t=71209


Responder

05/02/2006

Marco Salles

Talves o endereço lhe sirva , caso não de visualização

[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] ????


Responder

05/02/2006

Edilcimar

nem no link funciona, só dá a página do imageshack


Responder

05/02/2006

Edilcimar

consegui ver, mas aqui comigo está funcionando 100¬, inclusive depois eu inverti a ordem del alguns dentro da tabela2 e continuou funcionando perfeitamente


Responder

05/02/2006

Edilcimar

o meu resultado é este
[URL=http://img385.imageshack.us/my.php?image=imagemjog9md.jpg][img:48e99b939f]http://img385.imageshack.us/img385/8028/imagemjog9md.th.jpg[/img:48e99b939f][/URL]


Responder

05/02/2006

Marco Salles

se o seu esta funcionando .. tente fazer um teste usando minha base de dados.. Tabela1 e tabela2.. Com os mesmos dados..

Nãopode haver tamanha diferença ?????


Responder

05/02/2006

Edilcimar

escreva a tabela com os dados


Responder

05/02/2006

Marco Salles

[b:501e3f57cc]Assunto encerrado...Acho eu [/b:501e3f57cc]

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

if composicao[i]=´;´ then por if composicao[i]=´,´ then

Ja que a virgula e seu Limitador e o Ponto e virgula foi o usado por mim

Acho que é isso ai


Responder

05/02/2006

Edilcimar

É, realmente é isto, eu vi aqui que vc tinha separado por ponto e vírgula, e eu substituí por vírgula o seu bd e funcionou de acordo


Responder

05/02/2006

Edilcimar

a quem interessar possa, o meu procedimento final ficou assim

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


Responder

06/02/2006

Emerson Nascimento

Edilcimar, fiz pequenas alterações na sua rotina. coloquei um [i:e088c7ed51]For[/i:e088c7ed51] para avaliar os produtos digitados e estou utilizando StringList para montar os arrays, assim não preciso me preocupar em ´desmembrar´ o campo [i:e088c7ed51]composicao[/i:e088c7ed51].

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;



Responder

06/02/2006

Edilcimar

emerson, antes de testar eu faça uma pergunta: se ao cadastrar a composição do produto (veja a diferença nas linhas)
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?


Responder

06/02/2006

Emerson Nascimento

funciona direitinho.


Responder

06/02/2006

Edilcimar

ok, vou testar e depois retorno


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar