Array
(
)

Dúvida com select

Edilcimar
   - 04 fev 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


Emerson
   - 04 fev 2006

que banco de dados você usa, amigo Edilcimar?

creio que isso seja possível com Stored Procedures.


Marco Salles
   - 04 fev 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


Citação:
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



Citação:
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..


Citação:
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)



Edilcimar
   - 04 fev 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


Marco Salles
   - 04 fev 2006


Citação:
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


Citação:
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


Como voce definiu a sua tabela 2 ???? para mim isto e crucial


Edilcimar
   - 04 fev 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


Marco Salles
   - 04 fev 2006


Citação:
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 :


Citação:
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


Citação:
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 :


Edilcimar
   - 04 fev 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


Edilcimar
   - 04 fev 2006

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


Edilcimar
   - 04 fev 2006

num campo memo não, num Tmemo


Marco Salles
   - 04 fev 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
Citação:
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

concorda com esta colocação ????


Edilcimar
   - 04 fev 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


Marco Salles
   - 04 fev 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


Edilcimar
   - 04 fev 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)


Marco Salles
   - 04 fev 2006

sim , isto não é dificil

mas vamos criar uma .


Marco Salles
   - 04 fev 2006

Acho que esta procedure resolva

#Código

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;



Edilcimar
   - 04 fev 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;


Edilcimar
   - 04 fev 2006

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


Edilcimar
   - 04 fev 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;


Marco Salles
   - 04 fev 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

#Código

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;



Edilcimar
   - 04 fev 2006

está aqui, inclusive com a criação da matriz dinâmica
procedure TForm4.Button2Click(Sender: TObject);
var
I, J : Integer;
Texto, Temp : String;
X : array of string;
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
SetLength(X, J);
J := J + 1;
X[I] := Trim(Temp);
Temp := ´´;
End;
End;
end;