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)
-   -   Al volver al entrar en la aplicación me sale el ultimo Registro Repetido !!!!! (https://www.clubdelphi.com/foros/showthread.php?t=30129)

sierraja 09-02-2006 04:01:21

Al volver al entrar en la aplicación me sale el ultimo Registro Repetido !!!!!
 
Escenario:

Delphi 7
Componentes IBX
FireBird 1.5.3 ubicada en Server Linux
Aplicacion Server/Client
Client en WinXP

La situación es: cargo un formulario donde aparece un DBGrid conectado a una base de datos (IBDataBase, IBTransaction, IBDataSet, DataSource) al selecionar la celda requerida en la columna deseada del dbgrid, paso a editar el valor incluido en la celda, para eso en el evento OnColEnter comparo el nombre de la colmuna y luego coloco la opcion de edicion para cambiar dicho valor. Luego, continuo en la misma columan de la misma manera pero en la siguiente fila hasta modificar todas las filas (6). Todo queda perfecto, pero cuando salgo de la aplicación y vuelvo a entrar al mismo formulario en el dbgrid aparecen las (6) filas pero en la columna que se modificó aparece el último valor que entré en la ultima fila y repetido en todas las demás filas.

He revisado el DataChage en el DS no tiene nada, no se hace ningun post,
Ahora bien :D ¿De que depende este comportamiento? :confused:

sierraja 09-02-2006 18:43:55

Ensayo y Error
 
He realizado varias pruebas tales como: coloqué un disparador en la base de datos que se activa cuando se hace un update en la tabla en cuestión, y efectivamente cuando estoy haciendo la edición en el dbgrid se actualiza directamente la tabla, por lo que no se cómo controlar esto y poder manipularlo es decir si se hace una edición se debería hacer un post y seguidamente un commit, pero quisiera saber como es el comportamiento entre un ibdataset y un dbgrid, tal vez el conocer dicho comportamiento me ayudaría a controlar la situación...:(

sierraja 09-02-2006 21:14:21

Otra prueba
 
He realizado otra prueba: Coloqué componentes tales como TEdit para leer los datos y luego de leerlos les hago un post y los graba perfectamente, según el dbgrid, pero al cerrar la aplicación y volverla a abrir me sale con el mismo comportamiento (Error para mi). También informo que en los eventos del IBDataSet AfterPost y AfterDelete se hace un CommingRetaing; Que podrá ser:confused:

vtdeleon 09-02-2006 21:20:55

Saludos

Muestranos todo el codigo relacionado con esa transaccion, sea codigo Delphi o SQL, ademas de las propiedades modificadas del Dataset

sierraja 09-02-2006 22:30:00

Información Requerida
 
Ok en el IBDataSet están definidos en los eventos AfterPost y AfterDelete coloco un CommitRetaining.

En el IBDataSet Detalle tengo lo siguiente:

SqlModify:
Código SQL [-]
update "LISTA_CONTENIDO"
set
"SEMANA" = :SEMANA,
"FECHA_INICIO" = :FECHA_INICIO,
"FECHA_FIN" = :FECHA_FIN,
"CEDULA" = :CEDULA,
"NOMBRE" = :NOMBRE,
"TELEFONO" = :TELEFONO,
"PLACA" = :PLACA,
"MARCA" = :MARCA,
"COLOR" = :COLOR,
"MODELO" = :MODELO,
"NUMERO_LISTA" = :NUMERO_LISTA,
"PESO_INICIAL" = :PESO_INICIAL,
"PESO_FINAL" = :PESO_FINAL,
"PESO_CIBICO" = :PESO_CIBICO,
"ORDEN_DESPACHO" = :ORDEN_DESPACHO,
"TIPO_MATERIAL" = :TIPO_MATERIAL
where
"SEMANA" = :OLD_SEMANA and
"FECHA_INICIO" = :OLD_FECHA_INICIO and
"FECHA_FIN" = :OLD_FECHA_FIN

SqlInsert:
Código SQL [-]
insert into "LISTA_CONTENIDO"
("SEMANA", "FECHA_INICIO", "FECHA_FIN", "CEDULA", "NOMBRE", 
"TELEFONO", "PLACA", "MARCA", 
"COLOR", "MODELO", "NUMERO_LISTA", "PESO_INICIAL", "PESO_FINAL", 
"PESO_CIBICO", 
"ORDEN_DESPACHO", "TIPO_MATERIAL")
values
(:SEMANA, :FECHA_INICIO, :FECHA_FIN, :CEDULA, :NOMBRE, :TELEFONO, 
:PLACA, 
:MARCA, :COLOR, :MODELO, :NUMERO_LISTA, :PESO_INICIAL, :PESO_FINAL, 
:PESO_CIBICO, :ORDEN_DESPACHO, :TIPO_MATERIAL)

SqlDelete:
Código SQL [-]
delete from "LISTA_CONTENIDO"
where
"SEMANA" = :OLD_SEMANA and
"FECHA_INICIO" = :OLD_FECHA_INICIO and
"FECHA_FIN" = :OLD_FECHA_FIN

SqlRefresh:
Código SQL [-]
Select 
"SEMANA",
"FECHA_INICIO",
"FECHA_FIN",
"CEDULA",
"NOMBRE",
"TELEFONO",
"PLACA",
"MARCA",
"COLOR",
"MODELO",
"NUMERO_LISTA",
"PESO_INICIAL",
"PESO_FINAL",
"PESO_CIBICO",
"ORDEN_DESPACHO",
"TIPO_MATERIAL"
from "LISTA_CONTENIDO" 
where
"SEMANA" = :SEMANA and
"FECHA_INICIO" = :FECHA_INICIO and
"FECHA_FIN" = :FECHA_FIN

SqlSelect:
Código SQL [-]
select * from LISTA_CONTENIDO where
SEMANA = :SEMANA and
FECHA_INICIO = :FECHA_INICIO and
FECHA_FIN = :FECHA_FIN

En el IBDataSet Maestro tengo lo siguiente:

SqlModify:
Código SQL [-]
update "LISTA"
set
"SEMANA" = :SEMANA,
"FECHA_INICIO" = :FECHA_INICIO,
"FECHA_FIN" = :FECHA_FIN,
"OBS" = :OBS
where
"SEMANA" = :OLD_SEMANA and
"FECHA_INICIO" = :OLD_FECHA_INICIO and
"FECHA_FIN" = :OLD_FECHA_FIN

SqlInsert:
Código SQL [-]
insert into "LISTA"
("SEMANA", "FECHA_INICIO", "FECHA_FIN", "OBS")
values
(:SEMANA, :FECHA_INICIO, :FECHA_FIN, :OBS)

SqlDelete:
Código SQL [-]
delete from "LISTA"
where
"SEMANA" = :OLD_SEMANA and
"FECHA_INICIO" = :OLD_FECHA_INICIO and
"FECHA_FIN" = :OLD_FECHA_FIN

SqlRefresh:
Código SQL [-]
Select 
"SEMANA",
"FECHA_INICIO",
"FECHA_FIN",
"OBS"
from "LISTA" 
where
"SEMANA" = :SEMANA and
"FECHA_INICIO" = :FECHA_INICIO and
"FECHA_FIN" = :FECHA_FIN

SqlSelect:
Código SQL [-]
select * from "LISTA" order by "SEMANA"

Ahora bien, la tabla maestra contiene datos de definición de listas:

Semana=====>Campo Relación
Fecha_Inicio==>Campo Relación
Fecha_Fin====>Campo Relación

La tabla detalle contiene detalles de la lista como identificacion de vehiculos y su chofer:

Semana=====>Campo Relación
Fecha_Inicio==>Campo Relación
Fecha_Fin====>Campo Relación
Placa
Peso_Inicial
Peso_Final
{datos del vehiculo}
Cedula
{datos del chofer}

El código delphi lo tengo cuando leo los campos Peso_Inicial y Peso_Final en la tabla detalleis es:

Código Delphi [-]
dm.ibds_Lista_despacho.Edit;
dm.ibds_Lista_despacho.FieldByName('peso_inicial').AsInteger:=StrToInt(LabeledEdit5.Text);
dm.ibds_Lista_despacho.Post;
dm.ibds_Lista_despacho.Close;
dm.ibds_Lista_despacho.Open;
dbgrid3.Refresh;

Gracias, por la atención. :)

sierraja 11-02-2006 18:38:59

La solución al problema planteado inicialmente, fué en agregar a la clausula SqlModify el campo de placa, para así modificar únicamente el registro que corresponde y no todos los que contenían semana, fecha_inici y fecha_fin:

Código SQL [-]
update "LISTA_CONTENIDO"
set
"SEMANA" = :SEMANA,
"FECHA_INICIO" = :FECHA_INICIO,
"FECHA_FIN" = :FECHA_FIN,
"CEDULA" = :CEDULA,
"NOMBRE" = :NOMBRE,
"TELEFONO" = :TELEFONO,
"PLACA" = :PLACA,
"MARCA" = :MARCA,
"COLOR" = :COLOR,
"MODELO" = :MODELO,
"NUMERO_LISTA" = :NUMERO_LISTA,
"PESO_INICIAL" = :PESO_INICIAL,
"PESO_FINAL" = :PESO_FINAL,
"PESO_CIBICO" = :PESO_CIBICO,
"ORDEN_DESPACHO" = :ORDEN_DESPACHO,
"TIPO_MATERIAL" = :TIPO_MATERIAL
where
"SEMANA" = :OLD_SEMANA and
"FECHA_INICIO" = :OLD_FECHA_INICIO and
"FECHA_FIN" = :OLD_FECHA_FIN and
"PLACA" =:OLD_PLACA

Gracias por la atención....


La franja horaria es GMT +2. Ahora son las 08:59:17.

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