Club Delphi  
    Paypal   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 Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-05-2015
giulichajari giulichajari is offline
Miembro
 
Registrado: nov 2012
Posts: 306
Poder: 14
giulichajari Va por buen camino
Es que de hecho hice una funcion que obtiene el ultimo id y le suma 1 antes de insertar en la tabla maestro...
Tambien estuve leyendo que FireBird no utiliza campos autoincrementales justamente por este motivo.. en vez de esto es un campo integer pero el valor lo genera el servidor de aplicaciones o el programa, no el motor de base de datos.

Que te parece tener una tabla con un solo campo:

ULTIMO(ultimoidticket)

entonces cada transaccion suma 1 y se queda con el valor.. de esta forma no se pisan los valores, y no hay que esperar a que una transaccion finalize para empezar la otra.
Responder Con Cita
  #2  
Antiguo 14-05-2015
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.702
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
No entiendo, ¿quiéres un incremental, aunque se salten números? ¿o quieres un número consecutivo y que no se salte ninguno?

Última edición por Casimiro Noteví fecha: 15-05-2015 a las 11:08:20.
Responder Con Cita
  #3  
Antiguo 14-05-2015
giulichajari giulichajari is offline
Miembro
 
Registrado: nov 2012
Posts: 306
Poder: 14
giulichajari Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
No entiendo, ¿quiéres un incremental, aunque se salten números? ¿o quieres uno número consecutivo y que no se salte ninguno?
No entiendo porque la pregunta..
Es que si es un entero de 32 bits tiene millones de posiciones... osea con lo anterior se soluciona el problema de conecurrencia, si hay 2 o mas pc s haciendo ticket.. la verdad no interesa si se saltea un numero..
De hecho si una transaccion falla sobre un autoincremental y el ultimo idticket era 17, el 18 no se ocupa nunca mas.. si la proxima transaccion tiene exito sera el 19...
La funcion last_insert_id() retornara 18 para referenciar el ticket en la tabla detalleticket por lo tanto no sirve...
Y la funcion max(idticket) si falla el 18 la proxima vez sera 18, pero no sirve porque si 2 pc generan esa consulta.. ambos detalles de ticket corresponderan al mismo ticket.. porque devolvera 18 en ambos casos...
Responder Con Cita
  #4  
Antiguo 14-05-2015
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.702
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Cita:
Empezado por giulichajari Ver Mensaje
No entiendo porque la pregunta...
Porque no se entiende qué quieres exactamente.
Por lo que dices, lo que buscas en un id "normal y corriente", para eso están los generadores autoincrementales, nunca jamás se repiten. Lo que comentas de bloqueos y repetirse, etc. no ocurre con ellos.
Responder Con Cita
  #5  
Antiguo 14-05-2015
giulichajari giulichajari is offline
Miembro
 
Registrado: nov 2012
Posts: 306
Poder: 14
giulichajari Va por buen camino
Bueno es que a mi la funcion last_insert_id() me retorna 1.. no se porque.. y la vez pasada insertaba mal el idticket luego de que una transaccion hizo rollback..
Responder Con Cita
  #6  
Antiguo 14-05-2015
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.702
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Si no pones código o explicas en detalle cómo lo haces, solo podemos adivinar
Responder Con Cita
  #7  
Antiguo 14-05-2015
giulichajari giulichajari is offline
Miembro
 
Registrado: nov 2012
Posts: 306
Poder: 14
giulichajari Va por buen camino
Código Delphi [-]
procedure TServerMethods1.nuevoticket(numero,ids,idcliente:integer;importe,efectivo,vueltoouble;fechae,horae  ,tipo:string);
var
tr:TDBXTransaction;
begin
       if (SUCURSAL.InTransaction) then
     raise Exception.Create('Hay una transacción pendiente');
     SUCURSAL.Open;
       try
          try
            tr:=SUCURSAL.BeginTransaction();

               begin
                with qticket do
                  begin
                    Close;


                    ParamByName('numero').AsInteger:=numero;
                    ParamByName('importe').AsFloat:=importe;
                    ParamByName('fechae').AsString:=fechae;
                    ParamByName('horae').AsString:=horae;
                    ParamByName('idsucursal').AsInteger:=ids;

                    ParamByName('idcliente').AsInteger:=idcliente;
                    ParamByName('tipo').AsString:=tipo;
                    ParamByName('efectivo').AsFloat:=efectivo;
                    ParamByName('vuelto').AsFloat:=vuelto;
                    ExecSQL();
                  end;

         SUCURSAL.CommitFreeAndNil(tr);
               end;

      except
        SUCURSAL.RollbackFreeAndNil(tr);
        end;
      finally
      SUCURSAL.Close;
       end;
end;

procedure TServerMethods1.nuevodetalleticket(idp:integer;cantidad,preciououble);
  var
  tr:TDBXTransaction;
  begin
      if (SUCURSAL.InTransaction) then
     raise Exception.Create('Hay una transacción pendiente');
     SUCURSAL.Open;
       try
          try
            tr:=SUCURSAL.BeginTransaction();
               quticket.Close;
               begin
                with qventa do
                  begin
                    Close;


                 //    ShowMessage(IntToStr(quticket.ExecSQL()));
                    ParamByName('idt').AsInteger:=quticket.ExecSQL();
                    ParamByName('idp').AsInteger:=idp;
                    ParamByName('cantidad').AsFloat:=cantidad;
                    ParamByName('preciou').AsFloat:=preciou;
                    ExecSQL();
                  end;

         SUCURSAL.CommitFreeAndNil(tr);
               end;

      except
        SUCURSAL.RollbackFreeAndNil(tr);
        end;
      finally
      SUCURSAL.Close;
       end;
end;

eso es en DataSnap

y dentro de quticket tengo last_insert_id(), como veras hice un showmessage... y veo un 1..
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 04:24:14.


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