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)
-   -   Limitar cantidad e registros a crear en una base de datos (https://www.clubdelphi.com/foros/showthread.php?t=73166)

ecfisa 05-04-2011 23:55:01

Hola RedVenom.

Anoche falleció mi router :( por lo que no pude seguir con el tema. Recién ahora lo repuse.

Lo lamento por la urgencia que tenías. Pero veo que has estado en muy buenas manos... :)


Un saludo.

Casimiro Noteví 06-04-2011 00:11:53

Entonces, concretando, exactamente qué quieres controlar.

RedVenom 06-04-2011 01:08:08

Pues ya entregue la BETA diriamos de la aplicacion pero si necesito implementar lo que les plantie y la verdad con el poco conocimiento que tengo le he dado vueltas a lo que se y no se me ocurre bueno la solucion si pero el codigo no.
Espero que sigan apoyandome con su valiosa orientacion.
Gracias

ecfisa 06-04-2011 05:59:49

Hola de nuevo.

Agregué un campo a la tabla asociaciones que almacena el número de inscriptos en ese deporte de esa entidad.
Y a fin de simplificar, sólo voy a dejar los campos significativos. Quito por ejemplo nombre del participante, etc:
Cita:

ASOCIACIONES
ID
DEPORTE
INSCRIPTOS

DEPORTES
ID
DEPORTE
MAX_JUGADORES

PARTICIPANTES
ID
DEPORTE

INSCRIPCIONES
ID
ID_PARTICIPANTE
ID_ASOCIACION
ID_DEPORTE
Suponiendo que ya tenés asentados los datos de: ASOCIACIONES, DEPORTES y PARTICIPANTES. Y estas cargando las inscripciones, podrías aprovechar el evento BeforePost de la tabla INSCRIPCIONES:
Código Delphi [-]
procedure TForm1.tbInscBeforePost(DataSet: TDataSet);
var
  Cupo, Anotados: Integer;
begin
  with IBQuery1 do
  begin
    (* Obtener número máximo de jugadores permitidos en el deporte ingresado *)
    SQL.Clear;
    SQL.Add('SELECT MAX_JUGADORES FROM DEPORTES');
    SQL.Add('WHERE ID ='+tbInsc.FieldByName('ID_DEPORTE').AsString);
    Open;
    Cupo:= FieldByName('MAX_JUGADORES').AsInteger;
    Close;
    (* Obtener el número actual de inscriptos para ese deporte *)
    SQL.Clear;
    SQL.Add('SELECT INSCRIPTOS FROM ASOCIACIONES');
    SQL.Add('WHERE DEPORTE = '+tbInsc.FieldByName('ID_DEPORTE').AsString);
    Open;
    Anotados:= FieldByName('INSCRIPTOS').AsInteger;
  end;
  if Anotados >= Cupo then
  begin
   ShowMessage('Lo sentimos mucho, no hay mas cupo')
   Abort;
  end
end;

Es un ejemplo muy simplificado... pero espero que te acerque alguna idea.

Un saludo.

RedVenom 09-05-2011 20:04:00

Despues de un pequeño inconveniente que tuve con mi disco duro y casi pierdo todo mi codigo fuente, aqui estoy de regreso y pues no he resuelto el deta lle que les escribi aqui el ejemplo que me pone ECFISA es suponiendo que tengo un campo en el que llevo el control de los inscritos pero no es asi yo lo que deseo hacer es que de la tabla inscripciones yo cuente cuantos estan inscritos de cierta asociacion y comparando el limte maximo de jugadores con los que ya tengo inscritos me diga si puedo inscribir otro jugador o no.

RedVenom 09-05-2011 21:30:55

Creo que ya lo resolvi aqui les voy a poner el codigo que utilize, pero primero les explico que cree un campo mas en la tabla inscripciones al que llame CONTROL y que lo lleno haciendo una concatenacion de esta forma el "ID" de la Asociacion luego pongo un "-" y lo completo con el "ID" del deporte y por supuesto lo guardo en una variable llamada "Bandera" que lo que contenga el texto de la variable lo guardo en el campo CONTROL, y pues despues de dar esta explicacion ahoara si va el codigo.

Código Delphi [-]
procedure ControlDB(Depor,Bandera: String);
var
CUPO,REGISTRADOS: integer;
Begin
(*Obtengo el numero maximo de jugadores segun el deporte*)
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Select * From DEPORTES Where ID=' + '''' + Depor + '''');
CUPO:= ADOQuery1. FieldByName('MAX_JUGADORES').AsInteger;
(*Cuento los inscritos que ya hay de la asociación en el deporte a través de la variable “bandera”*)
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Select * From INSCRIPCIONES Where CONTROL=' + '''' + Bandera + '''');
REGISTRADOS:=ADOQuery1.RecordCount;
(*Comparo los registrados contra el cupo y ejecuto la accion segun el resultado de la comparacion*)
if REGISTRADOS>=CUPO then
  begin
   ShowMessage('Ya no se puede');
   ADOQuery1.Active:=False;
   INSCRIPCIONES.Cancel;
  end
else
  begin
   INSCRIPCIONES.Post;
   ADOQuery1.Active:=False;
  end;
end;

En caso de que haya alguna observacion sera muy bien recibida.
Gracias por toda su ayuda y orientacion si no hubiera sido por ustedes no hubiera logrado llegar a este pedazo de codigo, y pues como me dijeron la respuesta me la dieron desde el primer dia solo que en ese momento erea unos codigos mas ignorante.


La franja horaria es GMT +2. Ahora son las 06:51:10.

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