Dúvida com select

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

Respostas

04/02/2006

Emerson

que banco de dados você usa, amigo Edilcimar?

creio que isso seja possível com Stored Procedures.


Responder Citar

04/02/2006

Marco Salles

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)



Responder Citar

04/02/2006

Edilcimar

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


Responder Citar

04/02/2006

Marco Salles

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]


Responder Citar

04/02/2006

Edilcimar

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


Responder Citar

04/02/2006

Marco Salles

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 :


Responder Citar

04/02/2006

Edilcimar

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


Responder Citar

04/02/2006

Edilcimar

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


Responder Citar

04/02/2006

Edilcimar

num campo memo não, num Tmemo


Responder Citar

04/02/2006

Marco Salles

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]


Responder Citar

04/02/2006

Edilcimar

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


Responder Citar

04/02/2006

Marco Salles

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


Responder Citar

04/02/2006

Edilcimar

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)


Responder Citar

04/02/2006

Marco Salles

sim , isto não é dificil

mas vamos criar uma .


Responder Citar

04/02/2006

Marco Salles

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&93;=´;´ then
      begin
        texto:=copy(composicao,indiceanterior,i - indiceAnterior);
        indiceAnterior:=i+1;
         //aqui voce vaui criar a MatrizX&91;i&93;
        form1.Memo1.Lines.Add(texto);
      end;
    i:=i+1;
 end;
end;



Responder Citar