Dúvida com select
04/02/2006
0
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
Posts
04/02/2006
Edilcimar
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;
04/02/2006
Edilcimar
04/02/2006
Edilcimar
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;
04/02/2006
Marco Salles
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;
04/02/2006
Edilcimar
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;
04/02/2006
Edilcimar
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
04/02/2006
Edilcimar
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;
04/02/2006
Marco Salles
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
04/02/2006
Edilcimar
04/02/2006
Edilcimar
04/02/2006
Marco Salles
se voce vai criar com apenas uma.. O que eu to te perguntando e se :
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));
04/02/2006
Edilcimar
04/02/2006
Edilcimar
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;
04/02/2006
Marco Salles
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
04/02/2006
Edilcimar
X : array of string;
begin
.
setlength(x, 100), veja lá em cima onde coloquei em negrito
Clique aqui para fazer login e interagir na Comunidade :)