Dúvida com select

Delphi

04/02/2006

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

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

04/02/2006

que banco de dados você usa, amigo Edilcimar?

creio que isso seja possível com Stored Procedures.


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

eu não sei se é sql....acho que talvez poda ser resolvido com bloco de instruçoes.. So que para mim esta confuso algumas etapas.. Acho melhr resolver por partes

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);

Estas duas etapas acho que pode ser resolvido com sql seguido de um laço para que se monte as matriz X e Y . Ja que se tem no camo composição os componentes separados por Virgula

A terceira e quarta etapa tenho duvidas

3) montar uma combinação entre as duas matrizes, digamos uma matriz Z para jogar o resultado da pesquisa neste matriz;


Qual seria a estrutura dessa matriz.. Digo em termos de linha e colunas
Por exemplo Na etapa 1) Retorne 3 composicoes Na etapa 2) Retorne 2 Composiçoes
Como seria a estrutura de Z ???
Seria uma matriz Z(3+2,1)... cinco Linhas e Uma Coluna
Seria uma matriz Z(1,3+2)... Uma linha e cinco Colunas
Seria uma matriz Z(3,2)... tres linhas e duas Colunas
Seria uma matriz Z(2,3)... duas linhas e Tres Colunas


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].



Esta etapa para mim é a mais confusa...Pois alem da estrutura da Matriz Z
recorre problema de ordem dos indices. Vejamos :
quem garante que a quantidade de Xi seja igua a quantidade de Yi..

o entendimento desta etapas parece ser a parte mais dificil.. Parece que voce que fazer um combinação de composiçoes..

Acho que ajudaria muito para mim e para os colegas se voce definisse uma tabela 1 com alguns nomes e composiçoes , seguidas de uma tabela 2) com os campos Comp1 e compo2 e reaçao definidos... Desse um valor para edit1 1 edit2 . Apresenta-sse o que voce quer obter na matriz X e o que voce quer na Matriz Y.. por fim definir a Matriz Z na etapa 3 e por fim a Matriz Z na etapa 4)



GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

Um exemplo prático do que quero, apesar de que a tabela1 terá aproximadamente 5 mil produtos, onde cada produto pode ser composto por 1 a 10 elementos e na tabela2 terei quais as reações resultantes das misturas destes elementos 2 a 2, isto será utilizado para utilização de medicamentos, para verificar se há incompatibilidade entre os elementos químicos de um determinado medicamento e outro, para evitar reações alérgicas, perigosas ou nulas, estas reações podem variar de 0 a 30
Tabela1 tenho 2 produtos Produto1 e Produto2
Produto1 é composto de (A e B) ->Matriz X[1] = ´A´ e X[2] = ´B´
Produto2 é composto por (A, C, D) -> Matriz Y[1] = ´A´, Y[2] = ´C´ e Y[3] = ´D´
Crio então uma matriz Z que terá 6 elementos para captar o resultado das combinações [AA,AC,AD,BA,BC,BD]
faço agora a pesquisa na Tabela2 pelo elemento X[1] no campo composição1, e depois busco no campo composição2 todos os 3 elementos da matriz Y ou seja Y[1], Y[2] E Y[3] se o resultado for encontrado é porque existe uma reação negativa, então o Z[I] pega este resultado, depois passo para o X[2] e faço o mesmo processo. Então eu teria que:
Z[1] que veio de AA é nulo,
Z[2] que veio de AC é febre
Z[3] que veio de AC é nulo
Z[4] que veio de BA é diarréia
Z[5] que veio de BC é dor de cabeça e vômito
Z[6] que veio de BD é diminuição do efeito de B
Eu até sei montar isto usando for e while, porém com uma tabela deste tamanho e a quantidade de combinações possíveis, iria virar uma carroça, por isto estou querendo fazer com sql
O banco ainda não foi montado, mas pode ser firebird com ibquery ou piradox com query


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

Tabela1 tenho 2 produtos Produto1 e Produto2 Produto1 é composto de (A e B) ->Matriz X[1] = ´A´ e X[2] = ´B´ Produto2 é composto por (A, C, D) -> Matriz Y[1] = ´A´, Y[2] = ´C´ e Y[3] = ´D´ Crio então uma matriz Z que terá 6 elementos para captar o resultado das combinações [AA,AC,AD,BA,BC,BD]


Da dando para entender... Mas para ser dez e ter este resultado

Z[1] que veio de AA é nulo, Z[2] que veio de AC é febre Z[3] que veio de AC é nulo Z[4] que veio de BA é diarréia Z[5] que veio de BC é dor de cabeça e vômito Z[6] que veio de BD é diminuição do efeito de B


[b:0c609e4c6d]Como voce definiu a sua tabela 2 ???? para mim isto e crucial[/b:0c609e4c6d]


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

a tabela 2 é composta 2 campos composição1, onde é procurado os elementos do primeiro medicamento, e composição2 onde são procurados os elementos do segundo medicamento, e o campo reação de onde vem os problemas que podem ser causados pela mistura dos 2 elementos químicos


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

a tabela 2 é composta 2 campos composição1, onde é procurado os elementos do primeiro medicamento, e composição2 onde são procurados os elementos do segundo medicamento, e o campo reação de onde vem os problemas que podem ser causados pela mistura dos 2 elementos químicos


