Ir para conteúdo

Arquivado

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

EroSenin

cadastrar hora do ponto dependendo do horário.

Recommended Posts

Boa tarde estou fazendo um cadastro simples de ponto somente para adquirir conhecimento. O que eu gostaria é que dependo do horário o sistema gravasse no banco e desse uma mensagem ex:

 

Bom dia São 8:00. Seu Ponto foi registrado com sucesso.

Bom Almoço 12:00 Seu Ponto foi registrado com sucesso.

Boa Tarde 13:30. Seu Ponto foi registrado com sucesso.

Bom Descanso. Seu Ponto foi registrado com sucesso.

 

Estou usando este código e está cadastrando corretamente por enquanto. Não estou conseguindo finalizar esta parte, se alguém puder ajudar agradeço.

 

Obs: Delphi + Banco Access + ADO

// Se Login estiver ok
// Cadastra Ponto no Banco
with dm.qryPonto do begin
Close;
SQL.Clear;
SQL.Text := 'INSERT INTO ponto (codigofun_pon, data_pon, incluidoem_pon, responsavel_pon) VALUES (:codigofun_pon, :data_pon, :incluidoem_pon, :responsavel_pon)';
Parameters.ParamValues['codigofun_pon']   := dm.qryLogin.FieldByName('codigo_fun').AsInteger;
Parameters.ParamValues['data_pon']        := dataAtual;
Parameters.ParamValues['incluidoem_pon']  := dataAtual + ' ' + horaAtual;
Parameters.ParamValues['responsavel_pon'] := dm.qryLogin.FieldByName('login_fun').AsString;
ExecSQL;
end; 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se entendi correto, você quer substituir suas variáveis dataAtual e horaAtual pela data corrente e hora corrente certo? Você pode usar os comandos date, now ou time para isso... dê uma olhada neste link: http://www.delphibasics.co.uk/RTL.asp?Name=Date

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa Chrnos não é isso. Os três campos acima estão sendo cadastrados corretamente.

 

ponto.jpg

 

Dá uma olhada para melhor entendimento, preciso cadastrar em cada campo de acordo com o horário em que o usuário entra no Sistema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que entendi... as mensagens seriam estas abaixo?

 

 

Bom dia São 8:00. Seu Ponto foi registrado com sucesso.
Bom Almoço 12:00 Seu Ponto foi registrado com sucesso.
Boa Tarde 13:30. Seu Ponto foi registrado com sucesso.
Bom Descanso. Seu Ponto foi registrado com sucesso.

 

A questão é: esta mensagem será gravada no banco ou só exibida para o usuário na tela/impressa? Na imagem que postou isso não está claro... agora, supondo que fosse para gerar um showmessage por exemplo, bastaria usar um controle com if neste caso.

 

 

procedure TForm1.Button1Click(Sender: TObject);
var Hora : TDateTime;
begin
   //Atribui a hora atual a variável auxiliar de controle
   Hora := Time;
   //Testa o range do horário pra definir a mensagem
   if (Hora >= StrToTime('00:00:00')) and (Hora <= StrToTime('11:59:59')) then
      Showmessage('Bom dia. São ' + TimeToStr(Hora) + '. Seu Ponto foi registrado com sucesso!')
   else if (Hora >= StrToTime('12:00:00')) and (Hora <= StrToTime('13:29:59')) then
           Showmessage('Bom almoço. São ' + TimeToStr(Hora) + '. Seu Ponto foi registrado com sucesso!')
        else if (Hora >= StrToTime('13:30:00')) and (Hora <= StrToTime('18:00:00')) then
                Showmessage('Boa tarde. São ' + TimeToStr(Hora) + '. Seu Ponto foi registrado com sucesso!')
             else
                Showmessage('Bom descanso. São ' + TimeToStr(Hora) + '. Seu Ponto foi registrado com sucesso!');
end;

 

Se for gravar a mensagem no banco, o if acima teria que ser usado no ponto onde irá passar o valor do parâmetro... ou poderia por a mensagem numa variável auxiliar, montar ela antes de inserir e depois apenas passar ela ao parâmetro na gravação, ai você escolhe.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Chrnos estas instruções que você passou eu havia pensado nisso também mas, ia implementar depois de resolver a questão que não estou conseguindo.

 

Ps. Estou precisando é que dependendo do horário como você passou para as mensagens o Sistema grave no seu campo correspondente.

Se for das 8:00 as 11:59 grave no campo entrada1 e assim por diante.

 

Abaixo segue código que estou usando no momento junto com sua dica.

