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-03-2009
alquimista_gdl alquimista_gdl is offline
Miembro
 
Registrado: ago 2008
Ubicación: Guadalajara, México
Posts: 78
Poder: 16
alquimista_gdl Va por buen camino
Ayuda: "Record not found or changed by another user"

Hola,

Tengo un proceso que sumariza los detalles de una factura para determinar el importe e impuesto totales, en base a tales detalles.

pe_regoper es un objeto que contiene propiedades (property) que escriben los datos a los campos de la tabla. También tiene asociado el ClientDataSet que accede a la tabla. Partidas es otro objeto relacionado a pe_regoper que contiene propiedades de las partidas, y su ClientDataSet, que accede a la tabla de partidas.



if (pe_regoper.Cierre = 'N') and (not pe_regoper.Partidas.z_DataSet.EOF) then
begin

pe_regoper.z_DataSet.Edit;
pe_regoper.TotalImporte:= 0;
pe_regoper.TotalIVA:= 0;

with pe_regoper.Partidas.z_dataSet do
begin
First;
while not Eof do
begin
pe_regoper.TotalImporte:= pe_regoper.TotalImporte + pe_regoper.Partidas.Importe;
pe_regoper.TotalIVA:= pe_regoper.TotalIVA + pe_regoper.Partidas.IVA;
next;
end;
end;

pe_regoper.z_dataSet.Post;

if TClientDataSet( pe_regoper.z_dataSet ).ApplyUpdates(0) > 0 then
TClientDataSet( pe_regoper.z_dataSet ).CancelUpdates;

end;

En el debugger veo que entra a la condición sin problema, y efectúa las operaciones de totalización correctamente. El problema viene al aplicar el ApplyUpdates, obtengo "Record not found or changed by another user". Cada ClientDataSet está asociado al Provider, y este a su vez a un ZQuery de Zeos que conecta a MySQL 5. Uso Delphi 7

Qué podrá estar pasando?

Gracias,
Guillermo
Responder Con Cita
  #2  
Antiguo 20-03-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
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
¡Hola!

Justo en la parte inferior de esta página aparecen varios enlaces a otros hilos con el mismo mensaje de error.

El problema podría estar en lo mismo que encontramos en esta otra situación: http://www.clubdelphi.com/foros/showthread.php?t=63945

Muy importante: Usa las etiquetas especiales para darle formato al código que publiques, haciendo que quede más legible.

Saludos.

Al González.
Responder Con Cita
  #3  
Antiguo 21-03-2009
alquimista_gdl alquimista_gdl is offline
Miembro
 
Registrado: ago 2008
Ubicación: Guadalajara, México
Posts: 78
Poder: 16
alquimista_gdl Va por buen camino
Hola Al,

Gracias por la respuesta. Estoy viendo en el DataModule las propiedades del Provider y del ZQuery en lo que son los campos:

La propiedad SQL del ZQuery contiene:

Código SQL [-]
select * from regoper_part_v
  where regoper_id= :regoper_id
  order by rpp_numpartida

Dado que se trata de una vista y no una tabla, en el evento del Provider OnGetTableName, tengo:

Código Delphi [-]
procedure Tdm.DataSetProvider_RegOper_partGetTableName(Sender: TObject;
  DataSet: TDataSet; var TableName: String);
begin
  TableName:= 'regoper_part';
end;

Esta mecánica la uso en otras vistas, y me funciona bien. Lo diferente de los otros casos, es que en este que tengo problemas, el query tiene parámetos "where": where regoper_id= :regoper_id

En el Provider, el UpdateMode lo tengo como "upWhereKeyOnly", y he comprobado tanto en los campos del ZQuery como del ClientDataSet, que:
  • Los campos de la tabla actualizables, tengan "[pfInUpdate]"
  • Que los campos de la vista no actualizables, no tengan ninguna bandera
  • Que el campo ID de la vista/tabla, tenga "[pfInUpdate,pfInWhere]"

En el enlace que me indicas, Bauhaus tenía el problema de que externamente se le estaba modificando el "upWhereKeyOnly" a "upWhereAll", más no entendí muy bien de qué manera podría rastrearse eso en el código.
Como comentaba, tengo otros 4 ZQueries en donde no tengo problema con el ApplyUpdates, excepto con este, que tiene un parámetro "where" en la sentencia SQL y que uso para agrupar los detalles asociados a una tabla maestro. Qué podrá ser?

Gracias,
Guillermo
Responder Con Cita
  #4  
Antiguo 21-03-2009
alquimista_gdl alquimista_gdl is offline
Miembro
 
Registrado: ago 2008
Ubicación: Guadalajara, México
Posts: 78
Poder: 16
alquimista_gdl Va por buen camino
Como elemento adicional, y en caso de que pueda ayudar a que encontremos una pista del problema (esperando no confundir más):

En dxDBGrid en que muestro los registros de detalle, filtrados según el registro "master" o encabezado, al momento de seleccionar uno para modificar, sucede algo extraño:

