Fórum Consulta parametrizada usando dois campos #416308

07/05/2012

0

Caros profissionais estou com o seguinte problema, possuo um banco de dados SQLSERVER 2008 presciso fazer uma consulta onde é presciso verificar 2 campos para poder localiza-lo..uso 2 datamodules um para pesquisa e outro para cadastro, uso somente um form para isso, uso 2 groupbox que divide a parte de pesquisa da parte de cadastro..quando localizo determinado registro clico no dbgride nde estão os resultados da consulta, e logo abaixo onde fica os edits são preenchidos..uso este comanado no evento on click do dbgrid ..
   with TClientDataset(Dts_CadNCMCFOP.DataSet) do
     begin
      Close;
      Params[0].AsInteger :=  TClientDataset(Dts_PescNCM_CFOP.DataSet).Fields [0].AsInteger;
      Open;
    end;

eu uso sqldataset, sqlprovider e clientdataset.
para obter os paramentos vou citar este exemplo.. no sqldataset no command text eu coloco
select  * from CLIENTE where ID_CLIENTE = :ID

outro problema um dos campos é string e outro é decimal..outro problema estes dois campos são chaves primárias, os campos strings podem repetir e os decimal tbm más não existe uma combinação igual..meio complicado né..rsrs

se alguém poder me dá uma mãozinha..
Gilmar Moraes

Gilmar Moraes

Responder

Posts

07/05/2012

Joel Rodrigues

Cara, não entendi bem teu problema, mas se for conflito entre os tipos de dados que podem variar, tente usar a propriedade Value ao invés do AsInteger ou AsString. Value é do tipo Variant, logo, se você usar variants dos dois lados, elas devem se adequar. A menos que você use um inteiro de um lado e um string do outro, aí complica.

Se não der certo, tente explicar melhor a questão.

Abraço.
Responder

Gostei + 0

07/05/2012

Gilmar Moraes

Cara, não entendi bem teu problema, mas se for conflito entre os tipos de dados que podem variar, tente usar a propriedade Value ao invés do AsInteger ou AsString. Value é do tipo Variant, logo, se você usar variants dos dois lados, elas devem se adequar. A menos que você use um inteiro de um lado e um string do outro, aí complica.

Se não der certo, tente explicar melhor a questão.

Abraço.


Vou tentar explicar melhor..
Para eu chamar o registro encontrado na pesquisa em uma tabela com campo incremento é fácil uso este comando:
   with TClientDataset(Dts_CadParFed.DataSet) do
     begin
      Close;
      Params[0].AsInteger :=  TClientDataset(Dts_PescParFederal.DataSet).Fields [0].AsInteger;
      Open;
    end;


Como vc pode ter notado a tabela e a mesma em data modules diferentes, um data module é de pesquisa e outra para cadastro ou modificação.. quando faço a pesquisa e quero modificar algo siplismente clico no dbgride, isso aciona o código acima, este codigo seta a tabela de cadastro (ou de edição) na mesmo registro em que localizei..
Responder

Gostei + 0

07/05/2012

Joel Rodrigues

Rapaz, você tentou explicar melhor e piorou a situação rsrsrs
Agora foi que não entendi nada mesmo. Tudo bem que você usa dois datamodules e tal, mas qual o problema?
Responder

Gostei + 0

07/05/2012

Gilmar Moraes

Rapaz, você tentou explicar melhor e piorou a situação rsrsrs
Agora foi que não entendi nada mesmo. Tudo bem que você usa dois datamodules e tal, mas qual o problema?


basiamente presciso localizar um registro tendo como fonte de consulta dois campos de uma mesma tabela, usando parametrização..
Responder

Gostei + 0

07/05/2012

Bruno Leandro

select * from CLIENTE where ID_CLIENTE = :ID and Campo2 = :Campo2

with TClientDataset(Dts_CadNCMCFOP.DataSet) do
begin
Close;
Params[0].AsInteger := ID_Cliente;
Params[1].AsInteger := Valor_Campo2;
Open;
end;


