Renanbg 1 Denunciar post Postado Maio 31, 2009 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
Elisei 0 Denunciar post Postado Junho 1, 2009 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
Marcelo R Moura 0 Denunciar post Postado Junho 1, 2009 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
Renanbg 1 Denunciar post Postado Junho 1, 2009 Obrigado pelas dicas pessoal, hoje a noite asssim que chegar em casa vou testar e retorno para avisar Compartilhar este post Link para o post Compartilhar em outros sites
Renanbg 1 Denunciar post Postado Junho 1, 2009 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
Chrnos 30 Denunciar post Postado Junho 2, 2009 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
Renanbg 1 Denunciar post Postado Junho 2, 2009 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
Chrnos 30 Denunciar post Postado Junho 2, 2009 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
Elisei 0 Denunciar post Postado Junho 2, 2009 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
Renanbg 1 Denunciar post Postado Junho 2, 2009 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
Marcelo R Moura 0 Denunciar post Postado Junho 2, 2009 Renan, a galera aí já tinha acertado... faltou o .AsString mesmo... if (frmdm.tbfuncionarios.Fields[0].AsString = 'NÃO') Compartilhar este post Link para o post Compartilhar em outros sites
Renanbg 1 Denunciar post Postado Junho 2, 2009 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
Marcelo R Moura 0 Denunciar post Postado Junho 3, 2009 Vao funcionar se o variavel vListaCampos tiver apenas 1 campo... experimente passar 2 campos para ela... Compartilhar este post Link para o post Compartilhar em outros sites
Renanbg 1 Denunciar post Postado Junho 3, 2009 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
Marcelo R Moura 0 Denunciar post Postado Junho 3, 2009 Se vai sempre receber apenas um campo, blza. Pode colocar resolvido no seu topico. Compartilhar este post Link para o post Compartilhar em outros sites
Renanbg 1 Denunciar post Postado Junho 3, 2009 beleza então, tudo certo Obrigado a todos Compartilhar este post Link para o post Compartilhar em outros sites
Renanbg 1 Denunciar post Postado Junho 4, 2009 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