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 25-02-2011
webmasterplc webmasterplc is offline
Miembro
 
Registrado: mar 2008
Posts: 275
Poder: 17
webmasterplc Va por buen camino
Numeracion de factura repetido

Buenas estoy generando un numero de orden lo hago consultando el ultimo registro de una tabla y le sumo uno, pero el problema es que a veces me repite el numero mas que todo cuando se hace una orden desde otra estación el sistema funciona en 10 maquinas. aca el codigo que uso para calcular el numero.
Código Delphi [-]
procedure Todespacho.BitBtn1Click(Sender: TObject);
        var
        AccExclusivo:Boolean;
        proximonumero:Integer;
        numero:Integer;
        tord:Real;
        tpart:Real;
   begin

    Data.sqcaval.Close;
         Data.sqcaval.SQL.Clear;
         Data.sqcaval.SQL.Add('SELECT idorden ');
     Data.sqcaval.SQL.Add('from cartaavaleulalia');
     Data.sqcaval.SQL.Add('ORDER BY idorden ASC');
     Data.sqcaval.Open;
         Data.sqcaval.Last;
         proximonumero:= Data.sqcaval.FieldByname('idorden').Value + 1;
         numero:=0;
Responder Con Cita
  #2  
Antiguo 25-02-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Tienes varias alternativas, por ejemplo, cuando vayas a grabar y ya exista el número entonces le asignas uno más. Si existe, le asignas uno más... y así hasta que por fin ya no exista. O sea, sería un simple bucle.
La otra alternativa es usar un generador, el inconveniente es que puedes tener "saltos" entre los números si, por ejemplo, alguien cancela el alta de un registro y ya se le había asignado el número que tocaba.
Responder Con Cita
  #3  
Antiguo 25-02-2011
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
Cita:
procedure Todespacho.BitBtn1Click(Sender: TObject);
var
AccExclusivo:Boolean;
proximonumero:Integer;
numero:Integer;
tord:Real;
tpart:Real;
begin

Data.sqcaval.Close;
Data.sqcaval.SQL.Clear;
Data.sqcaval.SQL.Add('SELECT idorden ');
Data.sqcaval.SQL.Add('from cartaavaleulalia');
Data.sqcaval.SQL.Add('ORDER BY idorden ASC');
Data.sqcaval.Open;
Data.sqcaval.Last;
proximonumero:= Data.sqcaval.FieldByname('idorden').Value + 1;
numero:=0;
Que tal éste,
Código Delphi [-]
procedure Todespacho.BitBtn1Click(Sender: TObject);
var
  AccExclusivo: Boolean;
  proximonumero: Integer;
  numero: Integer;
  tord: Real;
  tpart: Real;
begin
  with Data.sqcaval do
  begin
    Close;
    SQL.Clear;
      SQL.Add('SELECT');
      SQL.Add('   MAX(IDORDEN)');
      SQL.Add(' FROM cartaavaleulalia');
    Open;
    proximonumero := FieldByName('IDORDEN').AsInteger +1;
    numero := 0;
  end;
end;
Espero que te sirva.

Un saludo.
Responder Con Cita
  #4  
Antiguo 25-02-2011
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.474
Poder: 21
newtron Va camino a la fama
Yo no soy partidario de hacerlo de forma automática en función de los registros de la tabla. Lo que hago es manejar un registro de contadores y cuando se va a asignar el número bloquea ese registro, toma el número, le asigna uno más y lo desbloquea. Así nos aseguramos que los números no se repiten y tienes la posibilidad de poner el contador en el número que quieras en un momento determinado, bien para recuperar un número de factura perdido o para empezar en una numeración determinada porque al cliente le interese. Si es cierto que de esta forma tendrías que controlar que cuando intentas asignar el número no haya un registro con el mismo porque si se ha puesto manualmente en el contador un número que ya exista puede pasar.

Saludos
Responder Con Cita
  #5  
Antiguo 25-02-2011
mcs mcs is offline
Miembro
 
Registrado: may 2007
Ubicación: Girona
Posts: 229
Poder: 18
mcs Va por buen camino
Y porqué simplemente no asignas el número de factura cuando vas a grabar? La operación de grabar debe ser algo rápido, y por lo tanto el número no va a estar bloqueado mucho tiempo...
Responder Con Cita
  #6  
