Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Problemas al modificar consulta. (https://www.clubdelphi.com/foros/showthread.php?t=23871)

alfredosg19 01-08-2005 12:29:12

Problemas al modificar consulta.
 
Hola a todos!!!!, estoy haciendo una especie de horario de trabajo personal, la rutina es sencillita, lo explico por encima tengo un DBGrid donde cada cuadro representa una hora y un día, y quiero que cuando clique encima del cuadro me cree un registro a la base de datos de mi agenda. Hasta aquí bien, el problema es que si trabajo de 7 a 14 horas me crea 7 registros uno para cada hora y quiero que el programa cuando clique sobre el cuadro de las ocho (si coincide con el día) me encuentre estos registros y me modifique el anterior, y aquí es donde falla. Pongo el código fuente y ojalá alguien pueda ayudarme:
Cita:

unit Uprueba;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, Grids, DBGrids;
type
THorario= record
Cita: String;
HInicio: TTime;
HFinal: TTime;
Fecha: TDate;
Prioridad: Boolean;
Provisional: Boolean;
end;
type
TFrmPrincipal = class(TForm)
SgHorario: TStringGrid;
DSAgenda: TDataSource;
ADOAgena: TADOConnection;
ADOTAgenda: TADOTable;
DBGAgenda: TDBGrid;
procedure SgHorarioSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure SgHorarioDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure FormCreate(Sender: TObject);
private
Horario: Array of THorario;
nomdia: Array [0..5] of String;
function EstaOcupada(Fecha, Horafinal: Integer): Boolean;
function horasdia(fila:Integer):Integer;
Procedure GuardaCita(fecha, horaInicio: Integer);
procedure BorraUna(fecha, HoraInici: Integer);
procedure Borratodo;
procedure Busca(Dia: Tdate; HoraInicio, Horafinal: TTime; Cita: String);
procedure NuevaCita(Dia, Horas: Integer);
procedure EditaCita(Dia, Horas: Integer);
function Columna(HIni: Ttime):Integer;
function Fila(HFin: Ttime):Integer;
{ Private declarations }
public
{ Public declarations }
end;

var
FrmPrincipal: TFrmPrincipal;

implementation

{$R *.dfm}

function TFrmPrincipal.horasdia(fila: Integer): Integer;
var i,a,num:Integer;
begin
For i:=0 to sgHorario.ColCount-1 do
If sgHorario.Cells[i,fila]='X' then
num:=num+1;
Result:=num;
end;

procedure TFrmPrincipal.SgHorarioSelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
var
nomd,hora,Inidia,fecha: String;
I,F: Integer;
begin
nomdia[0]:='lun';
nomdia[1]:='mar';
nomdia[2]:='mié';
nomdia[3]:='jue';
nomdia[4]:='vie';
nomdia[5]:='sáb';
if (estaOcupada(ARow,Acol,CbSessio.ItemIndex)=False) and (lbhorar.Caption<>'') then
begin
reserva(Arow,Acol,CbSessio.ItemIndex);
end
Else
begin
If SgHorario.Cells[Acol,Arow]<>'X' then
Begin
Showmessage('Ya está ocupada');
SgHorario.Cells[Acol,Arow]:='X';
For I:=0 to 5 do
Begin
Inidia:=FormatDatetime('ddd',now+I);
If inidia=nomdia[Arow] then
Begin
fecha:=FormatDatetime('dddd dd "de" mmmm "del" yyyy',now+I);
nomd:=FormatDatetime('dd"/"mm"/"yyyy"',now+I);
hora:=InttoStr(Acol+7)+':00:00';
//Showmessage(FormatDateTime('dd"/"mm"/"yyyy',now+I));
//Showmessage(InttoStr(Acol+7)+':00:00');
with ADOTAgenda do
If Locate('Cita_T01;Fecha_T01;Fin_T01', VarArrayOf(['Trabajar', FormatDateTime('dd"/"mm"/"yyyy',now+I), InttoStr(Acol+7)+':00:00']),[loPartialKey]) and (estaOcupada(ARow,Acol)=False) Then
Begin
GuardaCita(Arow,Acol);
EditaCita(Acol,I);
End
Else
Begin
NuevaCita(Acol,I);
if sgHorario.Cells[Acol,Arow]='X' then
//Showmessage('El dia '+(now+Arow)' a la hora '+InttoStr(ACol+7)+':00:00'+' ya tiene una cita.')
else
Borrauna(ACol,ARow);
End;
End;
End;
End
Else
Begin
SgHorario.Cells[Acol,Arow]:='';
End;
//Contarast;
//lbBselec.Caption:=InttoStr(Contarast);
//frmCanvi.lbNentrades.Caption:=InttoStr(contarast);
//frmCanvi.lbNent.Caption:=InttoStr(Contarast);
//lbBlliures.Caption:=InttoStr(Contar);
Borratodo;
Busca(Date+Arow,StrtoTime(InttoStr(Acol+7)+':00:00'),StrtoTime(InttoStr(Acol+8)+':00:00'),'Trabajar' );
//Salaplena;
end;

procedure TFrmPrincipal.SgHorarioDrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
If (Acol>=0) and (Arow>=0) then
with Sender as TDrawGrid do
begin
If SgHorario.Cells[ACol,ARow]='X' then
Canvas.Brush.Color:=clBlue
else
If SgHorario.Cells[Acol,Arow]='*' then
Canvas.Brush.Color:=clRed
else
Canvas.Brush.Color:=clWhite;
Canvas.FillRect(Rect);
end;
end;

function TFrmPrincipal.EstaOcupada(Fecha, HoraFinal: Integer): Boolean;
Var I:Integer;
begin
Result:=False;
For I:=Low(Horario) to High(Horario) do
If (Horario[i].Fecha=date+Fecha) and (Horario[i].HInicio=StrtoInt(InttoStr(HoraFinal+7)+':00:00')) then
Result:=True;
end;

procedure TFrmPrincipal.GuardaCita(fecha, horaInicio: Integer);
begin
setlength(Horario,Length(Horario)+1);
Horario[High(Horario)].Cita:='Trabajar';
Horario[High(Horario)].HInicio:=StrtoTime(InttoStr(HoraInicio+7)+':00:00');
Horario[High(Horario)].HFinal:=StrtoTime(InttoStr(HoraInicio+8)+':00:00');
Horario[High(Horario)].Fecha:=date+Fecha;
Horario[High(Horario)].Prioridad:=True;
Horario[High(Horario)].Provisional:=True;
end;

procedure TFrmPrincipal.BorraUna(fecha, HoraInici: Integer);
var I, Nitems: integer;
begin
NItems:=0;
For I:=Low(Horario) to High(Horario) do
begin
if (Horario[i].Fecha<>Fecha) or (Horario[i].HInicio<>HoraInici) then
begin
Horario[NItems]:=Horario[i];
Inc(Nitems);
end;
end;
SetLength(Horario,NItems);
end;

procedure TFrmPrincipal.Borratodo;
var F,C: Integer;
begin
For F:=0 to SgHorario.RowCount-1 do
For C:=1 to SgHorario.ColCount-1 do
SgHorario.Cells[C,F]:=' ';
end;

procedure TFrmPrincipal.Busca(Dia: TDate; HoraInicio, Horafinal: TTime; Cita: String);
var I:Integer;
begin
//Borratodo;
For I:=0 to High(Horario) Do
Begin
Showmessage(TimetoStr(Horario[i].HInicio)+'hola'+DatetoStr(Horario[i].Fecha)+TimetoStr(Horario[i].HFinal)+Horario[i].Cita+#13+TimetoStr(HoraInicio)+DatetoStr(Dia)+TimetoStr(Horafinal)+Cita);
If (Horario[i].Fecha=Dia) and (Horario[i].HInicio=HoraInicio) and (Horario[i].HFinal=Horafinal) and (Horario[i].Cita=Cita) then
Begin
Showmessage(TimetoStr(Horario[i].HInicio)+'Ahora'+TimetoStr(Horario[i].Fecha));
SgHorario.Cells[Columna(Horario[i].HInicio),Fila(Horario[i].Fecha)]:='X';
End;
// If (Cinema[i].Seient<>0) and (Cinema[i].Sessio=cbsessio.ItemIndex) and (cinema[i].Dates=DtData.Date) and (cinema[i].Hora=StrtoTime(lbHorar.Caption)) and (cinema[i].Provisional=False) then
// SgSala.Cells[Cinema[i].Seient,Cinema[i].fila]:='X';
end;
end;

procedure TFrmPrincipal.NuevaCita(Dia, horas: Integer);
begin
Showmessage(FormatDateTime('dd"/"mm"/"yyyy',now+Horas)+InttoStr(Dia+7)+':00:00');
DsAgenda.DataSet.Append;
ADOTAgenda['Cita_T01']:='Trabajar';
ADOTAgenda['Fecha_T01']:=Date+Horas;
ADOTAgenda['Hora_T01']:=InttoStr(Dia+7)+':00:00';
ADOTAgenda['Fin_T01']:=InttoStr(Dia+8+(horasdia(Dia)))+':00:00';
ADOTAgenda['Prioridad_T01']:=True;
ADOTAgenda.Post;
end;

procedure TFrmPrincipal.EditaCita(Dia, horas: Integer);
begin
Showmessage(FormatDateTime('dd"/"mm"/"yyyy',now+Horas)+InttoStr(Dia+7)+':00:00');
ADOTAgenda.Edit;
ADOTAgenda['Fin_T01']:=InttoStr(Dia+8)+':00:00';
ADOTAgenda['Prioridad_T01']:=True;
ADOTAgenda.Post;
end;

function TFrmPrincipal.Columna(HIni: Ttime): Integer;
var par: String;
begin
Par:=TimetoStr(HIni);
If not (copy(Par,1,1)=':') or (copy(Par,2,1)=':') then
Begin
Showmessage(InttoStr(StrtoInt(copy(Par,1,2))-7));
Result:=StrtoInt(copy(Par,1,2))-7;
End
Else
Begin
Showmessage(InttoStr(StrtoInt(copy(Par,1,1))-7));
Result:=StrtoInt(copy(Par,1,1))-7;
End;
end;

function TFrmPrincipal.Fila(HFin: Ttime): Integer;
var par: String;
begin
Par:=TimetoStr(HFin);
If not (copy(Par,1,1)=':') or (copy(Par,2,1)=':') then
Result:=StrtoInt(copy(Par,1,2))
Else
Result:=StrtoInt(copy(Par,1,1));
end;


end.
Muchas gracias :D!!!!!!!!!!!

epuigdef 03-08-2005 10:00:35

Creo que tu problema principal es precisamente que tienes un DBGrid por encima de todo. Creo que te sería más fácil con un grid que no esté ligado a la base de datos, y lo controlaras manualmente. Sabiendo la fila y la columna en la que te clican ya puedes saber el día y la hora correspondiente, y grabarlo en la base de datos.

Un saludo

Edu

Lepe 03-08-2005 12:32:50

Hombre, ya puestos a cambiar de control, yo usaría un planning que trae la suit JVCL, es parecido al que usa el Outlook (por no decir el mismo ;))

Un saludo


La franja horaria es GMT +2. Ahora son las 17:32:59.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi