Como bloquear usuario após 3 erros de senha/login
Andre Freitas
Respostas
Andre Freitas
17/07/2009
Wesley Yamazack
17/07/2009
Vamos a solução.
- Criar um campo na tabela de usuario, exemplo, Ativo, caso sim o usuario ta liberado, senao, ele esta bloqueado.
- Crie uma variável, em private, chamada IntTentativa : Integer = 0;
- No Clique do botao que voce tenta conectar, voce deve estar fazendo o seguinte.
if (usuario = usuario do banco) and (senha = senha do banco) and (status = 'ativo') then
abre form
else
inc(IntTentativa); // incrementa o numero de tentativas em 1;
O que voce tem que fazer antes do teste de usuario e senha seria
if IntTentativas = 3 then
begin
showmessage('Usuario bloqueado')
alterar status do usuario; para bloqueado.
end;
Sacou ? Espero que isso te ajude, qualquer coisa só postar
att,
Wesley Y
Andre Freitas
17/07/2009
Wesley Yamazack
17/07/2009
No clique do botão Entrar ou OK, para acessar o sistema. faça o seguinte
procedure TForm1.ButtonClick.....
Var
Qry : TSqlQuery; // Se você usar DBExpress Senão crie um query do tipo do componente que vc usa pra acessar dados.
Begin
Rotina que você já tem pronta hoje para valdar etc.
if (usuario = qryusuario and senha = qrysenha and qrystatus = ativo ) then
ao inves de comprar o usuário e senha, você tem que saber se aquele usuário ta ativo ou não, certo ?
na hora de ver se o usuário tentou 3 vezes, você bota o seguinte.
Qry := TSqlQuery.Create(Self);
Qry.SqlConnection := SqlConnection; // Sua conexao;
Qry.Sql.Add('UPDATE USUARIO ');
Qry.Sql.Add('SET STATUS = BLOQUEADO' );
Qry.Sql.Add('WHERE USUARIO = +EDTUSUARIO.TEXT );
Qry.Sql.Add('AND SENHA = +EDTSENHA.TEXT );
Qry.ExecSQL;
end;
ou seja quando o cara tentar as 3x, ele irá automaticamente alterar o status do usuário.
Com isso você mata o problema, senão consegui, me manda o clique do botão, que eu altero pra vc.
Att,
Wesley Y
Wesley Yamazack
17/07/2009
Td bem ? Consegui, fazer o exemplo ? Estou no aguardo, pra qualquer dúvida, OK ?
Att,
Wesley Y
Andre Freitas
17/07/2009
Wesley Yamazack
17/07/2009
Blz, estou no aguardo.
Um abraço
Wesley Y
Andre Freitas
17/07/2009
Wesley Yamazack
17/07/2009
Me manda somente o código onde é pra ser feito, quero ver como você fez o exemplo, dai tiro tua dúvida.
Fico no aguardo.
Att,
Wesley Y
Andre Freitas
17/07/2009
begin
Tentativas:=0; //conta o nº de vezes que senha ou login foram digitados incorretamente
IniConf:=TIniFile.Create(ExtractFilePath(Application.ExeName)+ 'conf.ini'); //cria o arquivo ini
end; //CLIQUE DO BOTÃO OK PARA CONFIRMAR SE SENHA ESTA CORRETA E SE ESTÁ BLOQUEADO procedure TFrmConexao.BbtnAcessarClick(Sender: TObject); begin
{Conexao de acesso ao banco de dados, se senha ou login diferente,
tem mais um tentativa para acesso senão o banco e fechado}
DMSysMac.IBQuerySysMac.Close;
DMSysMac.IBQuerySysMac.ParamByName('VLogin').AsString:= edtLogin.Text;
DMSysMac.IBQuerySysMac.ParamByName('VSenha').AsString:= edtSenha.Text;
DMSysMac.IBQuerySysMac.Open;
if (DMSysMac.IBQuerySysMac.RecordCount > 0) then
begin
{Abre janela splash e depois ativa os formes que serão utilizados}
FrmSplash:=TFrmSplash.Create(Self);
Frmsplash.show;
Frmsplash.refresh;
Frmsplash.Gauge1.Progress:= 1;
Application.Initialize;
Frmsplash.Gauge1.Progress:= 5;
Frmsplash.Gauge1.Progress:= 10;
//Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Frmsplash.Gauge1.Progress:= 99; Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Application.CreateForm(TFrmBarServ, FrmBarServ); Frmsplash.Gauge1.Progress:= 100;
Sleep(500);
Frmsplash.Free; FrmPrincipal.Show;
FrmBarServ.Show;
FrmBarServ.EdtUser.text:= EdtLogin.Text;
FrmConexao.Free;
Application.Run;
end
else
begin
inc(Tentativas);
if Tentativas > 3 then
begin
// DMSysMac.IBQuerySysMac.ParamByName('Bloq_S_N').AsString:='Sim';
showmessage('Final de Tentativas, acesso bloqueado!');
Application.Terminate;
end
else
begin
showmessage('Usuário ou senha inválido!');
end;
end;
end;
\\\COMPARAÇÃO DENTRO DO IBQUERY select * from "TblUser"
where "Login"=:VLogin and "Senha"=:VSenha No aguardo. Andre Freitas
Wesley Yamazack
17/07/2009
{Conexao de acesso ao banco de dados, se senha ou login diferente,
tem mais um tentativa para acesso senão o banco e fechado}
DMSysMac.IBQuerySysMac.Close;
DMSysMac.IBQuerySysMac.ParamByName('VLogin').AsString:= edtLogin.Text;
DMSysMac.IBQuerySysMac.ParamByName('VSenha').AsString:= edtSenha.Text;
DMSysMac.IBQuerySysMac.Open;
if (DMSysMac.IBQuerySysMac.RecordCount > 0) then
begin
{Abre janela splash e depois ativa os formes que serão utilizados}
FrmSplash:=TFrmSplash.Create(Self);
Frmsplash.show;
Frmsplash.refresh;
Frmsplash.Gauge1.Progress:= 1;
Application.Initialize;
Frmsplash.Gauge1.Progress:= 5;
Frmsplash.Gauge1.Progress:= 10;
//Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Frmsplash.Gauge1.Progress:= 99; Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Application.CreateForm(TFrmBarServ, FrmBarServ); Frmsplash.Gauge1.Progress:= 100;
Sleep(500);
Frmsplash.Free; FrmPrincipal.Show;
FrmBarServ.Show;
FrmBarServ.EdtUser.text:= EdtLogin.Text;
FrmConexao.Free;
Application.Run;
end
else
begin
inc(Tentativas);
if Tentativas > 3 then
begin
// DMSysMac.IBQuerySysMac.ParamByName('Bloq_S_N').AsString:='Sim';
BloquearUsuario(EdtLogin.Text,edtSenha.Text);
showmessage('Final de Tentativas, acesso bloqueado!');
Application.Terminate;
end
else
begin
showmessage('Usuário ou senha inválido!');
end;
end;
end;
//DECLARE E IMPLEMENTE ESTE PROCUDRE, FEITO ISSO ADPTE A MESMA AO IBQUERY, ESTOU CRIANDO //UMA QUERY DINAMICAMENTE
procedure TFrmConexao.BloquearUsuario(Usuario, Senha: String);
Var
Qry : TIBQuery;
begin
Qry := TIBQuery.Create(Self);
Qry.Conexao := DMSysMac.Conexao;
Qry.Sql.Add('UPDATE TblUser '+
' SET STATUS = ' + 'BLOQUEADO' +
' WHERE USUARIO = ' USUARIO +
' AND SENHA = ' SENHA +);
QRY.EXECUTE; OU QRY.OPEN;
end;
\\\COMPARAÇÃO DENTRO DO IBQUERY select * from "TblUser"
where "Login"=:VLogin and "Senha"=:VSenha AND "STATUS" <> "BLOQUEADO"
Adpte o exemplo, e veja se assim não funciona.
Fico a disposição.
Att,
Wesley Y
Andre Freitas
17/07/2009
where "Login"=:VLogin and "Senha"=:VSenha AND "STATUS" <> "BLOQUEADO" DÚVIDAS??? ...O ibquery contém como parametros VLogin, VSenha e 03º paramatro ( inclui o paramentro VBloq ) que não tinha. ...Quando vou ativar a ibquery ocorre um erro dinamic sql não localiza uma coluna. Onde incluo a prodecure? procedure TFrmConexao.BloquearUsuario(Usuario, Senha: String);
Var
Qry : TIBQuery;
begin
Qry := TIBQuery.Create(Self);
Qry.Conexao := DMSysMac.Conexao;
Qry.Sql.Add('UPDATE TblUser '+
' SET STATUS = ' + 'BLOQUEADO' +
' WHERE USUARIO = ' USUARIO +
' AND SENHA = ' SENHA +);
QRY.EXECUTE; OU QRY.OPEN; end; O usuário comparado na clausila acima você tirou da onda (depois de WHETE USUARIO=) o mesmo para senha. ... Dentro do data modulo ou do form conexao? Outra duvida No código abaixo e comparado se o parametro é igual as caixas de texto {Conexao de acesso ao banco de dados, se senha ou login diferente,
tem mais um tentativa para acesso senão o banco e fechado}
DMSysMac.IBQuerySysMac.Close;
DMSysMac.IBQuerySysMac.ParamByName('VLogin').AsString:= edtLogin.Text;
DMSysMac.IBQuerySysMac.ParamByName('VSenha').AsString:= edtSenha.Text;
DMSysMac.IBQuerySysMac.Open; ...só que senha e login e o bolqueio onde entra? Desde já agreço sua atenção Andre Freitas.
Wesley Yamazack
17/07/2009
Você pode incluir esta procedure no próprio form de login mesmo. O que importa é você executar ela no momento que exibir a mensagem dizendo que o usuário foi bloqueado. Ai voce executa ela
Ex : bloquearUsuario(Edtusuario, EdtSenha); Só isso
Onde incluo a prodecure? procedure TFrmConexao.BloquearUsuario(Usuario, Senha: String);
Var
Qry : TIBQuery;
begin
Qry := TIBQuery.Create(Self);
Qry.Conexao := DMSysMac.Conexao;
Qry.Sql.Add('UPDATE TblUser '+
' SET Bloq_S_N = ' + 'SIM' +
' WHERE USUARIO = ' + USUARIO +
' AND SENHA = ' + SENHA );
QRY.EXECUTE; OU QRY.OPEN; end; O usuário comparado na clausila acima você tirou da onda (depois de WHETE USUARIO=) o mesmo para senha. ... Dentro do data modulo ou do form conexao?
Se você olhar a procedure tem dois parametros, usuário e senha, os mesmos são os usuário e senha que vocÊ irá passar para poder bloquear. Eles serão substituidos pelos valores que você passar qnd for executar a procedure;
Ex : EdtUsuario = Wesley
EdtSenha = 123
O SQL fará isso
Var
Qry : TIBQuery;
begin
Qry := TIBQuery.Create(Self);
Qry.Conexao := DMSysMac.Conexao;
Qry.Sql.Add('UPDATE TblUser '+
' SET Bloq_S_N = ' + 'SIM' +
' WHERE USUARIO = ' + WESLEY +
' AND SENHA = ' + 123 );
QRY.EXECUTE; OU QRY.OPEN; end;
Sendo assim ele irá bloquear o meu usuário;
Outra duvida No código abaixo e comparado se o parametro é igual as caixas de texto {Conexao de acesso ao banco de dados, se senha ou login diferente,
tem mais um tentativa para acesso senão o banco e fechado}
DMSysMac.IBQuerySysMac.Close;
DMSysMac.IBQuerySysMac.ParamByName('VLogin').AsString:= edtLogin.Text;
DMSysMac.IBQuerySysMac.ParamByName('VSenha').AsString:= edtSenha.Text;
DMSysMac.IBQuerySysMac.Open;
...só que senha e login e o bolqueio onde entra?
if (DMSysMac.IBQuerySysMac.RecordCount > 0) and DMSysMac.IBQuerySysMac.FieldByName('Bloq_S_N').Asstring <> 'SIM') then
begin
{Abre janela splash e depois ativa os formes que serão utilizados}
FrmSplash:=TFrmSplash.Create(Self);
Frmsplash.show;
Frmsplash.refresh;
Frmsplash.Gauge1.Progress:= 1;
Application.Initialize;
Frmsplash.Gauge1.Progress:= 5;
Frmsplash.Gauge1.Progress:= 10;
//Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Frmsplash.Gauge1.Progress:= 99; Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Application.CreateForm(TFrmBarServ, FrmBarServ); Frmsplash.Gauge1.Progress:= 100;
Sleep(500);
Frmsplash.Free; FrmPrincipal.Show;
FrmBarServ.Show;
FrmBarServ.EdtUser.text:= EdtLogin.Text;
FrmConexao.Free;
Application.Run;
end
else
begin
inc(Tentativas);
if Tentativas > 3 then
begin
// DMSysMac.IBQuerySysMac.ParamByName('Bloq_S_N').AsString:='Sim';
showmessage('Final de Tentativas, acesso bloqueado!');
Application.Terminate;
end
else
begin
showmessage('Usuário ou senha inválido!');
end;
end;
Se conseguir, me manda novamente todo o código, com as alterações que te mandei, tudo o que você fez. Fico no aguardo do seu retorno.
Um abraço, estamos a sua disposição.
Att,
Wesley Y
Wesley Yamazack
17/07/2009
Consegui adpatar o exemplo ? Estou no aguardo para concluírmos este chamado.
Um abraço
Wesley Y
Andre Freitas
17/07/2009
Wesley Yamazack
17/07/2009
Me mande o código todo da tua unit, para poder analisar.
Mas para adiantar, voce declarou e implementou a procedure ?
Exemplo :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
procedure Bloquear; //Tem que declarar a chamada da procedure aqui, sem o TFrm..... Para isso use //a tecla de atalho, CTRL + Shift + C. Quando você fizer isso, automaticamente ele ira implementar lá //em baixo para você
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.Bloquear;
begin
/// Seu Codigo Aqui!!!
end;
end.
Fico no aguardo.
Um abraco
Wesley Y
Andre Freitas
17/07/2009
Andre Freitas
17/07/2009
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, IBDatabase, Db, IBCustomDataSet, IBQuery, Menus, IniFiles,
Buttons; type
TFrmConexao = class(TForm)
Panel1: TPanel;
Image1: TImage;
EdtLogin: TEdit;
EdtSenha: TEdit;
PMnOpDbase: TPopupMenu;
SelecionarDBase1: TMenuItem;
ODialDbase: TOpenDialog;
BbtnAcessar: TBitBtn;
BbtnCancelar: TBitBtn;
BbtnFechar: TBitBtn;
LblAcesso: TLabel;
Shape1: TShape;
Label2: TLabel;
Label1: TLabel;
Ajuda1: TMenuItem;
DSSysMac: TDataSource;
procedure FormCreate(Sender: TObject);
procedure SelecionarDBase1Click(Sender: TObject);
procedure BbtnAcessarClick(Sender: TObject);
procedure BbtnFecharClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure BbtnCancelarClick(Sender: TObject);
procedure FormActivate(Sender: TObject); private
{ Private declarations } Tentativas: Integer;
IniConf: TIniFile;
public
{ Public declarations }
procedure BloquearUsuario;
end; var
FrmConexao: TFrmConexao; implementation
Uses UnitDMSysMac, UnitPrincipal, UnitBarServ, UnitSplash, UnitFrmCadUser,
UnitCadFunc, UnitFrmItinerario, UnitFrmLocalidade, UnitRecebTalao,
UnitFrmEstoque, UnitAgencia; {$R *.DFM} procedure TFrmConexao.FormCreate(Sender: TObject);
begin
Tentativas:=0; //conta o nº de vezes que senha ou login foram digitados incorretamente
IniConf:=TIniFile.Create(ExtractFilePath(Application.ExeName)+ 'conf.ini'); //cria o arquivo ini
end; procedure TFrmConexao.SelecionarDBase1Click(Sender: TObject);
begin
{Seleciona a banco de dados desejado para trabalho}
if ODialDbase.Execute then
DmSysMac.IDBaseSysMac.Connected := false;
DmSysMac.IDBaseSysMac.DatabaseName := ODialDbase.FileName;
Iniconf.WriteString('FDBase','Path',DMSysMac.IDBaseSysMac.DatabaseName); // executa o arquivo ini
DmsysMac.IDBaseSysMac.Connected := true;
DMSysMac.IBQuerySysMac.Open;
end; procedure TFrmConexao.BbtnAcessarClick(Sender: TObject); begin
{Conexao de acesso ao banco de dados, se senha ou login diferente,
tem mais um tentativa para acesso senão o banco e fechado}
DMSysMac.IBQuerySysMac.Close;
DMSysMac.IBQuerySysMac.ParamByName('VLogin').AsString:= edtLogin.Text;
DMSysMac.IBQuerySysMac.ParamByName('VSenha').AsString:= edtSenha.Text;
DMSysMac.IBQuerySysMac.Open;
if (DMSysMac.IBQuerySysMac.RecordCount > 0) then
begin
{Abre janela splash e depois ativa os formes que serão utilizados}
FrmSplash:=TFrmSplash.Create(Self);
Frmsplash.show;
Frmsplash.refresh;
Frmsplash.Gauge1.Progress:= 1;
Application.Initialize;
Frmsplash.Gauge1.Progress:= 5;
Frmsplash.Gauge1.Progress:= 10;
//Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Frmsplash.Gauge1.Progress:= 99; Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Application.CreateForm(TFrmBarServ, FrmBarServ); Frmsplash.Gauge1.Progress:= 100;
Sleep(500);
Frmsplash.Free; FrmPrincipal.Show;
FrmBarServ.Show;
FrmBarServ.EdtUser.text:= EdtLogin.Text;
FrmConexao.Free;
Application.Run;
end
else
begin
inc(Tentativas);
if Tentativas > 3 then
begin
bloquearUsuario(Edtusuario, EdtSenha);
showmessage('Final de Tentativas, acesso bloqueado!');
Application.Terminate;
end
else
begin
showmessage('Usuário ou senha inválido!');
end;
end;
end; procedure TFrmConexao.BbtnFecharClick(Sender: TObject);
begin
FrmConexao.Close;
end; procedure TFrmConexao.FormShow(Sender: TObject);
begin
EdtLogin.SetFocus;
end; procedure TFrmConexao.BbtnCancelarClick(Sender: TObject);
begin
EdtLogin.SetFocus;
EdtLogin.Clear;
EdtSenha.Clear end;
Procedure TFrmConexao.BloquearUsuario;
Var usuario, senha:string;
Qry : TIBQuery;
begin
Qry := TIBQuery.Create(Self);
Qry.Database := DMSysMac.IDBaseSysMac;
Qry.Sql.Add('UPDATE IBTblCadUser '+
' SET Bloq_S_N = ' + 'SIM' +
' WHERE Login = ' + Usuario +
' AND Senha = ' + Senha );
QRY.ExecSQL ;
end;
end.
Wesley Yamazack
17/07/2009
Olhei o código aqui e vi o seguinte erro.
unit UnitConexao;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, IBDatabase, Db, IBCustomDataSet, IBQuery, Menus, IniFiles,
Buttons;
type
TFrmConexao = class(TForm)
Panel1: TPanel;
Image1: TImage;
EdtLogin: TEdit;
EdtSenha: TEdit;
PMnOpDbase: TPopupMenu;
SelecionarDBase1: TMenuItem;
ODialDbase: TOpenDialog;
BbtnAcessar: TBitBtn;
BbtnCancelar: TBitBtn;
BbtnFechar: TBitBtn;
LblAcesso: TLabel;
Shape1: TShape;
Label2: TLabel;
Label1: TLabel;
Ajuda1: TMenuItem;
DSSysMac: TDataSource;
procedure FormCreate(Sender: TObject);
procedure SelecionarDBase1Click(Sender: TObject);
procedure BbtnAcessarClick(Sender: TObject);
procedure BbtnFecharClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure BbtnCancelarClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
Tentativas: Integer;
IniConf: TIniFile;
public
{ Public declarations }
procedure BloquearUsuario(Usuario, Senha: String);
end;
var
FrmConexao: TFrmConexao;
implementation
Uses UnitDMSysMac, UnitPrincipal, UnitBarServ, UnitSplash, UnitFrmCadUser,
UnitCadFunc, UnitFrmItinerario, UnitFrmLocalidade, UnitRecebTalao,
UnitFrmEstoque, UnitAgencia;
{$R *.DFM}
procedure TFrmConexao.FormCreate(Sender: TObject);
begin
Tentativas:=0; //conta o nº de vezes que senha ou login foram digitados incorretamente
IniConf:=TIniFile.Create(ExtractFilePath(Application.ExeName)+ 'conf.ini'); //cria o arquivo ini
end;
procedure TFrmConexao.SelecionarDBase1Click(Sender: TObject);
begin
{Seleciona a banco de dados desejado para trabalho}
if ODialDbase.Execute then
DmSysMac.IDBaseSysMac.Connected := false;
DmSysMac.IDBaseSysMac.DatabaseName := ODialDbase.FileName;
Iniconf.WriteString('FDBase','Path',DMSysMac.IDBaseSysMac.DatabaseName); // executa o arquivo ini
DmsysMac.IDBaseSysMac.Connected := true;
DMSysMac.IBQuerySysMac.Open;
end;
procedure TFrmConexao.BbtnAcessarClick(Sender: TObject);
begin
{Conexao de acesso ao banco de dados, se senha ou login diferente,
tem mais um tentativa para acesso senão o banco e fechado}
DMSysMac.IBQuerySysMac.Close;
DMSysMac.IBQuerySysMac.ParamByName('VLogin').AsString:= edtLogin.Text;
DMSysMac.IBQuerySysMac.ParamByName('VSenha').AsString:= edtSenha.Text;
DMSysMac.IBQuerySysMac.Open;
if (DMSysMac.IBQuerySysMac.RecordCount > 0) then
begin
{Abre janela splash e depois ativa os formes que serão utilizados}
FrmSplash:=TFrmSplash.Create(Self);
Frmsplash.show;
Frmsplash.refresh;
Frmsplash.Gauge1.Progress:= 1;
Application.Initialize;
Frmsplash.Gauge1.Progress:= 5;
Frmsplash.Gauge1.Progress:= 10;
//Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Frmsplash.Gauge1.Progress:= 99;
Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Application.CreateForm(TFrmBarServ, FrmBarServ);
Frmsplash.Gauge1.Progress:= 100;
Sleep(500);
Frmsplash.Free;
FrmPrincipal.Show;
FrmBarServ.Show;
FrmBarServ.EdtUser.text:= EdtLogin.Text;
FrmConexao.Free;
Application.Run;
end
else
begin
inc(Tentativas);
if Tentativas > 3 then
begin
bloquearUsuario(Edtusuario.Text, EdtSenha.Text);
showmessage('Final de Tentativas, acesso bloqueado!');
Application.Terminate;
end
else
begin
showmessage('Usuário ou senha inválido!');
end;
end;
end;
procedure TFrmConexao.BbtnFecharClick(Sender: TObject);
begin
FrmConexao.Close;
end;
procedure TFrmConexao.FormShow(Sender: TObject);
begin
EdtLogin.SetFocus;
end;
procedure TFrmConexao.BbtnCancelarClick(Sender: TObject);
begin
EdtLogin.SetFocus;
EdtLogin.Clear;
EdtSenha.Clear
end;
Procedure TFrmConexao.BloquearUsuario(Usuario, Senha: String);
Var
Qry : TIBQuery;
begin
Qry := TIBQuery.Create(Self);
Qry.Database := DMSysMac.IDBaseSysMac;
Qry.Sql.Add('UPDATE IBTblCadUser '+
' SET Bloq_S_N = ' + 'SIM' +
' WHERE Login = ' + Usuario +
' AND Senha = ' + Senha );
QRY.ExecSQL ;
end;
end.
A principio tem que funcionar desta forma, esta tudo certinho. Fico no aguardo do teu retorno.
Um abraço.
Wesley Y
Wesley Yamazack
17/07/2009
Tudo bem ? Consegui adaptar o exemplo, e corrigir ?
Estou no aguardo.
Um abraço
Wesley Y
Andre Freitas
17/07/2009
procedure BbtnFecharClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure BbtnCancelarClick(Sender: TObject);
procedure FormActivate(Sender: TObject); ...Está informando erro 34 e erro 27 Não está compilando o form. Andre.
Wesley Yamazack
17/07/2009
Provávelmente você não tem a implementação desta procedure na tua unit, me manda todo o código dela, ou então tente apagar esta linha, e tente compilar novamente.
FIco no aguardo.
Um abraço,
Welsey Y
Andre Freitas
17/07/2009
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, IBDatabase, Db, IBCustomDataSet, IBQuery, Menus, IniFiles,
Buttons; type
TFrmConexao = class(TForm)
Panel1: TPanel;
Image1: TImage;
EdtLogin: TEdit;
EdtSenha: TEdit;
PMnOpDbase: TPopupMenu;
SelecionarDBase1: TMenuItem;
ODialDbase: TOpenDialog;
BbtnAcessar: TBitBtn;
BbtnCancelar: TBitBtn;
BbtnFechar: TBitBtn;
LblAcesso: TLabel;
Shape1: TShape;
Label2: TLabel;
Label1: TLabel;
Ajuda1: TMenuItem;
DSSysMac: TDataSource;
procedure FormCreate(Sender: TObject);
procedure SelecionarDBase1Click(Sender: TObject);
procedure BbtnAcessarClick(Sender: TObject);
procedure BbtnFecharClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure BbtnCancelarClick(Sender: TObject);
procedure FormActivate(Sender: TObject); private
{ Private declarations } Tentativas: Integer;
IniConf: TIniFile;
public
{ Public declarations }
procedure BloquearUsuario(Usuario, Senha: String);
end; var
FrmConexao: TFrmConexao; implementation
Uses UnitDMSysMac, UnitPrincipal, UnitBarServ, UnitSplash, UnitFrmCadUser,
UnitCadFunc, UnitFrmItinerario, UnitFrmLocalidade, UnitRecebTalao,
UnitFrmEstoque, UnitAgencia; {$R *.DFM} procedure TFrmConexao.FormCreate(Sender: TObject);
begin
Tentativas:=0; //conta o nº de vezes que senha ou login foram digitados incorretamente
IniConf:=TIniFile.Create(ExtractFilePath(Application.ExeName)+ 'conf.ini'); //cria o arquivo ini
end; procedure TFrmConexao.SelecionarDBase1Click(Sender: TObject);
begin
{Seleciona a banco de dados desejado para trabalho}
if ODialDbase.Execute then
DmSysMac.IDBaseSysMac.Connected := false;
DmSysMac.IDBaseSysMac.DatabaseName := ODialDbase.FileName;
Iniconf.WriteString('FDBase','Path',DMSysMac.IDBaseSysMac.DatabaseName); // executa o arquivo ini
DmsysMac.IDBaseSysMac.Connected := true;
DMSysMac.IBQuerySysMac.Open;
end; procedure TFrmConexao.BbtnAcessarClick(Sender: TObject); begin
{Conexao de acesso ao banco de dados, se senha ou login diferente,
tem mais um tentativa para acesso senão o banco e fechado}
DMSysMac.IBQuerySysMac.Close;
DMSysMac.IBQuerySysMac.ParamByName('VLogin').AsString:= edtLogin.Text;
DMSysMac.IBQuerySysMac.ParamByName('VSenha').AsString:= edtSenha.Text;
DMSysMac.IBQuerySysMac.Open;
if (DMSysMac.IBQuerySysMac.RecordCount > 0) then
begin
{Abre janela splash e depois ativa os formes que serão utilizados}
FrmSplash:=TFrmSplash.Create(Self);
Frmsplash.show;
Frmsplash.refresh;
Frmsplash.Gauge1.Progress:= 1;
Application.Initialize;
Frmsplash.Gauge1.Progress:= 5;
Frmsplash.Gauge1.Progress:= 10;
//Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Frmsplash.Gauge1.Progress:= 99; Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Application.CreateForm(TFrmBarServ, FrmBarServ); Frmsplash.Gauge1.Progress:= 100;
Sleep(500);
Frmsplash.Free; FrmPrincipal.Show;
FrmBarServ.Show;
FrmBarServ.EdtUser.text:= EdtLogin.Text;
FrmConexao.Free;
Application.Run;
end
else
begin
inc(Tentativas);
if Tentativas > 3 then
begin
bloquearUsuario(EdtLogin.Text, EdtSenha.Text);
showmessage('Final de Tentativas, acesso bloqueado!');
Application.Terminate;
end
else
begin
showmessage('Usuário ou senha inválido!');
end;
end;
end; procedure TFrmConexao.BbtnFecharClick(Sender: TObject);
begin
FrmConexao.Close;
end; procedure TFrmConexao.FormShow(Sender: TObject);
begin
EdtLogin.SetFocus;
end; procedure TFrmConexao.BbtnCancelarClick(Sender: TObject);
begin
EdtLogin.SetFocus;
EdtLogin.Clear;
EdtSenha.Clear end;
Procedure TFrmConexao.BloquearUsuario(Usuario, Senha: String);
Var
Qry : TIBQuery;
begin
Qry := TIBQuery.Create(Self);
Qry.Database := DMSysMac.IDBaseSysMac;
Qry.Sql.Add('UPDATE IBTblCadUser '+
' SET Bloq_S_N = ' + 'SIM' +
' WHERE Login = ' + Usuario +
' AND Senha = ' + Senha );
QRY.ExecSQL ;
end; end.
Wesley Yamazack
17/07/2009
Vamos lá, vamos entender como funciona a unit no delphi.
1 - Você declara uma procedure;
2 - Implementa esta procedure;
Obs : Se você declarar uma procedure com 2 parametros, e depois precisar mudar ela, e colocar mais um parametro, você tem que mudar tanto na seção implementation quando na interface, as duas tem que esta iguais, o que você esta me mostrando é a declaração da procedure( Interface) , e não tem a implementation. Não vai funcionar de jeito nenhum.
Qual foi o erro que aconteceu ? Me manda todas as mensagens que o delphi gerou, ou até melhor me manda um Print Screen da tua tela, mostrando o erro. Fica mais facil, sacou meu amigo ?
Um forte abraço
Wesley Y
Devmedia
17/07/2009
recomendo que vc crie um video e mande para que o consultor possa entender melhor a sua dúvida.
Andre Freitas
17/07/2009
Wesley Yamazack
17/07/2009
Com a video é muito mais fácil. Vamos lá .
Vou te ensinar e não resolver teu problema, ok?
Como devemos passar string em delphi?
Exemplo
ShowMessage('Teste');
Então toda String em delphi deve ser passada enter Plics. Se você olhar no teu código verá que esta passando o teu <> "SIM" entre aspas, e não entre Plics, mude para plics e veja senão funciona?
Com relação a procedure FormActive, é so fazer aquilo que você fez, comentar, ou excluir a linha, e pronto, problema Resolvido.
Com relacção, ao login, depure o código e me mande, uma video, com você depurando o código.
Fico no aguardo, meu amigo.
Um forte abraço
Wesley Y
Andre Freitas
17/07/2009
Wesley Yamazack
17/07/2009
A sua tabela, IBTBLCADUSER, qual é a tabela que esta apontada nesta IBTable ?
Pois desta forma não tem como saber, coloque breakPoint, no clique do botão ok, e va depurando ate achar o erro me mande uma video com esta depuração, pois não tem comos saber onde esta dando o erro, infelizmente !
Um abraço.
Wesley Y
Devmedia
17/07/2009
conseguiu resolver o seu problema?
Devmedia
17/07/2009
conseguiu resolver o seu problema?
Andre Freitas
17/07/2009
Wesley Yamazack
17/07/2009
Um Abraço
Wesley Y
Devmedia
17/07/2009
precisamos saber em que vc ainda tem dúvida para que possamos dar prosseguimento ao atendimento.
Andre Freitas
17/07/2009
Wesley Yamazack
17/07/2009
Qual bd e versão estas usando ?
Esta usando componentes de terceiro ? QUais ?
Qual versão do Delphi esta usando ?
Tem alguma dll especifica ? ou outra configuração especifica a se fazer ?
Um abraço
Wesley Y
Andre Freitas
17/07/2009
Wesley Yamazack
17/07/2009
Abraço
Wesley Y
Wesley Yamazack
17/07/2009
Bom notei que teu sistema, com uma coisa não muito boa, você conhece esta tela ? ela é acessada pelo menu, projetct/ Options.
Qual finalidade dela ?
Permite que certos, forms sejam criados quando o programa for executado, ou seja, todos este forms são criados quando você abre o executável, porém, você usa todos eles ao mesmo tempo? Nâo! Ou seja teu sistema fica lento, pois, tem vários forms já criados. O que te recomendo, veja bem, recomendo é deixar somente o teu DataModule, e teu FrmConexao, e O FrmPrincipal, o restante você joga no Available Forms dai toda vez que for chamar um form você tem que criar o mesmo, como ???
Try
FrmCadUser := TFrmCadUser.Create(Self);
FrmCadUser.ShowModal; // Porém você só podera abrir um form por vez, se for interessante usar, seria bom.
Finally
FreeAndNil(FrmCadUser);
end;
isso foi só uma dica.
Vamos ao que interessa. Altere sua procedure para esta forma.
Procedure TFrmConexao.BloquearUsuario(Usuario, Senha: String);
Var
Qry : TIBQuery;
begin
Qry := TIBQuery.Create(Self);
Qry.Database := DMSysMac.IDBaseSysMac;
Qry.Transaction := DMSysMac.IBTransSysMac;
Qry.Sql.Add('UPDATE "TblUser" '+
' SET "Bloq_S_N" = ' + QuotedStr('NAO') +
' WHERE "Login" = ' + QuotedStr(Usuario) );
QRY.ExecSQL ;
DMSysMac.IBTransSysMac.Commit;
end;
{Botão Acessar eu fiz uma pequena modificação caso não goste, é ignorar}
procedure TFrmConexao.BbtnAcessarClick(Sender: TObject);
begin
{Conexao de acesso ao banco de dados, se senha ou login diferente,
tem mais um tentativa para acesso senão o banco e fechado}
DMSysMac.IBQuerySysMac.Close;
DMSysMac.IBQuerySysMac.ParamByName('VLogin').AsString:= edtLogin.Text;
DMSysMac.IBQuerySysMac.ParamByName('VSenha').AsString:= edtSenha.Text;
DMSysMac.IBQuerySysMac.Open;
If (DMSysMac.IBQuerySysMac.FieldByName('Bloq_S_N').AsString = ('SIM')) then
begin
ShowMessage('Usuário esta bloqueado' +#13+#13+
'Entre em contato com o Administrador' );
Exit;
end
else
if (DMSysMac.IBQuerySysMac.RecordCount > 0) then
begin
{Abre janela splash e depois ativa os formes que serão utilizados}
FrmSplash:=TFrmSplash.Create(Self);
Frmsplash.show;
Frmsplash.refresh;
Frmsplash.Gauge1.Progress:= 1;
Application.Initialize;
Frmsplash.Gauge1.Progress:= 5;
Frmsplash.Gauge1.Progress:= 10;
//Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Frmsplash.Gauge1.Progress:= 99;
Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Application.CreateForm(TFrmBarServ, FrmBarServ);
Frmsplash.Gauge1.Progress:= 100;
Sleep(500);
Frmsplash.Free;
FrmPrincipal.Show;
FrmBarServ.Show;
FrmBarServ.EdtUser.text:= EdtLogin.Text;
FrmConexao.Free;
Application.Run;
end
else
begin
inc(Tentativas);
if Tentativas > 3 then
begin
bloquearUsuario(EdtLogin.Text, EdtSenha.Text);
showmessage('Final de Tentativas, acesso bloqueado!');
Application.Terminate;
end
else
begin
showmessage('Usuário ou senha inválido!');
end;
end;
end;
Fico por aqui, um abraço, espero te ajudado, qualquer coisa estamos a disposição. Caso resolva tudo, me informar para podermos fechar o chamado, ok ?
Wesley Y
Andre Freitas
17/07/2009
Wesley Yamazack
17/07/2009
Forte abraço.
Wesley Y