isto eu entendi , so que não daria para voce definir tb a tabela 2 para que a gente possa a partir de :

Matriz X[1] = ´A´ e X[2] = ´B´ Matriz Y[1] = ´A´, Y[2] = ´C´ e Y[3] = ´D´


e efetuando a pesquisa na tabela 2 chegar no resultado em Z

Z[1] que veio de AA é nulo, Z[2] que veio de AC é febre Z[3] que veio de AC é nulo Z[4] que veio de BA é diarréia Z[5] que veio de BC é dor de cabeça e vômito Z[6] que veio de BD é diminuição do efeito de B


so para entender melhor :


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

OK, agora eu criei uma tabela em piradox só para teste, depois vou mudar para firebird
na tabela 1 eu coloquei 2 produtos
Produto1-> A, B, C
Produto2-> A, D, E, F
Na tabela 2 eu coloquei as seguintes reações
A+D -> dor de barriga
A+F -> febre
B+D -> asia
B+E -> náusea
C+E -> diarréia
C+F -> vômito
portanto quando eu procurar por estes 2 produtos o resultado da matriz z terá que ser o acima mais os campos nulos


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

no final, o resultado da matriz Z[N] vou jogar como N linhas em um campo memo


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

num campo memo não, num Tmemo


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

De fato estamos avançando

mas em relação a tabela 2

vejo um problema na construção da mesma.. Talvez tenha que sempre que inserir uma combinação de medicamentos , voce deva faze-lo também na ordem inversa , ou uma outra saida e fazer uma pesquisa de X[i] pelo campo composicao2 se achar pesquise também Y[i] pelo campo Cpmposicao1 , simultaneamente
com pegar a matriz X[I] e buscar na tabela2 no campo composição1, se achar então pega a matriz Y[I]


Porque por exemplo , na tabela 2 pode estar cadastrado
A + D = Dor de barriga , mas não necessáriamente pode estar cadastrado
D + A = Dor de barriga

[b:19d60c8dfa]concorda com esta colocação ????[/b:19d60c8dfa]


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

Sim, é claro, se não fizer este tipo de pesquisa aí teria que ser cadastrado A+B e B+A, o que dobraria o trabalho de cadastramento


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

beleza

então vamos ver se da tempo para acabar hoje

antes de irmos para o sql , voce conhece alguma função que separa pela virgula as composiçoes

acho que ja ate fiz um código desse aqui

vou pesquisar


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

isto não é difícil de criar, basta ir procurando por vírgulas, só que na última não vai ter vírgula -> A, B, C, D, E, F (no f não tem vírgula mas é fim de texto)


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

sim , isto não é dificil

mas vamos criar uma .


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

Acho que esta procedure resolva

procedure CriarMatrizX(Composicao:String);
var
i,indiceanterior:integer;
texto:String;
begin
i:=1;
indiceAnterior:=1;
while i <= length(composicao) do
 begin
    if composicao[i]=´;´ then
      begin
        texto:=copy(composicao,indiceanterior,i - indiceAnterior);
        indiceAnterior:=i+1;
         //aqui voce vaui criar a MatrizX[i]
        form1.Memo1.Lines.Add(texto);
      end;
    i:=i+1;
 end;
end;



GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

terminei de criar, aqui me baseei no edit, mas na realidade vou buscar na tabela
procedure TForm4.Button2Click(Sender: TObject);
var
I, J : Integer;
Texto, Temp : String;
X : array of string;
begin
Temp := ´´;
J := 1;
Texto := Edit1.Text;
For I := 0 to Length(Texto) do
Begin
If Texto[I] <> ´,´ then
Temp := Temp + Texto[I]
Else
Begin
SetLength(X, J);
J := J + 1;
X[I] := Temp;
Temp := ´´;
End;
End;
end;


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

no teu exemplo onde vc aumenta o tamanho da matriz? afinal de contas eu não sei o tamanho inicial dela


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

pronto, já corrigi
Temp := ´´;
J := 1;
Texto := Edit1.Text;
With Table1 do
Begin
If Locate(´Produto´,Edit1.Text,[]) then
Texto := FieldByName(´COMPOSICAO´).AsString;
Else
Begin
ShowMessage(´PRODUTO NÃO ENCONTRADO´);
Abort;
End;
End;
For I := 0 to Length(Texto) do
Begin
If Texto[I] <> ´,´ then
Temp := Temp + Texto[I]
Else
Begin
SetLength(X, J);
J := J + 1;
X[I] := Temp;
Temp := ´´;
End;
End;


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

beleza.. eu so não to lembrando como se cria uma matriz dinamica

Coloquei

X : array of string; somente no eu código mas da erro de acesso vilolado

procedure CriarMatrizX(Composicao:String);
var
i,indiceanterior,q:integer;
texto:String;
X : array [1..10] of string;
begin
q:=0;
i:=1;
indiceAnterior:=1;
while i <= length(composicao) do
 begin
    if composicao[i]=´;´ then
      begin
        texto:=copy(composicao,indiceanterior,i - indiceAnterior);
        indiceAnterior:=i+1;
        //aqui voce vaui criar a MatrizX[i]
        X[q]:=texto;
        q:=q+1;
        form1.Memo1.Lines.Add(texto);
      end;
    i:=i+1;
 end;
