Power Builder - setitemstatus

 
Vista:

setitemstatus

Publicado por antonio (11 intervenciones) el 24/02/2014 18:56:32
Hola:
Cuando inserto una nueva linea en un datawindow dicha linea adquiere el estado de NEW y las columnas Notmodified.
Si modifico una columna de dicha linea, esta pasa a Newmodified y la columna a Datamodified.
Como puedo cambiar el estado de dicha columna para que no se actualice en la Base de Datos?. Trato de hacerlo mediante setitemstatus(linea,columna,primary, Notmodified!), el retorno de la funcion da ok (1), pero si vuelvo a preguntar por su estado me sale Datamodified, y por supuesto dicha columna se actualiza en la B.D.

Agradecería cualquier pista. Me estoy volviendo majara.

Un saludo y gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 37
Ha mantenido su posición en Power Builder (en relación al último mes)
Gráfica de Power Builder

setitemstatus

Publicado por JeinnerH (646 intervenciones) el 24/02/2014 23:37:59
Bueno, depende de lo que quieras hacer, si lo que deseas es hacer una consulta a la base de datos y agregar algunos registros temporales al Dw en la memoria, pero que estos no se actualicen a la base de datos, es cuestión de quitarle al DW las propiedades de actualización a la Tabla.

Si lo que deseas es que el DW quede con propiedades de actualización y agregar otro registro, pero que este no se actualice a la Tabla, lo que debes hacer es ejecutar un SetItemStatus()

Puedes ver en la ayuda ldel PB as propiedades.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

setitemstatus

Publicado por antonio (1 intervención) el 25/02/2014 00:40:00
Gracias por tu interés.
Lo que quieto hacer es insertar una linea; modificar tres columnas de esa linea y que solo se actualicen dos de las tres colimnas. para inyentar consehuirlo he procedifo a hacer lo qur indico en el primer memsaje. Hr aplicadi a la columna que no quiero actualizae un setitemstatus con notmodifief pero se actualiza en la bd
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 37
Ha mantenido su posición en Power Builder (en relación al último mes)
Gráfica de Power Builder

setitemstatus

Publicado por JeinnerH (646 intervenciones) el 25/02/2014 15:45:46
Para que no se actualice alguna columna debes usar el SetItem([Número Registro], [Nombre Columna], NOTMODIFIED!, PRIMARY!)

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

setitemstatus

Publicado por antonio (11 intervenciones) el 25/02/2014 18:14:31
Si lees los mensajes que he publicado te darás cuenta de que precisamente eso es lo que he hecho y eso es lo que falla
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 37
Ha mantenido su posición en Power Builder (en relación al último mes)
Gráfica de Power Builder

setitemstatus

Publicado por JeinnerH (646 intervenciones) el 25/02/2014 18:20:30
Bueno, el problema te puede estar dando entonces porque el registro completo está siendo modificado.

Si utilizas el SetItemStatus(1, 0, NOTMODIFIED!, PRIMARY!)

Con un cero en el parámetro del nombre de la Columna, eso hará que se actualice todo el estatus del registro.

Eso ya lo hiciste?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

setitemstatus

Publicado por antonio (11 intervenciones) el 25/02/2014 18:50:20
si pongo la linea a NOTMODIFIED la linea adquiere el estado de NEW!.
En esta situacion cambio una columa de las que quiero grabas a DATAMODIFIED y................TODAS las columnas pasan a Datamodified! y la linea a Newmodified

Esto no hay quien lo entienta
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mario Amaya

setitemstatus

Publicado por Mario Amaya (27 intervenciones) el 25/02/2014 18:18:42
Creo que lo correcto es
dw_.SetItemStatus(fila,columna,Primary!,notModified!)

Es decir la fila a modificar, la columna a modificar, buffer a modificar y el estatus a modificar.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

setitemstatus

Publicado por antonio (11 intervenciones) el 25/02/2014 18:20:43
Te repito que es eso lo que he hecho. Leete por favor los mensajes que he puesto
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 37
Ha mantenido su posición en Power Builder (en relación al último mes)
Gráfica de Power Builder

