Inicio > Power Builder > franktwen > el closetab y opentab de un control tab?

el closetab y opentab de un control tab?

Experto:
Usuario:
Fecha: 16/07/2009
Valoración: (3,00 sobre 5) Categoría: Power Builder
01/07/2009
marosim65, usuario preguntando en Power Builder
Usuario
en power builder 9.0 al aplicar el closetabpage a  todo los tabpage de un tab y luego al mismo control tab le voy agregando tabpage con opentab, a este no se visualiza su datawindows porque  pasa?
tengo una ventana diagramada a tres columna de esta forma:
un dw_external (parte superior izquierda) con nombre dw_pcnte
columnas
  1era columna un treeview  con nombre tv_1
  2da columna un tabcontrol  con nombre tab_1
  3era columna un treeviewv  con nombre tv_2.
funcionamiento.
1. Debe seleccionarse un paciente del dw_pcnte
2. Inmediatamente, se armar los componentes de la historia clinica (HC) del paciente
para ser diligenciada por el medico (esto se muestra en el control tv_1)
3. al dar click en un componente de la HC del control tv_1 se va creando una pestanna en el tab_1 mostrando el datawindows para capturar los datos o informacion asociada a este instrumento de recoleccion de datos. Este paso se repite en la media que sea demandado por el medico que diligencia la HC
4. Una vez que esta seguro que se ha finalizado la atencion del paciente, se graba
y se comienza nuevamente los pasos del 1 al 4.
Todo esto lo hace correctamente la interface grafica, el error o el funcionamiento inadecaudo es: al tomar un nuevo paciente se cierran todas los tabpage del tab_1, para este nuevo paciente se hacen los pasos 1,2 ok y el tercero es defectuoso y por ende igualmente el cuarto, debido a que se crea la pestanna pero no se muestra el datawindows en el control tab_1.
para entender esto y encontrar el punto de inflexion se debe tener en cuenta lo siguiente:
1.al seleccionar un nuevo paciente se ejecuta el evento postitemchanged() del control dw_pcnte,
si el nuevo paciente que se elige es diferente al anterior se cierran todas las pestannas del control tab_1 y se hace una apertura nuevamente del control tab. esto se hace con esta sintaxis:
if is_id_pcnte_antrior<>is_id_pcnte and is_id_pcnte_antrior<>'0' then
  ll_tme=ll_tme+1 
  em_1.text=string(ll_tme)
  messagebox("ll_tme",ll_tme)
  parent.event pfc_crrar_tabpage() /*cierra los tabpage del tab_1
  parent.event pfc_abrir_tabpage() /*inicia los tabpage del tab_1
end if
is_id_pcnte_antrior=is_id_pcnte 
esto lo realiza correctamente
2. cuando se arma los componentes de la HC y se da click en un de ello se ejecuja el evento selectionchanged() y es aqui donde no funciona correctamente,la sintaxis es
{
string ls_dw,ls_cdgo_det_cmpnnte_hc
TreeViewItem item_actual
long posx,posy,cont
int li_index,li_row
boolean lb_sw
 
GetItem(newhandle,item_actual)
ls_cdgo_det_cmpnnte_hc=item_actual.data
li_index=long(ls_cdgo_det_cmpnnte_hc)+2
li_row=5
lb_sw=false
do while lb_sw=false and li_row<=li_index
  if indeces[li_row]=li_index then
  lb_sw=true 
  else
    li_row=li_row+1
  end if 
loop
indeces[li_index]=li_index
ii_actual=li_index
if lb_sw=false then
  if nv_hc.of_retrieve_det_cmpnnte_hc(ls_cdgo_det_cmpnnte_hc)  then   
    is_dw=nv_hc.of_get_nmbre_dw_hc() 
    if not isnull(is_dw) and item_actual.children=false then
 il_ttaltabpge=il_ttaltabpge+1  
        ltab_tab.opentab ( luo_tabpage [li_index] , 0)
 luo_tabpage [li_index].text          = nv_hc.of_get_text_dw_hc()
 luo_tabpage [li_index].backcolor     = ltab_tab.backcolor
// luo_tabpage [li_index].powertiptext  = nv_hc.of_get_nmbre_dw_hc()
 luo_tabpage [li_index].picturename   = nv_hc.of_get_pctre_dw_hc()
 luo_tabpage[li_index].dw_1.dataobject  = is_dw /*en esta linea del codigo es donde se genera el inconveniente
 luo_tabpage[li_index].dw_1.hscrollbar =true
 luo_tabpage[li_index].dw_1.vscrollbar =true
 luo_tabpage[li_index].dw_1.livescroll =true
 luo_tabpage[li_index].dw_1.hsplitscroll =true
 luo_tabpage[li_index].dw_1.Of_SetUpdateable  (true) 
 luo_tabpage[li_index].dw_1.of_settransobject ( sqlca)
 lpo_objs [li_index]  = luo_tabpage[li_index].dw_1
 ldw_current = luo_tabpage [li_index].dw_1 
        if is_dw='d_mnt_pcnte_hc' then
   luo_tabpage[li_index].dw_1.retrieve(gs_emprsa,is_id_pcnte,is_tpo_id)
       else
           luo_tabpage [li_index].dw_1.Event pfc_addrow()
           if is_dw<>'d_mnt_pcnte_hc' and is_dw<>'d_mnt_hc_rips'  then
             luo_tabpage [li_index].dw_1.Object.cdgo_emprsa       [luo_tabpage [li_index].dw_1.getrow()] = gs_emprsa
             luo_tabpage [li_index].dw_1.Object.cdgo_scrsal  [luo_tabpage [li_index].dw_1.getrow()] = gs_scrsal
             luo_tabpage [li_index].dw_1.Object.id_pcnte   [luo_tabpage [li_index].dw_1.getrow()] = is_id_pcnte
             luo_tabpage [li_index].dw_1.Object.tpo_id   [luo_tabpage [li_index].dw_1.getrow()] = is_tpo_id
             luo_tabpage [li_index].dw_1.Object.nmro_mvmnto  [luo_tabpage [li_index].dw_1.getrow()] = il_mvmnto
             luo_tabpage [li_index].dw_1.Object.usrio         [luo_tabpage [li_index].dw_1.getrow()] = gnv_app.of_GetUserId()
             luo_tabpage [li_index].dw_1.Object.fcha_cntrol   [luo_tabpage [li_index].dw_1.getrow()] = f_get_datetime()
          ELSE
              luo_tabpage [li_index].dw_1.Object.cdgo_emprsa       [luo_tabpage [li_index].dw_1.getrow()] = gs_emprsa
              if is_dw<>'d_mnt_pcnte_hc' then
       luo_tabpage [li_index].dw_1.Object.cdgo_scrsal  [luo_tabpage [li_index].dw_1.getrow()] = gs_scrsal
       luo_tabpage [li_index].dw_1.object.nmro_id_prfsnal [luo_tabpage [li_index].dw_1.getrow()] = is_id_prfsnal
              end if
               luo_tabpage [li_index].dw_1.Object.usrio_ingrso      [luo_tabpage [li_index].dw_1.getrow()] = gnv_app.of_GetUserId()
               luo_tabpage [li_index].dw_1.Object.fcha_ingrso  [luo_tabpage [li_index].dw_1.getrow()] = f_get_datetime()
          end if 
        end if   
     end if 
  end if 
end if
parent.Of_SetUpdateObjects ( lpo_objs )
tab_1.event getfocus()
}
te agrezco, la atencion y colaboracion prestada
03/07/2009
marosim65, experto respondiendo en Power Builder
Experto
Vaya pregunta.  De antemano te sugiero tomes esto en consideración: 1) porqué en vez de estar abriendo y cerrando tabpages simplemente no lo ocultas y muestras?.  2) Estás asegurando la limpieza de todos tus controles cuando te cambias de paciente?.  3) Estos tabpages son userobjects?
04/07/2009
marosim65, usuario preguntando en Power Builder
Usuario
respuesta al inciso o numeral 3 de tu respuesta es, si es un userobject (objecto oculto) que es una ventana que tiene un datawindow. Ademas, estoy trabajando con las pfc (power foundation class -no se si se escribe asi-) e igualmente con herencia de objetos.
Realice una prueba sin hacer closetab ni opentab sino que hize una funcion que recorriera los tabpage abierto y realizara un retrieve (con sus parametros requeridos) a cada uno de lo datawindow que estan empotrado en la pagina . el resultado de esto, es que lo realiza bien pero al dar click (en tv_1 ) en un componente de hc que no estaba previamente abierto ocurre el mismo error. Es decir, funciono a medias y sin zapato.
opte por, esta solucion no tan adecuada, si EL MEDICO habia iniciado el proceso de diligneciamiento de un o varios componente de la hc de un paciente y el intentara escoger  otro paciente no se lo permito, hice ese control. Ademas, le notifico que debe guardar esa hc o cerrar LA VENTANA Y vaya al menu y escoga la opcion de iligenciamiento de la hc en consulta externa y tome un nuevo paciente. Si al guarda ese iligenciamiento, lo que hago es un close(parent) y el medicoo deb ir al menu y escoga la opcion de diligenciamiento de la hc en consulta externa para un nuevo paciente y asi no ocurre ningun error. esta solucion no me satisface para nada (no es beneficiosa al usario final ).
voy a intentar con ocultar y mostrar para ver si funciona. Gracias por la respuesta. estamos QAP
08/07/2009
marosim65, experto respondiendo en Power Builder
Experto
A mí tampoco me gusta esa implementación, sobre todo con médicos que son usuarios bien complejos.  No entiendo la necesidad de hacer retrieve a todos los datawindows de todos los tabpages (esto puede minimizar la velocidad del sistema), sería mejor que hicieras retrieve en el selectionchanged del tabpage que el usuario seleccionó.
Valida mejor lo que deseas hacer y evita realizar cierres y aperturas de ventanas innecesarias (implementa solo lo necesario, es lo más conveniente).
16/07/2009
marosim65, usuario preguntando en Power Builder
Usuario
gracias por tu ayuda, ya encontré la forma de hacerlo
Enlaces patrocinados