end;



GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

está aqui, inclusive com a criação da matriz dinâmica
procedure TForm4.Button2Click(Sender: TObject);
var
I, J : Integer;
Texto, Temp : String;
[b:b946e17ed6]X : array of string;[/b:b946e17ed6]
begin
Temp := ´´;
J := 1;
With Table1 do
Begin
If Locate(´Produto´,Edit1.Text,[]) then
Texto := FieldByName(´COMPOSICAO´).AsString
Else
Begin
ShowMessage(´PRODUTO NÃO ENCONTRADO´);
Abort;
End;
End;
For I := 0 to Length(Texto) do
Begin
If Texto[I] <> ´,´ then
Temp := Temp + Texto[I]
Else
Begin
[b:b946e17ed6]SetLength(X, J);[/b:b946e17ed6]
J := J + 1;
X[I] := Trim(Temp);
Temp := ´´;
End;
End;
end;


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

já corrigi aqui
X[J] := Trim(Temp);
porém no nosso processo o terminador está sendo a vírgula e no último elemento não tem, vou corrigir


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

acertado
For I := 0 to Length(Texto) do
Begin
If Texto[I] <> ´,´ then
Begin
Temp := Temp + Texto[I];
If I = Length(Texto) then
Begin
SetLength(X, J);
X[J] := Trim(Temp);
End
Else
Begin
SetLength(X, J);
J := J + 1;
X[J] := Trim(Temp);
Temp := ´´;
End;
End;


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

beleza , eu vou continuar com a minha depois voce usa a sua e não se fala mais nisso

Agora a outra parte importante , o que facilitaria muito , e sobre a criação de Z

nos seus exemplos voce trabalha sempre com caracter para representar
as Matrizes X e Y ...Tenho uma função de combinação pronta para este tipo de situação..Mas so vale para caracter..

Função :

function GeraCombinacoes(S: string; NumDig: Integer): TStrings;
var I, J: Integer;
       X: Char;
      TS: TStrings;
      S1: string;
begin
  Result := TStringList.Create;
  TS     := TStringList.Create;

  for I := 1 to Length(S) do Result.Add(S[I]);

  while Length(Result.Strings[0]) < NumDig do
    begin
      for I := 0 to (Result.Count - 1) do
        begin
          S1 := ´´;
          for J := 1 to Length(S) do 
            begin
              X := S[J]; 
              if Pos(X, Result.Strings[I]) = 0 then S1 := S1 + X;
            end; 

          for J := 1 to Length(S1) do
            begin 
              X := S1[J]; 
              TS.Add(Result.Strings[I] + X);
            end; 
        end;
      Result.Text := TS.Text;
      TS.Clear;
    end;
  TS.Free;
end; 


Para chamar por exemplo

Memo3.Lines.Assign(GeraCombinacoes(´ABCDEFG´, 2));


esta função ta na mao , caso contrario teremos que desenvolver outra , o que vai ser um pouco dificil aparentemente


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

mas eu não posso criar combinações apenas com uma pesquisa, teria que fazer a pesquisa do X, depois a do Y e aí então formar o Z de acordo com o tamanho das matrizes X e Y


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

ok copiei a tua função de combinações para ganhar tempo, depois qualquer coisa eu desenvolvo outra


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

Não disse isto

se voce vai criar com apenas uma.. O que eu to te perguntando e se :

nos seus exemplos voce trabalha sempre com caracter para representar as Matrizes X e Y ...Tenho uma função de combinação pronta para este tipo de situação..Mas so vale para caracter
..

porque fora isto vaiu dar mais trabalho, ja que a fuçao GerarCombinacoes ja esta pronta

Pense que ao inves de ser assim

Memo3.Lines.Assign(GeraCombinacoes(´ABCDEFG´, 2));


eu escrevesse assim

***Instrução a seguir so como exemplo **não vale . Não compila
Memo3.Lines.Assign(GeraCombinacoes(X+Y, 2));



GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

neste caso específico estou trabalhando com caracter para o nome das matrízes e para os dados contidos nas mesmas, mas na maioria das vezes dou nome ex: NomeVendedor[I], TotalVendedor[I], Vendas[I], etc


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

aqui está a parte da procura pelos 2 edits completa

procedure TForm4.Button2Click(Sender: TObject);
var
I, J : Integer;
Texto, Temp : String;
X, Y : array of string;
begin
Temp := ´´;
J := 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
SetLength(X, J);
X[J] := Trim(Temp);
End;
End
Else
Begin
SetLength(X, J);
J := J + 1;
X[J] := Trim(Temp);
Temp := ´´;
End;
End;
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
SetLength(Y, J);
Y[J] := Trim(Temp);
End;
End
Else
Begin
SetLength(Y, J);
J := J + 1;
Y[J] := Trim(Temp);
Temp := ´´;
End;
End;
end;


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

ok copiei a tua função de combinações para ganhar tempo, depois qualquer coisa eu desenvolvo outra



se for o caso , da ate para desenvover outra .. Mas eu estou emperrado
na criação da matriz dinamica

Por gentileza , aonde estou errando

Copie o codigo e veja o err que aparece

