Los componentes que uso:
para conectar: TADOConnection
Tablas: TADOTable
Queries: TADOQuery
cuando se entra una cedula en un TEdit (normal), al salir (con TAB para pasar al Tedit del nombre del personaje) está este evento:
Código:
procedure TfrmEntrada.edtIDExit(Sender: TObject);
var
ID:string;
iti:integer;
total:double;
semana,hoy:TDateTime;
begin
// para saber si el query que trae la historia del personaje está activado
if not dmppal1.adoqryHisVisTot.Active then
dmppal1.adoqryHisVisTot.Active:=true;
// toma la cedula del personaje
ID:=edtID.Text;
// inicializa la tabla de visitantes al primer record
dmppal1.adotblVisitas.First;
// los visitantes actuales se guardan en una tabla que se llama ADENTRO
// si la nueva cedula está adentro, no permite una segunda entrada
// esto es porque la gente se le olvida entregar el sticker a la salida
nohasalido:=dmppal1.adotblAdentro.Locate('VIS_CC',id,[loCaseInsensitive]);
if nohasalido then
begin
showmessage('El visitante con CC '+dmppal1.adotblAdentroVIS_CC.Value+
' no ha salido aún de la Gobernación. Entro el '+
dmppal1.adotblAdentroVTA_IN.AsString);
// oculta los label que muestran el historial del personaje
lblTotTiempo1.Visible:=false;
lblTotTiempo2.Visible:=false;
lblTotSemana1.Visible:=false;
lblTotSemana2.Visible:=false;
lblTotHoy1.Visible:=false;
lblTotHoy2.Visible:=false;
// deja en blanco el edit de cedula para una nueva entrada
edtID.Text:='';
edtVisNombre.Text:='';
imgVisFoto.Picture.Bitmap:=nil;// el Timage de la foto lo deja nulo
dbgVisitasEnt.Visible:=False;
bbtnRegistrar.Enabled:=False;// inhabilita el registro
sbtnCambiarFotoVis.Visible:=False;
sbtnCancelVisFoto.Visible:=False;
dbmmoVisNota.Visible:=false;
sbtnOKFoto.Visible:=False;
end;
// si existe coloca el cursor en el registro del personaje
existe:=dmppal1.adotblVisitante.Locate('VIS_CC',id,[loCaseInsensitive]);
if existe then
begin
if dmppal1.adotblVisitanteVIS_ESTADO.Value=0 then // si esta prohibida la entrada del personaje:
begin
edtID.Font.Color:=clwhite;
edtID.Font.Style:=[fsBold];
edtID.Color:=clRed;
edtVisNombre.Font.Color:=clwhite;
edtVisNombre.Font.Style:=[fsBold];
edtVisNombre.Color:=clRed;
dbmmoVisNota.Visible:=true;
dbmmoVisNota.Font.Color:=clwhite;
dbmmoVisNota.Font.Style:=[fsBold];
dbmmoVisNota.Color:=clRed;
bbtnRegistrar.Enabled:=false;
end
else // si sí puede entrar:
begin
edtID.Font.Color:=clWindowText;
edtID.Font.Style:=[];
edtID.Color:=clWindow;
edtVisNombre.Font.Color:=clWindowText;
edtVisNombre.Font.Style:=[];
edtVisNombre.Color:=clWindow;
dbmmoVisNota.Visible:=true;
dbmmoVisNota.Font.Color:=clWindowText;
dbmmoVisNota.Font.Style:=[];
dbmmoVisNota.Color:=clWindow;
bbtnRegistrar.Enabled:=true;
end;
edtVisNombre.Text:=dmppal1.adotblVisitanteVIS_NOMBRE.Value;
if FileExists(rutafotos+id+'.jpg') then // si el archivo existe en el directorio de fotos:
begin
imgVisFoto.Picture.LoadFromFile(rutafotos+id+'.jpg');
fotosel:=true;
end
else // si no, coloca un archivo de nofoto.jpg
begin
imgVisFoto.Picture.LoadFromFile(rutafotos+'nofoto.jpg');
fotosel:=false;
end;
// se habilitan los controles para cambiar la foto y otros...
sbtnCambiarFotoVis.Visible:=true;
sbtnCancelVisFoto.Visible:=true;
dmppal1.adoqryHisVisTot.Active:=false; // para saber la historia del peronaje
dmppal1.adoqryHisVisTot.Parameters.Items[0].value:=ID;
dmppal1.adoqryHisVisTot.Active:=true;
lblTotTiempo1.Visible:=true;
lblTotTiempo2.Visible:=true;
lblTotSemana1.Visible:=true;
lblTotSemana2.Visible:=true;
lblTotHoy1.Visible:=true;
lblTotHoy2.Visible:=true;
total:=0;
for iti:=1 to dmppal1.adoqryHisVisTot.RecordCount do
begin
total:=total+SecondsBetween(dmppal1.adoqryHisVisTotVTA_OUT.Value,dmppal1.adoqryHisVisTotVTA_IN.Value);
dmppal1.adoqryHisVisTot.Next;
end;
lblTotTiempo2.Caption:=FloatToStrF(total/3600,ffGeneral,2,2)+ 'horas';
semana:=incday(now,-7);
dmppal1.adoqryHisVisSem.Active:=false;
dmppal1.adoqryHisVisSem.Parameters.Items[0].Value:=ID;
dmppal1.adoqryHisVisSem.Parameters.Items[1].Value:=semana;
dmppal1.adoqryHisVisSem.Active:=true;
total:=0;
for iti:=1 to dmppal1.adoqryHisVisSem.RecordCount do
begin
total:=total+SecondsBetween(dmppal1.adoqryHisVisSemVTA_OUT.Value,dmppal1.adoqryHisVisSemVTA_IN.Value);
dmppal1.adoqryHisVisSem.Next;
end;
lblTotSemana2.Caption:=FloatToStrF(total/3600,ffGeneral,2,2)+ 'horas';
hoy:=today;
dmppal1.adoqryHisVisHoy.Active:=false;
dmppal1.adoqryHisVisHoy.Parameters.Items[0].Value:=ID;
dmppal1.adoqryHisVisHoy.Parameters.Items[1].Value:=hoy;
dmppal1.adoqryHisVisHoy.Active:=true;
total:=0;
for iti:=1 to dmppal1.adoqryHisVisHoy.RecordCount do
begin
total:=total+SecondsBetween(dmppal1.adoqryHisVisHoyVTA_OUT.Value,dmppal1.adoqryHisVisHoyVTA_IN.Value);
dmppal1.adoqryHisVisHoy.Next;
end;
lblTotHoy2.Caption:=FloatToStrF(total/3600,ffGeneral,2,2)+ 'horas';
dbgVisitasEnt.Visible:=true;
bbtnRegistrar.Enabled:=true;
end
else
begin
edtVisNombre.SetFocus;
sbtnOKFoto.Visible:=true;
sbtnCancelVisFoto.Visible:=true;
bbtnRegistrar.Enabled:=true;
end;
end;
en el boton de REGISTRAR, que es el que llena las tablas:
Código:
procedure TfrmEntrada.bbtnRegistrarClick(Sender: TObject);
var
hoy:TDateTime;
begin
if edtID.Text='' then
begin
showmessage('No ha Introducido la cédula');
exit;
end;
if not fotosel then
begin
showmessage('No ha tomado la foto');
exit;
end;
if not areasel then
begin
showmessage('No ha seleccionado un AREA para el visitante');
exit;
end;
if not empleadosel then
begin
showmessage('No ha seleccionado un EMPLEADO para el visitante');
exit;
end;
if not existe then // esta variable es global. si existe es FALSE inserta un registro en visitantes
begin
with dmppal1 do
begin
hoy:=now;
// rutina de visitante
adotblVisitante.Insert;
adotblVisitanteVIS_CC.Value:=edtID.Text;
adotblVisitanteVIS_NOMBRE.Value:=edtVisNombre.Text;
adotblVisitanteVIS_FOTO.Value:=rutafotos+edtID.Text+'.jpg';
adotblVisitanteVIS_ULTVIS.Value:=hoy;
adotblVisitanteVIS_ESTADO.Value:=1;
adotblVisitanteUSU_USUARIO.Value:=adotblUsuarioUSU_USUARIO.Value;
adotblVisitante.Post;
end;
end
else // si existe es TRUE, solo actualiza la fecha de la última visita
with dmppal1 do
begin
hoy:=now;
// rutina de visitante
adotblVisitante.edit;
adotblVisitanteVIS_ULTVIS.Value:=hoy;
adotblVisitanteUSU_USUARIO.Value:=adotblUsuarioUSU_USUARIO.Value;
adotblVisitante.Post;
end;
with dmppal1 do // aqui se llena la tabla de VISITAS
begin
// rutina de visita
adotblVisitas.Insert;
adotblVisitasVTA_IN.Value:=hoy;
adotblVisitasVTA_OUT.Value:=hoy;
adotblVisitasARE_ID.Value:=adoqryAreasEmplARE_ID.Value;
adotblVisitasEMP_ID.Value:=adoqryAreasEmplEMP_ID.Value;
adotblVisitasVIS_ID.Value:=adotblVisitanteVIS_ID.Value;
adotblVisitasUSU_USUARIO.Value:=adotblUsuarioUSU_USUARIO.Value;
adotblVisitas.Post;
dmppal1.adotblAdentro.insert; // aqui se llena la tabla de ADENTRO
dmppal1.adotblAdentroVTA_ID.Value:=dmppal1.adotblVisitasVTA_ID.Value;
dmppal1.adotblAdentroVTA_IN.Value:=dmppal1.adotblVisitasVTA_IN.Value;
dmppal1.adotblAdentroVTA_OUT.Value:=dmppal1.adotblVisitasVTA_OUT.Value;
dmppal1.adotblAdentroVIS_CC.Value:=dmppal1.adotblVisitaslk_VisCC.Value;
dmppal1.adotblAdentroVIS_NOMBRE.Value:=dmppal1.adotblVisitaslk_Visitante.Value;
dmppal1.adotblAdentroARE_NOMBRE.Value:=dmppal1.adotblVisitaslk_Area.Value;
dmppal1.adotblAdentroEMP_NOMBRE.Value:=dmppal1.adotblVisitaslk_Empleado.Value;
dmppal1.adotblAdentroUSU_USUARIO.Value:=dmppal1.adotblVisitasUSU_USUARIO.Value;
dmppal1.adotblAdentro.Post;
end;
// imprime
rfrmStikerPeq:=TrfrmStikerPeq.create(self);
rfrmStikerPeq.qrlblEntrada.Caption:=DateTimetoStr(dmppal1.adotblVisitasVTA_IN.Value);
rfrmStikerPeq.qrlblVisitante.Caption:=dmppal1.adotblVisitaslk_Visitante.Value;
rfrmStikerPeq.qrlblAreaVis.Caption:=dmppal1.adotblVisitaslk_Area.Value;
rfrmStikerPeq.qreanVisCC.BarCode:=dmppal1.adotblVisitaslk_VisCC.Value;
rfrmStikerPeq.qrStickerPeq.Print;
rfrmStikerPeq.Close;
rfrmStikerPeq.Free;
// Limpiar el formulario
lblTotTiempo1.Visible:=false;
lblTotTiempo2.Visible:=false;
lblTotSemana1.Visible:=false;
lblTotSemana2.Visible:=false;
lblTotHoy1.Visible:=false;
lblTotHoy2.Visible:=false;
edtID.Text:='';
edtVisNombre.Text:='';
imgVisFoto.Picture.Bitmap:=nil;
dbgVisitasEnt.Visible:=False;
bbtnRegistrar.Enabled:=False;
sbtnCambiarFotoVis.Visible:=False;
sbtnCancelVisFoto.Visible:=False;
sbtnOKFoto.Visible:=False;
dbgrdAreEntrada.SelectedRows.Clear;
dbgrdEmplEntrada.SelectedRows.Clear;
edtID.Font.Color:=clWindowText;
edtID.Font.Style:=[];
edtID.Color:=clWindow;
edtVisNombre.Font.Color:=clWindowText;
edtVisNombre.Font.Style:=[];
edtVisNombre.Color:=clWindow;
dbmmoVisNota.Font.Color:=clWindowText;
dbmmoVisNota.Font.Style:=[];
dbmmoVisNota.Color:=clWindow;
dbmmoVisNota.Visible:=false;
areasel:=false;
empleadosel:=false;
dmppal1.adotblAdentro.First;
edtID.SetFocus;
end;
bueno. Pues se que se abusa de los queries para la historia del personaje...
Cuando los tengo en red, la búsqueda del archivo de fotos si es realmente lenta...
Es muy descabellado incluir la foto dentro de la base de datos???
Saludos desde Colombia...
Sergio