pegar hora de entrada e hora de saida

21/05/2020

0

estou querendo pegar hora da entrada e hora da saida de um funcionario da tabela bilhetes vou estar pondo minha programação aqui em baixo.
com minha programação estou conseguindo pegar só a a hora de entrada porem a data de saida eu n estou conseguindo pegar

// INI FUNCIONARIOS / INICIO
with ADO_Funcionario, SQL do
begin
Clear;
Close;
Add('select a.nome, a.COD_PESSOA, a.MATRICULA,C.CodigoDeBarras, CAST(b.DataHora as datetime) data_acesso ');
Add('from [TopAcesso].[dbo].[Funcionarios] a, ');
Add(' [TopAcesso].[dbo].[Bilhetes] b, ');
Add(' [TopAcesso].[dbo].[Cartoes] c ');
Add('where a.COD_PESSOA = b.COD_PESSOA AND A.COD_PESSOA = C.COD_PESSOA ');
Add('and b.Tipo = 10 ');


if ((Copy(CB_Departamentos.Text,1,2) = '00') OR (Copy(CB_Departamentos.Text,1,2) = '**')) then
begin
// INI VISITANTES
Add(' UNION all ');

Add(' select x.nome, x.COD_PESSOA, x.DOCUMENTO, '''+'Visitante'+''', CAST(y.DataHora as date) data_acesso ');
Add(' from [TopAcesso].[dbo].[Visitantes] x, ');
Add(' [TopAcesso].[dbo].[Bilhetes] y ');
Add(' where x.COD_PESSOA = y.COD_PESSOA ');
Add(' and y.Tipo = 10 ');

end;

add('ORDER BY data_acesso desc');
Open;

end;
// FIM FUNCIONARIOS / FIM

begin
for lin := 1 to StringGrid1.RowCount - 1 do
for col := 0 to StringGrid1.ColCount - 1 do
StringGrid1.Cells[col, lin] := '';
end;

StringGrid1.CELLS[0, I] := ' ';
StringGrid1.CELLS[1, I] := ' ';
StringGrid1.CELLS[2, I] := ' ';
StringGrid1.CELLS[3, I] := ' ';
StringGrid1.CELLS[4, I] := ' ';
StringGrid1.CELLS[5, I] := ' ';
StringGrid1.CELLS[6, I] := ' ';
StringGrid1.CELLS[7, I] := ' ';

StringGrid1.ColWidths[0] := 130;
StringGrid1.ColWidths[1] := 350;
StringGrid1.ColWidths[2] := 135;
StringGrid1.ColWidths[3] := 105;
StringGrid1.ColWidths[4] := 95;
StringGrid1.ColWidths[5] := 95;
StringGrid1.ColWidths[6] := 200;
StringGrid1.ColWidths[7] := 150;

StringGrid1.CELLS[0, 0] := 'Matricula/Doc.';
StringGrid1.CELLS[1, 0] := 'Nome';
StringGrid1.CELLS[2, 0] := 'Cartão';
StringGrid1.CELLS[3, 0] := 'Data';
StringGrid1.CELLS[4, 0] := 'Entrada';
StringGrid1.CELLS[5, 0] := 'Saida';
StringGrid1.CELLS[6, 0] := 'Departamento';
StringGrid1.CELLS[7, 0] := 'Perfil Acesso';


StringGrid1.RowCount := 1;

while not ADO_Funcionario.EOF DO
begin
for i := 0 to ADO_Funcionario.RecordCount - 1 do
begin
if ADO_Funcionario.FieldByName('CodigoDeBarras').AsString <> 'Visitante' then
begin
// DEPARTAMENTO
with ADO_pesquisa, SQL do
begin
Clear;
Close;
Add('select distinct b.descricao ');
Add('from [TopAcesso].[dbo].[Funcionarios] a, [TopAcesso].[dbo].[departamentos] b where a.COD_departamento = b.COD_departamento ');
Add('and a.cod_pessoa = :wpessoa_dep ');
Parameters.ParamByName('wpessoa_dep').Value := ADO_Funcionario.FieldByName('COD_PESSOA').AsInteger;
Open;
end;

sdepartamento := ADO_pesquisa.FieldByName('DESCRICAO').AsString;

// PERFIL DE ACESSO
with ADO_pesquisa, SQL do
begin
Clear;
Close;
Add('select distinct b.descricao ');
Add('from [TopAcesso].[dbo].[Funcionarios] a, [TopAcesso].[dbo].[PerfisDeAcesso] b where a.COD_PERFIL = b.COD_PERFIL');
Add('and a.cod_pessoa = :wpessoa_dep');
Parameters.ParamByName('wpessoa_dep').Value := ADO_Funcionario.FieldByName('COD_PESSOA').AsInteger;
Open;
end;

sperfilacesso := ADO_pesquisa.FieldByName('DESCRICAO').AsString;
end
else
begin
sdepartamento := 'Externo';

// PERFIL DE ACESSO
with ADO_pesquisa, SQL do
begin
Clear;
Close;
Add('select distinct b.descricao ');
Add('from [TopAcesso].[dbo].[Visitantes] a, [TopAcesso].[dbo].[PerfisDeAcesso] b where a.COD_PERFIL = b.COD_PERFIL ');
Add('and a.cod_pessoa = :wpessoa_dep');
Parameters.ParamByName('wpessoa_dep').Value := ADO_Funcionario.FieldByName('COD_PESSOA').AsInteger;
Open;
end;

sperfilacesso := ADO_pesquisa.FieldByName('DESCRICAO').AsString;
end;

data_movimento := Copy(ADO_Funcionario.fieldbyName('data_acesso').AsString,1,2) + '/' +
Copy(ADO_Funcionario.fieldbyName('data_acesso').AsString,4,2) + '/' +
Copy(ADO_Funcionario.fieldbyName('data_acesso').AsString,7,4);


StringGrid1.CELLS[0, I+1] := ADO_Funcionario.FieldByName('MATRICULA').AsString;
StringGrid1.CELLS[1, I+1] := ADO_Funcionario.FieldByName('NOME').AsString;
StringGrid1.CELLS[2, I+1] := ADO_Funcionario.FieldByName('CodigoDeBarras').AsString;
StringGrid1.CELLS[3, I+1] := data_movimento ;
StringGrid1.CELLS[6, I+1] := sdepartamento;

StringGrid1.CELLS[7, I+1] := sperfilacesso;



DATA_ENTRADA := copy(ADO_Funcionario.FieldByname('data_acesso').value,11,3)+':'+copy(ADO_Funcionario.FieldByname('data_acesso').value,15,2)+':'
+copy(ADO_Funcionario.FieldByname('data_acesso').value,18,2);

StringGrid1.CELLS[4,I+1] := DATA_ENTRADA;

ADO_Funcionario.Next;
end;
Lucas

Lucas

Responder

Posts

21/05/2020

Emerson Nascimento

você está sempre filtrando a tabela Bilhetes pelo Tipo = 10.
não será aí o problema?
é bem difícil ajudar sem conhecer as tabelas do banco de dados.
Responder

21/05/2020

Lucas

você está sempre filtrando a tabela Bilhetes pelo Tipo = 10.
não será aí o problema?
é bem difícil ajudar sem conhecer as tabelas do banco de dados.

O TIPO 10 SERIA ENTRADA TIPO 11 SERIA SAIDA
TENTEI PASSAR O TIPO 11 DE ALGUNS JEITOS JÁ MAIS ND ROLOU AI APAGUEI E VIM PEDIR AJUDA
Responder

21/05/2020

Emerson Nascimento

antes vamos resolver uma coisa... tem um for dentro do while ali que está bem esquisito...
altere este exemplo de modo que ao menos execute:
const aColWidths array[0..7] of integer = {130, 350, 135, 105, 95, 95, 200, 150};
const aColTitles array[0..7] of string = {'Matricula/Doc.', 'Nome', 'Cartão', 'Data', 'Entrada', 'Saida', 'Departamento', 'Perfil Acesso'}


	// INI FUNCIONARIOS / INICIO
	with ADO_Funcionario, SQL do
	begin
		Close;
		Clear;
		Add('select a.nome, a.COD_PESSOA, a.MATRICULA, c.CodigoDeBarras, COALESCE(d.Descricao,'''') Departamento, ');
		Add('(case when b.Tipo = 10 then CAST(b.DataHora as datetime) else null end) data_entrada, ');
		Add('(case when b.Tipo = 11 then CAST(b.DataHora as datetime) else null end) data_saida ',);
		Add('COALESCE(e.Descricao,'''') PerfilAcesso ');
		Add('from [TopAcesso].[dbo].[Funcionarios] a');
		Add('inner join [TopAcesso].[dbo].[Bilhetes] b on b.COD_PESSOA = a.COD_PESSOA and b.Tipo in (10,11) ');
		Add('inner join [TopAcesso].[dbo].[Cartoes] c on AND c.COD_PESSOA = a.COD_PESSOA ');
		Add('left join [TopAcesso].[dbo].[departamentos] d on d.COD_departamento = a.COD_departamento ');
		Add('left join [TopAcesso].[dbo].[PerfisDeAcesso] e where e.COD_PERFIL = a.COD_PERFIL ');

		if ((Copy(CB_Departamentos.Text,1,2) = '00') OR (Copy(CB_Departamentos.Text,1,2) = '**')) then
		begin
			// INI VISITANTES
			Add('UNION all ');

			Add('select x.nome, x.COD_PESSOA, x.DOCUMENTO, ''Visitante'' CodigoDeBarras, ''Externo'' Departamento ');
			Add('(case when b.Tipo = 10 then CAST(y.DataHora as date) else null end) data_entrada, '); 
			Add('(case when b.Tipo = 11 then CAST(y.DataHora as date) else null end) data_saida, '); 
			Add('COALESCE(z.Descricao,'''') PerfilAcesso ');
			Add('from [TopAcesso].[dbo].[Visitantes] x ');
			Add('inner join [TopAcesso].[dbo].[Bilhetes] y on y.COD_PESSOA = x.COD_PESSOA and y.Tipo in (10,11) ');
			Add('left join [TopAcesso].[dbo].[PerfisDeAcesso] z where z.COD_PERFIL = x.COD_PERFIL ');
		end;

		add('ORDER BY data_entrada desc');
		Open;

	end;
	// FIM FUNCIONARIOS / FIM

	// LIMPA OS DADOS DA GRADE
	for lin := 1 to StringGrid1.RowCount - 1 do
		for col := 0 to StringGrid1.ColCount - 1 do
			StringGrid1.Cells[col, lin] := '''';
 
	// CONFIGURA LARGURAS DAS COLUNAS
	for col := 0 to High(aColWidths) do
		StringGrid1.ColWidths[col] := aColWidths[col];

	// CONFIGURA OS TITULOS DAS COLUNAS
	for col := 0 to High(aColTitles) do
		StringGrid1.CELLS[col, 0] := aColTitles[col]

	// PREENCHE A GRADE
	lin := 1;
	while not ADO_Funcionario.EOF do
	begin
		StringGrid1.RowCount := StringGrid1.RowCount + 1;

		sdepartamento := ADO_Funcionario.FieldByName('Departamento').AsString;
		data_entrada := FormatDateTime('dd/mm/yyyy', ADO_Funcionario.FieldbyName('data_entrada').AsDate);
		data_saida := FormatDateTime('dd/mm/yyyy', ADO_Funcionario.FieldbyName('data_saida').AsDate);
		sperfilacesso := ADO_Funcionario.FieldByName('PerfilAcesso').AsString;

		StringGrid1.CELLS[0, lin] := ADO_Funcionario.FieldByName('MATRICULA').AsString;
		StringGrid1.CELLS[1, lin] := ADO_Funcionario.FieldByName('NOME').AsString;
		StringGrid1.CELLS[2, lin] := ADO_Funcionario.FieldByName('CodigoDeBarras').AsString;
		StringGrid1.CELLS[3, lin] := data_entrada;
		StringGrid1.CELLS[4, lin] := data_entrada;
		StringGrid1.CELLS[5, lin] := data_saida;
		StringGrid1.CELLS[6, lin] := sdepartamento;
		StringGrid1.CELLS[7, lin] := sperfilacesso;

		ADO_Funcionario.Next;

		Inc(lin); // incrementa a linha
	end;
Responder

21/05/2020

Lucas

antes vamos resolver uma coisa... tem um for dentro do while ali que está bem esquisito...
altere este exemplo de modo que ao menos execute:
const aColWidths array[0..7] of integer = {130, 350, 135, 105, 95, 95, 200, 150};
const aColTitles array[0..7] of string = {'Matricula/Doc.', 'Nome', 'Cartão', 'Data', 'Entrada', 'Saida', 'Departamento', 'Perfil Acesso'}


	// INI FUNCIONARIOS / INICIO
	with ADO_Funcionario, SQL do
	begin
		Close;
		Clear;
		Add('select a.nome, a.COD_PESSOA, a.MATRICULA, c.CodigoDeBarras, COALESCE(d.Descricao,'''') Departamento, ');
		Add('(case when b.Tipo = 10 then CAST(b.DataHora as datetime) else null end) data_entrada, ');
		Add('(case when b.Tipo = 11 then CAST(b.DataHora as datetime) else null end) data_saida ',);
		Add('COALESCE(e.Descricao,'''') PerfilAcesso ');
		Add('from [TopAcesso].[dbo].[Funcionarios] a');
		Add('inner join [TopAcesso].[dbo].[Bilhetes] b on b.COD_PESSOA = a.COD_PESSOA and b.Tipo in (10,11) ');
		Add('inner join [TopAcesso].[dbo].[Cartoes] c on AND c.COD_PESSOA = a.COD_PESSOA ');
		Add('left join [TopAcesso].[dbo].[departamentos] d on d.COD_departamento = a.COD_departamento ');
		Add('left join [TopAcesso].[dbo].[PerfisDeAcesso] e where e.COD_PERFIL = a.COD_PERFIL ');

		if ((Copy(CB_Departamentos.Text,1,2) = '00') OR (Copy(CB_Departamentos.Text,1,2) = '**')) then
		begin
			// INI VISITANTES
			Add('UNION all ');

			Add('select x.nome, x.COD_PESSOA, x.DOCUMENTO, ''Visitante'' CodigoDeBarras, ''Externo'' Departamento ');
			Add('(case when b.Tipo = 10 then CAST(y.DataHora as date) else null end) data_entrada, '); 
			Add('(case when b.Tipo = 11 then CAST(y.DataHora as date) else null end) data_saida, '); 
			Add('COALESCE(z.Descricao,'''') PerfilAcesso ');
			Add('from [TopAcesso].[dbo].[Visitantes] x ');
			Add('inner join [TopAcesso].[dbo].[Bilhetes] y on y.COD_PESSOA = x.COD_PESSOA and y.Tipo in (10,11) ');
			Add('left join [TopAcesso].[dbo].[PerfisDeAcesso] z where z.COD_PERFIL = x.COD_PERFIL ');
		end;

		add('ORDER BY data_entrada desc');
		Open;

	end;
	// FIM FUNCIONARIOS / FIM

	// LIMPA OS DADOS DA GRADE
	for lin := 1 to StringGrid1.RowCount - 1 do
		for col := 0 to StringGrid1.ColCount - 1 do
			StringGrid1.Cells[col, lin] := '''';
 
	// CONFIGURA LARGURAS DAS COLUNAS
	for col := 0 to High(aColWidths) do
		StringGrid1.ColWidths[col] := aColWidths[col];

	// CONFIGURA OS TITULOS DAS COLUNAS
	for col := 0 to High(aColTitles) do
		StringGrid1.CELLS[col, 0] := aColTitles[col]

	// PREENCHE A GRADE
	lin := 1;
	while not ADO_Funcionario.EOF do
	begin
		StringGrid1.RowCount := StringGrid1.RowCount + 1;

		sdepartamento := ADO_Funcionario.FieldByName('Departamento').AsString;
		data_entrada := FormatDateTime('dd/mm/yyyy', ADO_Funcionario.FieldbyName('data_entrada').AsDate);
		data_saida := FormatDateTime('dd/mm/yyyy', ADO_Funcionario.FieldbyName('data_saida').AsDate);
		sperfilacesso := ADO_Funcionario.FieldByName('PerfilAcesso').AsString;

		StringGrid1.CELLS[0, lin] := ADO_Funcionario.FieldByName('MATRICULA').AsString;
		StringGrid1.CELLS[1, lin] := ADO_Funcionario.FieldByName('NOME').AsString;
		StringGrid1.CELLS[2, lin] := ADO_Funcionario.FieldByName('CodigoDeBarras').AsString;
		StringGrid1.CELLS[3, lin] := data_entrada;
		StringGrid1.CELLS[4, lin] := data_entrada;
		StringGrid1.CELLS[5, lin] := data_saida;
		StringGrid1.CELLS[6, lin] := sdepartamento;
		StringGrid1.CELLS[7, lin] := sperfilacesso;

		ADO_Funcionario.Next;

		Inc(lin); // incrementa a linha
	end;


const aColWidths array[0..7] of integer = {130, 350, 135, 105, 95, 95, 200, 150};
const aColTitles array[0..7] of string = {'Matricula/Doc.', 'Nome', 'Cartão', 'Data', 'Entrada', 'Saida', 'Departamento', 'Perfil Acesso'}
/////////////////
esta linha coloca antes de comecar o begin ou depois ?
por exemplo
procedure TformEasyInnerOnLine.Pesquisar_Registros;
const aColWidths array[0..7] of integer = {130, 350, 135, 105, 95, 95, 200, 150};
const aColTitles array[0..7] of string = {'Matricula/Doc.', 'Nome', 'Cartão', 'Data', 'Entrada', 'Saida', 'Departamento', 'Perfil Acesso'}
begin
/// o que vc me mandou ///
end;
ou coloca depois do begin ?
Responder

22/05/2020

Emerson Nascimento

Lucas, é da forma que você apresentou.
procedure TformEasyInnerOnLine.Pesquisar_Registros;
const
  aColWidths: array[0..7] of integer = (130, 350, 135, 105, 95, 95, 200, 150);
  aColTitles: array[0..7] of string = ('Matricula/Doc.', 'Nome', 'Cartão', 'Data', 'Entrada', 'Saida', 'Departamento', 'Perfil Acesso');
begin
    /// o que vc me mandou ///
end;
Responder

22/05/2020

Lucas

Lucas, é da forma que você apresentou.
procedure TformEasyInnerOnLine.Pesquisar_Registros;
const
  aColWidths: array[0..7] of integer = (130, 350, 135, 105, 95, 95, 200, 150);
  aColTitles: array[0..7] of string = ('Matricula/Doc.', 'Nome', 'Cartão', 'Data', 'Entrada', 'Saida', 'Departamento', 'Perfil Acesso');
begin
    /// o que vc me mandou ///
end;

não rolou ñ ele me retorna assim
nome | cod_pessoa |matricula | codigoDeBarras | departamento |Data_Entrada | Data_Saida | perfil_Acesso
teste | 1 |123 |555 |Sala |2020-05-21 11:00 | null | teste
teste | 1 |123 |555 |Sala |null | |2020-05-21 11:10 | teste

///////////////////eu precisava que aparecesse assim

nome | cod_pessoa |matricula | codigoDeBarras | departamento |Data_Entrada | Data_Saida | perfil_Acesso
teste | 1 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste
Responder

22/05/2020

Emerson Nascimento

era exatamente o que deveria acontecer.
para ter o resultado em uma linha, da forma como você precisa:
    // INI FUNCIONARIOS / INICIO
    with ADO_Funcionario, SQL do
    begin
        Close;
        Clear;
        Add('select nome, COD_PESSOA, MATRICULA, CodigoDeBarras, Departamento, ');
        Add('max(data_entrada) data_entrada, ');
        Add('max(data_saida) data_saida, ');
        Add('PerfilAcesso ');
        Add('from (');

        Add('select a.nome, a.COD_PESSOA, a.MATRICULA, c.CodigoDeBarras, COALESCE(d.Descricao,'''') Departamento, ');
        Add('(case when b.Tipo = 10 then CAST(b.DataHora as datetime) else null end) data_entrada, ');
        Add('(case when b.Tipo = 11 then CAST(b.DataHora as datetime) else null end) data_saida, ');
        Add('COALESCE(e.Descricao,'''') PerfilAcesso ');
        Add('from [TopAcesso].[dbo].[Funcionarios] a');
        Add('inner join [TopAcesso].[dbo].[Bilhetes] b on b.COD_PESSOA = a.COD_PESSOA and b.Tipo in (10,11) ');
        Add('inner join [TopAcesso].[dbo].[Cartoes] c on AND c.COD_PESSOA = a.COD_PESSOA ');
        Add('left join [TopAcesso].[dbo].[departamentos] d on d.COD_departamento = a.COD_departamento ');
        Add('left join [TopAcesso].[dbo].[PerfisDeAcesso] e where e.COD_PERFIL = a.COD_PERFIL ');
 
        if ((Copy(CB_Departamentos.Text,1,2) = '00') OR (Copy(CB_Departamentos.Text,1,2) = '**')) then
        begin
            // INI VISITANTES
            Add('UNION all ');
 
            Add('select x.nome, x.COD_PESSOA, x.DOCUMENTO, ''Visitante'' CodigoDeBarras, ''Externo'' Departamento ');
            Add('(case when b.Tipo = 10 then CAST(y.DataHora as date) else null end) data_entrada, '); 
            Add('(case when b.Tipo = 11 then CAST(y.DataHora as date) else null end) data_saida, '); 
            Add('COALESCE(z.Descricao,'''') PerfilAcesso ');
            Add('from [TopAcesso].[dbo].[Visitantes] x ');
            Add('inner join [TopAcesso].[dbo].[Bilhetes] y on y.COD_PESSOA = x.COD_PESSOA and y.Tipo in (10,11) ');
            Add('left join [TopAcesso].[dbo].[PerfisDeAcesso] z where z.COD_PERFIL = x.COD_PERFIL ');
        end;

        Add(') tab');
        Add('GROUP BY nome, COD_PESSOA, MATRICULA, CodigoDeBarras, Departamento, PerfilAcesso ');
        Add('ORDER BY max(data_entrada) desc');

        Open;
 
    end;
    // FIM FUNCIONARIOS / FIM
 

