Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-06-2006
cvinas cvinas is offline
Registrado
 
Registrado: jun 2006
Posts: 2
Poder: 0
cvinas Va por buen camino
Question dbexpress

Amigos: estoy trabajando con dbexpress. Como puedo hacer para generar un valor único para la tabla maestra CABECERAREMITOS, siendo que estoy utilizando ClientDataSet anidados (Master/Details).
Uno de los ClientDataSet para CABECERAREMITOS y otro para el DETALLEREMITO. también utilizo una tabla PROXREMITO que me guarda el último valor de las CABECERASREMITOS, pero tengo problemas al actulizar esta tabla dentro del DataSet Anidado. Agraderería mucho alguna ayuda.. Gracias....

Última edición por cvinas fecha: 12-06-2006 a las 21:46:42. Razón: Consulta
Responder Con Cita
  #2  
Antiguo 14-06-2006
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
Smile Diferencia entre campos "ID" y "NUMERO"

¡Hola a todos!

En uno de los proyectos que me ocupan actualmente (Delphi 7 + Firebird 1.5), tengo un procedimiento almacenado llamado SPIDGeneral, el cual utilizo para obtener la llave ID que le doy a cada registro nuevo (el valor se obtiene de un generador):
Código SQL [-]
CREATE PROCEDURE SPIDGENERAL 
RETURNS (
    ID INTEGER)
AS
BEGIN
  ID = Gen_ID (GNGENERAL, 1);
END

En la aplicación, en uno de los módulos de datos, tengo un método función llamado NuevoID, que se encarga de ejecutar ese procedimiento almacenado:
Código Delphi [-]
Function TdmGeneral.NuevoID :Integer;
Begin
  spIDGeneral.ExecProc;
  Result := spIDGeneral.Params [0].AsInteger;
End;

Finalmente, me aseguro de llamar al método NuevoID en el evento AfterInsert de cada conjunto de datos cliente de captura, para asignar un valor al campo ID de cada nuevo registro:
Código Delphi [-]
procedure TfmPlantillaCapturaCodigo.dtCapturaAfterInsert(
  DataSet: TDataSet);
begin
  inherited;
  dtCapturaID.Value := dmGeneral.NuevoID ();
end;

Esto considerando que el campo llave ID de todas las tablas se utiliza solamente para identificar de manera única cada registro y no tiene un valor semántico para el usuario (el campo ID no es mostrado ni impreso, el número que almacena no representa nada para el usuario). Por lo tanto utilizo un generador común (gnGeneral) para el campo ID de todas las tablas.

En casos donde requiero un campo estrictamente consecutivo y representativo para el usuario (como los números de facturas, por ejemplo), lo agrego a la tabla a la cual corresponda y lo alimento en un disparador Before Insert con el número máximo almacenado actualmente más uno («Select Max (Numero) From...» + 1). Como es de esperarse, el número consecutivo aparece en pantalla hasta que el usuario guarda el registro.

De esa manera, cada tabla tiene un campo ID cuyo valor es obtenido desde un generador común, y asignado desde el evento AfterInsert de un conjunto de datos, o en su defecto, desde el disparador Before Insert que, para este propósito, toda tabla puede tener. Y algunas de esas tablas cuentan además con un campo Numero, para guardar el número consecutivo que el usuario verá en pantalla o impreso. Es decir, no mezclo los identificadores de registro que son para el servidor (campos ID), con los identificadores de entidad de datos que son para el usuario (campos Numero). Establezco una independencia muy sana entre ambos.

Espero esta experiencia sea de utilidad a muchos otros desarrolladores.

Un abrazo clave.

Al González.
Responder Con Cita
  #3  
Antiguo 16-06-2006
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.420
Poder: 21
AGAG4 Va por buen camino
Ok

Muy Buena Explicación Alberto....

Te mando un Saludo Maestro.

Aunque no me queden igual las despedidas
Responder Con Cita
  #4  