1- Si es la primera vez que entro al grid y elijo un registro a modificar dentro de una forma con el mismo dataSource, se elige bien el registro y se muestra bien en la forma.
2- Si después, navegando en el grid, elijo visualmente otro registro a modificar, la forma toma otro registro distinto al elegido y al regresar al dbgrid, la lista parece volverse loca, ya que el cursor se reposiciona en el número de registro que elegí, pero mostrando el registro equivocado tomado por la forma. Si se hace repaint al dbGrid, se redibujan correctamente los datos.

Esto no sucede en los dbgrid en que no hay Params en el ZQuery.

Gracias
Responder Con Cita
  #5  
Antiguo 21-03-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
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
Hola de nuevo Guillermo.

Por lo que nos comentas, creo que sólo te falta la bandera pfInKey en el campo ID, ya que de otra manera, por tratarse del modo upWhereKeyOnly, no se tomaría en cuenta el campo.

En cuanto al comportamiento que mencionas de la rejilla, tal vez se trate de un problema aparte. Primero dinos cómo te funciona con la bandera pfInKey debidamente activada.

Saludos.

Al González.
Responder Con Cita
  #6  
Antiguo 21-03-2009
alquimista_gdl alquimista_gdl is offline
Miembro
 
Registrado: ago 2008
Ubicación: Guadalajara, México
Posts: 78
Poder: 16
alquimista_gdl Va por buen camino
Hola Al,

Me he asegurado de que en el id de la tabla/view se tengan las banderas [pfInUpdate,pfInWhere,pfInKey] tanto en el ZQuery como en el ClientDataSet. ya están puestas, de hecho estaban en el ZQuery, y en el ClientDataSet solo faltaba el "pfInKey".
Lo volví a ejecutar y aún marca el error
Responder Con Cita
  #7  
Antiguo 21-03-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
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
OK, ¿podrías mostrarnos el contenido de la vista regoper_part_v? Esto para saber cómo estás obteniendo el campo ID.
Responder Con Cita
  #8  
Antiguo 21-03-2009
alquimista_gdl alquimista_gdl is offline
Miembro
 
