Ajuda com INSERT em determinado campo e horário.
Boa tarde a todos, estou com uma situação aqui que não estou conseguindo resolver e venho pedir ajuda.
Delphi XE5, mySQL
Tabelas que estou usando:
CREATE TABLE `funcionarios` (
`CODIGO_FUN` int(11) unsigned NOT NULL AUTO_INCREMENT,
`ATIVO_FUN` varchar(1) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'S',
`NOME_FUN` varchar(60) COLLATE utf8_unicode_ci NOT NULL,
`LOGIN_FUN` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
`SENHA_FUN` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`CODIGO_FUN`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `ponto` (
`CODIGO_PON` int(11) unsigned NOT NULL AUTO_INCREMENT,
`CODIGOFUN_PON` int(11) unsigned NOT NULL,
`DATAPONTO_PON` date NOT NULL,
`ENTRADA1_PON` time NOT NULL,
`SAIDA1_PON` time NOT NULL,
`ENTRADA2_PON` time NOT NULL,
`SAIDA2_PON` time NOT NULL,
PRIMARY KEY (`CODIGO_PON`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Situação: Preciso que em um forme onde o usuário digita seu login e senha, o sistema grave na tabela ponto a data e hora que o usuário está informando:
// SELECIONA USUÁRIO
strSqlLog:= 'SELECT * FROM funcionarios WHERE ';
strSqlLog:= strSqlLog + ' login_fun = ' + #39 + (edtUsuario.Text) + #39;
strSqlLog:= strSqlLog + ' AND senha_fun = ' + #39 + (edtSenha.Text) + #39;
FrmMarcarPonto.FDQueryUsuario.Close;
FrmMarcarPonto.FDQueryUsuario.SQL.Clear;
FrmMarcarPonto.FDQueryUsuario.SQL.Add(strSqlLog);
FrmMarcarPonto.FDQueryUsuario.Open;
usuarioNoPonto:= FDQueryUsuario.FieldByName('codigo_fun').AsInteger;
// ATRIBUI A HORA ATUAL
Hora := Time;
if (Hora >= StrToTime('00:00:00')) and (Hora <= StrToTime('11:59:59')) then
ShowMessage('Marcar Entrada 1.');
// SAÍDA 1
if (Hora >= StrToTime('12:00:00')) and (Hora <= StrToTime('13:29:59')) then
ShowMessage('Marcar Saída 1.');
// ENTRADA 2
if (Hora >= StrToTime('13:30:00')) and (Hora <= StrToTime('17:59:59')) then
ShowMessage('Marcar Entrada 2');
// SAÍDA 2
if (Hora >= StrToTime('18:00:00')) then
ShowMessage('Marcar Saída 2');
Até aqui a mensagem está vindo de acordo com o horário, mas não estou conseguindo criar as SQLs para incluir na tabela Ponto.
Se alguém puder dar uma luz, agradeço.
Delphi XE5, mySQL
Tabelas que estou usando:
CREATE TABLE `funcionarios` (
`CODIGO_FUN` int(11) unsigned NOT NULL AUTO_INCREMENT,
`ATIVO_FUN` varchar(1) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'S',
`NOME_FUN` varchar(60) COLLATE utf8_unicode_ci NOT NULL,
`LOGIN_FUN` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
`SENHA_FUN` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`CODIGO_FUN`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `ponto` (
`CODIGO_PON` int(11) unsigned NOT NULL AUTO_INCREMENT,
`CODIGOFUN_PON` int(11) unsigned NOT NULL,
`DATAPONTO_PON` date NOT NULL,
`ENTRADA1_PON` time NOT NULL,
`SAIDA1_PON` time NOT NULL,
`ENTRADA2_PON` time NOT NULL,
`SAIDA2_PON` time NOT NULL,
PRIMARY KEY (`CODIGO_PON`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Situação: Preciso que em um forme onde o usuário digita seu login e senha, o sistema grave na tabela ponto a data e hora que o usuário está informando:
// SELECIONA USUÁRIO
strSqlLog:= 'SELECT * FROM funcionarios WHERE ';
strSqlLog:= strSqlLog + ' login_fun = ' + #39 + (edtUsuario.Text) + #39;
strSqlLog:= strSqlLog + ' AND senha_fun = ' + #39 + (edtSenha.Text) + #39;
FrmMarcarPonto.FDQueryUsuario.Close;
FrmMarcarPonto.FDQueryUsuario.SQL.Clear;
FrmMarcarPonto.FDQueryUsuario.SQL.Add(strSqlLog);
FrmMarcarPonto.FDQueryUsuario.Open;
usuarioNoPonto:= FDQueryUsuario.FieldByName('codigo_fun').AsInteger;
// ATRIBUI A HORA ATUAL
Hora := Time;
if (Hora >= StrToTime('00:00:00')) and (Hora <= StrToTime('11:59:59')) then
ShowMessage('Marcar Entrada 1.');
// SAÍDA 1
if (Hora >= StrToTime('12:00:00')) and (Hora <= StrToTime('13:29:59')) then
ShowMessage('Marcar Saída 1.');
// ENTRADA 2
if (Hora >= StrToTime('13:30:00')) and (Hora <= StrToTime('17:59:59')) then
ShowMessage('Marcar Entrada 2');
// SAÍDA 2
if (Hora >= StrToTime('18:00:00')) then
ShowMessage('Marcar Saída 2');
Até aqui a mensagem está vindo de acordo com o horário, mas não estou conseguindo criar as SQLs para incluir na tabela Ponto.
Se alguém puder dar uma luz, agradeço.
Jiraya San
Curtidas 0
Respostas
Thiago Santana
28/04/2015
Jiraya qual banco você está utilizando?
O horário você poderia captar diretamente no BD usando por exemplo o GETDATE() caso utilize SQL Server.
O INSERT será normal!
O horário você poderia captar diretamente no BD usando por exemplo o GETDATE() caso utilize SQL Server.
O INSERT será normal!
GOSTEI 0
Jiraya San
28/04/2015
Como mencionado acima, estou utilizando Delphi XE5 com mySQL.
GOSTEI 0
Marcos P
28/04/2015
A função equivalente ao getdate() do sql server no mysql, é a now().
[url:descricao=Funções Date and Time - MySql]https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html[/url]
Você chegou a usá-la ?
[url:descricao=Funções Date and Time - MySql]https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html[/url]
Você chegou a usá-la ?
GOSTEI 0
Jiraya San
28/04/2015
Então, quanto a pegar data e hora tranquilo, minha dúvida é como dar os inserts ou updates para assim estar alimentando o banco de dados de acordo com a marcação do usuário.
Conforme explicado acima, que seria de acordo com o horário. Aqueles ShowMessage(''); foi só para teste, para ver se está pegando o horário correto. Até aí está ok.
Conforme explicado acima, que seria de acordo com o horário. Aqueles ShowMessage(''); foi só para teste, para ver se está pegando o horário correto. Até aí está ok.
GOSTEI 0
Jiraya San
28/04/2015
Então, quanto a pegar data e hora tranquilo, minha dúvida é como dar os inserts ou updates para assim estar alimentando o banco de dados de acordo com a marcação do usuário.
Conforme explicado acima, que seria de acordo com o horário. Aqueles ShowMessage(''); foi só para teste, para ver se está pegando o horário correto. Até aí está ok.
Conforme explicado acima, que seria de acordo com o horário. Aqueles ShowMessage(''); foi só para teste, para ver se está pegando o horário correto. Até aí está ok.
Apesar de não saber se esta seria a melhor forma de estar fazendo isso.
GOSTEI 0
Marcos P
28/04/2015
Se a ideia é atualizar o campo de data e hora, com a data e hora corrente a melhor forma é usar a função nativa do próprio MySql.
Se a ideia é utilizar qualquer outro critério, o controle deve ser da aplicação.
Quanto ao insert com a função now() é simples...
Update... do mesmo modo !
Se a ideia é utilizar qualquer outro critério, o controle deve ser da aplicação.
Quanto ao insert com a função now() é simples...
insert tabela ( campo_int, campo_char, campo_datetime) values ( 123, 'abc', now())
Update... do mesmo modo !
GOSTEI 0
Jiraya San
28/04/2015
Acho que vocês não entenderam meu real problema, a dúvida não é com relação a gravar a data ou hora no banco e sim como dar o select para fazer a atualiza da mesma.
Como visto acima no meu select até o momento só filtrei o usuário para ver se ele existe ou não. A partir daí estou tendo dificuldade para gravar o ponto no dia atual.
Até consegui gravar, mas fica assim:
CODIGO_PON CODIGOFUN_PON DATAPONTO_PON ENTRADA1_PON SAIDA1_PON
1 1 30/04/2015 8:00:00 NULL
Quando vou registrar a primeira saida está criando um novo registro e não atualizando a hora de saída
CODIGO_PON CODIGOFUN_PON DATAPONTO_PON ENTRADA1_PON SAIDA1_PON
2 1 30/04/2015 NULL 12:00:00
Como visto acima no meu select até o momento só filtrei o usuário para ver se ele existe ou não. A partir daí estou tendo dificuldade para gravar o ponto no dia atual.
Até consegui gravar, mas fica assim:
CODIGO_PON CODIGOFUN_PON DATAPONTO_PON ENTRADA1_PON SAIDA1_PON
1 1 30/04/2015 8:00:00 NULL
Quando vou registrar a primeira saida está criando um novo registro e não atualizando a hora de saída
CODIGO_PON CODIGOFUN_PON DATAPONTO_PON ENTRADA1_PON SAIDA1_PON
2 1 30/04/2015 NULL 12:00:00
GOSTEI 0
Thiago Santana
28/04/2015
Jiraya, acho que não estamos conseguindo entender bem o que você necessita!
Teria como detalhar por partes?
Você consegue pegar a data e hora e consegue efetuar o insert né isso?
Em qual ponto encontra-se o problema?
Teria como detalhar por partes?
Você consegue pegar a data e hora e consegue efetuar o insert né isso?
Em qual ponto encontra-se o problema?
GOSTEI 0
Jothaz
28/04/2015
Acho que entendi! É um controle de ponto! É isso?
Quando o usuário marca a entrada gera o seguinte registro:
CODIGO_PON----CODIGOFUN_PON----DATAPONTO_PON----ENTRADA1_PON----SAIDA1_PON
-------1---------------------1--------------------------30/04/2015-------------------8:00:00-----------------NULL
Quando sai:
CODIGO_PON----CODIGOFUN_PON----DATAPONTO_PON----ENTRADA1_PON----SAIDA1_PON
-------2---------------------1--------------------------30/04/2015-------------------NULL-----------------12:00
Mas você quer assim:
CODIGO_PON----CODIGOFUN_PON----DATAPONTO_PON----ENTRADA1_PON----SAIDA1_PON
-------1---------------------1--------------------------30/04/2015-------------------08:00-----------------12:00
No meu entendimento seria mais recomendado cria algo assim:
CODIGO_PON----CODIGOFUN_PON----DATAPONTO_PON----HORA_MARCACAO----OPERACAO
1------------------------------3----------------------------30/04/2015------------------08:00--------------------E
2------------------------------3----------------------------30/04/2015------------------12:00--------------------S
3------------------------------3----------------------------30/04/2015------------------14:00--------------------E
4------------------------------3----------------------------30/04/2015------------------18:00--------------------S
Ao invés de usar tudo em uma linha, ai você monta o ponto na aplicação.
Confirme se o que expus acima é realmente seu cenário!
Quando o usuário marca a entrada gera o seguinte registro:
CODIGO_PON----CODIGOFUN_PON----DATAPONTO_PON----ENTRADA1_PON----SAIDA1_PON
-------1---------------------1--------------------------30/04/2015-------------------8:00:00-----------------NULL
Quando sai:
CODIGO_PON----CODIGOFUN_PON----DATAPONTO_PON----ENTRADA1_PON----SAIDA1_PON
-------2---------------------1--------------------------30/04/2015-------------------NULL-----------------12:00
Mas você quer assim:
CODIGO_PON----CODIGOFUN_PON----DATAPONTO_PON----ENTRADA1_PON----SAIDA1_PON
-------1---------------------1--------------------------30/04/2015-------------------08:00-----------------12:00
No meu entendimento seria mais recomendado cria algo assim:
CODIGO_PON----CODIGOFUN_PON----DATAPONTO_PON----HORA_MARCACAO----OPERACAO
1------------------------------3----------------------------30/04/2015------------------08:00--------------------E
2------------------------------3----------------------------30/04/2015------------------12:00--------------------S
3------------------------------3----------------------------30/04/2015------------------14:00--------------------E
4------------------------------3----------------------------30/04/2015------------------18:00--------------------S
Ao invés de usar tudo em uma linha, ai você monta o ponto na aplicação.
Confirme se o que expus acima é realmente seu cenário!
GOSTEI 0
Jiraya San
28/04/2015
Isso Jothaz é um controle de ponto, bem simples claro como se pode ver.
Estou tomando como base um outro sistema que trabalhei um tempo atrás onde o registro no banco de dados ficava desta forma:
[img]http://arquivo.devmedia.com.br/forum/imagem/390998-20150430-152134.jpg[/img]
Por isso criei somente estas duas tabelas.(Pelo menos por enquanto.)
A dúvida é como gravar cada um na sua coluna sem interferir na coluna que já foi preenchida com o horário em questão.
Estou tomando como base um outro sistema que trabalhei um tempo atrás onde o registro no banco de dados ficava desta forma:
[img]http://arquivo.devmedia.com.br/forum/imagem/390998-20150430-152134.jpg[/img]
Por isso criei somente estas duas tabelas.(Pelo menos por enquanto.)
A dúvida é como gravar cada um na sua coluna sem interferir na coluna que já foi preenchida com o horário em questão.
GOSTEI 0
Marcos P
28/04/2015
Jiraya,
Será que a tabela acima não é uma tabela consolidada dos movimentos físicos nas catracas ?
Se você quer seguir esse modelo, o que não me parece muito recomendado, uma vez que a solução proposta pelo Jothaz é mais eficiente, você vai ter de implementar uma lógica na aplicação que localize a entrada do dia corrente ( que foi gerada via INSERT ) e atualize a saída correspondente ( via UPDATE ).
Perceba que isso não é tão trivial como parece, pois existem diversas de combinações e exceções a serem tratadas.
Fazendo uma lógica mais unitária, como a proposta pelo Jothaz, isso seria bem mais simples... Seriam sempre inserts e o movimento seria sempre o "MÓDULO" do movimento anterior ( afinal, não faz sentido registrar duas entradas ou duas saídas sucessivas ) !
Obviamente, haverá uma lógica de crítica e fechamento desses movimentos na aplicação, mas isso terá de existir independentemente do modelo de dados.
Será que a tabela acima não é uma tabela consolidada dos movimentos físicos nas catracas ?
Se você quer seguir esse modelo, o que não me parece muito recomendado, uma vez que a solução proposta pelo Jothaz é mais eficiente, você vai ter de implementar uma lógica na aplicação que localize a entrada do dia corrente ( que foi gerada via INSERT ) e atualize a saída correspondente ( via UPDATE ).
Perceba que isso não é tão trivial como parece, pois existem diversas de combinações e exceções a serem tratadas.
Fazendo uma lógica mais unitária, como a proposta pelo Jothaz, isso seria bem mais simples... Seriam sempre inserts e o movimento seria sempre o "MÓDULO" do movimento anterior ( afinal, não faz sentido registrar duas entradas ou duas saídas sucessivas ) !
Obviamente, haverá uma lógica de crítica e fechamento desses movimentos na aplicação, mas isso terá de existir independentemente do modelo de dados.
GOSTEI 0
Thiago Santana
28/04/2015
Tenho essa lógica do ponto pronta!
Posto ela jajá.
Mas como citaram acima, essa não é a melhor estrutura!
Posto ela jajá.
Mas como citaram acima, essa não é a melhor estrutura!
GOSTEI 0
Jiraya San
28/04/2015
E aí Thiago boa tarde, teria como você disponibilizar esta solução que você falou?
Desde já obrigado!
Desde já obrigado!
GOSTEI 0
Marcos Saffran
28/04/2015
Olá Jiraya San,
primeiro você terá que buscar na tabela ponto o registro que deseja alterar:
SELECT CODIGO_PON FROM `PONTO` WHERE CODIGOFUN_PON = CÓDIGO_DO_FUNCIONÁRIO AND DATAPONTO_PON = DATA_DESEJADA LIMIT 1
Com o código acima você buscará o código a ser alterado na tabela ponto, considerando que o funcionário já possui um registro para a data desejada.
Depois você deverá alterar o registro com o código abaixo:
UPDATE `PONTO` SET SAIDA1_PON = HORA_DESEJADA WHERE CODIGO_PON = CODIGO_BUSCADO_ACIMA
Com o código acima você atualizará o registro com o valor, claro que no seu procedimento você verificará qual o campo deverá ser alterado.
Espero que te ajude.
primeiro você terá que buscar na tabela ponto o registro que deseja alterar:
SELECT CODIGO_PON FROM `PONTO` WHERE CODIGOFUN_PON = CÓDIGO_DO_FUNCIONÁRIO AND DATAPONTO_PON = DATA_DESEJADA LIMIT 1
Com o código acima você buscará o código a ser alterado na tabela ponto, considerando que o funcionário já possui um registro para a data desejada.
Depois você deverá alterar o registro com o código abaixo:
UPDATE `PONTO` SET SAIDA1_PON = HORA_DESEJADA WHERE CODIGO_PON = CODIGO_BUSCADO_ACIMA
Com o código acima você atualizará o registro com o valor, claro que no seu procedimento você verificará qual o campo deverá ser alterado.
Espero que te ajude.
GOSTEI 0
Jiraya San
28/04/2015
Bom dia a todos que estão tentando me ajudar, estou empacado neste ponto ainda. Segue minha Unit para análise.
Aos que estão tentando ajudar, de antemão vou agradecendo. E continuando com os testes aqui.
unit uFrmMarcarPonto;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, uFrmBase, Vcl.StdCtrls, Vcl.Buttons,
Vcl.Imaging.pngimage, Vcl.ExtCtrls, FireDAC.Stan.Intf, FireDAC.Stan.Option,
FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf,
FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt, Data.DB,
FireDAC.Comp.DataSet, FireDAC.Comp.Client;
type
TFrmMarcarPonto = class(TFrmBase)
ImgLogo: TImage;
lblSaudacao: TLabel;
lblUsuario: TLabel;
edtUsuario: TEdit;
lblSenha: TLabel;
edtSenha: TEdit;
imgBtnOk: TImage;
imgBtnSair: TImage;
FDQueryUsuario: TFDQuery;
FDQueryPonto: TFDQuery;
FDQueryUsuarioCODIGO_FUN: TFDAutoIncField;
FDQueryUsuarioATIVO_FUN: TWideStringField;
FDQueryUsuarioCPFCNPJ_FUN: TWideStringField;
FDQueryUsuarioRGIE_FUN: TWideStringField;
FDQueryUsuarioNOME_FUN: TWideStringField;
FDQueryUsuarioENDERECO_FUN: TWideStringField;
FDQueryUsuarioNUMERO_FUN: TLongWordField;
FDQueryUsuarioCOMPLEMENTO_FUN: TWideStringField;
FDQueryUsuarioBAIRRO_FUN: TWideStringField;
FDQueryUsuarioCEP_FUN: TWideStringField;
FDQueryUsuarioCODIGOCID_FUN: TLongWordField;
FDQueryUsuarioCODIGOEST_FUN: TLongWordField;
FDQueryUsuarioTELEFONE_FUN: TWideStringField;
FDQueryUsuarioCELULAR_FUN: TWideStringField;
FDQueryUsuarioNEXTEL_FUN: TWideStringField;
FDQueryUsuarioLOGIN_FUN: TWideStringField;
FDQueryUsuarioSENHA_FUN: TWideStringField;
FDQueryUsuarioCODIGOPER_FUN: TLongWordField;
FDQueryUsuarioEMAIL_FUN: TWideStringField;
FDQueryUsuarioNASCIMENTO_FUN: TDateField;
FDQueryUsuarioINCLUIDOEM_FUN: TSQLTimeStampField;
FDQueryUsuarioALTERADOEM_FUN: TSQLTimeStampField;
FDQueryUsuarioRESPONSAVELI_FUN: TLongWordField;
FDQueryUsuarioRESPONSAVELA_FUN: TLongWordField;
FDQueryPontoCODIGO_PON: TFDAutoIncField;
FDQueryPontoCODIGOFUN_PON: TLongWordField;
FDQueryPontoDATAPONTO_PON: TDateField;
FDQueryPontoENTRADA1_PON: TTimeField;
FDQueryPontoSAIDA1_PON: TTimeField;
FDQueryPontoENTRADA2_PON: TTimeField;
FDQueryPontoSAIDA2_PON: TTimeField;
FDQueryPontoOBS_PON: TWideStringField;
FDQueryPontoINCLUIDOEM_PON: TSQLTimeStampField;
FDQueryPontoALTERADOEM_PON: TSQLTimeStampField;
FDQueryPontoRESPONSAVELI_PON: TLongWordField;
FDQueryPontoRESPONSAVELA_PON: TLongWordField;
procedure imgBtnSairClick(Sender: TObject);
procedure imgBtnOkClick(Sender: TObject);
procedure SeleconaUsuario;
procedure edtSenhaKeyPress(Sender: TObject; var Key: Char);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FrmMarcarPonto: TFrmMarcarPonto;
controle: Boolean;
implementation
{$R *.dfm}
uses uDM;
procedure TFrmMarcarPonto.edtSenhaKeyPress(Sender: TObject; var Key: Char);
begin
inherited;
// CHAMA AÇÃO BOTÃO OK
if Key = #13 then
imgBtnOkClick(Sender);
end;
procedure TFrmMarcarPonto.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
inherited;
CanClose:= controle;
end;
procedure TFrmMarcarPonto.FormCreate(Sender: TObject);
begin
inherited;
controle:= False;
end;
procedure TFrmMarcarPonto.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
inherited;
// TROCA ENTER POR TAB
case Key of
//VK_ESCAPE: Close;
VK_RETURN: Perform(WM_NEXTDLGCTL,0,0);
end;
end;
procedure TFrmMarcarPonto.imgBtnOkClick(Sender: TObject);
begin
inherited;
SeleconaUsuario;
end;
procedure TFrmMarcarPonto.imgBtnSairClick(Sender: TObject);
begin
inherited;
controle:= True;
Close;
end;
procedure TFrmMarcarPonto.SeleconaUsuario;
var
msgLogin, strSqlLog, strSqlPonto: string;
Hora: TDateTime;
dataAtual: TDate;
usuarioNoPonto: Integer;
begin
// VERIFICA SE OS CAMPOS DE LOGIN E SENHA FORAM PREENCHIDOS
if Trim(edtUsuario.Text) = EmptyStr then
begin
Application.MessageBox('O USUÁRIO é de preenchimento obrigatório.',
'Informação do Sistema!', MB_OK + MB_ICONINFORMATION);
if edtUsuario.CanFocus then
edtUsuario.SetFocus;
Exit;
end;
if Trim(edtSenha.Text) = EmptyStr then
begin
Application.MessageBox('A SENHA é de preenchimento obrigatório.',
'Informação do Sistema!', MB_OK + MB_ICONINFORMATION);
if edtSenha.CanFocus then
edtSenha.SetFocus;
Exit;
end;
// SELECIONA USUÁRIO
strSqlLog:= 'SELECT * FROM funcionarios WHERE ';
strSqlLog:= strSqlLog + ' login_fun = ' + #39 + (edtUsuario.Text) + #39;
strSqlLog:= strSqlLog + ' AND senha_fun = ' + #39 + (edtSenha.Text) + #39;
FDQueryUsuario.Close;
FDQueryUsuario.SQL.Clear;
FDQueryUsuario.SQL.Add(strSqlLog);
FDQueryUsuario.Open;
usuarioNoPonto:= FDQueryUsuario.FieldByName('CODIGO_FUN').AsInteger;
// ATRIBUI A HORA ATUAL
Hora := Time;
dataAtual:= Now;
// VERIFICA LOGIN
if (FDQueryUsuario.RecordCount) = 1 then
begin
strSqlPonto:= 'SELECT CODIGO_PON FROM PONTO WHERE CODIGOFUN_PON = ';
strSqlPonto:= strSqlPonto + IntToStr(usuarioNoPonto) + ' AND DATAPONTO_PON = ';
strSqlPonto:= strSqlPonto + DateToStr(dataAtual) + ' LIMIT 1';
FDQueryPonto.Close;
FDQueryPonto.SQL.Clear;
FDQueryPonto.SQL.Add(strSqlPonto);
FDQueryPonto.Open;
// ACHOU USUÁRIO
controle:= True;
if (Hora >= StrToTime('00:00:00')) and (Hora <= StrToTime('11:59:59')) then
begin
//ShowMessage('Marcar Entrada 1. Código do Usuário: ' + IntToStr(usuarioNoPonto));
strSqlPonto:= 'INSERT INTO PONTO (CODIGOFUN_PON,DATAPONTO_PON,ENTRADA1_PON) ';
strSqlPonto:= strSqlPonto + 'VALUES (:CODIGOFUN_PON,:DATAPONTO_PON,:ENTRADA1_PON)';
FDQueryPonto.Close;
FDQueryPonto.SQL.Clear;
FDQueryPonto.SQL.Add(strSqlPonto);
FDQueryPonto.ParamByName('CODIGOFUN_PON').AsInteger:= usuarioNoPonto;
FDQueryPonto.ParamByName('DATAPONTO_PON').AsDate:= dataAtual;
FDQueryPonto.ParamByName('ENTRADA1_PON').AsTime:= Hora;
//FDQueryPonto.ParamByName('SAIDA1_PON').AsTime:= NULL;
//FDQueryPonto.ParamByName('ENTRADA2_PON').AsTime:= NULL;
//FDQueryPonto.ParamByName('SAIDA2_PON').AsTime:= NULL;
//FDQueryPonto.Open;
ShowMessage(strSqlPonto);
end
else
begin
if (Hora >= StrToTime('12:00:00')) and (Hora <= StrToTime('13:29:59')) then
begin
ShowMessage('Marcar Saída 1. Código do Usuário: ' + IntToStr(usuarioNoPonto));
end
else
begin
if (Hora >= StrToTime('13:30:00')) and (Hora <= StrToTime('17:59:59')) then
begin
ShowMessage('Marcar Entrada 2. Código do Usuário: ' + IntToStr(usuarioNoPonto));
end
else
begin
if (Hora >= StrToTime('18:00:00')) then
begin
ShowMessage('Marcar Saída 2. Código do Usuário: ' + IntToStr(usuarioNoPonto));
end;
end;
end;
end;
end;
// USUÁRIO DESATIVADO
if (FDQueryUsuario.FieldByName('ativo_fun').AsAnsiString = 'N') then
begin
msgLogin:='Você está cadastrado no sistema, mas não' + #13 +
'possui autorização para usá-lo neste momento. ' + #13 + #13 +
'CONSULTE O ADMINISTRADOR DO SISTEMA!';
Application.MessageBox(PChar(msgLogin),'Login não autorizado', MB_OK+MB_ICONERROR);
end
else
// USUÁRIO INVÁLIDO
if(FDQueryUsuario.RecordCount) = 0 then
begin
msgLogin:='Nome ou Senha do usuário inválido.' + #13 +
'Se você esqueceu sua senha. ' + #13 + #13 +
'CONSULTE O ADMINISTRADOR DO SISTEMA!';
Application.MessageBox(PChar(msgLogin),'Login não autorizado', MB_OK+MB_ICONERROR);
if edtSenha.CanFocus then
begin
edtSenha.SetFocus;
ModalResult:= mrNone;
end;
end;
end;
end.
Aos que estão tentando ajudar, de antemão vou agradecendo. E continuando com os testes aqui.
GOSTEI 0
Marcos P
28/04/2015
"Empacado" talvez seja um pouco vago...
Vai ser muito difícil alguém analisar teu código pra tentar entender o que "empacado" significa...
Acho melhor, você detalhar seus problemas !
Vai ser muito difícil alguém analisar teu código pra tentar entender o que "empacado" significa...
Acho melhor, você detalhar seus problemas !
GOSTEI 0
Jothaz
28/04/2015
"Empacado" talvez seja um pouco vago...
Vai ser muito difícil alguém analisar teu código pra tentar entender o que "empacado" significa...
Acho melhor, você detalhar seus problemas !
Vai ser muito difícil alguém analisar teu código pra tentar entender o que "empacado" significa...
Acho melhor, você detalhar seus problemas !
Além disso detalhe por qual estrutura de dados você optou?
GOSTEI 0
Marcos Saffran
28/04/2015
Olá Jiraya San,
'que besteira eu tinha falado, rsrsrsrs'
No meu código eu coloco códigos que alteram a base do banco para executar através do seu 'tzconnection', 'dbconnection', ou outro connection que você está usando.
strSqlPonto:= 'INSERT INTO PONTO (CODIGOFUN_PON,DATAPONTO_PON,ENTRADA1_PON) ';
strSqlPonto:= strSqlPonto + 'VALUES (:CODIGOFUN_PON,:DATAPONTO_PON,:ENTRADA1_PON)';
Connection.ExecuteDirect(strSqlPonto);
'que besteira eu tinha falado, rsrsrsrs'
No meu código eu coloco códigos que alteram a base do banco para executar através do seu 'tzconnection', 'dbconnection', ou outro connection que você está usando.
strSqlPonto:= 'INSERT INTO PONTO (CODIGOFUN_PON,DATAPONTO_PON,ENTRADA1_PON) ';
strSqlPonto:= strSqlPonto + 'VALUES (:CODIGOFUN_PON,:DATAPONTO_PON,:ENTRADA1_PON)';
Connection.ExecuteDirect(strSqlPonto);
GOSTEI 0
Jiraya San
28/04/2015
Boa tarde galera depois de uma sumida, estou eu aqui novamente. Fiz umas modificações no meu código e estou chegando perto da solução, mas inda com algumas dúvidas.
Segue código modificado e que estou atualmente usando:
Os ShowMessage que coloquei é para efeito de teste, assim verifico se estou no horário que eu quero. Até aí está indo bem o que me é retornado no ShowMessage jogo no IBExpert para testar e efetua a consulta, insert ou update. Mas no Sistema em si retorna o seguinte erro:
[img]http://arquivo.devmedia.com.br/forum/imagem/390998-20150518-145900.jpg[/img]
Já quebrei a cabeça aqui e não consegui descobrir o que é, se alguém puder ajudar agradeço.
PS. Se alguém se interessar posso mandar por e-mail uma cópia do que estou fazendo.
Segue código modificado e que estou atualmente usando:
procedure TFrmMarcarPonto.BtnOkClick(Sender: TObject);
var
//strSqlLog: string;
DataAtual, HoraAtual: string;
begin
DataAtual := FormatDateTime('yyyy-mm-dd', Now);
HoraAtual := FormatDateTime('hh:mm:ss', Now);
// SELECIONA USUÁRIO
DM.FDQueryFuncionarios.Close;
DM.FDQueryFuncionarios.SQL.Clear;
DM.FDQueryFuncionarios.SQL.Add('SELECT * FROM funcionarios WHERE login = ' + #39 + (EdtLogin.Text) + #39 + ' AND senha = ' + #39 + (edtSenha.Text) + #39 + '');
DM.FDQueryFuncionarios.Open;
//ShowMessage(DM.FDQueryFuncionarios.SQL.Text);
if (DM.FDQueryFuncionarios.RecordCount) = 0 then
ShowMessage('Usuário ou senha inválidos. Verifique!')
else
begin
DM.FDQuery1.Close;
DM.FDQuery1.SQL.Clear;
DM.FDQuery1.SQL.Add('SELECT * FROM PONTO WHERE CODIGOFUN = ' + DM.FDQueryFuncionariosCODIGO.AsString + ' AND DATAPONTO = ' + #39 + DataAtual + #39);
DM.FDQuery1.Open;
ShowMessage(DM.FDQuery1.SQL.Text);
if DM.FDQuery1.RecordCount = 0 then
begin
DM.FDQuery1.Close;
DM.FDQuery1.SQL.Clear;
DM.FDQuery1.SQL.Add('INSERT INTO PONTO (CODIGO, CODIGOFUN, DATAPONTO, ENTRADA1) VALUES (gen_id(gen_ponto_id,1),' + DM.FDQueryFuncionariosCODIGO.AsString + ', '+#39+DataAtual+#39+', '+#39+HoraAtual+#39+' ');
DM.FDQuery1.Open;
//ShowMessage('Entrada 1: ' + DM.FDQuery1.SQL.Text);
end
else // SE JÁ EXISTE, O FUNCIONÁRIO ESTÁ SAINDO AGORA DA EMPRESA
begin
//ShowMessage('Já registrou Entrada1');
if DM.FDQuery1.FieldByName('SAIDA1').IsNull then // SAINDO DA EMPRESA PARA ALMOÇO
begin
// executa query
DM.FDQuery1.Close;
DM.FDQuery1.SQL.Clear;
DM.FDQuery1.SQL.Add('UPDATE PONTO SET SAIDA1 = '+#39+HoraAtual+#39+' WHERE CODIGOFUN = '+DM.FDQueryFuncionariosCODIGO.AsString+' AND DATAPONTO = '+#39+DataAtual+#39+' ');
//DM.FDQuery1.Open;
ShowMessage('Saída 1: ' + DM.FDQuery1.SQL.Text);
end
else if DM.FDQuery1.FieldByName('ENTRADA2').IsNull then // ENTRANDO NA EMPRESA APÓS ALMOÇO
begin
// executa query
DM.FDQuery1.Close;
DM.FDQuery1.SQL.Clear;
DM.FDQuery1.SQL.Add('UPDATE PONTO SET ENTRADA2 = '+#39+HoraAtual+#39+' WHERE CODIGOFUN = '+DM.FDQueryFuncionariosCODIGO.AsString+' AND DATAPONTO = '+#39+DataAtual+#39+' ');
//DM.FDQuery1.Open;
ShowMessage('Entrada 2: ' + DM.FDQuery1.SQL.Text);
end
else if DM.FDQuery1.FieldByName('SAIDA2').IsNull then // SAIDO DA EMPRESA FINAL EXPEDIENTE
begin
// executa query
DM.FDQuery1.Close;
DM.FDQuery1.SQL.Clear;
DM.FDQuery1.SQL.Add('UPDATE PONTO SET SAIDA2 = '+#39+HoraAtual+#39+' WHERE CODIGOFUN = '+DM.FDQueryFuncionariosCODIGO.AsString+' AND DATAPONTO = '+#39+DataAtual+#39+' ');
//DM.FDQuery1.Open;
ShowMessage('Saída 2: ' + DM.FDQuery1.SQL.Text);
end
else
ShowMessage('SAÍDA JÁ REGISTRADA');
end;
end;
end;
Os ShowMessage que coloquei é para efeito de teste, assim verifico se estou no horário que eu quero. Até aí está indo bem o que me é retornado no ShowMessage jogo no IBExpert para testar e efetua a consulta, insert ou update. Mas no Sistema em si retorna o seguinte erro:
[img]http://arquivo.devmedia.com.br/forum/imagem/390998-20150518-145900.jpg[/img]
Já quebrei a cabeça aqui e não consegui descobrir o que é, se alguém puder ajudar agradeço.
PS. Se alguém se interessar posso mandar por e-mail uma cópia do que estou fazendo.
GOSTEI 0
Jiraya San
28/04/2015
Bom dia galera, estou passando para informar que consegui resolver o meu problema. Agradeço a todos pela ajuda, segue abaixo como ficou minha solução:
A única coisa que ficou faltando é que quando aparece o ShowMessage com a Saudação, a tela de login continua aberta atrás do ShowMessagem. Não consegui fazer esta tela sumir e só depois dar o ShowMessage. Mas nos demais está ok.
procedure TFrmMarcarPonto.BtnOkClick(Sender: TObject);
var
DataAtual, HoraAtual: string;
begin
// DEFINE AS VARIÁVEIS PARA DATA E HORA DO PONTO
DataAtual := FormatDateTime('yyyy-mm-dd', Now);
HoraAtual := FormatDateTime('hh:mm:ss', Now);
// SELECIONA USUÁRIO
DM.FDQueryFuncionarios.Close;
DM.FDQueryFuncionarios.SQL.Clear;
DM.FDQueryFuncionarios.SQL.Add('SELECT * FROM funcionarios WHERE login = ' + #39 + (EdtLogin.Text) + #39 + ' AND senha = ' + #39 + (edtSenha.Text) + #39 + '');
DM.FDQueryFuncionarios.Open;
// VERIFICA SE O FUNCIONÁRIO EXISTE
if (DM.FDQueryFuncionarios.RecordCount) = 0 then
ShowMessage('Usuário ou senha inválidos. Verifique!')
else
begin
DM.FDQueryPonto.Close;
DM.FDQueryPonto.SQL.Clear;
DM.FDQueryPonto.SQL.Add('SELECT * FROM PONTO WHERE CODIGOFUN = ' + DM.FDQueryFuncionariosCODIGO.AsString + ' AND DATAPONTO = ' + #39 + DataAtual + #39);
DM.FDQueryPonto.Open;
if DM.FDQueryPonto.RecordCount = 0 then
begin
DM.FDQueryPonto.Close;
DM.FDQueryPonto.SQL.Clear;
DM.FDQueryPonto.SQL.Add('INSERT INTO PONTO (CODIGO, CODIGOFUN, DATAPONTO, ENTRADA1) VALUES (gen_id(gen_ponto_id,1), ' + DM.FDQueryFuncionariosCODIGO.AsString + ', '+#39+DataAtual+#39+', '+#39+HoraAtual+#39+')');
DM.FDQueryPonto.ExecSQL;
Self.Close;
ShowMessage('Bom Trabalho! ' +DM.FDQueryFuncionariosLOGIN.AsString+ #13 + 'Seu ponto foi registrado as: ' +HoraAtual);
DM.FDQueryFuncionarios.Close;
end
else // SE JÁ EXISTE, O FUNCIONÁRIO ESTÁ SAINDO AGORA DA EMPRESA
begin
if DM.FDQueryPonto.FieldByName('SAIDA1').IsNull then // SAINDO DA EMPRESA PARA ALMOÇO
begin
DM.FDQueryPonto.Close;
DM.FDQueryPonto.SQL.Clear;
DM.FDQueryPonto.SQL.Add('UPDATE PONTO SET SAIDA1 = '+#39+HoraAtual+#39+' WHERE CODIGOFUN = '+DM.FDQueryFuncionariosCODIGO.AsString+' AND DATAPONTO = '+#39+DataAtual+#39+' ');
DM.FDQueryPonto.ExecSQL;
Self.Close;
ShowMessage('Bom Almoço! ' +DM.FDQueryFuncionariosLOGIN.AsString+ #13 + 'Seu ponto foi registrado as: ' +HoraAtual);
DM.FDQueryFuncionarios.Close;
end
else if DM.FDQueryPonto.FieldByName('ENTRADA2').IsNull then // ENTRANDO NA EMPRESA APÓS ALMOÇO
begin
DM.FDQueryPonto.Close;
DM.FDQueryPonto.SQL.Clear;
DM.FDQueryPonto.SQL.Add('UPDATE PONTO SET ENTRADA2 = '+#39+HoraAtual+#39+' WHERE CODIGOFUN = '+DM.FDQueryFuncionariosCODIGO.AsString+' AND DATAPONTO = '+#39+DataAtual+#39+' ');
DM.FDQueryPonto.ExecSQL;
Self.Close;
ShowMessage('Boa Tarde! ' +DM.FDQueryFuncionariosLOGIN.AsString+ #13 + 'Seu ponto foi registrado as: ' +HoraAtual);
DM.FDQueryFuncionarios.Close;
end
else if DM.FDQueryPonto.FieldByName('SAIDA2').IsNull then // SAIDO DA EMPRESA FINAL EXPEDIENTE
begin
DM.FDQueryPonto.Close;
DM.FDQueryPonto.SQL.Clear;
DM.FDQueryPonto.SQL.Add('UPDATE PONTO SET SAIDA2 = '+#39+HoraAtual+#39+' WHERE CODIGOFUN = '+DM.FDQueryFuncionariosCODIGO.AsString+' AND DATAPONTO = '+#39+DataAtual+#39+' ');
DM.FDQueryPonto.ExecSQL;
Self.Close;
ShowMessage('Bom Descanço! ' +DM.FDQueryFuncionariosLOGIN.AsString+ #13 + 'Seu ponto foi registrado as: ' +HoraAtual);
DM.FDQueryFuncionarios.Close;
end
else
ShowMessage('SAÍDA JÁ REGISTRADA');
end;
end;
end;
A única coisa que ficou faltando é que quando aparece o ShowMessage com a Saudação, a tela de login continua aberta atrás do ShowMessagem. Não consegui fazer esta tela sumir e só depois dar o ShowMessage. Mas nos demais está ok.
GOSTEI 0
Jiraya San
28/04/2015
Bom dia galera, estou passando para informar que consegui resolver o meu problema. Agradeço a todos pela ajuda, segue abaixo como ficou minha solução:
procedure TFrmMarcarPonto.BtnOkClick(Sender: TObject);
var
DataAtual, HoraAtual: string;
begin
// DEFINE AS VARIÁVEIS PARA DATA E HORA DO PONTO
DataAtual := FormatDateTime('yyyy-mm-dd', Now);
HoraAtual := FormatDateTime('hh:mm:ss', Now);
// SELECIONA USUÁRIO
DM.FDQueryFuncionarios.Close;
DM.FDQueryFuncionarios.SQL.Clear;
DM.FDQueryFuncionarios.SQL.Add('SELECT * FROM funcionarios WHERE login = ' + #39 + (EdtLogin.Text) + #39 + ' AND senha = ' + #39 + (edtSenha.Text) + #39 + '');
DM.FDQueryFuncionarios.Open;
// VERIFICA SE O FUNCIONÁRIO EXISTE
if (DM.FDQueryFuncionarios.RecordCount) = 0 then
ShowMessage('Usuário ou senha inválidos. Verifique!')
else
begin
DM.FDQueryPonto.Close;
DM.FDQueryPonto.SQL.Clear;
DM.FDQueryPonto.SQL.Add('SELECT * FROM PONTO WHERE CODIGOFUN = ' + DM.FDQueryFuncionariosCODIGO.AsString + ' AND DATAPONTO = ' + #39 + DataAtual + #39);
DM.FDQueryPonto.Open;
if DM.FDQueryPonto.RecordCount = 0 then
begin
DM.FDQueryPonto.Close;
DM.FDQueryPonto.SQL.Clear;
DM.FDQueryPonto.SQL.Add('INSERT INTO PONTO (CODIGO, CODIGOFUN, DATAPONTO, ENTRADA1) VALUES (gen_id(gen_ponto_id,1), ' + DM.FDQueryFuncionariosCODIGO.AsString + ', '+#39+DataAtual+#39+', '+#39+HoraAtual+#39+')');
DM.FDQueryPonto.ExecSQL;
Self.Close;
ShowMessage('Bom Trabalho! ' +DM.FDQueryFuncionariosLOGIN.AsString+ #13 + 'Seu ponto foi registrado as: ' +HoraAtual);
DM.FDQueryFuncionarios.Close;
end
else // SE JÁ EXISTE, O FUNCIONÁRIO ESTÁ SAINDO AGORA DA EMPRESA
begin
if DM.FDQueryPonto.FieldByName('SAIDA1').IsNull then // SAINDO DA EMPRESA PARA ALMOÇO
begin
DM.FDQueryPonto.Close;
DM.FDQueryPonto.SQL.Clear;
DM.FDQueryPonto.SQL.Add('UPDATE PONTO SET SAIDA1 = '+#39+HoraAtual+#39+' WHERE CODIGOFUN = '+DM.FDQueryFuncionariosCODIGO.AsString+' AND DATAPONTO = '+#39+DataAtual+#39+' ');
DM.FDQueryPonto.ExecSQL;
Self.Close;
ShowMessage('Bom Almoço! ' +DM.FDQueryFuncionariosLOGIN.AsString+ #13 + 'Seu ponto foi registrado as: ' +HoraAtual);
DM.FDQueryFuncionarios.Close;
end
else if DM.FDQueryPonto.FieldByName('ENTRADA2').IsNull then // ENTRANDO NA EMPRESA APÓS ALMOÇO
begin
DM.FDQueryPonto.Close;
DM.FDQueryPonto.SQL.Clear;
DM.FDQueryPonto.SQL.Add('UPDATE PONTO SET ENTRADA2 = '+#39+HoraAtual+#39+' WHERE CODIGOFUN = '+DM.FDQueryFuncionariosCODIGO.AsString+' AND DATAPONTO = '+#39+DataAtual+#39+' ');
DM.FDQueryPonto.ExecSQL;
Self.Close;
ShowMessage('Boa Tarde! ' +DM.FDQueryFuncionariosLOGIN.AsString+ #13 + 'Seu ponto foi registrado as: ' +HoraAtual);
DM.FDQueryFuncionarios.Close;
end
else if DM.FDQueryPonto.FieldByName('SAIDA2').IsNull then // SAIDO DA EMPRESA FINAL EXPEDIENTE
begin
DM.FDQueryPonto.Close;
DM.FDQueryPonto.SQL.Clear;
DM.FDQueryPonto.SQL.Add('UPDATE PONTO SET SAIDA2 = '+#39+HoraAtual+#39+' WHERE CODIGOFUN = '+DM.FDQueryFuncionariosCODIGO.AsString+' AND DATAPONTO = '+#39+DataAtual+#39+' ');
DM.FDQueryPonto.ExecSQL;
Self.Close;
ShowMessage('Bom Descanço! ' +DM.FDQueryFuncionariosLOGIN.AsString+ #13 + 'Seu ponto foi registrado as: ' +HoraAtual);
DM.FDQueryFuncionarios.Close;
end
else
ShowMessage('SAÍDA JÁ REGISTRADA');
end;
end;
end;
GOSTEI 0
Marcos P
28/04/2015
Valeu pelo retorno !
Pode ajudar alguém no futuro !
Pode ajudar alguém no futuro !
GOSTEI 0
Jiraya San
28/04/2015
Valeu pelo retorno !
Pode ajudar alguém no futuro !
Pode ajudar alguém no futuro !
RESOLVIDO
GOSTEI 0