Ajuda com INSERT em determinado campo e horário.

MySQL

Delphi

28/04/2015

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.
Jiraya San

Jiraya San

Curtidas 0

Respostas

Thiago Santana

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!
GOSTEI 0
Jiraya San

Jiraya San

28/04/2015

Como mencionado acima, estou utilizando Delphi XE5 com mySQL.
GOSTEI 0
Marcos P

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 ?
GOSTEI 0
Jiraya San

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.
GOSTEI 0
Jiraya San

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.


Apesar de não saber se esta seria a melhor forma de estar fazendo isso.
GOSTEI 0
Marcos P

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...

insert tabela ( campo_int, campo_char, campo_datetime) values ( 123, 'abc', now())


Update... do mesmo modo !
GOSTEI 0
Jiraya San

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
GOSTEI 0
Thiago Santana

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?
GOSTEI 0
Jothaz

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!
GOSTEI 0
Jiraya San

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.
GOSTEI 0
Marcos P

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.
GOSTEI 0
Thiago Santana

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!
GOSTEI 0
Jiraya San

Jiraya San

28/04/2015

E aí Thiago boa tarde, teria como você disponibilizar esta solução que você falou?
Desde já obrigado!
GOSTEI 0
Marcos Saffran

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.
GOSTEI 0
Jiraya San

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.

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

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 !
GOSTEI 0
Jothaz

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 !


Além disso detalhe por qual estrutura de dados você optou?
GOSTEI 0
Marcos Saffran

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);
GOSTEI 0
Jiraya San

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:
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

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;


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

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

Marcos P

28/04/2015

Valeu pelo retorno !

Pode ajudar alguém no futuro !
GOSTEI 0
Jiraya San

Jiraya San

28/04/2015

Valeu pelo retorno !

Pode ajudar alguém no futuro !



RESOLVIDO
GOSTEI 0
POSTAR