Responder

Gostei + 0

07/05/2012

Gilmar Moraes

select * from CLIENTE where ID_CLIENTE = :ID and Campo2 = :Campo2

with TClientDataset(Dts_CadNCMCFOP.DataSet) do
begin
Close;
Params[0].AsInteger := ID_Cliente;
Params[1].AsInteger := Valor_Campo2;
Open;
end;




Massa vou testar..vlw
Responder

Gostei + 0

07/05/2012

William

Colega só me explica uma coisa, vc tem 1 tabela no banco de dados, mas usa 2 componentes ClientDataSet em DataModules diferentes para acessar a mesma tabela?
Responder

Gostei + 0

07/05/2012

Gilmar Moraes

Colega só me explica uma coisa, vc tem 1 tabela no banco de dados, mas usa 2 componentes ClientDataSet em DataModules diferentes para acessar a mesma tabela?


é assim..para evitar resultados indesejados e economizar forms existe partes do meu programa que uso consulta e cadastro num mesmo form..vamos imaginar que presciso ajustar um ítem no estoque, é feito a busca deste ítem usando o datamodule de pesquisa (sem interferir no de cadastro), apos ser localizado seleciono o registro encontrado dando um click..no evento onclick do meu dbgrid tem uma função onde seto a tabela de pesquisa com a tabela da cadastro podendo assim edita-la, um problema que eu teria se a pesquisa fosse na mesma tabela apos ter feito uma pesquisa´seria quando eu desse um insert adicionario os dados e apo´s salvar os dados sumiriam da minha tela..estariam salvos más não na minha tela. um problema de estética entre outros.
Responder

Gostei + 0

08/05/2012

Gilmar Moraes

select * from CLIENTE where ID_CLIENTE = :ID and Campo2 = :Campo2

with TClientDataset(Dts_CadNCMCFOP.DataSet) do
begin
Close;
Params[0].AsInteger := ID_Cliente;
Params[1].AsInteger := Valor_Campo2;
Open;
end;




Massa vou testar..vlw


Funcionou vlw mesmo ..más apareceu um problema de ordem de estética más isso acaba fazendo com que a pesquise não funciona direito..,estas pesquisa são numeros, estes seguem um padrão de formatação especifico, o primeiro teria uma formatação algo assim 0000.00.00, este foi fácil de resolver usando um mask edit e pesquisa funcionou..más o segundo campo segue este padrão 0.0 ou 0.00 ou 0.000.. no imputmask coloco 0\.000;1;_ a formatação atende neste caso e funciona a pesquisa somente se todos os campos tiverem sido prenchido se eu colocar um numero menor não funciona tipo 1.20 ou 1.1 só funciona 1.101 num teria um jeito de colocar no imput mask tipo 1.xxx ou seja a mascara funcinaria somente até o ponto depois do ponto seria livre da mascara..
Responder

Gostei + 0

08/05/2012

Joel Rodrigues

Tente usar a máscara ´!0.999;1;_´ e, para ler o texto, use um Trim, por exemplo:
var
parametro:string;
begin
parametro := Trim(MaskEdit1.Text);
end;

Com isso, o usuário pode digitar valores nos formados 0.0, 0.00 e 0.000. Caso seja digitado 0.0, sobrará um espaço no final, com o Trim você o remove.
Responder

Gostei + 0

08/05/2012

Gilmar Moraes

Tente usar a máscara ´!0.999;1;_´ e, para ler o texto, use um Trim, por exemplo:
var
parametro:string;
begin
parametro := Trim(MaskEdit1.Text);
end;

Com isso, o usuário pode digitar valores nos formados 0.0, 0.00 e 0.000. Caso seja digitado 0.0, sobrará um espaço no final, com o Trim você o remove.


Funciou muito bem..vlw mesmo..más como em programação sempre tem alguns bug´s acabei de achar mais um problema no meu código..descobri que na minha pequisa(sem ser a parametrizada)não esta fazendo corretamente aliás por algum motivo o código está ignorando a primeira pesquisa..
var
  CFOP,NCM : string;
begin
  CFOP := Trim(MaskEdit2.Text);
  NCM :=  Trim(MaskEdit1.Text);
  with TClientDataSet(Dts_PescNCM_CFOP.DataSet) do
  begin
    Close;
    CommandText:= SELECT * FROM NCM_CFOP WHERE COD_NCM like + Quotedstr(NCM + %);
    CommandText:= SELECT * FROM NCM_CFOP WHERE COD_CFOP like + Quotedstr(CFOP + %);
    Open;
  end;


Fiz um teste separado de cada funcção e ambas funcionam idependentes más juntas só prevalece a pesquisa CFOP..
Responder

Gostei + 0

08/05/2012

Bruno Leandro

with TClientDataSet(Dts_PescNCM_CFOP.DataSet) do
begin
Close;
CommandText:= SELECT * FROM NCM_CFOP WHERE COD_NCM like + Quotedstr(NCM + %);
CommandText:= SELECT * FROM NCM_CFOP WHERE COD_CFOP like + Quotedstr(CFOP + %);
Open;
end;

o problema aqui é que voce colocou um CommandText abaixo do outro ou seja, quando ele executar o segundo irá apagar o primeiro, para realizar a consulta dos dois campos ao mesmo tempo, tente conforme modelo.

with TClientDataSet(Dts_PescNCM_CFOP.DataSet) do
begin
Close;
CommandText:= SELECT * FROM NCM_CFOP WHERE COD_NCM like + Quotedstr(NCM + %) + and COD_CFOP like + Quotedstr(CFOP + %);
Open;
end;
Responder

Gostei + 0

09/05/2012

Gilmar Moraes

with TClientDataSet(Dts_PescNCM_CFOP.DataSet) do
begin
Close;
CommandText:= SELECT * FROM NCM_CFOP WHERE COD_NCM like + Quotedstr(NCM + %);
CommandText:= SELECT * FROM NCM_CFOP WHERE COD_CFOP like + Quotedstr(CFOP + %);
Open;
end;

o problema aqui é que voce colocou um CommandText abaixo do outro ou seja, quando ele executar o segundo irá apagar o primeiro, para realizar a consulta dos dois campos ao mesmo tempo, tente conforme modelo.

with TClientDataSet(Dts_PescNCM_CFOP.DataSet) do
begin
Close;
CommandText:= SELECT * FROM NCM_CFOP WHERE COD_NCM like + Quotedstr(NCM + %) + and COD_CFOP like + Quotedstr(CFOP + %);

Funcioou tinindo este um meio de deixar esta pesquisa mais apurada ? do jeito que está se eu colocar no cfop ex: campo 1 coloco 0000.00.00 e no outro coloco 1.101 blz aí a cunsulta fuciona do jeito que tem que ser mpas se eu colocar 1.1 aparece um monte..para mim se existisse este registro mostrar se não não mostar uma consulta exata..troquei o like por = más deu erro na consulta..

Open;
end;
Responder

Gostei + 0

09/05/2012

Bruno Leandro

Ola, vamos tentar assim, desta forma soh trará o codigo digitado

CommandText:= SELECT * FROM NCM_CFOP WHERE COD_NCM = + Quotedstr(Trim(NCM)) + and COD_CFOP = + Quotedstr(Trim(CFOP));
Responder

Gostei + 0

09/05/2012

Gilmar Moraes

Ola, vamos tentar assim, desta forma soh trará o codigo digitado

CommandText:= SELECT * FROM NCM_CFOP WHERE COD_NCM = + Quotedstr(Trim(NCM)) + and COD_CFOP = + Quotedstr(Trim(CFOP));


è meu patrão num é que deu certim igual anzou..rsrs desculpe a brincadeira..cara funcionou perfeitinho.vlw mesmo aproveitei e coloquei a função anterior como uma forma alternativa de busca..
Responder

Gostei + 0

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

Aceitar