procedure CriarMatrizX(Composicao:String);
var
i,indiceanterior,q:integer;
texto:String;
X : array of string;
begin
q:=0;
i:=1;
indiceAnterior:=1;
while i <= length(composicao) do
 begin
    if composicao[i]=´;´ then
      begin
        texto:=copy(composicao,indiceanterior,i - indiceAnterior);
        indiceAnterior:=i+1;
        //aqui voce vaui criar a MatrizX[i]
        X[q]:=Trim(texto);
        q:=q+1;
        form1.Memo1.Lines.Add(texto);
      end;
    i:=i+1;
 end;
end;


para chamar

procedure TForm1.Button2Click(Sender: TObject);
begin
CriarMatrizX(´ABS ; DE ; W; H ; J; I´);
end;


eu preciso disso para proseguir


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

Var
X : array of string;
begin

.

setlength(x, 100), veja lá em cima onde coloquei em negrito


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

mas fazendo isso voce não esta defininindo uma limitação para esta matriz ???? Sera isto mesmo

2)ja que voce esta trabalhando com matriz , como saber quantos elementos tem esta matriz... Tip um recorcCound


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

high me traz a quantidade de elementos da matriz menos 1


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

O meu está dando erro na memória aqui
X[J] := Trim(Temp);


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

O meu está dando erro na memória aqui
X[J] := Trim(Temp);

para isto voce deve fazer antes

[b:3cccd45148]setlength(x, 100), [/b:3cccd45148]

mas eu to querendo fazer

high me traz a quantidade de elementos da matriz menos 1


Como usa ::


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

agora acertei tudo, está funcionando perfeitamente
Temp := ´´;
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;
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);
se usar lenght(x) terá o tamanho da matriz, se usar high(x) terá o valor do maior índice da matriz, ou seja length - 1


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

beleza .. MAs me responda por favor

como definir a Matriz Z uma matriz n,2 .. onde o n não se sabe


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

veja bem, eu não defini o tamanho da matriz, eu criei uma matriz dinâmica (que é diferente de uma matriz comum), e depois dei um tamanho mínimo para ela e fui aumentando o tamanho da mesma a cada vírgula que achava
X, Y : array of string;

StLength(X,1);
SetLength(Y,1);

SetLength(X, J);
SetLength(Y J);


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

sim , mas da mesma forma que voce definiu a matriz X e Y tem que definir a Matriz Z.. como se faz isto por definição


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

agora que estou incrementando esta parte com
TamanhoX := Length(X);
TamanhoY := Length(Y);
SetLength(Z, TamanhoX * TamanhoY);


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

está aí completo, agora só falta a sql, no local onde estou jogando na memo ainda não é a hora, pois vou pegar o valor contido na matriz Z e acrescentar o resultado da sql para depois jogar no memo

procedure TForm4.Button2Click(Sender: TObject);
var
I, J, K, TamanhoX, TamanhoY : Integer;
Texto, Temp : String;
X, Y, Z : array of string;
begin
Temp := ´´;
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] +´= ´;
Memo1.Lines.Add(Z[K]);
K := K + 1;
End;
End;
end;


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

o meu tb esta quase completo , so que é diferente do seu...

falta alguns ajustes ,,,

é apenas o esboço

daqui ha pouco vai


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

ok, vamos ver a tal da query, este é que está sendo o meu problema


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

segue...

tente acompanhar o raciocineo é importante colocar este codigo , tentar fazer e depois adapta-lo Não esta otimazado e nen esta completo não implementei a função Z , por não saber defini-la Também ainda não implementei a função que gera combinaçoes para o caso de String


implementation

{$R *.DFM}


var X : array of string; tamanhox:integer; Y : array of string; tamanhoy:integer; Z : array of string;//o certo e definila como duas dimensoes FormacaoString:string;


procedure CriarMatrizX(Composicao:String);
var
i,indiceanterior,q:integer;
texto:String;
begin
q:=0;
i:=1;
indiceAnterior:=1;
while i <= length(composicao) do
 begin
    if composicao[i]=´;´ then
      begin
        texto:=copy(composicao,indiceanterior,i - indiceAnterior);
        indiceAnterior:=i+1;
        //aqui voce vaui criar a MatrizX[i]
        X[q]:=Trim(texto);
        q:=q+1;
        form1.Memo1.Lines.Add(texto);
        FormacaoString:=formacaoString+texto;
      end;
    i:=i+1;
 end;
end;



procedure CriarMatrizY(Composicao:String);
var
i,indiceanterior,q:integer;
texto:String;
begin
setlength(Y, 100);
i:=1;
indiceAnterior:=1;
while i <= length(composicao) do
 begin
    if composicao[i]=´;´ then
      begin
        texto:=copy(composicao,indiceanterior,i - indiceAnterior);
        indiceAnterior:=i+1;
        //aqui voce vai criar a MatrizY[i]
        Y[q]:=Trim(texto);
        form1.Memo2.Lines.Add(texto);
        FormacaoString:=FormacaoString+texto;
      end;
    i:=i+1;
 end;
end;


//Veja que é uma reduntancia os dois métodos serem iguais... É so fazer uma passagem de parametro com Var