Responder

25/05/2020

Lucas

era exatamente o que deveria acontecer.
para ter o resultado em uma linha, da forma como você precisa:
    // INI FUNCIONARIOS / INICIO
    with ADO_Funcionario, SQL do
    begin
        Close;
        Clear;
        Add('select nome, COD_PESSOA, MATRICULA, CodigoDeBarras, Departamento, ');
        Add('max(data_entrada) data_entrada, ');
        Add('max(data_saida) data_saida, ');
        Add('PerfilAcesso ');
        Add('from (');

        Add('select a.nome, a.COD_PESSOA, a.MATRICULA, c.CodigoDeBarras, COALESCE(d.Descricao,'''') Departamento, ');
        Add('(case when b.Tipo = 10 then CAST(b.DataHora as datetime) else null end) data_entrada, ');
        Add('(case when b.Tipo = 11 then CAST(b.DataHora as datetime) else null end) data_saida, ');
        Add('COALESCE(e.Descricao,'''') PerfilAcesso ');
        Add('from [TopAcesso].[dbo].[Funcionarios] a');
        Add('inner join [TopAcesso].[dbo].[Bilhetes] b on b.COD_PESSOA = a.COD_PESSOA and b.Tipo in (10,11) ');
        Add('inner join [TopAcesso].[dbo].[Cartoes] c on AND c.COD_PESSOA = a.COD_PESSOA ');
        Add('left join [TopAcesso].[dbo].[departamentos] d on d.COD_departamento = a.COD_departamento ');
        Add('left join [TopAcesso].[dbo].[PerfisDeAcesso] e where e.COD_PERFIL = a.COD_PERFIL ');
 
        if ((Copy(CB_Departamentos.Text,1,2) = '00') OR (Copy(CB_Departamentos.Text,1,2) = '**')) then
        begin
            // INI VISITANTES
            Add('UNION all ');
 
            Add('select x.nome, x.COD_PESSOA, x.DOCUMENTO, ''Visitante'' CodigoDeBarras, ''Externo'' Departamento ');
            Add('(case when b.Tipo = 10 then CAST(y.DataHora as date) else null end) data_entrada, '); 
            Add('(case when b.Tipo = 11 then CAST(y.DataHora as date) else null end) data_saida, '); 
            Add('COALESCE(z.Descricao,'''') PerfilAcesso ');
            Add('from [TopAcesso].[dbo].[Visitantes] x ');
            Add('inner join [TopAcesso].[dbo].[Bilhetes] y on y.COD_PESSOA = x.COD_PESSOA and y.Tipo in (10,11) ');
            Add('left join [TopAcesso].[dbo].[PerfisDeAcesso] z where z.COD_PERFIL = x.COD_PERFIL ');
        end;

        Add(') tab');
        Add('GROUP BY nome, COD_PESSOA, MATRICULA, CodigoDeBarras, Departamento, PerfilAcesso ');
        Add('ORDER BY max(data_entrada) desc');

        Open;
 
    end;
    // FIM FUNCIONARIOS / FIM
 


coloquei no sql server e deu
Mensagem 156, Nível 15, Estado 1, Linha 12
Sintaxe incorreta próxima à palavra-chave 'AND'.

Responder

25/05/2020

Lucas

era exatamente o que deveria acontecer.
para ter o resultado em uma linha, da forma como você precisa:
    // INI FUNCIONARIOS / INICIO
    with ADO_Funcionario, SQL do
    begin
        Close;
        Clear;
        Add('select nome, COD_PESSOA, MATRICULA, CodigoDeBarras, Departamento, ');
        Add('max(data_entrada) data_entrada, ');
        Add('max(data_saida) data_saida, ');
        Add('PerfilAcesso ');
        Add('from (');

        Add('select a.nome, a.COD_PESSOA, a.MATRICULA, c.CodigoDeBarras, COALESCE(d.Descricao,'''') Departamento, ');
        Add('(case when b.Tipo = 10 then CAST(b.DataHora as datetime) else null end) data_entrada, ');
        Add('(case when b.Tipo = 11 then CAST(b.DataHora as datetime) else null end) data_saida, ');
        Add('COALESCE(e.Descricao,'''') PerfilAcesso ');
        Add('from [TopAcesso].[dbo].[Funcionarios] a');
        Add('inner join [TopAcesso].[dbo].[Bilhetes] b on b.COD_PESSOA = a.COD_PESSOA and b.Tipo in (10,11) ');
        Add('inner join [TopAcesso].[dbo].[Cartoes] c on AND c.COD_PESSOA = a.COD_PESSOA ');
        Add('left join [TopAcesso].[dbo].[departamentos] d on d.COD_departamento = a.COD_departamento ');
        Add('left join [TopAcesso].[dbo].[PerfisDeAcesso] e where e.COD_PERFIL = a.COD_PERFIL ');
 
        if ((Copy(CB_Departamentos.Text,1,2) = '00') OR (Copy(CB_Departamentos.Text,1,2) = '**')) then
        begin
            // INI VISITANTES
            Add('UNION all ');
 
            Add('select x.nome, x.COD_PESSOA, x.DOCUMENTO, ''Visitante'' CodigoDeBarras, ''Externo'' Departamento ');
            Add('(case when b.Tipo = 10 then CAST(y.DataHora as date) else null end) data_entrada, '); 
            Add('(case when b.Tipo = 11 then CAST(y.DataHora as date) else null end) data_saida, '); 
            Add('COALESCE(z.Descricao,'''') PerfilAcesso ');
            Add('from [TopAcesso].[dbo].[Visitantes] x ');
            Add('inner join [TopAcesso].[dbo].[Bilhetes] y on y.COD_PESSOA = x.COD_PESSOA and y.Tipo in (10,11) ');
            Add('left join [TopAcesso].[dbo].[PerfisDeAcesso] z where z.COD_PERFIL = x.COD_PERFIL ');
        end;

        Add(') tab');
        Add('GROUP BY nome, COD_PESSOA, MATRICULA, CodigoDeBarras, Departamento, PerfilAcesso ');
        Add('ORDER BY max(data_entrada) desc');

        Open;
 
    end;
    // FIM FUNCIONARIOS / FIM
 


