Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-05-2015
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
Se supone que está correcto, ¿no?

http://mysql.conclase.net/curso/?sqlfun=LAST_INSERT_ID

Cita:
El último ID que fue generado se mantiene en el servidor en una base por conexión. Esto significa que el valor que devuelve la función para un cliente dado es valor AUTO_INCREMENT más reciente generado por ese cliente. El valor no puede verse afectado por otros clientes, aunque generen valores AUTO_INCREMENT por si mismos. Este comportamiento asegura que se puede recuperar un ID sin preocuparse por la actividad de otros clientes, y sin necesidad de bloqueos o transacciones. El valor de LAST_INSERT_ID() no cambia si se actualiza una columna AUTO_INCREMENT de una fila con un valor no mágico (es decir, un valor que no es NULL ni 0). Si se insertan muchas filas al mismo tiempo con una sentencia , LAST_INSERT_ID() devuelve el valor para la primera fila insertada. El motivo para esto es hacer posible reproducir más fácilmente la misma sentencia de nuevo en algún otro servidor. Si se da un argumento expr a LAST_INSERT_ID(), el valor del argumento será devuelto por la función, y se asigna como siguiente valor a retornar por LAST_INSERT_ID(). Esto se puede usar para simular secuencias:
Primero crear la tabla:
mysql> CREATE TABLE sequence (id INT NOT NULL); mysql> INSERT INTO sequence VALUES (0); Después la tabla se puede usar para generar secuencias de números como esta:
mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1); Se pueden generar secuencias sin llamar a LAST_INSERT_ID(), pero al utilidad de usar la función de este modo es que el valor ID se mantiene en el servidor como el último valor generado automáticamente (seguro en multiusuario). Se puede recuperar el nuevo ID como si se recuperase cualquier valor AUTO_INCREMENT normal en MySQL. Por ejemplo, LAST_INSERT_ID() (sin argumentos) devolverá el nuevo ID. La función del API C mysql_insert_id también se puede usar para obtener el valor. mysql_insert_id sólo se actualiza después de sentencias y , de modo que no se puede usar la función del API C para recuperar el valor para LAST_INSERT_ID(expr) después de ejecutar otra sentencia SQL como o .


Última edición por Casimiro Notevi fecha: 15-05-2015 a las 11:09:04.
Responder Con Cita
  #2  
Antiguo 14-05-2015
giulichajari giulichajari is offline
Miembro
 
Registrado: nov 2012
Posts: 306
Poder: 12
giulichajari Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Se supone que está correcto, ¿no?
Claro me queda descubrir porque me da 1 el server, probe hacer 2 ticketts y devuelve 1.

Se pueden generar secuencias sin llamar a LAST_INSERT_ID(), pero al utilidad de usar la función de este modo es que el valor ID se mantiene en el servidor como el último valor generado automáticamente (seguro en multiusuario) aparte si tengo 2 sucursales son 2 conexiones distintas entonces no va a tomar el id insertado por otro: hay 17 y una conexion inserta 1 sera 18 pero la otra conexion no lo ve.

Pero yendo al grano: ¿cual seria la solucion correcta entonces(a ver si entiendo)? en lo que negrie arriba dice seguro en multiusuario: osea que es correcta la solucion que te plantie de tener los ids en una tabla aparte.

Perdona mi ignorancia..

Última edición por Casimiro Notevi fecha: 15-05-2015 a las 11:09:17.
Responder Con Cita
  #3  
Antiguo 14-05-2015
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Las ventajas de las secuencias (llamadas generadores en Firebird) es que no son transaccionales y es imposible que dos peticiones "Next Value" obtengan el mismo valor. Te recomiendo que tu aplicación cliente, justo al comenzar la captura de un registro, pida a una secuencia/generador de la base de datos su siguiente valor y lo asignes en ese momento desde la propia aplicación al nuevo registro en memoria. Eso te permitirá un mejor control de relaciones entre registros.

Incluso si el registro no termina siendo guardado, no hay problema, las llaves primarias (campos ID) no tienen por qué ser números consecutivos; para eso son otros campos: NUMERO/CLAVE/CODIGO, para los cuales sí puedes hacer Select Max y tener un índice con restricción unique para impedir que se asigne el mismo valor a una lista de datos que deben ir numerados de forma consecutiva.

Saludos.
Responder Con Cita
  #4  
Antiguo 15-05-2015
giulichajari giulichajari is offline
Miembro
 
Registrado: nov 2012
Posts: 306
Poder: 12
giulichajari Va por buen camino
Cita:
Empezado por Al González Ver Mensaje
Las ventajas de las secuencias (llamadas generadores en Firebird) es que no son transaccionales y es imposible que dos peticiones "Next Value" obtengan el mismo valor. Te recomiendo que tu aplicación cliente, justo al comenzar la captura de un registro, pida a una secuencia/generador de la base de datos su siguiente valor y lo asignes en ese momento desde la propia aplicación al nuevo registro en memoria. Eso te permitirá un mejor control de relaciones entre registros.

Incluso si el registro no termina siendo guardado, no hay problema, las llaves primarias (campos ID) no tienen por qué ser números consecutivos; para eso son otros campos: NUMERO/CLAVE/CODIGO, para los cuales sí puedes hacer Select Max y tener un índice con restricción unique para impedir que se asigne el mismo valor a una lista de datos que deben ir numerados de forma consecutiva.

Saludos.
Muchas gracias Al, la verdad uno aprende mucho en la practica.. queriendo hacer algo a lo grande como es el sistema de cliente servidor..jeje en mi ciudad todavia usan disco compartido..
Responder Con Cita
  #5  
Antiguo 15-05-2015
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
¿Lo has solucionado?
Responder Con Cita
  #6  
Antiguo 15-05-2015
giulichajari giulichajari is offline
Miembro
 
Registrado: nov 2012
Posts: 306
Poder: 12
giulichajari Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿Lo has solucionado?
Estoy en eso... voy a implementar un id no consecutivo osea no autoincremental... de seguro funcionara.. Gracias
Responder Con Cita
  #7  
Antiguo 16-05-2015
giulichajari giulichajari is offline
Miembro
 
Registrado: nov 2012
Posts: 306
Poder: 12
giulichajari Va por buen camino
hice lo siguiente y funciono:
Código Delphi [-]
function TServerMethods1.nuevoid:integer;
begin

  with quticket do
    begin
      SQL.Clear;
      SQL.Add('update identificadores set ticket=ticket+1');
      ExecSQL();
      SQL.Clear;
      SQL.Add('select ticket from identificadores');
      Open;
      result:=FieldByName('ticket').AsInteger;
    end;

end;

nunca falla..
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
Como obtener un ultimo registro de una tabla!! Caray Varios 4 09-07-2008 03:55:35
Extraer ultimo campo de tabla Petolansa Varios 4 26-10-2007 02:39:53
Consulta que obtiene campos de una tabla u otra según condición Gabo SQL 10 20-08-2007 08:53:02
como conocer el ultimo valor autonumerico creado de una tabla Tama MS SQL Server 8 16-06-2004 19:14:30
Ir al último registro de una tabla fortran Tablas planas 6 05-09-2003 16:36:02


La franja horaria es GMT +2. Ahora son las 19:35:43.


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