function GeraCombinacoes(S: string; NumDig: Integer): TStrings; 
var
I, J: Integer;
X: Char;
TS: TStrings;
S1: string;
begin
  Result := TStringList.Create; 
  TS     := TStringList.Create; 

  for I := 1 to Length(S) do Result.Add(S[I]); 

  while Length(Result.Strings[0]) < NumDig do 
    begin 
      for I := 0 to (Result.Count - 1) do
        begin
          S1 := ´´; 
          for J := 1 to Length(S) do 
            begin
              X := S[J]; 
              if Pos(X, Result.Strings[I]) = 0 then S1 := S1 + X; 
            end; 

          for J := 1 to Length(S1) do
            begin 
              X := S1[J]; 
              TS.Add(Result.Strings[I] + X);
            end; 
        end;
      Result.Text := TS.Text; 
      TS.Clear; 
    end; 

  TS.Free;
end; 


//esta função que a partir de X e de Y Gera-la a Matriz Z
//Tb não implementei esta parte.. Coloquei apenas na forma de Memo3

procedure TForm1.Button1Click(Sender: TObject);
var
i,j,indice:integer;
begin
//pesquisa na tabela1
Query1.Close;
Query1.SQL.Clear;
Query1.Sql.Add(´Select *From  Tabela1´);
Query1.Sql.Add(´Where Produto=:NomePrimeiroProduto´);
Query1.ParamByName(´NomePrimeiroProduto´).asstring:=edit1.text;
Query1.Sql.Add(´And Produto=:NomesegundoProduto´);
Query1.ParamByName(´NomesegundoProduto´).asstring:=edit2.text;
Query1.Prepare;
Query1.open;
Criaçao da MatrizX
tamanhox:=0;
setlength(x, 100);
CriarMatrizX(query1.FieldByName(´Produto´).asstring);
Query1.Next;
//Criaçao da Matriz Y
tamanhoy:=0;
setlength(y, 100);
CriarMatrizY(query1.FieldByName(´Produto´).asstring);

//******ETAPA ABAIXO DEVE SER SUBSTITUIDA

Memo3.Lines.Assign(GeraCombinacoes(formacaoString,2));
//aqui voce deve criar a sua matriz Z .. Ela é da forma N,2
//eu não to fazendo este passo..suponha que a partir de Memo3 se consiga isto

//Novamente mais uma consulTa , agora na tabela 2
i:=1;
for i:=1 to tamanhox do
  begin
    for j:=1 to tamanhoy do
      begin
        Query2.Close;
        Query2.SQL.Clear;
        Query2.Sql.Add(´Select *From  Tabela2´);
        Query2.Sql.Add(´Where (Composicao1=:Comp1´);
        Query2.Sql.Add(´And Composicao2=:Comp2)´);
        query2.sql.add(´Or(composicao1:=comp2´);
        query2.sql.add(´and(composicao2:=comp1))´);
        Query2.ParamByName(´Comp1´).asstring:=X[i];
        Query2.ParamByName(´Comp2´).asstring:=Y[J];
        Query2.Prepare;
        Query2.open;

        //esta é a lei de formação servira para implementar Z******
        Indice:=(i*j)+(i-1)*(3-j);
       //A formula anteiror no meu conceito e de extrema importancia para 
      //a formação da futura Matriz Z

        if query2.fieldByName(´Reacao´).AsString <> ´´ Then
           Memo4.Lines.Add(query2.fieldByName(´Reacao´).AsString)
        //Z[i,Indice]:=query2.fieldByName(´Reacao´).AsString
        //nada foi encontrado
        else
          Memo4.Lines.Add(´´);
          // Z[I,indice]:=´´;
      end;
 end;
end;



[b:cac9145575][b]outro passo importante que não foi mencionado e não foi jevantado e sobre os Produtos da Tabela1.. Por suposição na Tabela1 Nunca Tera 2
Produtos Iguais, isto é os Pordutos são sempre diferentes[/b:cac9145575]

espero que tenha tirado alguma idéia , pois deu trabalho


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

na tabela1 o nome do produto será índice primário, vou testar o teu código da sql para pesquisa na tabela2, depois retorno o resultado


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

está dando um erro aqui
Query1.ParamByName(´Comp1´).AsString:=X[I - 1];
Query1.ParamByName(´Comp2´).AsString:=Y[J - 1]; nesta linha, dizendo que query1.parameter ´Comp2´ not found, isto na primeira passada do loop, porém se dou um showmessage no y[j-1] ele me mostra o valor


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

está dando um erro aqui Query1.ParamByName(´Comp1´).AsString:=X[I - 1]; Query1.ParamByName(´Comp2´).AsString:=Y[J - 1]; nesta linha, dizendo que query1.parameter ´Comp2´ not found, isto na primeira passada do loop, porém se dou um showmessage no y[j-1] ele me mostra o valor


o código que lhe passei não tem isto

outra coisa edicilmar , voltei aqui so para te dizer isto:

1)para testar deve cadastrar a composicao na tabela1 sem deixar espaços,
isto porque estamos trabalhando com caracter
Assimdev-se ter por exemplo
Produto1 A;S;D;F
Produto2 H;J;K;L

