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 20-10-2005
Johnny Q Johnny Q is offline
Miembro
 
Registrado: may 2005
Ubicación: Colombia
Posts: 172
Poder: 19
Johnny Q Va por buen camino
Unhappy Clientdataset y concurrencia

Un saludo a todos.

Tengo 2 ClientDataSet para crear Facturas con Detalles, yo mismo asigno el consecutivo cuando se genera una nueva factura. Todo me funciona de maravilla excepto cuando dos o mas usuarios intentan crear al mismo tiempo una factura, pues se genera el mismo consecutivo.

He podido reasignar hasta cierto punto el consecutivo cuando se da esta concurrencia, pero tengo problemas cuando trato de editar los detalles. No se si influya el hecho de que los datos están en memoria hasta que no se aplique ApplyUpdates(0).

Si alguien me puede dar una mano con este problema estare muy agradecido.
Responder Con Cita
  #2  
Antiguo 20-10-2005
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
Buenas!


Lo normal sería que buscaras el número de factura en el momento de grabarla, no al principio.

En este caso es muy difícil que haya concurrencia.

Edu
Responder Con Cita
  #3  
Antiguo 20-10-2005
Johnny Q Johnny Q is offline
Miembro
 
Registrado: may 2005
Ubicación: Colombia
Posts: 172
Poder: 19
Johnny Q Va por buen camino
justamente eso es lo que estoy haciendo, antes de guardar verifico cual es el consecutivo mayor y lo incremento en 1, y cuando ya lo tengo intento asignarlo a los detalles editandolos con un While pero algo raro sucede y solo me reasigna algunos y otros me los guarda con el consecutivo sin incremento

El codigo para modificar los detalles es el siguiente:
Código:
 	ClientDataSet2.first;
 	while not ClientDataSet2.eof do
 	begin
 	  ClientDataSet2.Edit;
 	  ClientDataSet2.FieldValues['codigo'] := qryMaximomaximo.Value + 1;
 	  ClientDataSet2.Post;
 	  ClientDataSet2.Next;
 	end;
Responder Con Cita
  #4  
Antiguo 20-10-2005
jfgonzalez jfgonzalez is offline
Registrado
 
Registrado: ago 2003
Ubicación: Colombia
Posts: 7
Poder: 0
jfgonzalez Va por buen camino
Tabla de consecutivos

Hola

La verdad si el desarrollo que haces maneja facturación, veo que es bastante amplio, entonces deberías manejar una tabla libre para consecutivos, y cuando empiezas a hacer la nueva la factura ,lees el consec actual lo incrementas y vuala el usuario 1 ve la factura #123 y el usuario 2 ve la factura #124

atento a cualquier comentario
Responder Con Cita
  #5  
Antiguo 20-10-2005
Johnny Q Johnny Q is offline
Miembro
 
Registrado: may 2005
Ubicación: Colombia
Posts: 172
Poder: 19
Johnny Q Va por buen camino
Tienes razón Juan Fernando, a nivel visual es muy bueno lo que tu propones, pero supon el caso en que el usuario que tomo el # 123 cancelo la operación; en tal caso ese numero no se almacenaria en la base de datos. Para evitar ese inconveniente es mejor leer e incrementar el consecutivo justo antes de grabar.
Responder Con Cita
  #6  
Antiguo 21-10-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Hola:

Y ese dato consecutivo, podría ser un campo autoincrement definido en la
BD ?

Hasta Luego.
__________________
No todo es como parece ser...
Responder Con Cita
  #7  
Antiguo 25-10-2005
Programero Programero is offline
Registrado
 
Registrado: oct 2005
Posts: 4
Poder: 0
Programero Va por buen camino
Talking Codigos consecutivos

lo que puedes hacer hacer es los siguiente;
en el evento Before Post ejeucutas una consulta que te trae el proximo codigo el cual es generado en la DB esto me funciona de maravillas y en tu base de datos debes de hacer el varlo de tu clave primaria se inserte arbitrariamente osea en tu triger que debes de poner el valor directamente no debes de poner
if New.mi_id is null then
debes de poner de asi
new.mi_id = gen_id(mi_gerator, 1);
de esta manera entonces si dos usuarios lleven el mimo numero lo unico que pasara es que no podra ver los datos que ingreso pero se arregla con un refresh

salu-2
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


La franja horaria es GMT +2. Ahora son las 21:02:01.


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