Consulta parametrizada usando dois campos

Delphi

07/05/2012

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

Curtidas 0

Respostas

Joel Rodrigues

Joel Rodrigues

07/05/2012

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.
GOSTEI 0
Gilmar Moraes

Gilmar Moraes

07/05/2012

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..
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

07/05/2012

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?
GOSTEI 0
Gilmar Moraes

Gilmar Moraes

07/05/2012

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..
GOSTEI 0
Bruno Leandro

Bruno Leandro

07/05/2012

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;


GOSTEI 0
Gilmar Moraes

Gilmar Moraes

07/05/2012

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
GOSTEI 0
William

William

07/05/2012

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?
GOSTEI 0
Gilmar Moraes

Gilmar Moraes

07/05/2012

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.
GOSTEI 0
Gilmar Moraes

Gilmar Moraes

07/05/2012

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..
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

07/05/2012

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.
GOSTEI 0
Gilmar Moraes

Gilmar Moraes

07/05/2012

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..
GOSTEI 0
Bruno Leandro

Bruno Leandro

07/05/2012

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;
GOSTEI 0
Gilmar Moraes

Gilmar Moraes

07/05/2012

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;
GOSTEI 0
Bruno Leandro

Bruno Leandro

07/05/2012

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));
GOSTEI 0
Gilmar Moraes

Gilmar Moraes

07/05/2012

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..
GOSTEI 0
POSTAR