Select filtrando caracteres
salve!
como eu poderia escrever esse SELECT:
selecione o maior valor do campo ´referencia´ da tabela ´livros´, quando o valor contiver nos seus dois primeiros caracteres as letras ´AB´
como eu poderia escrever esse SELECT:
selecione o maior valor do campo ´referencia´ da tabela ´livros´, quando o valor contiver nos seus dois primeiros caracteres as letras ´AB´
{ criei algo assim mas nao funciona direito, ou seja ele até seleciona o maior valor, porem nao checa os dois primeiros caracteres }
DM.qry_MatNovo.Open;
DM.qry_MatNovo.SelectSQL.Clear;
DM.qry_MatNovo.SelectSQL.add(´SELECT MAX(REFERENCIA) PROX FROM LIVROS where REFERENCIA Like:PCodigo ´);
DM.qry_MatNovo.Params[0].AsString;
DM.qry_MatNovo.ParamByName(´PCodigo´).AsString := ´¬´+´AB´;
dm.qry_MatNovo.open;
Mahdak
Curtidas 0
Respostas
Rjun
20/09/2005
Acho que você inverteu a posição do caracter coringa. Ele deve vir apos o ´AB´.
DM.qry_MatNovo.ParamByName(´PCodigo´).AsString := ´AB¬´;
GOSTEI 0
Mahdak
20/09/2005
Acho que você inverteu a posição do caracter coringa. Ele deve vir apos o ´AB´.
DM.qry_MatNovo.ParamByName(´PCodigo´).AsString := ´AB¬´;
Rjun... nao deu certo nao
fiz desse jeito mais nao adiantou, ele ainda continua sem verificar os dois primeiros caracteres da string....
GOSTEI 0
Rjun
20/09/2005
Precisa colocar o texto entre aspas no SQL. Faça assim:
DM.qry_MatNovo.ParamByName(´PCodigo´).AsString := QuotedStr(´AB¬´);
GOSTEI 0
Mahdak
20/09/2005
Precisa colocar o texto entre aspas no SQL. Faça assim:
DM.qry_MatNovo.ParamByName(´PCodigo´).AsString := QuotedStr(´AB¬´);
na verdade nao é bem um texto em sí que o sistema checa, mas sim um campo de uma tabela Interbase. mas esse campo é uma string de no maximo 2 caracteres, entao eu considero como um texto, mas mesmo assim ainda nao funcionou... vou colar aqui o código desse procedure pra vc dar uma analizada... e vou indicar onde está o problema...
[]´s
procedure TMateriais.Btn_NovoClick(Sender: TObject);
var
Cod1 : integer;
ref1,ref2,ref3, cod2 : String;
begin
if combo_area.Text = ´´ then
begin
ShowMessage(´O campo "Área" está vazio, por favor escolha uma Área.´);
end
else
begin
// Gera o Código do material ESSE BLOCO ESTÁ OK
DM.qry_MatCod.Open;
DM.qry_MatCod.SelectSQL.Clear;
DM.qry_MatCod.SelectSQL.add(´SELECT (MAX(CODIGO) + 1 ) PROX FROM LIVROS´);
dm.qry_MatCod.open;
cod1 := dm.qry_MatCod.Fields[0].AsInteger;
if cod1 = null then
begin
cod1:=0;
end
else
cod1:=cod1;
Edit_Codigo.Text := FloatToStr(cod1);
// esse select seleciona a palavra que vai antes o ponto (o código da area escolhida) ESSE BLOCO TAMBEM ESTÁ OK
DM.qry_ArNovo.Close;
DM.qry_ArNovo.SelectSQL.Clear;
DM.qry_ArNovo.SelectSQL.add(´select * from AREA where NOME Like:Consulta ´);
DM.qry_ArNovo.Params[0].AsString;
DM.qry_ArNovo.ParamByName(´Consulta´).AsString:=´´+´¬´+combo_area.Text+´¬´;
Dm.qry_ArNovo.open;
cod2 := DM.Qry_ArNovoPSEUDONIMO.AsString;
// *********** PROBLEMAS AQUI, VERIFICAR POR QUE NAO ESTÁ FAZENDO A CHECAGEM *******
{ selecione o maior valor do campo "referencia" da tabela "livros", quando o valor
contiver nos seus dois primeiros caracteres as letras "AB"
}
// esse select seleciona o numero que vai após o ponto, que contenha antes do ponto "cod2", PORÉM NAO ESTA FUNCIONANDO, OU SEJA, ELE ESTÁ GERANDO O CÓDIGO A PARTIR DOS PRIMEIROS REGISTROS DA TABELA, E NAO OS REGISTROS DO SELECT
DM.qry_MatNovo.Open;
DM.qry_MatNovo.SelectSQL.Clear;
DM.qry_MatNovo.SelectSQL.add(´SELECT MAX(REFERENCIA) PROX FROM LIVROS where REFERENCIA Like:PCodigo ´);
DM.qry_MatNovo.Params[0].AsString;
DM.qry_MatNovo.ParamByName(´PCodigo´).AsString := QuotedStr(Cod2+´¬´);
dm.qry_MatNovo.open;
ref1 := QuotedStr(DM.qry_MatNovoPROX.AsString);
if ref1 = null then
begin
ref1:=´0´;
end
else
ref1:=ref1;
//DM.qry_ArNovo.Close;
ShowMessage(ref1);
ref2 := FilterChars(Ref1, [´0´..´9´]); // remove as letras e o ponto decimal para a consulta deixando apenas os numeros referentes ao material
ref3 := IntToStr(StrToInt(ref2) + StrToInt(´1´)); //
edit_CodigoR.Text := Cod2 + ´.´ + ref3;
end;
end;
GOSTEI 0
Rjun
20/09/2005
Eu dei uma mexida no seu código. Veja se funciona.
procedure TMateriais.Btn_NovoClick(Sender: TObject);
var
Cod1: integer;
ref1,
ref2,
ref3,
cod2: String;
begin
if combo_area.Text = ´´ then
ShowMessage(´O campo "Área" está vazio, por favor escolha uma Área.´);
else
begin
// Gera o Código do material ESSE BLOCO ESTÁ OK
DM.qry_MatCod.SelectSQL.Clear;
DM.qry_MatCod.SelectSQL.Add(´SELECT (MAX(Codigo) + 1) PROX FROM LIVROS´);
DM.qry_MatCod.Open;
try
cod1 := dm.qry_MatCod.Fields[0].AsInteger;
finally
DM.qry_MatCod.Close;
end;
if (cod1 = null) then
cod1 := 0;
Edit_Codigo.Text := FloatToStr(cod1);
// esse select seleciona a palavra que vai antes o ponto (o código da area escolhida) ESSE BLOCO TAMBEM ESTÁ OK
DM.qry_ArNovo.SelectSQL.Clear;
DM.qry_ArNovo.SelectSQL.Add(´SELECT * FROM Area WHERE Nome LIKE :Consulta ´);
DM.qry_ArNovo.ParamByName(´Consulta´).AsString := ´´ + ´¬´ + combo_area.Text + ´¬´;
DM.qry_ArNovo.Open;
try
cod2 := DM.Qry_ArNovo.FieldByName(´PSEUDONIMO´).AsString;
finally
DM.qry_ArNovo.Close;
end;
// *********** PROBLEMAS AQUI, VERIFICAR POR QUE NAO ESTÁ FAZENDO A CHECAGEM *******
{
selecione o maior valor do campo "referencia" da tabela "livros", quando o valor
contiver nos seus dois primeiros caracteres as letras "AB"
}
// esse select seleciona o numero que vai após o ponto, que contenha antes do ponto "cod2",
// PORÉM NAO ESTA FUNCIONANDO, OU SEJA, ELE ESTÁ GERANDO O CÓDIGO A PARTIR DOS PRIMEIROS
// REGISTROS DA TABELA, E NAO OS REGISTROS DO SELECT
DM.qry_MatNovo.SelectSQL.Clear;
DM.qry_MatNovo.SelectSQL.Add(´SELECT MAX(Referencia) AS PROX FROM Livros WHERE Referencia LIKE :PCodigo´);
DM.qry_MatNovo.ParamByName(´PCodigo´).AsString := QuotedStr(Cod2 + ´¬´);
DM.qry_MatNovo.Open;
try
ref1 := QuotedStr(DM.qry_MatNovo.FieldByName(´PROX´).AsString);
finally
DM.qry_MatNovo.Close;
end;
if ref1 = null then
ref1 := ´0´;
ShowMessage(ref1);
// remove as letras e o ponto decimal para a consulta deixando apenas
// os numeros referentes ao material
ref2 := FilterChars(Ref1, [´0´..´9´]);
ref3 := IntToStr(StrToInt(ref2) + StrToInt(´1´)); //
edit_CodigoR.Text := Cod2 + ´.´ + ref3;
end;
end;
GOSTEI 0
Mahdak
20/09/2005
nao deu certo nao R.Jun....
acho que o problema é só nesse select mesmo...
nao to conseguindo me achar nessa resolução...
acho que o problema é só nesse select mesmo...
nao to conseguindo me achar nessa resolução...
// *********** PROBLEMAS AQUI, VERIFICAR POR QUE NAO ESTÁ FAZENDO A CHECAGEM *******
{ selecione o maior valor do campo "referencia" da tabela "livros", quando o valor
contiver nos seus dois primeiros caracteres as letras "AB"
}
// esse select seleciona o numero que vai após o ponto, que contenha antes do ponto "cod2"
DM.qry_MatNovo.Open;
DM.qry_MatNovo.SelectSQL.Clear;
DM.qry_MatNovo.SelectSQL.add(´SELECT MAX(REFERENCIA) PROX FROM LIVROS where REFERENCIA Like:PCodigo ´);
DM.qry_MatNovo.Params[0].AsString;
DM.qry_MatNovo.ParamByName(´PCodigo´).AsString := QuotedStr(Cod2+´¬´);
dm.qry_MatNovo.open;
ref1 := QuotedStr(DM.qry_MatNovoPROX.AsString);
GOSTEI 0