Antiguo 25-02-2011
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Personalmente creo que la solución más segura es utilizar transacciones para conseguir que la operación sea "unitaria"; No comentas qué SGBD estás utilizando, pero si además esa operación puedes hacerla en el servidor, mejor aun.

Cita:
Empezado por webmasterplc Ver Mensaje
...lo hago consultando el ultimo registro de una tabla y le sumo uno...
De todas formas, el código que estás utilizando para esa operación no es el óptimo.
(1º) Supongo que debes tener índice definido por el campo IDOrden; Si no es así defínelo.
(2º) No hace falta hacer el SELECT de toda la tabla, cuando en realidad sólo necesitas un registro. Porque luego debes hacer el recorrido hasta el final (Last) cosa que es muy costosa. Puedes utilizar alguna de estas variantes para obtener un único registro.

SELECT Max(IDOrden)....

SELECT TOP(1) .... ORDER BY DESC



Cita:
Empezado por Casimiro Notevi Ver Mensaje
Tienes varias alternativas, por ejemplo, cuando vayas a grabar y ya exista el número entonces le asignas uno más. Si existe, le asignas uno más... y así hasta que por fin ya no exista. O sea, sería un simple bucle.
El problema es que tal y como tiene la tabla ahora, podría leer (y le daría que no existe) y al escribir podría ser que alguien ya hubiera escrito (en ese espacio de tiempo). Creo que Casimiro asume que no se permiten duplicados (y saltaría un error); Cosa que por el problema que tienes no debe ser así.
Deberías definir un índice único (en la Base de Datos) por el campo IDOrden, cosa que no debes tener ahora si estás obteniendo duplicados.


Cita:
Empezado por mcs Ver Mensaje
Y porqué simplemente no asignas el número de factura cuando vas a grabar? La operación de grabar debe ser algo rápido, y por lo tanto el número no va a estar bloqueado mucho tiempo...
Creo que eso es lo que está haciendo ahora, pero para grabar el número debe consultar primero cual es el último; Y entre la consulta y la grabación es cuando se le cuela otra máquina y se producen los repetidos.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #7  
Antiguo 25-02-2011
webmasterplc webmasterplc is offline
Miembro
 
Registrado: mar 2008
Posts: 275
Poder: 17
webmasterplc Va por buen camino
Uso mysql y el procedimiento lo uso justo cuando voy a grabar
Responder Con Cita
  #8  
Antiguo 25-02-2011
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Revisa los ISOLATIONLEVEL de las transacciones definidos en MySQL.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #9  
Antiguo 25-02-2011
webmasterplc webmasterplc is offline
Miembro
 
Registrado: mar 2008
Posts: 275
Poder: 17
webmasterplc Va por buen camino
donde se revisa eso
Responder Con Cita
  #10  
Antiguo 25-02-2011
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
En la docuentación/ayuda de MySQL; Si es que deseas utilizar transacciones.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #11  
Antiguo 25-02-2011
webmasterplc webmasterplc is offline
Miembro
 
Registrado: mar 2008
Posts: 275
Poder: 17
webmasterplc Va por buen camino
La pregunta es hay alguna manera de bloquear la tabla para que nadie escriba si no que espere y si la encuentra bloqueada que vuelva a ejecutar la consulta para incrementar el numer
Responder Con Cita
  #12  
Antiguo 25-02-2011
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
La tabla no, el registro. Y eso es lo que intento decir que se suele hacer utilizando transacciones.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #13  
Antiguo 25-02-2011
webmasterplc webmasterplc is offline
Miembro
 
Registrado: mar 2008
Posts: 275
Poder: 17
webmasterplc Va por buen camino
Estoy viendo que aunque le coloque el campo como clave principal permite repetir ragistros por ejemplo el 135 dos veces y deberia darme un error
Responder Con Cita
  #14  
Antiguo 25-02-2011
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Pues no debes estar haciendolo bien.
Si has puesto el campo como clave principal única y tiene un índice único (cosa automática si es Clave Primaria) no te dejará introducir repetidos.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #15  
Antiguo 25-02-2011
webmasterplc webmasterplc is offline
Miembro
 
Registrado: mar 2008
Posts: 275
Poder: 17
webmasterplc Va por buen camino
Estoy usando la conculta de olbeub solo le agregue algo a lado de los parentesis (max (idorden) as idorden)
Código Delphi [-]
 SQL.Add('MAX(IDORDEN) as idorden');
