Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Renanbg

[Resolvido] Usando variavel em select

Recommended Posts

Amigos,

 

É possivel usar uma variavel dentro de um select?

 

No codigo abaixo eu gostaria de substituir o valor "autoriza_config" por uma variavel que eu

decidiria o qual valor receberia.

 

No caso criaria uma variavel chamada "autoriza" e faria ela receber o campo "autoriza_config" dentre varios outros que eu necessito

 

É possivel?

 

 

Query1.sql.clear;
	Query1.sql.text := 'select autoriza_config from tbfuncionarios where codigo = "dbedit1.text"';
  if (frmdm.tbfuncionarios.FieldByName('autoriza_config').asstring = 'NÃO') then
  Begin
	Mensagem := 'Acesso não permitido!';
	Application.MessageBox(PCHAR(Mensagem), 'ATENÇÃO', MB_ICONINFORMATION + MB_OK);
	dbedit1.clear;
	dbedit1.SetFocus;
	Exit;
  end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, nao entendi muito bem sua pergunta.

ou tentar te ajudar, caso não for isso, nos avise.

 

Voce quer colocar uma variável dentro de uma clausula de seu select. É possivel Sim.

 

Vamos esclarecer:

 

DM.QRY.Close;
DM.QRY.SQL.Clear;
DM.QRY.SQL.Add('SELECT * FROM tabela WHERE status = 'NAO' ');
DM.QRY.Open;

Isso não é variável, é uma constante.

 

DM.QRY.Close;
DM.QRY.SQL.Clear;
DM.QRY.SQL.Add('SELECT * FROM tabela WHERE status = :Indicador ');
DM.QRY.Parambyname('Indicador').AsString := Edit.Text;
DM.QRY.Open;

Isso é uma variável.

Pode receber qualquer valor.

 

Ou se preferir:

 