procedure TfrmPontoMarca.btnOkClick(Sender: TObject);
var
  dataAtual, horaAtual, strSqlPonto, strMensagem : string;
  Hora : TDateTime;
begin
  dataAtual := DateToStr(Date);
  horaAtual := TimeToStr(Time);
  //Atribui a hora atual a variável auxiliar de controle
  Hora := Time;

  // Efetua a consulta para ver se usuário e senha existem
  dm.qryPonto.Open;
  strSqlPonto:= 'SELECT * FROM funcionarios WHERE login_fun = ' + #39 + edtUsuario.Text + #39;
  strSqlPonto:= strSqlPonto + ' AND senha_fun = ' + #39 + edtSenha.Text + #39;
  strSqlPonto:= strSqlPonto + ' AND status_fun = ' + #39 + 'T' + #39;
  dm.qryPonto.Close;
  dm.qryPonto.SQL.Clear;
  dm.qryPonto.SQL.Add(strSqlPonto);
  dm.qryPonto.Open;

  // Se Login estiver ok
  // Cadastra Ponto no Banco
  if not dm.qryPonto.IsEmpty then
  begin
    Close;
    with dm.qryPonto do begin
      Close;
      SQL.Clear;
      SQL.Text := 'INSERT INTO ponto (codigofun_pon, data_pon, incluidoem_pon, alteradoem_pon, responsavel_pon)' +
      ' VALUES (:codigofun_pon, :data_pon, :incluidoem_pon, :alteradoem_pon, :responsavel_pon)';
      Parameters.ParamValues['codigofun_pon']   := dm.qryLogin.FieldByName('codigo_fun').AsInteger;
      Parameters.ParamValues['data_pon']        := dataAtual;
      Parameters.ParamValues['incluidoem_pon']  := dataAtual + ' ' + horaAtual;
      Parameters.ParamValues['responsavel_pon'] := dataAtual + ' ' + horaAtual;
      Parameters.ParamValues['responsavel_pon'] := dm.qryLogin.FieldByName('login_fun').AsString;
      ExecSQL;
      frmPontoMarca.Close; // Fecha o frmPontoMarca
      //ShowMessage('Ponto Registrado com Sucesso!');
      //Testa o range do horário pra definir a mensagem
      if (Hora >= StrToTime('00:00:00')) and (Hora <= StrToTime('11:59:59')) then
        Showmessage('Bom dia. São ' + TimeToStr(Hora) + '. Seu Ponto foi registrado com sucesso!')
      else if (Hora >= StrToTime('12:00:00')) and (Hora <= StrToTime('13:29:59')) then
        Showmessage('Bom almoço. São ' + TimeToStr(Hora) + '. Seu Ponto foi registrado com sucesso!')
      else if (Hora >= StrToTime('13:30:00')) and (Hora <= StrToTime('18:00:00')) then
        Showmessage('Boa tarde. São ' + TimeToStr(Hora) + '. Seu Ponto foi registrado com sucesso!')
      else
        Showmessage('Bom descanso. São ' + TimeToStr(Hora) + '. Seu Ponto foi registrado com sucesso!');
    end;
  end
  else
    // Se o usuário estiver bloqueado para uso ou não existir
    ShowMessage('Você não tem acesso ao Ponto!');
    edtUsuario.SetFocus;
end;

Deixa ver se entendi, a logica seria essa?

if (Hora >= StrToTime('00:00:00')) and (Hora <= StrToTime('11:59:59')) then
  Parameters.ParamValues['entrada1_pon']        := Hora;
if (Hora >= StrToTime('12:00:00')) and (Hora <= StrToTime('13:29:59')) then
  Parameters.ParamValues['entrada1_pon']        := Hora;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, agora está um pouco mais claro... A questão aqui não é dar uma mensagem, mas determinar pelo horário o campo que será gravado e se a operação é um insert ou update, a menos que você esteja pensando em ter 4 entradas por dia pra cada funcionário... poderia dar um detalhamento melhor de como pretende controlar isto? Se será um registro com 4 marcações de ponto por dia ou se irá fazer para um dia 4 ou mais inserts (um pra cada marcação de ponto)?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa olha eu denovo. São 4 marcações por dia para cada usuário.

 

Está assim até o momento.

procedure TfrmPontoMarca.btnOkClick(Sender: TObject);
var
  dataAtual, horaAtual, strSqlPonto, strMensagem: string;
  usuarioLogado: integer;
  Hora : TDateTime;
begin
  dataAtual := DateToStr(Date);
  horaAtual := TimeToStr(Time);
  //Atribui a hora atual a variável auxiliar de controle
  Hora := Time;

  // Efetua a consulta para ver se usuário e senha existem
  dm.qryPonto.Open;
  strSqlPonto:= 'SELECT * FROM funcionarios WHERE login_fun = ' + #39 + edtUsuario.Text + #39;
  strSqlPonto:= strSqlPonto + ' AND senha_fun = ' + #39 + edtSenha.Text + #39;
  strSqlPonto:= strSqlPonto + ' AND status_fun = ' + #39 + 'T' + #39;
  dm.qryPonto.Close;
  dm.qryPonto.SQL.Clear;
  dm.qryPonto.SQL.Add(strSqlPonto);
  dm.qryPonto.Open;

  usuarioLogado:= dm.qryPonto.FieldByName('codigo_fun').AsInteger;

  // Se Login estiver ok
  // Cadastra Ponto no Banco
  if not dm.qryPonto.IsEmpty then
  begin
    Close;
    with dm.qryPonto do begin
      Close;
      SQL.Clear;
      SQL.Text := 'INSERT INTO ponto (codigofun_pon, data_pon, entrada1_pon, saida1_pon, entrada2_pon, saida2_pon, incluidoem_pon, alteradoem_pon, responsavel_pon)' +
      ' VALUES (:codigofun_pon, :data_pon, :entrada1_pon, :saida1_pon, :entrada2_pon, :saida2_pon, :incluidoem_pon, :alteradoem_pon, :responsavel_pon)';
      Parameters.ParamValues['codigofun_pon']   := usuarioLogado; //dm.qryPonto.FieldByName('codigo_fun').AsInteger;
      Parameters.ParamValues['data_pon']        := dataAtual;

      if (Hora >= StrToTime('00:00:00')) and (Hora <= StrToTime('11:59:59')) then
        Parameters.ParamValues['entrada1_pon']  := Hora;
      if (Hora >= StrToTime('12:00:00')) and (Hora <= StrToTime('13:29:59')) then
        Parameters.ParamValues['saida1_pon']    := Hora;
      if (Hora >= StrToTime('13:30:00')) and (Hora <= StrToTime('17:59:59')) then
        Parameters.ParamValues['entrada2_pon']  := Hora;
      if (Hora >= StrToTime('18:00:00')) then
        Parameters.ParamValues['saida2_pon']    := Hora;

      Parameters.ParamValues['incluidoem_pon']  := dataAtual + ' ' + horaAtual;
      Parameters.ParamValues['alteradoem_pon'] := dataAtual + ' ' + horaAtual;
      Parameters.ParamValues['responsavel_pon'] := dm.qryLogin.FieldByName('login_fun').AsString;
      ExecSQL;

      frmPontoMarca.Close; // Fecha o frmPontoMarca

      //ShowMessage('Ponto Registrado com Sucesso!');
      //Testa o range do horário pra definir a mensagem
      if (Hora >= StrToTime('00:00:00')) and (Hora <= StrToTime('11:59:59')) then
        Showmessage('Bom dia. São ' + TimeToStr(Hora) + '. Seu Ponto foi registrado com sucesso!')
      else if (Hora >= StrToTime('12:00:00')) and (Hora <= StrToTime('13:29:59')) then
        Showmessage('Bom almoço. São ' + TimeToStr(Hora) + '. Seu Ponto foi registrado com sucesso!')
      else if (Hora >= StrToTime('13:30:00')) and (Hora <= StrToTime('18:00:00')) then
        Showmessage('Boa tarde. São ' + TimeToStr(Hora) + '. Seu Ponto foi registrado com sucesso!')
      else
        Showmessage('Bom descanso. São ' + TimeToStr(Hora) + '. Seu Ponto foi registrado com sucesso!');
    end;
  end
  else
    // Se o usuário estiver bloqueado para uso ou não existir
    ShowMessage('Você não tem acesso ao Ponto!');
    edtUsuario.SetFocus;
end;

Para tudo, minha lógica está totalmente errada. Eu tenho que dar o INSERT na primeira marcação certo? Aí a partir da segunda ir dando UPDATE nos horários.

 

Vou ter que rever tudo aqui e depois posto o que consegui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acredito que seria o melhor, honeraria menos o banco fazer 1 registro só ao invés de quatro.... suponho que sua chave primária seja os campos codigofun_pon, data_pon nesta tabela certo? Se for, antes de decidir se fará um insert/update, você poderia ver se há algum registro com essa combinaçaõ no BD para a partir dai definir se fará um insert ou update na tabela. Depois, é só pegar a lógica que já montou no insert do valor dos campos e por no update saca?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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