Antiguo 16-06-2006
cvinas cvinas is offline
Registrado
 
Registrado: jun 2006
Posts: 2
Poder: 0
cvinas Va por buen camino
dbexpress

Problema:

Siguiendo con el tema, planteo el siguiente problema.

Existen 2 puestos que están facturando, el en momento t1 el puesto PC1 lee en una tabla PROXNUMEROFACTURA el próximo numero a facturar en este caso “1000”. Un rato después (t1 + 30 segundos) el usuario Pc2 lee el valor también “1000” de la tabla PROXNUMEROFACTURA. Luego el usuario PC1 aplica los cambios, grabando ‘1001’ en la tabla PROXNUMEROFACTURA y inserta los cambios en FACTURAS/DETALLEFACTURAS. Momento después el usuario PC2 quiere aplicar los cambios con el valor “1000” de donde surge una excepción porque el valor ya existe en FACTURAS.

Requisitos:
  • Necesito obtener un número de facturas con un valor secuencial y representativo para el usuario.

Posible solución:

Cuando el usuario PC2 aplica un número de factura que ya existe, se genera una excepción. En este momento se puede capturar la excepción y si por ejemplo es un error de unicidad se le puede sumar 1 a valor que ya existe, aplicando los cambios en las tablas PROXNUMEROFACTURA y FACTURAS.

Consulta:

¿Como hacerlo, siendo que estoy utilizando ClientDataSet Anidados para FACTURA/DETALLE FACTURAS?

Muchas gracias,

Claudio Viñas


Responder Con Cita
  #5  
Antiguo 16-06-2006
[pepon386] pepon386 is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Valencia
Posts: 68
Poder: 20
pepon386 Va por buen camino
Cita:
Empezado por cvinas
Problema:

Siguiendo con el tema, planteo el siguiente problema.

Existen 2 puestos que están facturando, el en momento t1 el puesto PC1 lee en una tabla PROXNUMEROFACTURA el próximo numero a facturar en este caso “1000”. Un rato después (t1 + 30 segundos) el usuario Pc2 lee el valor también “1000” de la tabla PROXNUMEROFACTURA. Luego el usuario PC1 aplica los cambios, grabando ‘1001’ en la tabla PROXNUMEROFACTURA y inserta los cambios en FACTURAS/DETALLEFACTURAS. Momento después el usuario PC2 quiere aplicar los cambios con el valor “1000” de donde surge una excepción porque el valor ya existe en FACTURAS.

Requisitos:
  • Necesito obtener un número de facturas con un valor secuencial y representativo para el usuario.
Posible solución:

Cuando el usuario PC2 aplica un número de factura que ya existe, se genera una excepción. En este momento se puede capturar la excepción y si por ejemplo es un error de unicidad se le puede sumar 1 a valor que ya existe, aplicando los cambios en las tablas PROXNUMEROFACTURA y FACTURAS.

Consulta:

¿Como hacerlo, siendo que estoy utilizando ClientDataSet Anidados para FACTURA/DETALLE FACTURAS?

Muchas gracias,

Claudio Viñas

Tienes dos opciones:
- Asignar dicho valor desde un trigger y recuperarlo en el evento AfterUpdateRecord del TDataSetProvider (recomendado).
- Asignar dicho valor capturando el evento BeforeUpdateRecord del TDataSetProvider.

De las dos, yo prefiero la primera, pues te aseguras de que es la base de datos la que gestiona la asignación de los números.
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
SQL con dbexpress gescoto99 MS SQL Server 4 25-01-2005 17:04:24
DBExpress Esau Conexión con bases de datos 0 04-10-2003 00:10:58
dbExpress iriber Conexión con bases de datos 3 19-09-2003 15:02:47
De BDE a DBExpress Sergio J. Conexión con bases de datos 2 09-07-2003 22:32:25
DBExpress Jordy Conexión con bases de datos 6 08-05-2003 14:48:22


La franja horaria es GMT +2. Ahora son las 08:25: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