DM.QRY.Close;
DM.QRY.SQL.Clear;
DM.QRY.SQL.Add('SELECT * FROM tabela WHERE status = ' + QuotedStr(Edit.Text) + ');
DM.QRY.Open;

Agora, voce quer comparar o que o usuário digitar na caixa de texto ou o resultado do select?

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem sim camarada...

 

cria uma variavel do tipo String...

 

var

 

vListaCampos : String;

 

begin

 

vListaCampos := 'Campo1','Campo2', 'Campo3'; //e porae vai... quantos você quiser

 

 

Query1.sql.clear;

Query1.sql.text := 'select ' + vListaCampos +' from tbfuncionarios where codigo = "dbedit1.text"';

if (frmdm.tbfuncionarios.Fields[0] = 'NÃO') then

Begin

Mensagem := 'Acesso não permitido!';

Application.MessageBox(PCHAR(Mensagem), 'ATENÇÃO', MB_ICONINFORMATION + MB_OK);

dbedit1.clear;

dbedit1.SetFocus;

Exit;

end;

 

repare será melhor, neste caso, utilizar o Fields[] ao inves do fieldbyname.. lá no seu if...

 

P.S.: quando você Query1.sql.text := , nao é precisar daar clear antes!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Testei a opção do Marcelo aqui e obtive esse erro na linha abaixo

 

if (frmdm.tbfuncionarios.Fields[0] = 'NÃO') then


Incompatible types: 'String' and 'TField'

alguma sugestão?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não faltou por o .AsString?

 

if (frmdm.tbfuncionarios.FieldByName('autoriza_config').asstring = 'NÃO')

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não faltou por o .AsString?

 

if (frmdm.tbfuncionarios.FieldByName('autoriza_config').asstring = 'NÃO')

[]'s

estou usando uma variavel, por isso o campo "autoriza_config" sempre vai mudar recebendo o valor de vListaCampos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mesmo que mude, você vai ter que fazer tratamentos para pegar o campo específico do seu teste não? Se o vListaCampos for apenas 1 campo, você pode passar ele no FieldByName, no lugar do 'autoriza_config' ... agora, se forem vários, você vai ter que especificar no seu retorno qual campo dos que selecionou quer pegar para seus testes funcionarem.... uma coisa é a montagem da query dinâmica, a outra é seus testes de validação em cima dela... são dois momentos distintos que terá que controlar.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, ainda estou sem entender o que voce quer.

 

Pelo que percebi, voce quer testar o valor retornado de uma query.

No caso voce quer saber se o determinado campo que voce selecionou possui o valor "não"?

 

Se for iso, teste o seguinte:

 

procedure TForm1.Button1Click(Sender: TObject);
var resultado : string;
begin
  ZQuery1.Close;
  ZQuery1.SQL.Clear;
  ZQuery1.SQL.Add('SELECT status FROM teste');
  ZQuery1.Open;
  resultado := ZQuery1.FieldValues['status'];
  if (resultado = 'Não') then begin
	 showmessage('Acesso não autorizado!');
	 Editx.SetFocus;
  end;
end;

Ou se for o caso de uma verificação de permissão de acesso pelo nome de usuário:

 

procedure TForm1.Button1Click(Sender: TObject);
var resultado : string;
begin
  ZQuery1.Close;
  ZQuery1.SQL.Clear;
  ZQuery1.SQL.Add('SELECT status FROM teste WHERE login = :Login ');
  ZQuery1.Parambyname('Login').AsString := Edit.Text;
  ZQuery1.Open;
  resultado := ZQuery1.FieldValues['status'];
  if (resultado = 'Não') then begin
	 showmessage('Acesso não autorizado!');
	 Editx.SetFocus;
  end;
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Elisei,

 

O que eu desejo é uma query dinamica, onde o campo a ser usado no select seja uma variavel que vai receber o valor que eu informar.

 

o exemplo do Marcelo R Moura é bem o que eu desejo, porem deu aquele erro que mostrei no momento de compilar.

 

Chrnos, como você diz se eu informar uma variavel no lugar do autoriza_config vai dar erro, visto que é uma varialvel...tem outra forma...tipo colocando sinal de + na frente?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Usando o Fields não deu certo, então usei assim:

 

if (frmdm.tbfuncionarios.FieldByName(vListaCampos).AsString = 'NÃO') then

e ta funcionando bem

 

Obrigado a todos pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A vListaCampos recebe apenas 1 campo.

 

faço da seguinte forma

 

a cada item do menu que eu acesso eu abro uma tela que pede usuario e senha. Nessa tela um edit recebe o nome do campo da tabela

 

no botão OK verifico se o funcionario existe, se a senha é valida e em seguida verifico se tem a autorização fazendo a variavel vListaCampos receber o conteudo do edit.

 

se eu usar o fields [0] o sistema lê o campo codigo ao inves do vListaCampos, por isso usei como mostrei acima.

 

No geral a logica ta certa creio eu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora surgiu um problema...

 

dentro do form de senha eu criei uma procedure para cada item do menu que eu desejo acessar e chamo da seguinte forma

if Eddestino.Text = 'Procedimentos_C' then
	 Procedimentos_Comuns;

  if Eddestino.Text = 'Procedimentos_A' then
	 Procedimentos_Atendimento;

  if Eddestino.Text = 'Procedimentos_D' then
	 Procedimentos_Direcao;

Dentro dessas procedures só tem um codigo que cria um form e chama ele via showmodal

 

entao o form se abre sem problemas, mas qndo eu fecho ele começou a dar erro de read adress, entao mudei para isso:

 

if Eddestino.Text = 'Procedimentos_C' then
	begin
	 Procedimentos_Comuns;
	 exit;
	end;

  if Eddestino.Text = 'Procedimentos_A' then
	begin
	 Procedimentos_Atendimento;
	 exit;
	end;

  if Eddestino.Text = 'Procedimentos_D' then
	begin
	 Procedimentos_Direcao;
	 exit;
	end;

aparentemente resolveu. Mesmo assim gostaria de saber a opinião de vcs se esta certo ou existe uma forma melhor de fazer

 

obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.