Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Concurrencia en ClientDataset (https://www.clubdelphi.com/foros/showthread.php?t=64108)

Vlady 17-03-2009 22:09:07

Concurrencia en ClientDataset
 
Hola amigos del club delphi tengo dos tablas conectadas maestro detalle en undos clientdataset el problema que tengo es q cuando dos usuarios estan trabajando en red yo tomo el id del documento mendiante una consulta sql preguntando el maximo numero a la base de datos el problema radica en q si otro usuario tambien esta creando otro ducumento el id del primero se pierde y el documento queda grabado en el insert del segundo es decir la llave primaria de uno de los documentos se pierde y todo queda en el ultimo documento que se grave, la llave primaria la consulta mediante la siguiente sentencia en el evento newrecord de la tabla maestro,

Código SQL [-]

 Buscar.Close;
    Buscar.SqL.Clear;
    Buscar.SqL.Add('SELECT MAX(ID) AS ID FROM DOCUMENTO);
    Buscar.Open;
    if Buscar['ID'] = NULL then
       CDSDocumento['IDDOC'] := 1
    ELSE
      CDSDocumento['IDDOC'] := Buscar['ID']  + 1;

En el evento BeforeApplyUpdates como puedo saber si una consulta es de insercion o de actualizacion para volver a realizar la consulta a la base de datos y saber cual es el id mayor.

trabajo con firebird 2.0 y delphi 7. Gracias;

ContraVeneno 17-03-2009 22:51:14

No lo busques en el evento "BeforeApplyUpdates", búscalo en el evento "BeforeUpdateRecord"

Vlady 18-03-2009 00:43:06

Gracias contraveneno por tu respuesta pero ahora me surgen varios interrogante como puedo utilizar este evento ya que recibe varias variables y lo que yo necesito es si es un insert averiguar la llave primaria en la base de datos asignarla a la tabla maestra y luego recorrer la tabla detalle y asignarle la llave foranea, como puedo resolver este problema, con esta funcion?

Código Delphi [-]
procedure TDataMC.DSPDocumentoBeforeUpdateRecord(Sender: TObject;
  SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;
  UpdateKind: TUpdateKind; var Applied: Boolean);
begin

end;

Vlady 18-03-2009 14:27:52

lguien que me pueda ayudar con el uso del evento BeforeApplyUpdates para actualizar las llaves primaria de una tabla maestro y las llaves foranes de una tabla detalle, se lo agradeceria

ContraVeneno 18-03-2009 16:01:15

Si buscas en la ayuda de delphi sobre este evento, explica que con el parámetro "UpdateKind" puedes identificar si es un registro nuevo, una modificación o están borrando un registro:
Código Delphi [-]
  case UpdateKind of
    ukModify: begin
          //aquí modifican
     end;
    ukInsert: Begin
          ///aquí insertan y aquí deberías buscar el máximo
         DeltaDS.FieldByName('IDDoc').NewValue := IDDoc+1;
     End;
    ukDelete: Begin
       //aquí borran.
    End; //Delete
  end;

Vlady 18-03-2009 21:04:56

Gracias contraveneno

Vlady 19-03-2009 00:05:13

Contraveneno gracias por tus aportes pero ahora como tengo una relacion maestro detalle solo tengo un provider, pero no se como hago para diferenciar cual tabla se inserto si en el maestro o en el detalle, he probado de varias formas pero no he podido dar con el chiste ya q cuando se hace una inserción en el maestro funciona bien pero cuando se hace una insercion en el detalle igual me calcula el mayor, debo diferenciar entre una insercion en el maestro y otra en el detalle, igual mi problema es solo la llave primaria de la tabla maestra q puede cambiar por otro usuario mientras q se esta creando el documento. si me pudieran ayudar se los agradeceria


La franja horaria es GMT +2. Ahora son las 10:41:51.

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