coloquei no sql server e deu
Mensagem 156, Nível 15, Estado 1, Linha 12
Sintaxe incorreta próxima à palavra-chave 'AND'.


ja arrumei aqui
mais no caso ele esta me retornando assim certo
nome | cod_pessoa |matricula | codigoDeBarras | departamento |Data_Entrada | Data_Saida | perfil_Acesso
lucas| 1 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste
teste | 2 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste
no banco eu fiz 4 entradas e saida de 2 funcionarios
queria que aparecesse todas

sendo assim eu lucas entro e saio
nome | cod_pessoa |matricula | codigoDeBarras | departamento |Data_Entrada | Data_Saida | perfil_Acesso
lucas| 1 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste
ai outra pessoa chamada teste entra e sai
nome | cod_pessoa |matricula | codigoDeBarras | departamento |Data_Entrada | Data_Saida | perfil_Acesso
lucas| 1 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste
teste | 2 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste
ai eu pego e entro na empresa
nome | cod_pessoa |matricula | codigoDeBarras | departamento |Data_Entrada | Data_Saida | perfil_Acesso
lucas| 1 |123 |555 |Sala |2020-05-21 13:00 | |'e para aparecer em branco '| teste
lucas| 1 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste
teste | 2 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste
eu pego e saiu
nome | cod_pessoa |matricula | codigoDeBarras | departamento |Data_Entrada | Data_Saida | perfil_Acesso
lucas| 1 |123 |555 |Sala |2020-05-21 13:00 | |2020-05-21 16:10| teste
lucas| 1 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste
teste | 2 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste

