Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-08-2013
steelha steelha is offline
Miembro
 
Registrado: mar 2012
Posts: 158
Poder: 13
steelha Va por buen camino
Generar Numero Aleatorio

Buenas, he visto muchos ejemplos de como generar números aleatorios, pero tengo un pequeño problema que no se como solucionar a ver si pueden ayudarme. Tengo que generar un numero aleatorio el cual pertenece a una determinada estación de servicio (1-N), pero puede darse el caso de que M estacion(es) este(én) fuera de servicio por x razón (comiendo, vacaciones, permiso,etc) por lo cual no debe ser tomada en cuenta para la generación del numero. Para presentar las estaciones utilice un TDBCtrlGrid (con su estatus) pero no se como solucionar el problema de generar el numero. si me pueden en caminar a una posible solución se los agradeceré. Gracias de antemanos por cualquier ayuda.

Utilizo Delphi 7 con Mysql.

Última edición por steelha fecha: 20-08-2013 a las 19:23:08.
Responder Con Cita
  #2  
Antiguo 21-08-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola steelha.

Supongamos que tu tabla se llama ESTACIONES y tiene dos campos ID y ACTIVA, identificador y estado de la estación respectivamente, también que el estado:
  • ACTIVA = 0 si esta fuera de servicio.
  • ACTIVA = 1 si esta en servicio.

Código Delphi [-]
...
function TForm1.GetActiveServiceStation: Integer;
var
  MaxRegs : Integer;
begin
  with un_Query do
  begin
    // Obtener el número total de estaciones de servicio activas
    Close;
    SQL.Text := 'SELECT COUNT(*) AS MAX_REG FROM ESTACIONES WHERE ACTIVA = 1';
    Open;
    if isEmpty then
      raise Exception.Create('No hay estaciones de servicio activas');
    MaxRegs :=  FieldByName('MAX_REG').AsInteger;

    // Seleccionar una estación de servicio activa al azar
    Close;
    SQL.Text := 'SELECT ID FROM ESTACIONES WHERE ACTIVA = 1';
    Open;
    Randomize;
    Locate('ID', Random(MaxRegs), []);
    Result := FieldByName('ID').AsInteger;
    Close;
  end;
end;

Llamada ejemplo:
Código Delphi [-]
procedure TForm1.btnGenerarClick(Sender: TObject);
begin
  ListBox1.Items.Add(IntToStr(GetActiveServiceStation));
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 21-08-2013
steelha steelha is offline
Miembro
 
Registrado: mar 2012
Posts: 158
Poder: 13
steelha Va por buen camino
Muchas gracias ecfisa por responder, he copiado y modificado el código para adaptarlo pero aun así obtengo un error de :
Project GeneradorTicket.exe raised exception class EDatabaseError with message 'qryEstacioens:Field'ID' not found'. Process stopped. Use step or run to continue.

No entiendo el porque si el campo existe en la tabla :
ID
Descripcion
Activo
Online


Adaptacion del codigo
Código Delphi [-]
function TGenerador.GetActiveServiceStation: Integer;
var
  MaxRegs : Integer;
begin
  with dm.qryEstaciones do
  begin
    // Obtener el número total de estaciones de servicio activas
    Close;
    SQL.Text := 'SELECT COUNT(*) AS MAX_REG FROM tblRepresentante WHERE ACTIVO = ''S'' ';
    Open;
    if isEmpty then
      raise Exception.Create('No hay estaciones de servicio activas');
    MaxRegs :=  FieldByName('MAX_REG').AsInteger;

    // Seleccionar una estación de servicio activa al azar
    Close;
    SQL.Text := 'SELECT ID FROM tblRepresentante WHERE Activo = ''S'' ';
    Open;
    Randomize;
    Locate('ID', Random(MaxRegs), []);
    Result := FieldByName('ID').AsInteger;
    Close;
  end;
end;
Responder Con Cita
  #4  
Antiguo 21-08-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola steelha.

Mirando tu código, yo tampoco me explico ese error si el campo ID existe y con ese nombre... Por si estuvieras utilizando el mismo componente en otra parte del código, intenta salvando y restaurando la consulta original:
Código Delphi [-]
function TGenerador.GetActiveServiceStation: Integer;
var
  MaxRegs : Integer;
  OldSQL  : string;
begin
  with dm.qryEstaciones do
  begin
    OldSQL := SQL.Text;
    // Obtener el número total de estaciones de servicio activas
    Close;
    SQL.Text := 'SELECT COUNT(*) AS MAX_REG FROM tblRepresentante WHERE ACTIVO = ''S'' ';
    Open;
    if isEmpty then
      raise Exception.Create('No hay estaciones de servicio activas');
    MaxRegs :=  FieldByName('MAX_REG').AsInteger;

    // Seleccionar una estación de servicio activa al azar
    Close;
    SQL.Text := 'SELECT ID FROM tblRepresentante WHERE Activo = ''S'' ';
    Open;
    Randomize;
    Locate('ID', Random(MaxRegs), []);
    Result := FieldByName('ID').AsInteger;
    Close;
    SQL.Text := OldSQL;
  end;
end;

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 21-08-2013
steelha steelha is offline
Miembro
 
Registrado: mar 2012
Posts: 158
Poder: 13
steelha Va por buen camino
Verificando puse en comentario las lineas

