RE:Cuantas formas de grabar registros en PB existe
buenos días Santiago,
la diferencia entre un datawindow y datastore es que el datawindow tiene attributos de visibilidad y el datastore no: el objeto datastore no existía en versiones anteriores ( me parece que aparecieron con la versión 3 o 4 de PB) y lo que hacia la gente era usar un control de datawindow en una ventana y ponerlo invisible. Un datastore es un datawindow que existe en memoria y que tiene todo lo que tiene un datawindow "salvo los attributos que tienen que ver con la visibilidad". (creo que se podrá criticar esto, pero es una aproximación de lo que hay).
Si quieres poder depurar, codificar y controlar los eventos de un datastore no te valdrá el datastore así sin más, hazte uno de tipo objeto de usuario (standard, no visual, tipo datastore), salvalo como por ejemplo 'uds_mi_objeto_datastore' y usa ese en vez de un "datastore".
en vez de:
-------------
datastore lds
lds = create datastore
lds.dataobject = 'mi_dw_que_uso_como_datastore'
lds.settransobject(sqlca)
mrow = lds.insertrow(0)
lds.object.columna1[mrow] = .... // lo mismo que lds.setitem(mrow, 'columna1', ...)
lds.update()
commit;
....
.....
destroy lds
puedes hacer:
-------------------
uds_mi_objeto_datastore lds
lds = create uds_mi_objeto_datastore
lds.dataobject = 'mi_dw_que_uso_como_datastore'
lds.settransobject(sqlca)
mrow = lds.insertrow(0)
lds.object.columna1[mrow] = .... // lo mismo que lds.setitem(mrow, 'columna1', ...)
lds.update()
commit;
....
destroy lds
-----------------------------------------------------------------------------------------------------------
Luego, sobre tu código, está bien salvo por las últimas 2 líneas:
primero tienes que hacer el dw_1.update() y después si esto ha ido bien, así:
if dw_1.update() = 1 then
commit
else
rollback;
end if
para borrar:
dw_1.deleterow(0) ....
if dw_1.update() = 1 then
commit
else
rollback;
end if
para actualizar:
dw_1.setitem(..., .... , ...)
// o dejar al usuario que modifique lo que le de la gana
if dw_1.update() = 1 then
commit
else
rollback;
end if
Si pones algo de código en el evento SqlPreview de un control de datawindow, serás capaz de poner una parada en el depurador y puedes ver lo que realmente está pasando a la hora de ejecutar el dw_1.update( ):
por ejemplo mete algo de código:
integer li_i
li_i = 1
pones una parada de depuración sobre li_i = 1 y verás el sql que en realidad se manda a la Base de datos - cuando haces un update( ) - en los argumentos a este evento sqlpreview.
saludos,
Miguel