Responder

25/05/2020

Lucas

era exatamente o que deveria acontecer.
para ter o resultado em uma linha, da forma como você precisa:
    // INI FUNCIONARIOS / INICIO
    with ADO_Funcionario, SQL do
    begin
        Close;
        Clear;
        Add('select nome, COD_PESSOA, MATRICULA, CodigoDeBarras, Departamento, ');
        Add('max(data_entrada) data_entrada, ');
        Add('max(data_saida) data_saida, ');
        Add('PerfilAcesso ');
        Add('from (');

        Add('select a.nome, a.COD_PESSOA, a.MATRICULA, c.CodigoDeBarras, COALESCE(d.Descricao,'''') Departamento, ');
        Add('(case when b.Tipo = 10 then CAST(b.DataHora as datetime) else null end) data_entrada, ');
        Add('(case when b.Tipo = 11 then CAST(b.DataHora as datetime) else null end) data_saida, ');
        Add('COALESCE(e.Descricao,'''') PerfilAcesso ');
        Add('from [TopAcesso].[dbo].[Funcionarios] a');
        Add('inner join [TopAcesso].[dbo].[Bilhetes] b on b.COD_PESSOA = a.COD_PESSOA and b.Tipo in (10,11) ');
        Add('inner join [TopAcesso].[dbo].[Cartoes] c on AND c.COD_PESSOA = a.COD_PESSOA ');
        Add('left join [TopAcesso].[dbo].[departamentos] d on d.COD_departamento = a.COD_departamento ');
        Add('left join [TopAcesso].[dbo].[PerfisDeAcesso] e where e.COD_PERFIL = a.COD_PERFIL ');
 
        if ((Copy(CB_Departamentos.Text,1,2) = '00') OR (Copy(CB_Departamentos.Text,1,2) = '**')) then
        begin
            // INI VISITANTES
            Add('UNION all ');
 
            Add('select x.nome, x.COD_PESSOA, x.DOCUMENTO, ''Visitante'' CodigoDeBarras, ''Externo'' Departamento ');
            Add('(case when b.Tipo = 10 then CAST(y.DataHora as date) else null end) data_entrada, '); 
            Add('(case when b.Tipo = 11 then CAST(y.DataHora as date) else null end) data_saida, '); 
            Add('COALESCE(z.Descricao,'''') PerfilAcesso ');
            Add('from [TopAcesso].[dbo].[Visitantes] x ');
            Add('inner join [TopAcesso].[dbo].[Bilhetes] y on y.COD_PESSOA = x.COD_PESSOA and y.Tipo in (10,11) ');
            Add('left join [TopAcesso].[dbo].[PerfisDeAcesso] z where z.COD_PERFIL = x.COD_PERFIL ');
        end;

        Add(') tab');
        Add('GROUP BY nome, COD_PESSOA, MATRICULA, CodigoDeBarras, Departamento, PerfilAcesso ');
        Add('ORDER BY max(data_entrada) desc');

        Open;
 
    end;
    // FIM FUNCIONARIOS / FIM
 


coloquei no sql server e deu
Mensagem 156, Nível 15, Estado 1, Linha 12
Sintaxe incorreta próxima à palavra-chave 'AND'.


ja arrumei aqui
mais no caso ele esta me retornando assim certo
nome | cod_pessoa |matricula | codigoDeBarras | departamento |Data_Entrada | Data_Saida | perfil_Acesso
lucas| 1 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste
teste | 2 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste
no banco eu fiz 4 entradas e saida de 2 funcionarios
queria que aparecesse todas

sendo assim eu lucas entro e saio
nome | cod_pessoa |matricula | codigoDeBarras | departamento |Data_Entrada | Data_Saida | perfil_Acesso
lucas| 1 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste
ai outra pessoa chamada teste entra e sai
nome | cod_pessoa |matricula | codigoDeBarras | departamento |Data_Entrada | Data_Saida | perfil_Acesso
lucas| 1 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste
teste | 2 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste
ai eu pego e entro na empresa
nome | cod_pessoa |matricula | codigoDeBarras | departamento |Data_Entrada | Data_Saida | perfil_Acesso
lucas| 1 |123 |555 |Sala |2020-05-21 13:00 | |'e para aparecer em branco '| teste
lucas| 1 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste
teste | 2 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste
eu pego e saiu
nome | cod_pessoa |matricula | codigoDeBarras | departamento |Data_Entrada | Data_Saida | perfil_Acesso
lucas| 1 |123 |555 |Sala |2020-05-21 13:00 | |2020-05-21 16:10| teste
lucas| 1 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste
teste | 2 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste


corriginto fiz duas entradas e duas saidas de dois funcionarios
queria que me aparecesse assim quando entro e saio de um primeiro funcionario
nome | cod_pessoa |matricula | codigoDeBarras | departamento |Data_Entrada | Data_Saida | perfil_Acesso
lucas| 1 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste

seguindo funcionario
nome | cod_pessoa |matricula | codigoDeBarras | departamento |Data_Entrada | Data_Saida | perfil_Acesso
teste| 2 |123 |555 |Sala |2020-05-21 13:00 | |2020-05-21 14:10 | teste
lucas| 1 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste

segunda entrada do primeiro funcionario
nome | cod_pessoa |matricula | codigoDeBarras | departamento |Data_Entrada | Data_Saida | perfil_Acesso
lucas| 1 |123 |555 |Sala |2020-05-21 15:00 | |2020-05-21 16:10 | teste
teste| 2 |123 |555 |Sala |2020-05-21 13:00 | |2020-05-21 14:10 | teste
lucas| 1 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste

segunda entrada do segundo funcionario
nome | cod_pessoa |matricula | codigoDeBarras | departamento |Data_Entrada | Data_Saida | perfil_Acesso
teste| 2 |123 |555 |Sala |2020-05-21 17:00 | |2020-05-21 18:10 | teste
lucas| 1 |123 |555 |Sala |2020-05-21 15:00 | |2020-05-21 16:10 | teste
teste| 2 |123 |555 |Sala |2020-05-21 13:00 | |2020-05-21 14:10 | teste
lucas| 1 |123 |555 |Sala |2020-05-21 11:00 | |2020-05-21 11:10 | teste

deu para entender mais ou menos ?
Responder

26/05/2020

Emerson Nascimento

qual a estrutura da tabela Bilhetes?
porque é necessário saber quais bilhetes pertencem ao mesmo dia (a menos que seja garantido que a entrada e saída aconteçam no mesmo dia).
Responder

26/05/2020

Lucas

qual a estrutura da tabela Bilhetes?
porque é necessário saber quais bilhetes pertencem ao mesmo dia (a menos que seja garantido que a entrada e saída aconteçam no mesmo dia).

cod_pessoa(fk,int,nao nulo) //uso
cod_local(fk,int ,nulo) //uso
tipo(int ,nao nulo) //uso
numInner(fk,int,nulo) //uso
dataHora(datetime,nao nulo) //uso
ordem(int ,nulo) //n uso
exportado(int ,nulo)//n uso
pode ser a q aconteca que a pessoa entre as 23:00 de um dia e saia 05:00 do outro dia
Responder

26/05/2020

Lucas

qual a estrutura da tabela Bilhetes?
porque é necessário saber quais bilhetes pertencem ao mesmo dia (a menos que seja garantido que a entrada e saída aconteçam no mesmo dia).

cod_pessoa(fk,int,nao nulo) //uso
cod_local(fk,int ,nulo) //uso
tipo(int ,nao nulo) //uso
numInner(fk,int,nulo) //uso
dataHora(datetime,nao nulo) //uso
ordem(int ,nulo) //n uso
exportado(int ,nulo)//n uso
pode ser a q aconteca que a pessoa entre as 23:00 de um dia e saia 05:00 do outro dia

consegui fazer utilizando dois bancos
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar