Ir al contenido


Foto

Como leer datos del registro anterior


  • Por favor identifícate para responder
5 respuestas en este tema

#1 axesys

axesys

    Advanced Member

  • Moderadores
  • PipPipPip
  • 640 mensajes
  • LocationLos Mochis

Escrito 15 abril 2009 - 07:42

Que tal amigos, estoy tratando de usar campos calculados para calcular el valor en el que inicia la profundidad de cada capa de suelo (ini) y fin es capturado por el usuario en un grid, por ejemplo:

INI - FIN
--------
0 - 10
10 - 30
30 - 60

Aquí­ el usuario captura el primer registro con 10 en fin, entonces en ini se le asigna 0 por ser el primer registro, el usuario captura el segundo registro con 30 en fin, entonces en ini se le asigna 10 que fue el fin del registro anterior, esto se repite igual para todos los demás registros que no sean el primero.

Por lo pronto lo estoy haciendo de la siguiente manera en el evento OnCalcFields de un ClientDataSet que apunta a la tabla de Estratos (cdsEstratos) la cual tambien esta asignada a otro ClientDataSet que se llama cdsClon:



delphi
  1. procedure TfrmParcelas.cdsEstratosCalcFields(DataSet: TDataSet);
  2. var
  3.   anterior: double;
  4. begin
  5.   anterior:= 0;
  6.   if cdsEstratos.RecNo > 1 then
  7.   begin
  8.     if cdsEstratos.RecordCount <> cdsClon.RecordCount then
  9.     begin
  10.       cdsClon.Close;
  11.       cdsClon.Open;
  12.     end;
  13.     if cdsClon.Locate('ID', cdsEstratos.FieldByName('ID').Value, []) then
  14.     begin
  15.       cdsClon.Prior;
  16.       if not cdsClon.FieldByName('FIN').IsNull then
  17.         anterior:= cdsClon.FieldByName('FIN').Value
  18.     end;
  19.   end;
  20.   cdsEstratos.FieldByName('INI').Value:= anterior;
  21. end;



Pero creo que esto no es muy eficiente usando datasnap y me gustarí­a saber si ustedes conocen otra forma más eficiente.


Saludos
  • 0

#2 Kipow

Kipow

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 228 mensajes
  • LocationGuatemala

Escrito 15 abril 2009 - 09:02

Por lo que veo tenes un campo ID que seria un correlativo.  con eso en el evento OnNewRecord del cds podes ubicar el valor inicial facilmente.

  • 0

#3 axesys

axesys

    Advanced Member

  • Moderadores
  • PipPipPip
  • 640 mensajes
  • LocationLos Mochis

Escrito 15 abril 2009 - 09:06

Mis ids son guids y olvide comentar que no estoy guardando el valor de ini
  • 0

#4 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 16 abril 2009 - 06:49

Saludos.

Has probado a guardar en una variable global en el evento BeforePost el valor capturado, esto funciona correctamente siempre y cuando hagas la comparación con el ultimo registro almacenado.
  • 0

#5 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 16 abril 2009 - 09:34

Aquí­ el usuario captura el primer registro con 10 en fin, entonces en ini se le asigna 0 por ser el primer registro, el usuario captura el segundo registro con 30 en fin, entonces en ini se le asigna 10 que fue el fin del registro anterior, esto se repite igual para todos los demás registros que no sean el primero.


considerando tu lógica de inicio no serí­a más cómodo que al guardar el registro actual se genere a la par el siguiente? este contendria el valor ini del anterior y 0 en el fin. Tal como sucede con el registro inicial.

De tal manera que distinguirias el inicio y final por los valores 0.

Saludos
  • 0

#6 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 22 mayo 2009 - 01:49

axesys, no se si sea demasiado tarde( estuve muchos dí­as sin conectarme por problemas de salud), yo tuve que implementar algo muy similar con fechas inicial y final en donde el registro actual debí­a consultar en algunos casos el registro anterior y en otros el registro siguiente.

Lo que hice fue agregar a la tabla en cuestión un campo de nombre contador, el ejemplo de enseguida (para Firebird) hará exactamente lo que tu necesitas directamente en la BD, si necesitas implementarlo en el lado cliente ya lo adaptarás con ClientDataset.Locate.

Saludos



sql
  1. CREATE TABLE MEDIDAS (
  2.     ID_MEDIDA  INTEGER NOT NULL,
  3.     INI        INTEGER,
  4.     FIN        INTEGER,
  5.     CONTADOR  INTEGER
  6. );
  7.  
  8.  
  9. /* Trigger: MEDIDAS_BI0 */
  10. CREATE OR ALTER TRIGGER MEDIDAS_BI0 FOR MEDIDAS
  11. ACTIVE BEFORE INSERT POSITION 0
  12. AS
  13. DECLARE VARIABLE VCONTADOR INTEGER;
  14. DECLARE VARIABLE VINI INTEGER;
  15. BEGIN
  16. SELECT MAX(CONTADOR)
  17. FROM MEDIDAS
  18. INTO :VCONTADOR;
  19.   IF (:VCONTADOR IS NULL) THEN
  20.   BEGIN
  21.     NEW.CONTADOR = 1;
  22.     NEW.INI = 0;
  23.   END
  24.   ELSE
  25.   BEGIN
  26.     NEW.CONTADOR = :VCONTADOR + 1;
  27.     SELECT MEDIDAS.FIN
  28.     FROM MEDIDAS
  29.     WHERE MEDIDAS.CONTADOR = NEW.CONTADOR -1
  30.     INTO :VINI;
  31.     NEW.INI = :VINI;
  32.   END
  33. END
  34. ^
  35.  
  36. /* Trigger: MEDIDAS_BD0 */
  37. CREATE OR ALTER TRIGGER MEDIDAS_BD0 FOR MEDIDAS
  38. ACTIVE BEFORE DELETE POSITION 0
  39. AS
  40. BEGIN
  41.   UPDATE MEDIDAS SET CONTADOR = CONTADOR -1
  42.   WHERE CONTADOR > OLD.CONTADOR;
  43. END
  44. ^


  • 0




IP.Board spam blocked by CleanTalk.