Fórum Select filtrando caracteres #296201

20/09/2005

0

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´
               
{ 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

Mahdak

Responder

Posts

20/09/2005

Rjun

Acho que você inverteu a posição do caracter coringa. Ele deve vir apos o ´AB´.

DM.qry_MatNovo.ParamByName(´PCodigo´).AsString := ´AB¬´;



Responder

Gostei + 0

20/09/2005

Mahdak

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....


Responder

Gostei + 0

20/09/2005

Rjun

Precisa colocar o texto entre aspas no SQL. Faça assim:

DM.qry_MatNovo.ParamByName(´PCodigo´).AsString := QuotedStr(´AB¬´); 



Responder

Gostei + 0

20/09/2005

Mahdak

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;



Responder

Gostei + 0

20/09/2005

Rjun

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;



Responder

Gostei + 0

21/09/2005

Mahdak

nao deu certo nao R.Jun....
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);



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar