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 Temas de Hoy

Conexión con bases de datos

 
 
Herramientas Buscar en Tema Desplegado
  #4  
Antiguo 26-06-2014
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Yo utilizo IDs para cada registro de la tabla y luego otros campos para los números de orden, pedido, factura, etc.
El ID es un campo obtenido de un generador y el número del documento se calcula en los triggers.
Todo lo hecho en un trigger está dentro de una misma transacción, por lo que si no hay errores al insertar/modificar, la base de datos se ha encargado de que no haya duplicados.

Yo trabajo con Firebird. Esta base tiene generadores que devuelven el número siguiente del actual.
En los eventos BeforePost es donde obtengo un número para mi ID y se lo asigno al parámetro del dataset. Este ID es imposible que se duplique, por lo solo queda esperar a que el SQL se complete y refrescar los datos que sean necesarios (NRO_DOCUMENTO, TOTALES, etc.)

Código Delphi [-]
function TDMMain.DameGenerador(NomGen: string): integer;
var
  Q : THYFIBQuery;
begin
  Result := 0;
  if (Trim(NomGen) > '') then
  begin
     Q := THYFIBQuery.Create(nil);
     try
        with Q do
        begin
           Close;
           DataBase := Self.DataBase;
           SQL.Text := 'SELECT GEN_ID(' + NomGen + ',1) FROM RDB$DATABASE';
           ExecQuery;
           Result := Fields[0].AsInteger;
           Close;
           FreeHandle;
        end;
     finally
        FreeAndNil(Q);
     end;
  end;
end;

procedure TDMFacturas.QMCabeceraBeforePost(DataSet: TDataSet);
var
  existe : smallint;
begin
  // Solo asigno ID si estoy insertando
  if (DataSet.State = dsInsert) then
     DataSet.FieldByName('ID_CAB_FACTURA_CLI').AsInteger := DMMain.DameGenerador('GEN_CAB_FACTURA_CLI');
  [...]
end;

El trigger sería algo así:
Código SQL [-]
créate trigger CAB_FACTURA_CLI_BI0 for FACTURA before insert 0
as
begin
    /* Calculo el ID si vino vacio */
    if ((new.ID_CAB_FACTURA_CLI = 0) or (new.ID_CAB_FACTURA_CLI is null)) then
        newID_CAB_FACTURA_CLI := GEN_ID(GEN_CAB_FACTURA_CLI, 1);

    /* Calculo el siguiente numero de factura */
    select max(numero) from CAB_FACTURA_CLI
    where
    empresa = new.empresa and
    ejercicio = new.ejercicio and
    serie = new.serie
    into new.numero;
  
    /* Si es la primera factura no me habrá devuelto nada util */
    if ((numero =0) or (new.numero is null)) then
        new.numero = 1;

    [...]
end

Última edición por duilioisola fecha: 26-06-2014 a las 21:55:17.
Responder Con Cita
 



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
mostrar campo con clave foranea georgeliners Conexión con bases de datos 3 11-06-2014 22:57:43
identificar un error de clave foranea... pnsd_89 SQL 5 25-03-2011 13:01:03
Campo puede ser clave foranea de dos tabla richy08 Conexión con bases de datos 4 26-01-2010 18:38:54
problema al crear clave foranea anubis Firebird e Interbase 4 28-06-2008 16:24:49
Saber a quien se refiere una clave foránea Cecil Conexión con bases de datos 2 27-09-2007 19:17:50


La franja horaria es GMT +2. Ahora son las 16:24:53.


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