Power Builder - filtros multiples

   
Vista:

filtros multiples

Publicado por werner (4 intervenciones) el 09/09/2009 19:06:54
Jancarlo, tienes razón.

Voy a formular la pregunta de otra manera.

Lo que deseo es hacer mi consulta filtrando datos de un Datawindow por DEPARTAMENTO, PROVINCIA,DISTRITO, SERVICIO, Y AUTORIZACIÓN. todas a la vez o DEPARTAMENTO, PROVINICA, DISTRITO Y SERVICIO solamente.

El departamento, provincia, distrito debo utilizar el DDDW y Servicio y autorización lo debo hacer mediante un DDLB.

Ejemplo:

codigo DEPARTAMENTO PROVINCIA DISTRITO SERVICIO FREC. AUTORI.
0567 Junin Huancayo Chilca FM 98.5 SI
0897 Junin Huancayo Chilca FM 104.5 SI

Ahora, si doy enter en el registro de la fila con código 0657 , me deben salir todos los datos de ese registro.

Espero me haya expresado de la mejor forma.

Gracias de antemano.
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

RE:filtros multiples

Publicado por Leopoldo Taylhardat (691 intervenciones) el 10/09/2009 16:40:49
Asumo que son dos objetos de la ventana..
...
creas un datastore (dw no visible) para obtener los servicios de ese departamento con un dw que filter por departamento, por ej. se llama dddw_servicios_x_departmento
...
en el rowfocuschanged del dw de departamento...
obtienes el valor del código...
long ll_codigo=this.getItemNumber(this.getRow(),'codigo')
datastore ds_servicios
ds_servicios.DataObject='dddw_servicios_x_departmento'
ds_servicios.SetTransObject(SQLCA)
ds_servicios.retrieve(ll_codigo)

...y los valores que obtengas en ese datastore lo pasas al ddlb...
lb_procesos.Reset()
ciclo de agregar servicios...
long ll_row=1, ll_rows
ll_rows=ds_servicios.RowCount()
do while ll_row <=ll_rows
lb_procesos.additem(ds_servicios.GetItemString(ll_row,'servicio'))

ll_row ++
LOOP
...
Si son dos columnas en un dw... trabajas con el evento 'itemchanged' del dw
CHOOSE CASE dwo.name
CASE 'departamento'
long ll_codigo=long(data)
datastore ds_servicios
ds_servicios.DataObject='dddw_servicios_x_departmento'
ds_servicios.SetTransObject(SQLCA)
ds_servicios.retrieve(ll_codigo)

...y los valores que obtengas en ese datastore lo pasas al ddlb...

ciclo de agregar servicios...
long ll_row=1, ll_rows
ll_rows=ds_servicios.RowCount()
do while ll_row <=ll_rows
//Modificar desde script el contenido del campo del dw estilo ddlb
//lo q quieres es modificar desde script el contenido del campo del dw estilo ddlb tienes
//que generar un string con la lista a cargar
//en esa cadena de caracteres va la lista q se muestra como asi tambien el dato q se grabara
// separados por tabulador "~t"entre desplegar y valor del dato, y termina con "/"para separar los items...

THIS.Object.SERVICIOS.Values = ds_servicios.GetItemString(ll_row,'servicio')+"~t"+ds_servicios.GetItemString(ll_row,'servicio')+"/"

ll_row ++
LOOP
END CHOOSE
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

RE:filtros multiples

Publicado por miguel (153 intervenciones) el 11/09/2009 14:30:13
estoy de acuerdo que el anterior método funcionará:

Personalmente haría uso de getchild ( )
cosa que puedes hacer es:

definir el where del select del datawindow que usas en la columna con dddw de una forma "dual / con trucillo":

select .......
from ......
where col1 = :arg1 and
col2 = :arg2 and
col3 = :arg3 and
col4 = :arg4 and
( col5 = :arg5 OR :arg5 = '[sin filtro5]' )

con esto la última expresión siempre devolvería true cuando le pasas '[sin filtro5]' en el retrieve para el argumento 5, y filtraría a un valor determinado si le pasas un valor existente o no en la base de datos.

en el rowfocuschanged:

datawindowhild ldwc

getchild( 'mi_col_para_arg5', ldw)
ldwc.settransobject(sqlca)
arg1 = ....
arg2 = ....
etc
if ... no filtrar then
arg5 = '[sin filtro5]'
else // sí quieres filtrar
arg5 = ... algun valor que obtienes
end if

ldw.retrieve( arg1, arg2, arg3, arg4, arg5)

si esto supone que el select se vuelve demasiado lento lo que puedes hacer, es usar dos datawindows distintos: uno con 5 y otro con 4 argumentos. el el rowfocuschanged tendrías que hacer un modify( ) sobre la columna en cuestión para asignar un dddw u otro. Luego no haría falta el 'trucillo' con el "OR arg5 = '[sin filtro]' " ya que cada datawindow tendría sólo los argumentos que realmente necesita. (uno con 4 y otro con 5).

saludos

Miguel
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

RE:filtros multiples

Publicado por werner (5 intervenciones) el 14/09/2009 21:59:39
Gracias Leopoldo y Miguel, me dieron una excelente ayuda, el panorama para mí está mucho más abierto, 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