y ademas ya logue que no me repita registros desde la bases de datos pero cuando lo consigue repetido me da un error y listo me gustaria es que si consigue ese registro repetido linpie la consulta y velva a ejecutarla y luego que no este repetido continue el procedimiento aca coloco un trozo de codigo

Código Delphi [-]
procedure Todespacho.BitBtn1Click(Sender: TObject);
        var
        AccExclusivo:Boolean;
        proximonumero:Integer;
        numero:Integer;
        tord:Real;
        tpart:Real;
        begin
  with Data.sqcaval do
  begin
    Close;
    SQL.Clear;
      SQL.Add('SELECT');
      SQL.Add('MAX(IDORDEN) as idorden');
      SQL.Add(' FROM cartaavaleulalia');
    Open;
    proximonumero := FieldByName('IDORDEN').AsInteger +1;
    numero := 0;
  end;

   begin

       Data.orden.Append;
       Data.mtiva.Append;
       Data.ttrans.Append;
       Data.orden.FieldByname('programa').AsString := programa.LookupValue;
       Data.ejecucion.FieldByname('programa').AsString := programa.LookupValue;
       Data.orden.FieldByname('presupuesto').AsString := presupuesto.LookupValue;
       Data.ejecucion.FieldByname('presupuesto').AsString := presupuesto.LookupValue;
Responder Con Cita
  #16  
Antiguo 26-02-2011
webmasterplc webmasterplc is offline
Miembro
 
Registrado: mar 2008
Posts: 275
Poder: 17
webmasterplc Va por buen camino
Hacer un Bucle en Delphi

Buenas como hago para que mi aplicación ejecute un procedimiento siempre y cuadno se cumpal una condicion y si no se cuemple vuelva a verificar hasta que esta se cumpla.

Por ejemplo que consulte si un numero existe un una tabla, si existe vuelva a hacer una consulta y le incrmente un numero (numero+1) hasta que la consicion se cumpla y guarde los datos
Responder Con Cita
  #17  
Antiguo 26-02-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por webmasterplc;392006[..
me da un error y listo[..]
¿Y el error es... ?

Amigo, no olvides nuestra guía de estilo, gracias.
Responder Con Cita
  #18  
Antiguo 26-02-2011
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Puedes hacerlo dentro de un ciclo While o Repeat o mucho mejor usar un Hilo(Thread)
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #19  
Antiguo 26-02-2011
webmasterplc webmasterplc is offline
Miembro
 
Registrado: mar 2008
Posts: 275
Poder: 17
webmasterplc Va por buen camino
Hacer un Bucle en Delphi

Como hago para hacer un bucle donde asignas un número, intentas grabarlo y si da error (porque ya existe) entonces le sumas 1, hasta que no dé error.
el numero lo asigno consultando una base de datos y le sumo uno pero si por error esta repetido que haga el bucle aca coloco un poco del codigo.
Código Delphi [-]
procedure Todespacho.BitBtn1Click(Sender: TObject);
        var
        AccExclusivo:Boolean;
        proximonumero:Integer;
        numero:Integer;
        tord:Real;
        tpart:Real;
        begin
  with Data.sqcaval do
  begin
    Close;
    SQL.Clear;
      SQL.Add('SELECT');
      SQL.Add('MAX(IDORDEN) as idorden');
      SQL.Add(' FROM cartaavaleulalia');
    Open;
    proximonumero := FieldByName('IDORDEN').AsInteger +1;
    numero := 0;
  end;

   begin

       Data.orden.Append;
       Data.mtiva.Append;
       Data.ttrans.Append;
       Data.orden.FieldByname('programa').AsString := programa.LookupValue;
       Data.ejecucion.FieldByname('programa').AsString := programa.LookupValue;
Responder Con Cita
  #20  
Antiguo 26-02-2011
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Me parece que éstas creando muchos hilos para tu misma pregunta...
lee por favor nuestra Guía de estilo...para conocer ciertas reglas del foro.
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
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
No consigo hacer funcionar este bucle. radge Varios 14 27-01-2009 18:54:35
hacer un bucle esimon OOP 4 25-01-2009 21:27:37
Bucle for de 2 en 2 douglas OOP 9 17-10-2007 15:55:53
Se puede hacer un bucle a un TTimer gontxalo OOP 2 18-07-2005 21:37:53
bucle dentro de un bucle Cosgaya Varios 2 06-06-2005 07:05:16


La franja horaria es GMT +2. Ahora son las 03:58:56.


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