Necesito es que mi datawindows me muestre todos los datos al hacer el retrieve

Tengo un problemón haber si me entienden
Tengo una datawindows que tiene 10 campos de una tabla esta datawindows la uso para
ingresar los datos como para modificarlos.
Pero cuando le hago el dw. Retrieve()
Me da el problema
En la datawindows
Hay 3 campos región ciudad y comuna
Región, ciudad y comuna son dropdawndatawindows
Ciudad y comuna tiene un retrieval argument cada una
cuidad y comuna las controlo en el itemchanged de la datawindows dependiendo de
el código que vaya sacando de región para ciudad y de ciudad para comuna
el problema es que cuando quiero traer los datos
o sea dw_1. Settransobject(sqlca)
dw_1.retrieve()
Me pide los dos argumentos por pantalla o sea el de ciudad y comuna
me imagino que me los pedirá por que las dropdawn poseen argumentos
No se como solucionarlo pues lo que necesito es que me muestre todos los datos
al hacer el retrieve, sin perder la potencialidad de las dropdawn
Agradecería enormemente tu ayuda.
Gracias.
nota = solo comuna se guarda en la la tabla
region y ciudad son campos computados para sacar la comuna
region = ciudad = comuna
Respuesta
1
La solución es no usar parámetros en las dddw.
Si deseas filtrar una segunda DW por algún valor de la primera deberías:
En el evento ITEMCHANGED de la DW, al momento de detectar el cambio en el campo PRIMARIO, realizar un GETCHILD(...) sobre el campo SECUNDARIO y realizar un SETFILTER(...) sobre el mismo.
Por ejemplo, si tenemos un campo RUBRO y otro ARTICULO, donde algunos artículos pertenecen a un rubros y otros artículos a otros rubros, y queremos mostrar en el campo ARTICULO los items pertenecientes al RUBRO actualmente seleccionado, el SCRIPT sería algo así:
// SRIPT para DW_1, ITEMCHANGED
datawindowchild dwc
string s_nulo
// se supone que en la actual DW existe al menos un campo RUBRO y otro ARTICULO
// cada campo asociado a una dw
if dwo.name = 'rubro' then
this.getchild('articulo', dwc)
// en esta linea se supone que:
// 1. el rubro es de tipo STRING
// 2. existe en la dddw un campo llamado codigo_rubro, que tal vez sea NO VISIBLE
dwc.SetFilter("codigo_rubro = '" + data + "'")
// "vacio" el campo articulo, porque, si tenia valores, seguro que pertenecía a otro rubro
SetNull(s_nulo)
this.object.articulo[row] = s_nulo
end if

3 respuestas más de otros expertos

Respuesta
2
Los cursores no son más que tablas temporales que se crean en una base de datos, esta tabla temporal, es accesada por medio del fetch, en algunos casos existen modificaciones del fetch, primero, siguiente, ultimo, etc.
La idea de utilizar un cursor es incluir más de un registro en lo que podríamos llamar una tabla virtual, y por medio del fetch podemos navegar dentro de esta tabla, los campos que componen esta tabla son los que se incluyen dentro del select que acompaña el cursor.
Por supuesto que para poder acceder al cursor primero hay que abrirlo por medio de un OPEN y cuando finalice, cerrarlo por medio de un CLOSE, esto lo puntualizo simplemente porque si el cursor es generado y no abierto, este no podrá ser utilizado, y en el caso ultimo si no es cerrado cuando deja de ser utilizado, entonces la próxima vez puede que provoque un problema cuando intente ser abierto algo que aun no esta cerrado, o aun se mantiene abierto.
Power builder utiliza bastante bien el manejo de los cursores, pero dentro de las especificaciones de este lenguaje, recomiendan utilizar en lugar de los cursores, datastores, estos objetos, son prácticamente un datawindow con todas sus características, pero no son visuales, los datastores, contendrán entonces la información seleccionada por medio de el script correspondiente, con la ventaja que puedes solicitar la información más dinámicamente, en otras palabras navegar completamente dentro del resultado requerido, saltar de fila a fila, o de columna a columna, realmente es más eficiente, no tienes que estar preocupado por el tipo de las variables que vas a declarar para que sean compatibles con los campos solicitados, ni tienes que estar preocupándote de si el cursor fue abierto o cerrado, y lo más eficiente es que permite la navegación y como valor extra, puedes hacer modificaciones de los datos, insertar, borrar, o actualizar cualquier dato si así lo necesitaras, en el caso de hacer este proceso con la ayuda de un cursor, esto tiene que ser tratado de una forma no muy usual pues no puedes actualizar datos en un cursor, si este cursor contiene datos de la misma tabla que esta siendo actualizada.
Espero esto pueda ser de utilidad para resolver tu problema
Gracias por tu respuesta pero disculpa si te hago otra
Para que sirven los cursores y el fetch o sea más que eso en que caso se utilizan y cuando los utilizas cuando es bueno utilizarlos y un pequeño ejemplo si pudieras gracias de antemano
Tu problema esta casi resuelto, pues he notado que controlas los retrieves de los dropdowndatawindow por medios programáticos, sin embargo el problema es que no tienes control al momento de construir la ventana o datawindow.
Para evitar este problema ve al objeto edit que contiene el dropdowndatawindow en el datawindow y busca la propiedad AUTORETRIEVE quítale el check y problema resuelto,
En el caso que no exista esta propiedad en el objeto edit, pues resulta que estas usando una version anterior a esta corrección, la solución debe ser también programática.
Debes hacer lo mismo que haces en el itemchanged por cada dropdowndatawindow, pero en el evento CONSTRUCTOR, o sea cuando el objeto datawindow va a ser creado, pues en ese momento es cuando se activa el autoretrieve, después de este me imagino que ya no te da ese problema.
Respuesta
1
Bien, antes de realizar el retrieve de la datawindows, tienes que realizar los retrieves de los dropdowndatawindows.
En el constructor del objeto datawindows, en la ventana, debes de realizar lo siguiente:
Datawindowchild ldwc
Long ll_retrieve
this.GetChild('comuna',ldwc)
ldwc.SetTransObject(SQLCA)
ll_retrieve = ldwc.Retrieve()
if ll_retrieve = 0 then
ldwc.InsertRow(0)
end if
Si necesita el dropdowndatawindos de comuna algún argumento, lo debes de especificar en el ldwc. Retrieve()
Lo de ldwc. Insertrow(0) que aparece es por si no ha encontrado registros, sucede que al realizar el retrieve de la dw_1 nos puede volver a pedir los argumentos.
Si prefieres, en vez del construcor de la dw_1 puedes hacerlo ( si lo que tienes es una datastore ) en el open de la ventana, sustituyendo el this. Por el nombre del objeto.
Respuesta
1
Lo que tienes que hacer es Antes del retrieve hace un getchild.
A la datawindowchild hacele retrieve con un parámetros que haga que traiga todos los registros.
Si también haces esto en el itemchanged tal vez te convenga tener una variable de instancia.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas