2010-07-07 10 views

Respuesta

5

Esto puede ocurrir si está mostrando las mismas filas en más de una DataWindow (no compartida) y luego intenta actualizarlas. Otras causas son el uso incorrecto de SetItemStatus(); uso incorrecto de los indicadores de estado en la instrucción update(); y finalmente, la causa que se pretende detectar, otro usuario actualizó la fila que tienes delante.

+1

Ver también [Informe de Terry sobre irregularidades en la base de datos] (http://www.techno-kitten.com/PowerBuilder_Help/Troubleshooting/Database_Irregularities/database_irregularities.html). –

1

¿Se ha resuelto esto? Hay varias razones por las que esto podría suceder, una es si la fila ha sido actualizada por otro usuario. En las propiedades de actualización de su objeto de datos, puede elegir el método de actualización, ya sea mediante el valor de la clave, la clave y los valores modificados, o la clave y todas las columnas actualizables.

Si está SEGURO de que no hay problemas de concurrencia, puede cambiar esta configuración para "usar solo el valor de clave". Hará que la cláusula where para las actualizaciones consista únicamente en el valor de la clave y otras columnas no se evaluarán en busca de cambios.

Puede ocurrir si se producen errores de validación, debe recordar configurar el estado del elemento para que no se modifique. Para configurar todas las filas para que no se modifiquen, harías dw_1.setitemstatus (1,0, Primary!, NotModified!) Si mi memoria es correcta que establecería todas las columnas de la fila uno en NotMofidied !. También puede hacer ResetUpdate() o Recuperar datos.

Espero que esto ayude. Rich

2

Esto generalmente significa que alguna columna has incluido en la actualización donde la cláusula se actualiza en otro lugar, como a través de un disparador. otras causas incluyen que no tener cadena vacía es nulo establecido para las columnas de cadena cuando se habla con Oracle. Oracle convierte cualquier cadena vacía enviada a nulos, por lo que una actualización posterior no encontrará la misma fila a menos que le indique a pb que la considere nula también. mira las columnas que le has indicado a pb para incluir en la cláusula where (en las especificaciones de actualización) y asegúrate de que realmente sean columnas que necesitas tener allí.

+0

+1 para marcar "la cadena vacía es nula" ... la corrigió para mí –

1

Esto también puede suceder cuando tiene dos filas de ventanas de datos que actualizan la misma fila o filas de la base de datos.

(A no tan bueno) Ejemplo:

La tabla tiene ninguna clave principal, pero el datawindow utiliza el DateOfBirth.

 
    Name:   Dennis Miller 
    DateOfBirth: 19531103 
    Vocation:  comedian 
 
    Name:   Kate Capshaw 
    DateOfBirth: 19531103 
    Vocation:  actress 

en cuenta que Dennis y Kate tienen el mismo DateOfBirth.

Vamos a suponer que estos cambios se hacen

 
    Name:   Mr. Dennis Miller 
 
    Name:   Ms. Kate Capshaw 

Cuando se invoca dw_1.update(), aparece este mensaje:

 
    "Row changed between retrieve and update" 

porque cada fila se actualiza dos veces, primero con 'Mr. Dennis Miller y luego con 'Ms. Kate Capshaw '

+0

En este caso, podría agregar [sexo y código postal] (http://epic.org/privacy/reidentification/) a la clave. –

0

Me doy cuenta de que esta es una vieja pregunta, pero pensé que agregaría mi solución en caso de que ayudara a alguien. En mi caso, la ventana de datos estaba emitiendo una declaración UPDATE y cuando esa declaración se ejecutó en SQL Management Studio, las columnas devueltas coinciden con lo que debería haberse esperado. Sin embargo, la consulta mostró dos veces dónde (1 fila (s) afectadas).Un activador estaba actualizando una fila no relacionada con la tabla que se está actualizando. Al agregar SET NOCOUNT ON a ese desencadenador, se produjo 1 instancia en la que (1 fila (s) afectada (s)) y la Fila modificada entre la recuperación y la actualización se resolvió.

0

Otra posibilidad es que la definición de la columna de la ventana de datos no coincida con la definición de columna de la base de datos.

Ejemplo:

  1. columna se define en la base de datos como char (10)

  2. datawindow está construido con COLUMNA como char (10)

  3. columna se altera para char (20) en la base de datos

  4. los datos se agregan externamente a la columna A con más de 10 caracteres.

  5. DataWindow recuperar trunca a 10 caracteres (con o sin error en función de configuración de la aplicación.)

  6. Eliminar fila/actualización puede producir "Fila cambió entre recuperar y actualizar"

0

Este comportamiento es monitoreado por las 'Propiedades de actualización' de su ventana de datos y más específicamente por la parte 'Donde cláusula para Actualizar/Eliminar'. Esto controla la cláusula where que será utilizado por Powerbuilder en updating.deleting, como se puede comprobar mediante el evento SQLPreview de su DataWindow:

  1. columnas clave: solamente las columnas de clave se utilizan en el dónde cláusula. Si usa esto, corre el riesgo de que algunas columnas hayan sido modificadas en otro lugar (no necesariamente por PowerBuilder) entre su recuperación y su actualización. Solo la última actualización permanecerá en el DB. Por supuesto, si las columnas clave se han modificado, recibirá el mensaje "Fila modificada".
  2. Columnas clave y actualizables: en la parte superior de las columnas clave, agregue todas las columnas actualizables, como se define inmediatamente debajo, en el cuadro 'Columnas actualizables'. Siempre que se haya modificado una columna (de nuevo, no necesariamente usando Powerbuilder), la fila no se recuperará y obtendrá el mensaje 'Cambio de fila'. En muchos casos, esto es excesivo.
  3. Columnas clave y modificadas: solo las columnas modificadas para la fila específica se agregan a la clave.
    Ahora depende de usted elegir uno de estos, dependiendo del contexto específico de su aplicación.
Cuestiones relacionadas