Código Delphi [-]
  { // Obtener el número total de estaciones de servicio activas
    Close;
    SQL.Text := 'SELECT COUNT(*) AS MAX_REG FROM tblRepresentante WHERE ACTIVO = ''S'' ';
    Open;
    if isEmpty then
      raise Exception.Create('No hay estaciones de servicio activas');
    MaxRegs :=  FieldByName('MAX_REG').AsInteger;

    ShowMessage('TODO BIEN');     }

y me funciona no da ningún error
Responder Con Cita
  #6  
Antiguo 21-08-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola steelha.

Es extraño... Y mas aún cuando en el código que comentaste (desactivaste) no existe referencia alguna al campo ID. Para salir de toda duda acabo de hacer una pequeña prueba en Firebird.

Cree la tabla:
Código SQL [-]
CREATE TABLE TBLREPRESENTANTE (
  ID INTEGER,
  DESCRIPCION VARCHAR(50),
  ACTIVO CHAR(1) CHECK(ACTIVO IN ('S','N')),
  ONLINE CHAR(1) CHECK(ONLINE IN ('S','N'))
)
Le cargué 500 registros de prueba:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
const
  SINO : array[0..1] of string = ('N','S');
var
  i: Integer;
begin
  Randomize;
  if not IBTransaction1.Active then
    IBTransaction1.StartTransaction;
  with IBQuery1 do
  begin
    Open;
    SQL.Clear;
    SQL.Add('INSERT INTO TBLREPRESENTANTE (ID,DESCRIPCION,ACTIVO,ONLINE)');
    SQL.Add('VALUES(:ID,:DESCRIPCION,:ACTIVO,:ONLINE)');
    Prepare;
    for i:= 1 to 500 do
    begin
      ParamByname('ID').AsInteger := i;
      ParamByname('DESCRIPCION').AsString := 'DESCRIPCION '+IntToStr(i);
      ParamByname('ACTIVO').AsString := SINO[Random(2)];
      ParamByname('ONLINE').AsString := SINO[Random(2)];
      ExecSQL;
    end;
  end;
  try
    IBTransaction1.Commit;
  except
    on E: Exception do
    begin
      IBTransaction1.Rollback;
      raise Exception.Create(E.Message);
    end;
  end;
end;
Y usando la función del mensaje #2:
Código Delphi [-]
function TForm1.GetActiveServiceStation: Integer;
var
  MaxRegs : Integer;
begin
  with IBQuery1 do
  begin
    // Obtener el número total de estaciones de servicio activas
    Close;
    SQL.Text := 'SELECT COUNT(*) AS MAX_REG FROM TBLREPRESENTANTE WHERE ACTIVO = ''S''';
    Open;
    if isEmpty then
      raise Exception.Create('No hay estaciones de servicio activas');
    MaxRegs :=  FieldByName('MAX_REG').AsInteger;

    // Seleccionar una estación de servicio activa al azar
    Close;
    SQL.Text := 'SELECT ID FROM TBLREPRESENTANTE WHERE ACTIVO = ''S''';
    Open;
    //  Randomize;  // (innecesario por que ya fué llamado en FormCreate)
    Locate('ID', Random(MaxRegs), []);
    Result := FieldByName('ID').AsInteger;
    Close;
  end;
end;
No genera ningún tipo de error y funciona a la perfección.

¿ Segura que el error se produce en la función ?

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 21-08-2013
steelha steelha is offline
Miembro
 
Registrado: mar 2012
Posts: 158
Poder: 13
steelha Va por buen camino
Ok daré una revisada general al programa a ver que referencia puede estar haciendo al momento
Cualquier cosa borro y empiezo desde cero
gracias.
Responder Con Cita
  #8  
Antiguo 22-08-2013
steelha steelha is offline
Miembro
 
Registrado: mar 2012
Posts: 158
Poder: 13
steelha Va por buen camino
Muchas gracias por la ayuda ecfisa, no se porque no quería funcionar lo que hice fue crear otro query donde especifique el select count con la variable Max_reg y partir de hay funciono cosas extrañas, creo que el espiritu maligno de Bill Gate andaba por ahí...luego paso el código completo. Chanfle si me olvidaba nunca dije para que se utilizara. Es un sistema de llamada de cola (Atención al cliente), donde existen N representantes y X personas en cola las cuales se asignan al azar o manualmente dependiendo a cada representante. Este turno va a una cola de llamada la cual sera anunciada por altavoces y mostrada a su ves en una pantalla. En los momentos de ocio (Cuando no se esta llamando), se estará presentando una series de video definidas en una tabla. Bueno esa es la idea que presente espero me salga todo bien especialmente con la ultima parte. Gracias por la ayuda, la cual seguiré necesitando
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Numero aleatorio de productos principiante22 Impresión 6 04-03-2008 01:24:08
Generar Numero de CUIL LucasArgentino Varios 5 31-03-2007 17:44:32
generar numero de 9 cifras aleatorio que nunca se repita coletaun Varios 9 19-02-2007 10:34:29
Generar Numero de CUIL LucasArgentino Varios 2 24-09-2004 17:41:14
Generar Numero Automatico en Cotizacion jmedina Varios 9 30-06-2004 17:54:01


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


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
Copyright 1996-2007 Club Delphi