2)outra coisa que quero deixar levantado e sobre esta citação
//esta é a lei de formação servira para implementar Z****** Indice:=(i*j)+(i-1)*(3-j); //A formula anteiror no meu conceito e de extrema importancia para

esta formula não esta certa.. Vou desenvolver uma outra formula e post amanha de manha

[b:db5ac3f1c8]Por mais modifique a sql para o código que eu postei.. Note que to trabalhando com duas query[/b:db5ac3f1c8] Uma consulta na tabela1 e outra na tabela2

É claro que este cídigos no fim podem ser todos Maximizados.. Mas isto é para ver aonde podemos chegar

Boa sorte


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

devido ao fato de que troquei apenas os nomes dos campos, a tua está dando erro não sei se de parênteses, espaço, ou outra coisa, já troquei de todas as formas mas o erro persiste, eis aqui a minha, e creio que o Z vai funicionar

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 ´);
Query1.Sql.Add(´And (ELEMENTO2 =:Comp2)) ´);
Query1.Sql.Add(´Or ((ELEMENTO1 :=Comp2) ´);
Query1.Sql.Add(´And (ELEMENTO2 :=Comp1))´);
Query1.ParamByName(´Comp1´).AsString := X[I];
Query1.ParamByName(´Comp2´).AsString := Y[J];
Query1.Prepare;
Query1.Open;

//esta é a lei de formação servira para implementar Z******
// Indice:=(i*j)+(i-1)*(3-j);
//A formula anteiror no meu conceito e de extrema importancia para
//a formação da futura Matriz Z

If Query1.FieldByName(´RESULTADO´).AsString <> ´´ then
Z[K] := Z[K] + Query1.FieldByName(´RESULTADO´).AsString
Else
Z[K] := Z[K] + ´Sem Reação Conhecida´;
// Memo4.Lines.Add(Query2.FieldByName(´Reacao´).AsString)
//Z[i,Indice]:=query2.fieldByName(´Reacao´).AsString
//nada foi encontrado
// Else
// Memo4.Lines.Add(´´);
// Z[I,indice]:=´´;
End;
End;
For I := 1 to Length(Z) do
Memo1.Lines.Add(Z[K]);


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

corrigindo aqui
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;


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

A formação de Z , se voce quiser uma Matriz Z(n,2) ja da para calcular o Indice.. Desde que se defina Z como sendo em duas dimensoes. O que parece que voce não o Fez


corrigindo aqui 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;


Eu não entendi.. Deu para chegar em algum lugar ou não ???

devido ao fato de que troquei apenas os nomes dos campos, a tua está dando erro não sei se de parênteses,


o meu select2 Deve ser refletido,, eu fiz sem testar. A idéia e testar o valor de X[I] Y[j] simultaneamente

[b:97fa5e45aa](X[i] na Composica1 e Y[j] na composicao2)Or
(X[i] na Composica2 e Y[j] na composicao1)[/b:97fa5e45aa]

Pelo que nos combinamos logo no inicio lembra


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

Não fiz uma matriz bidimensional, não há necessidade, basta pegar a matriz Z e acrescentar o texto da reação com o texto já existente, tipo
Z[1] := A+B= (isto já foi colocado antes) + ´dor de barriga´ isto deverá ser colocado aqui, caso a reação A+B não exista então será colocado ´sem reação conhecida´
Isto já foi colocado para quando a sql venha a funcionar, quanto da pesquisa dos 2 campos x[i] e y[j], não vejo problema algum


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

bom dia

mudei algumas instruçoes..

alem disso testei

parece Ok

so precisa colocar pimenta a seu gosto

type
A = Array of string;

var
X : A;
tamanhox:integer;
Y : A;
tamanhoy:integer;
Z : A;

procedure CriarMatriz(var B:A;var tamanho:integer;Composicao:String);
var
i,indiceanterior,q:integer;
texto:String;
begin
tamanho:=0;
setlength(B, 100);
i:=0;
indiceAnterior:=1;
q:=0;
while i <= (length(composicao)-1) do
 begin
    if composicao[i]=´;´ then
      begin
        texto:=copy(composicao,indiceanterior,i - indiceAnterior);
        indiceAnterior:=i+1;
        B[q]:=Trim(texto);
        q:=q+1;
        tamanho:=Tamanho+1;
      end;
    i:=i+1;
 end;
if length(composicao) > 0 then
  begin
    if composicao[i]=´;´ then
      texto:=copy(composicao,indiceanterior,i-indiceAnterior)
    else
      texto:=copy(composicao,indiceanterior,(i+1) - indiceAnterior);
    B[q]:=Trim(texto);
    tamanho:=Tamanho+1;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
i,j,indice:integer;
begin
Query1.Close;
Query1.SQL.Clear;
Query1.Sql.Add(´Select *From  Tabela1´);
Query1.Sql.Add(´Where Produto=:NomePrimeiroProduto´);
Query1.ParamByName(´NomePrimeiroProduto´).asstring:=edit1.text;
Query1.Sql.Add(´OR Produto=:NomesegundoProduto´);
Query1.ParamByName(´NomesegundoProduto´).asstring:=edit2.text;
Query1.Prepare;
Query1.open;
if query1.RecordCount = 2 then
  begin
   CriarMatriz(X,tamanhox,query1.FieldByName(´Composicao´).asstring);
   Query1.Next;
   CriarMatriz(y,tamanhoy,query1.FieldByName(´Composicao´).asstring);
   setlength(Z, 100);
   indice:=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  Tabela2´);
          Query1.Sql.Add(´Where ((Composicao1=:Comp1)and(Composicao2=:Comp2))or((Composicao1=:Comp2)and(Composicao2=:Comp1))´);
          Query1.ParamByName(´Comp1´).asstring:=X[i];
          Query1.ParamByName(´Comp2´).asstring:=Y[J];
          Query1.Prepare;
          Query1.open;
          Z[indice]:=X[i]+´  ´+Y[J];
          if query1.fieldByName(´Reacao´).AsString <> ´´ Then
             Z[Indice]:=Z[Indice]+´  ´+query1.fieldByName(´Reacao´).AsString
          //nada foi encontrado
          else
            Z[indice]:=Z[Indice]+´ Sem Reação Conhecida´;
          Indice:=indice+1;
        end;
   end;
  for i:=0 to indice do
    memo1.Lines.Add(Z[i]);
 end
else
 showmessage(´Pesquisa concluida . Nada fora encontrado´);
end;


testei e a principio foi satisfatorio

O que eu mudei

1) Z não é mais bidiemensional

2) Maximizei o código

3)utililei a mesma procedure criar Matriz Para X e Y

4)A combinação Matriz Z , não precisa mais de uma função de Combinação.. Ela é contruida no próprio Loop

5)Importante ... Coloquei toda a instrução do segundo Select dentro de Uma mesma Linha... Sofro em tentar separa-lo e ja ha muito tempo atrás abri um tópico sobre isso
[b:6df99c5ec5]//Mesma Linha[/b:6df99c5ec5]
Query1.Sql.Add(´Where ((Composicao1=:Comp1)and(Composicao2=:Comp2))or((Composicao1=:Comp2)and(Composicao2=:Comp1))´);


6)Alterei a função CriarMatriz

7)Alterei no primeir sql
query1.FieldByName(´Produto´).asstring para
query1.FieldByName(´Composicao´).asstring
, pois as matrizes devem ser criadas a partir da composição e naõ do nome do Produto

8)A intrução
if query1.RecordCount = 2 then

é a gosto e há como fazer outros testes , usando o Próprio
[b:6df99c5ec5]query1.FieldByName(´Composicao´).asstring <> ´´ Faça Senão Não Faça[/b:6df99c5ec5]

9)Emfim , acho que não ira ter problemas


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

FUNCIONOU
aqui está a que eu terminei de modificar, vou testar a sua função, a minha está funcionando perfeitamente inclusive na inversão das posições na tabela;
Marcos, grato pela ajuda, valeu pela força


procedure 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;

pode testar a minha que funciona, agora vou testar a sua


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

Marcos, não entendi este procedimento
procedure CriarMatriz(var B:A;var tamanho:integer;Composicao:String);
o que significa var B:A ?


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

descobri, a é um array of string; mas vc deu um tamanho de Z = 100, ele pode ser 1 ou 1000, eu não tenho nem idéia inicialmente


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

Marcos, não entendi este procedimento procedure CriarMatriz(var B:A;var tamanho:integer;Composicao:String); o que significa var B:A ?


descobri, a é um array of string; mas vc deu um tamanho de Z = 100, ele pode ser 1 ou 1000, eu não tenho nem idéia inicialmente


não na verdade eu dei porque voce me explicou assim...

Lembra da minha dúvida em post passados como definir Array Dinamicos

Citação de marcos Pagina 2
beleza.. eu so não to lembrando como se cria uma matriz dinamica


Citacao de Edicilmar Pagina3
Var X : array of string; begin . setlength(x, 100), veja lá em cima onde coloquei em negrito


Mas agora to vendo que o negoci o pode ser este

setlength(x, i); a cada lopp .. Vou testar com esta instrução


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

Corrigido e Funcionou

procedure CriarMatriz(var B:A;var tamanho:integer;Composicao:String);
var
i,indiceanterior,q:integer;
texto:String;
begin
tamanho:=0;
i:=0;
indiceAnterior:=1;
q:=0;
while i <= (length(composicao)-1) do
 begin
    if composicao[i]=´;´ then
      begin
        texto:=copy(composicao,indiceanterior,i - indiceAnterior);
        tamanho:=Tamanho+1;
        setlength(B,tamanho); //******corrigido
        B[q]:=Trim(texto);
        indiceAnterior:=i+1;
        q:=q+1;
      end;
    i:=i+1;
 end;