setitemstatus

Publicado por JeinnerH (646 intervenciones) el 25/02/2014 19:16:02
Bueno, primero que nada Antonio.

Estamos tratando de ayudarte, no sé si lo entiendes.

No es necesario que nos mandes a leer de nuevo los correos, sino que respondas de forma educada lo que te preguntamos o sugerimos.

Segundo, si pones la línea en NOTMODIFIED, no debiera quedar el registro como NEW!, sino NOTMODIFIED!.

Este problema es muy común en PowerBuilder, por lo que todos hemos pasado por esto.

Según lo que estás haciendo los pasos son los siguientes:
1
2
3
4
5
6
7
dw_1.Insert(1)
dw_1.Object.Llave[1]='1'
dw_2.Object.Campo1[1]='INFORMACION'
 
dw_1.SetItemStatus(1, 'Llave', PRIMARY!, NotModified!)
dw_1.SetItemStatus(1, 'Campo1', PRIMARY!, NotModified!)
dw_1.SetItemStatus(1, 0, PRIMARY!, Modified!)

Si lo dejas como NewModified!, la actualización se intentará realizar con un Insert, NO con un Update.

Debes estar seguro de que todos los campos están quedando como NotModified!

Puede construir un proceso que recorra campo por campo del DW y te regrese el status de cada campo, para darte cuenta de cuál es el que está siendo modificado.

Para darte cuenta en qué momento o qué camp es el que se está modificando vas a tener que utilizar esta función que te paso antes de actualizar la información.

Aquí te dejo unos ejemplos que tengo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$PBExportHeader$f_recordgetitemstatus.srf
global type f_recordgetitemstatus from function_object
end type
 
forward prototypes
global subroutine f_recordgetitemstatus (ref datawindow adw_1, integer il_registro)
end prototypes
 
global subroutine f_recordgetitemstatus (ref datawindow adw_1, integer il_registro);Integer li_1
 
 
 
For li_1=1 to Integer(adw_1.object.DataWindow.Column.Count)
	Messagebox('Información', 'Campo('+String(adw_1.Describe('#'+String(li_1)+'.Name'))+') ItSt: '+String(f_GetItemStatusName(adw_1.GetItemStatus(il_registro, li_1, PRIMARY!))))
Next
 
end subroutine

Aquí está el código que empleo para actualizar el SetItemStatus, no sé qué versión de PB usas, porque en la 6.5 había una pulga en la cual había que hacer dos veces el SetItemStatus para que quedara bien:
1
2
3
4
5
6
7
8
9
10
11
$PBExportHeader$f_setitemstatus.srf
global type f_setitemstatus from function_object
end type
 
forward prototypes
global function integer f_setitemstatus (ref datawindow adw_referencia, integer ai_fila, string as_columna, dwbuffer ab_buffer, dwitemstatus adw_status)
end prototypes
 
global function integer f_setitemstatus (ref datawindow adw_referencia, integer ai_fila, string as_columna, dwbuffer ab_buffer, dwitemstatus adw_status);adw_referencia.SetItemStatus(ai_fila, as_columna, ab_buffer, DataModified!)
RETURN adw_referencia.SetItemStatus(ai_fila, as_columna, ab_buffer, adw_status)
end function
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

setitemstatus

Publicado por antonio (11 intervenciones) el 25/02/2014 19:29:48
Primero de todo gracias por tu interés y espero que sabras disculparme.
Llevo programando en powerbuilder unos 12 años. Actualemente estoy con la version 12.1 y creo conocer el comportamiento y el uso del setitemstatus y el getitemstatus.

Dicho esto mi problema.... sorpresa... con setitemstatus en una linea INSERTADA, es decir new! es:

"Como puedo cambiar el estado de dicha columna para que no se actualice en la Base de Datos?. Trato de hacerlo mediante setitemstatus(linea,columna,primary, Notmodified!), el retorno de la funcion da ok (1), pero si vuelvo a preguntar por su estado me sale Datamodified, y por supuesto se actualiza la columna"

