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

04/02/2006

Edilcimar

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;


Responder

04/02/2006

Edilcimar

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


Responder

04/02/2006

Edilcimar

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;


Responder

04/02/2006

Marco Salles

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;



Responder

04/02/2006

Edilcimar

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;


Responder

04/02/2006

Edilcimar

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


Responder

04/02/2006

Edilcimar

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;


Responder

04/02/2006

Marco Salles

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


Responder

04/02/2006

Edilcimar

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


Responder

04/02/2006

Edilcimar

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


Responder

04/02/2006

Marco Salles

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



Responder

04/02/2006

Edilcimar

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


Responder

04/02/2006

Edilcimar

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;


Responder

04/02/2006

Marco Salles

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


Responder

04/02/2006

Edilcimar

Var
X : array of string;
begin

.

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


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