if length(composicao) > 0 then
  begin
    if composicao[i]=´;´ then
      texto:=copy(composicao,indiceanterior,i-indiceAnterior)
    else
      texto:=copy(composicao,indiceanterior,(i+1) - indiceAnterior);
    tamanho:=Tamanho+1;
    setlength(B,tamanho); //*********corrigido
    B[q]:=Trim(texto);
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
i,j,indice:integer;
begin
Query1.Close;
Query1.SQL.Clear;
Query1.Sql.Add(´Select *From  Tabela1´);
Query1.Sql.Add(´Where Produto=:NomePrimeiroProduto´);
Query1.ParamByName(´NomePrimeiroProduto´).asstring:=edit1.text;
Query1.Sql.Add(´OR Produto=:NomesegundoProduto´);
Query1.ParamByName(´NomesegundoProduto´).asstring:=edit2.text;
Query1.Prepare;
Query1.open;
if query1.RecordCount = 2 then
  begin
   CriarMatriz(X,tamanhox,query1.FieldByName(´Composicao´).asstring);
   Query1.Next;
   CriarMatriz(y,tamanhoy,query1.FieldByName(´Composicao´).asstring);
   indice:=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  Tabela2´);
          Query1.Sql.Add(´Where ((Composicao1=:Comp1)and(Composicao2=:Comp2))or((Composicao1=:Comp2)and(Composicao2=:Comp1))´);
          Query1.ParamByName(´Comp1´).asstring:=X[i];
          Query1.ParamByName(´Comp2´).asstring:=Y[J];
          Query1.Prepare;
          Query1.open;
          setlength(Z,indice+1);  //******corrigido 
          Z[indice]:=X[i]+´  ´+Y[J];
          if query1.fieldByName(´Reacao´).AsString <> ´´ Then
             Z[Indice]:=Z[Indice]+´  ´+query1.fieldByName(´Reacao´).AsString
          //nada foi encontrado
          else
            Z[indice]:=Z[Indice]+´ Sem Reação Conhecida´;
          Indice:=indice+1;
        end;
   end;
  for i:=0 to indice-1 do //********corrigido
    memo1.Lines.Add(Z[i]);
 end
else
 showmessage(´Pesquisa concluida . Nada fora encontrado´);
end;



GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

ok vou testar


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

Fiz um teste com a seguinte situação

Tabela 1 ; tabela2

Ver como esta a base de dados da Tabela 1 e da Tabela2

[URL=http://imageshack.us][img:c69ddf97c1]http://img392.imageshack.us/img392/8950/imagemparaedicilmar32kf.jpg[/img:c69ddf97c1][/URL]

Executei agora od dosi métodos ... Button1(Marco) o método que lhe passei , Button2(Edicilmar) o método que me passou

Execução do Button1(Marco).. O resultado no Memo1 Foi este ;

[URL=http://imageshack.us][img:c69ddf97c1]http://img99.imageshack.us/img99/9528/imagemparaedicilmar45ny.jpg[/img:c69ddf97c1][/URL]

Execução do Button2(Edicilmar).. O resultado fo ieste ;

[URL=http://imageshack.us][img:c69ddf97c1]http://img353.imageshack.us/img353/934/imagemparaedicilmar52fr.jpg[/img:c69ddf97c1][/URL]

Não to entendendo porque da diferença ????


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

Execução do Button1(Marco).. O resultado no Memo1 Foi este ;



Execução do Button2(Edicilmar).. O resultado fo ieste ;



Não to entendendo porque da diferença ????

O que deveria haver entre estas 2 linhas? está em branco


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

O que deveria haver entre estas 2 linhas? está em branco


Deveria ter os desenhos que gerei a partir da execução do programa... Usei o ImageShack para cria-los .. Consegue ver agora ????


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

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


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

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


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

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


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

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


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

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


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

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]


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

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


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

escreva a tabela com os dados


GOSTEI 0
Marco Salles

Marco Salles

04/02/2006

[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


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

É, 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


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

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


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

04/02/2006

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;



GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

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?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

04/02/2006

funciona direitinho.


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

ok, vou testar e depois retorno


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

negativo emerson, o resultado não coadunou com o bd


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

04/02/2006

você alterou o delimitador?


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

era isto, eu estava usando vírgula e vc colocou ponto e vírgula, e como eu tinha dado ctrl+c e ctrl+v no procedimento, não tinha reparado


GOSTEI 0
Martins

Martins

04/02/2006

era isto, eu estava usando vírgula e vc colocou ponto e vírgula, e como eu tinha dado ctrl+c e ctrl+v no procedimento, não tinha reparado


Isso mesmo o Emerson.en está usando ´;´ como delimitador. Então quer dizer q funcionou perfeitamente?


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

sim, a do emerson também funciona corretamente


GOSTEI 0
Martins

Martins

04/02/2006

sim, a do emerson também funciona corretamente


Certo colega, obrigado pelo retorno.

Valew!!!!


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

04/02/2006

ótimo!
mas o que eu queria mesmo era mostrar essa forma de trabalhar com delimitadores juntamente com o StringList. isso economiza um bom tempo de ´queimação´ de neurônios.


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

é, concordo plenamente, mas na hora que se está desenvolvendo, a maior preocupação é ´fazer funcionar´ e não otimizar, afinal de contas isto é feito depois, mas é claro que sempre se aprende algo


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

é, concordo plenamente, mas na hora que se está desenvolvendo, a maior preocupação é ´fazer funcionar´ e não otimizar, afinal de contas isto é feito depois, mas é claro que sempre se aprende algo novo


GOSTEI 0
Edilcimar

Edilcimar

04/02/2006

é, concordo plenamente, mas na hora que se está desenvolvendo, a maior preocupação é ´fazer funcionar´ e não otimizar, afinal de contas isto é feito depois, mas é claro que sempre se aprende algo novo


GOSTEI 0
POSTAR