Consultar varias tabelas no banco

Delphi

06/07/2009

Olá pessoal, estou com dificuldade em um select

campos da tabela acesso
Codigo , DataEntrada, DataSaida, HoraEntrada, HoraSaida, nome

vejá so, tenho varias tabelas com o inicio do nome: Acesso_mmyyyy
onde mm=mes e yyyy = ano

preciso fazer um select em que me retorne as tabelas do mes 1 ao 12 em um determinando ano, verificando se existe um determinado nome.

desde já agradeço a atenção.


Sdph

Sdph

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

06/07/2009

mas o que você quer exatamente? retornar o nome das tabelas que contenham o nome procurado? retornar os registros dessas tabelas? o quê?

isso pode ser resolvido de várias formas, tanto através Delphi como do próprio banco de dados (desde que você informe qual bando de dados está utilizando)


GOSTEI 0
Sdph

Sdph

06/07/2009

O que preciso e pegar os dados destas tabelas e emitir um relatorio, ex:


O fulando de tal entrou no mes 01,02, 03.... portanto preciso unir varias tabelas já que minhas tabelas tem nomes diferentes como acesso_012009 a acesso_082009.

desde já agradeço a atenção...


GOSTEI 0
Daniel.felgar

Daniel.felgar

06/07/2009

Boa tarde... voce pode tentar fazer assim

select codigo , dataEntrada, dataSaida, horaEntrada, horaSaida, nome
from acesso_012009

union

select codigo , dataEntrada, dataSaida, horaEntrada, horaSaida, nome
from acesso_022009

union

select codigo , dataEntrada, dataSaida, horaEntrada, horaSaida, nome
from acesso_032009

... etc...

Mas porque voce nao pode usar somente uma tabela para isso???
nao ha necessidade de varias tabelas!!!!


GOSTEI 0
Osocram

Osocram

06/07/2009

acho q esta precisando aplicar uma normalização nesse banco.


GOSTEI 0
Cipriano

Cipriano

06/07/2009

Boa tarde, vi a sugestão acima e fiquei numa duvida: acho que seria necessário o predicado ALL logo após o comando UNION...para que retornem até os registros repetidos ( se for o caso da consulta que ele precisa ) e também acho que seria necessário a igualdade entre as tabelas - JOIN - para que ele consiga buscar os acessos de um nome especifico...ex:

where codigo_012009.codigo=codigo_013009.codigo and codigo_013009.codigo=codigo_014009.codigo etc...


GOSTEI 0
Sdph

Sdph

06/07/2009

Olá pessoal, quero agradecer a todos que responderal este post.

e dizer que o meu problema ja foi solucionado, conforme segue codigo abaixo:

valeu!!!!.

procedure TFrm_FiltroIntervaloES.BitBtn2Click(Sender: TObject);
Var nRegistro : Integer;
var Id, nMesInicio, nAnoInicio, nMesFinal, nAnoFinal, mesAnoInicial, mesAnoFinal : Integer;
var nNome, Inicio, Fim : String;
begin
ibAcesso.Close;
ibAcesso.SelectSQL.Clear;
//****************************************************************************************************************************************************
if FormatDateTime(´mm´, edDataInicial.Date) <= FormatDateTime(´mm´, edDataFinal.Date) then
begin
nMesInicio := StrToInt(FormatDateTime(´mm´,edDataInicial.Date));
nAnoInicio := StrToInt(FormatDateTime(´yyyy´,edDataInicial.Date));
Inicio := dm.zeroesquerda(nMesInicio, 2);
fim := dm.zeroesquerda(nMesFinal,2);

nMesFinal := StrToInt(FormatDateTime(´mm´,edDataFinal.Date));
nAnoFinal := StrToInt(FormatDateTime(´yyyy´,edDataFinal.Date));

mesAnoInicial := nMesInicio+nAnoInicio;
mesAnoFinal := nMesFinal+nAnoFinal;

id := ibCadastroID_CODIGO.AsInteger;
nNome := ibCadastroNOME.AsString;
end;
//****************************************************************************************************************************************************

Memo1.Lines.Clear;
while (mesAnoInicial <= mesAnoFinal) do
begin
if (nAnoInicio < nAnoFinal) then
begin
while nMesInicio <= 12 do
begin
Inicio := dm.zeroesquerda(nMesInicio, 2);
Memo1.Lines.Add(´Select * From ACESSO´ + ´_´+Inicio+intToStr(nAnoInicio) + ´ Where DataEntrada >=:locEntrada And DataEntrada <=:locSaida´ );
Memo1.Lines.Add(´ And id_Cadastro =:locCadastro And Nome =:locNome ´);
Memo1.Lines.Add(´union all´);
nMesInicio := nMesInicio +1 ;
end;
nMesInicio := 1;
end;

if (nAnoInicio = nAnoFinal) then
begin
while (nMesInicio <= nMesFinal) do
begin
Inicio := dm.zeroesquerda(nMesInicio, 2);
Memo1.Lines.Add(´Select * From ACESSO´ + ´_´+Inicio+intToStr(nAnoInicio) + ´ Where DataEntrada >=:locEntrada And DataEntrada <=:locSaida´ );
Memo1.Lines.Add(´ And id_Cadastro =:locCadastro And Nome =:locNome ´);
if (nMesInicio < nMesFinal)then
begin
Memo1.Lines.Add(´union all´);
end;
nMesInicio := nMesInicio +1 ;
end;
end;
mesAnoInicial := nMesInicio+nAnoInicio;
nAnoInicio := nAnoInicio +1;
end;
end;


GOSTEI 0
POSTAR