Es decir tu aporte es correcto si funcionara todo como debiera y así ocurre cuando la linea no es new, pero con una linea nueva...insertrow(0), a mi al menos me falla

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 37
Ha mantenido su posición en Power Builder (en relación al último mes)
Gráfica de Power Builder

setitemstatus

Publicado por JeinnerH (646 intervenciones) el 25/02/2014 19:19:26
Otra cosa, la forma en la cual estás haciendo el proceso no es la correcta.

Te comento por qué?

Porque estás asumiendo que un registro ya existen la base de datos y la vas a actualizar por medio del DW.

Entonces si el registro fue modificado o eliminado y se trata de hacer un Update, te va dar error.

Lo correcto sería, que recuperes los registros que vas a modificar primero en el DW.

Luego sólo haces las modificaciones a los campos que deseas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

setitemstatus

Publicado por antonio (11 intervenciones) el 25/02/2014 19:32:18
El proceso que hago es insertar un registro "dw_1.insertrow80)" No es un registro traido de la base de datos con un Retrieve
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

setitemstatus

Publicado por jhidalgo (1 intervención) el 25/02/2014 20:19:29
Me parece que lo que estás haciendo en este caso es correcto y debiera funcionar.

Pero no sé si el error con el SetItemStatus se ha mantenido desde la versión 6.5

El error consistía en que no se aplica el cambio del Status a menos de que primero se pusiera el registro o el campo en DataModified.

En la función que te mandé arriba yo lo hago de esta forma, puedes exportarla o en tu sistema o aplicar la lógica para ver si esto te corrige el problema?

En ocasiones a mi me ha tocado lidear con errores de este tipo que me han tomado mucho tiempo en corregir. Algunas de esas veces lo que me sucede es que se están actualizando algunos otros campos en el registro de forma automática o por código, sin que yo lo haya previsto, entonces a pesar de que ya cambié el status tal y como lo deseo, este se cambia y no realiza la actualización de la forma en la que deseo.

También te pasé otro código para que antes de realizar el Update de la información lo ejecutes, para que te vaya dando el status de cada campo y puedas determinar si hay algún otro campo que está causando el problema.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

setitemstatus

Publicado por antonio (11 intervenciones) el 25/02/2014 20:36:54
Intentare hacer lo que me dices a ver que pasa. Sus razones tendrán los de sybase pero joder.....
Gracias por tu interés
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

setitemstatus

Publicado por Jorge (3 intervenciones) el 21/03/2014 21:32:37
Necesitaba algo parecido, será cuestión que pruebes si funciona para tu caso. Lo que se hace es, declarar una variable de tipo DWItemStatus y a esta igualarla a nulo y, finalmente, setear a la fila/ columna.

Este código podría ir antes del dw_1.update()


DWItemStatus ldw_DWStatus

setNull ( ldw_DWStatus )

// Setear el status
this.setItemStatus( ll_currentRow, 0,Primary!,ldw_DWStatus )
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

setitemstatus

Publicado por Jorge (3 intervenciones) el 21/03/2014 22:08:23
En teoría, al cambiar el estado de la columna mediante el SetItemStatus debería fucinar pero, al parecer, no lo está haciendo. Si ese es tu caso, prueba con la siguiente linea.

Lo que hace es, simplemente, a la columna que desas indicarle que no se actualiace.


dw_2.Modify("nombre_columna.Update=No")

Comenta si se solucionó tu inconveniente.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

setitemstatus

Publicado por Leopoldo Taylhardat (710 intervenciones) el 21/03/2014 21:48:48
Saludos...

dw_x.Modify("columna,Update=NO")

Espero que te sirva...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

setitemstatus

Publicado por ANTONIO (11 intervenciones) el 22/03/2014 11:34:36
Hola, muchas gracias por tu interes.
Aportas una solución interesante, la pega es que estoy trabajando con un datawindow tabular con lo cual esa columna en TODAS las filas se quedaria sin actualizar.
No obstante estudiare la manera de poder aplicarlo
Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar