Problema com count

Delphi

04/11/2004

Pessoal queria saber como faço para usar o comando count:

do jeito que que está este select quando uso count(*), quando vou atribuir o valor de um campo a variavel v_num_fech_caixa, ele da a seguinte mensagem, Field ´num_controle´ not found. se eu não usar o count e usar * from ele funciona só que eu não consigo saber quantos registros que tem.


datamodule1.SQLDataSet3.Close;
    
 datamodule1.SQLDataSet3.CommandText:=´select count(*) from CONTROLE_CAIXA where terminal=:id_terminal and status=:v_status´;
    datamodule1.SQLDataSet3.ParamByName(´id_terminal´).AsString:=id_terminal;
    datamodule1.SQLDataSet3.ParamByName(´v_status´).AsString:=´F´;
    datamodule1.SQLDataSet3.open;
    v_num_fech_caixa:=datamodule1.SQLDataSet3.fieldbyname(´num_controle´).AsInteger



Gameiro

Gameiro

Curtidas 0

Respostas

Gilvanj

Gilvanj

04/11/2004

datamodule1.SQLDataSet3.Close;
    
 datamodule1.SQLDataSet3.CommandText:=´select count(*) from CONTROLE_CAIXA where terminal=:id_terminal and status=:v_status´;
    datamodule1.SQLDataSet3.ParamByName(´id_terminal´).AsString:=id_terminal;
    datamodule1.SQLDataSet3.ParamByName(´v_status´).AsString:=´F´;
    datamodule1.SQLDataSet3.open;
    v_num_fech_caixa:=datamodule1.SQLDataSet3.fieldbyname(´num_controle´).AsInteger


Sem alterar o seu comando do banco de dados, vc pode ler o retorno desta forma:
v_num_fech_caixa:=datamodule1.SQLDataSet3.Fields[0].AsInteger;

E se vc alterar o comando do banco para:
´select count(*) AS Num_Controle from CONTROLE_CAIXA where terminal=:id_terminal and status=:v_status´
Vc conseguirá ler o retorno com datamodule1.SQLDataSet3.fieldbyname(´num_controle´).AsInteger


GOSTEI 0
Gameiro

Gameiro

04/11/2004

Muito Obrigado GilvanJ, funcionou certinho.


Até mais.


GOSTEI 0
Gameiro

Gameiro

04/11/2004

Pensei que havia dado certo mas não deu, o que aconteceu foi o seguinte

ele deveria atribuir a variavel [b:f506f521de]v_num_fech_caixa[/b:f506f521de]:=datamodule1.SQLDataSet3.fieldbyname(´num_controle´).AsInteger este valor do sqldataset, mas quando eu uso o select abaixo ele passa o valor do count , se eu mudo o comando AS num_controle para outro nome me da um erro dizendo que o campo Num_controle não existe.

´select count(*) AS Num_Controle from CONTROLE_CAIXA where terminal=:id_terminal and status=:v_status´


Eu não preciso do valor do count para gravar em lugar nenhum, ele só me ajuda para ver se há uma sessão de caixa aberta, se o valor do count for diferente de zero eu pego o campo num_controle e atribuo a uma variavel, se o count for zero eu informo que o caixa precisa ser aberto.
Eu só preciso saber se há algum registro que esteja de acordo com minha seleção.


Não sei se consegui ser muito claro


Se alguem puder me ajudar agradeço desde já.


GOSTEI 0
Gandalf.nho

Gandalf.nho

04/11/2004

Se você quer só saber se tem um ou mais registros que obedecem seu critério, use IsEmpty.

query.Open;
if query.IsEmpty then //Se não houver registro...


GOSTEI 0
Gilvanj

Gilvanj

04/11/2004

A instrução:

select count(*) AS Num_Controle from CONTROLE_CAIXA where terminal=:id_terminal and status=:v_status

faz com que seja apresentado como resposta um campo chamado ´Num_Controle´ cujo conteúdo é a quantidade de registros.
Isto é, está-se apenas atribuindo nome para a quantidade de registros.
Vc pode observar isso utilizando o editor de comandos do banco de dados.

Pelo que vc falou, a impressão que tenho é que a tabela Controle_Caixa tem também um campo chamada Num_Controle. Se for isso, então não está correto mesmo utilizar a instrução que sugeri. E pelo que vc falou, vc precisa saber se a quantidade de registros é zero ou diferente de zero, não havendo necessidade de saber exatamente quantos registros são quando acima de zero. Neste caso, a sugestão de gandalf.nho está mais adequada. Portanto execute o comando

´select Num_controle from CONTROLE_CAIXA where terminal=:id_terminal and status=:v_status´

e verifique se o query retornou IsEmpty=True ou EOF=True para se certificar que nenhum registro foi encontrado com o filtro que vc passou.


GOSTEI 0
POSTAR