Registrado: ago 2008
Ubicación: Guadalajara, México
Posts: 78
Poder: 16
alquimista_gdl Va por buen camino
select
`regoper_part`.`regoper_part_id` AS regoper_part_id`,
`regoper_part`.`regoper_id` AS `regoper_id`,
`regoper_part`.`proveedor_id` AS `proveedor_id`,
`proveedor`.`prv_rfc` AS `PRV_RFC`,
`proveedor`.`prv_nombre` AS `PRV_NOMBRE`,
`regoper_part`.`rpp_numpartida` AS `RPP_NUMPARTIDA`,
`regoper_part`.`rpp_numpoliza` AS `RPP_NUMPOLIZA`,
`regoper_part`.`rpp_numfactura` AS `RPP_NUMFACTURA`,
`regoper_part`.`rpp_mesfactura` AS `RPP_MESFACTURA`,
`regoper_part`.`rpp_iva` AS `RPP_IVA`,
`regoper_part`.`rpp_importe` AS `RPP_IMPORTE`,
`regoper_part`.`rpp_pendientespoliza` AS `RPP_PENDIENTESPOLIZA`

from (`regoper_part` left join `proveedor` on((`regoper_part`.`proveedor_id` = `proveedor`.`proveedor_id`)))
Responder Con Cita
  #9  
Antiguo 21-03-2009
alquimista_gdl alquimista_gdl is offline
Miembro
 
Registrado: ago 2008
Ubicación: Guadalajara, México
Posts: 78
Poder: 16
alquimista_gdl Va por buen camino
Hola Al,

Creo que nos estamos yendo por la tangente. El problema no es actualizar un registro en "regoper_part_v", sino en la tabla padre: "regoper". El problema original viene del código inicialmente mostrado en el hilo (aquí un poco más legible):

Código Delphi [-]
    pe_regoper.z_DataSet.Edit;
    pe_regoper.TotalImporte:= 0;
    pe_regoper.TotalIVA:= 0;

    with pe_regoper.Partidas.z_dataSet do
    begin
      First;
      while not Eof do
      begin
        {00010}
        pe_regoper.TotalImporte:= pe_regoper.TotalImporte + pe_regoper.Partidas.Importe;
        {00013}
        pe_regoper.TotalIVA:= pe_regoper.TotalIVA + pe_regoper.Partidas.IVA;
        next;
      end;
    end;

    pe_regoper.z_dataSet.Post;

    if TClientDataSet( pe_regoper.z_dataSet ).ApplyUpdates(0) > 0 then
      TClientDataSet( pe_regoper.z_dataSet ).CancelUpdates;

Es en el ApplyUpdates que tengo el error ya mencionado. Ubiqué un ZSQLMonitor, y aquí está el código que genera para hacer la actualización:

Código SQL [-]
update `regoper` set `rop_totiva` = 4293.06005859375 where `regoper_id` = 689349199046620201

La verdad no veo problema; pero en fin, he aquí más datos. El Provider de regoper_v tiene el evento correspondiente:

Código Delphi [-]
procedure Tdm.DataSetProvider_regoperGetTableName(Sender: TObject;
  DataSet: TDataSet; var TableName: String);
begin
  TableName:= 'regoper';
end;

Y el SQL del ZQuery de regoper_v es:

Código SQL [-]
select * from regoper_v
order by cli_nombre

La vista consiste de:

Código SQL [-]
select `regoper`.`regoper_id` AS `regoper_id`,
`regoper`.`cliente_id` AS `cliente_id`,
`cliente`.`cli_rfc` AS `cli_rfc`,
`cliente`.`cli_nombre` AS `cli_nombre`,
`regoper`.`rop_fechainicial` AS `rop_fechainicial`,
`regoper`.`rop_fechafinal` AS `rop_fechafinal`,
`regoper`.`rop_cierre` AS `rop_cierre`,
`regoper`.`rop_totimporte` AS `rop_totimporte`,
`regoper`.`rop_totiva` AS `rop_totiva` 

from (`regoper` left join `cliente` on((`cliente`.`cliente_id` = `regoper`.`cliente_id`)))
Responder Con Cita
  #10  
Antiguo 21-03-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
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
Ahora veo que todo el tiempo te referías a la tabla maestra, me confundí cuando mencionaste también la tabla de partidas.

Pues la primera pregunta que salta es, ¿existe un registro en la tabla maestra con el ID 689349199046620201? Por cierto, sospechosamente largo. ¿Es un "Big Int"?

Me gustaría seguir revisando esto con mayor detenimiento, pero no sólo de postear vive el hombre. Tal vez mañana me dé algo de tiempo...

Saludos.
Responder Con Cita
  #11  
Antiguo 21-03-2009
alquimista_gdl alquimista_gdl is offline
Miembro
 
Registrado: ago 2008
Ubicación: Guadalajara, México
Posts: 78
Poder: 16
alquimista_gdl Va por buen camino
Al,

Agradezco tu tiempo y tu disposición de asistir en este tema

Sobre tus observaciones:

"689349199046620201", si ... los ID de las tablas son bigInt (Int64 en Delphi). Y si, el registro existe en la tabla.

Las banderas de Provider para "regoper" están bien puestas en relación a "upWhereKeyOnly".

Saludos y que tengas buen viernes!
Guillermo
Responder Con Cita
  #12  
Antiguo 21-03-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
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
Cita:
Empezado por Al González Ver Mensaje
Me gustaría seguir revisando esto con mayor detenimiento, pero no sólo de postear vive el hombre.
Cita:
Empezado por alquimista_gdl Ver Mensaje
Saludos y que tengas buen viernes!
Olvidaba que la frase es muy usada para referirse a que también hay que dedicar tiempo al esparcimiento y muchas veces como sinónimo de irse de fiesta, pero en este caso me refiero a exprimir el escaso trabajo que ha caído en el changarro en lo que va del año.
Responder Con Cita
  #13  
Antiguo 21-03-2009
alquimista_gdl alquimista_gdl is offline
Miembro
 
Registrado: ago 2008
Ubicación: Guadalajara, México
Posts: 78
Poder: 16
alquimista_gdl Va por buen camino
Estimado Al....

No quememos más neuronas. Se trataba de un triste bug en los componentes ZeosLib versión 6.6.4 que presumen, es la estable. Es el segundo bug serio que les pesco... El primero lo pude arreglar yo en los fuentes, por que en sus foros nunca respondieron estas inquietudes...

Ahora, reemplacé la conexión de Base de Datos y el ZQuery, por componentes dbExpress demo de DevArt para MySQL... y asunto arreglado.

Ni modo... yo que ya estaba contento con ZeosLib ...

Saludos y gracias por tu ayuda!
Guillermo
Responder Con Cita
  #14  
Antiguo 21-03-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
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
Que bien que hayas optado por los nativos dbExpress, pero aun así puede que valga la pena comentar de qué se trata el defecto (bug) que encontraste en los Zeos. Igual y resulta factible corregirlo o sacarle la vuelta mediante algún truco.

Por cierto, ¿tiene que ver con los BigInt? ¿por qué usas un entero tan grande como llave?
Responder Con Cita
  #15  
Antiguo 21-03-2009
alquimista_gdl alquimista_gdl is offline
Miembro
 
Registrado: ago 2008
Ubicación: Guadalajara, México
Posts: 78
Poder: 16
alquimista_gdl Va por buen camino
Al,

Si, sería bueno saber las causas de este bug en particular, más lo desconozco. He posteado esta situación en los foros Zeos; desafortunadamente en los mensajes que he dejado, los tiempos de respuesta son de una semana, y eso es preocupante en un proyecto crítico.

Saludos
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
TClientDataSet.applyupdates (error: record not found or changed by another user) Bauhaus1975 Conexión con bases de datos 11 17-03-2009 11:30:51
applyupdates (record not found or changed by another user) Stell Conexión con bases de datos 4 13-05-2008 13:36:20
Error: "Record not found or changed by another user" jmlifi Varios 0 27-01-2006 10:16:57
Record not found or changed by another user felixgo Conexión con bases de datos 1 30-09-2005 13:07:40
Record not found or changed by another user. Luis Conexión con bases de datos 2 12-08-2005 19:50:45


La franja horaria es GMT +2. Ahora son las 09:13:25.


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