Autor Tópico: Como atualizar um componente em outra janela?  (Lida 4886 vezes)

Alexandre Thees

  • Newbie
  • *
  • Mensagens: 9
  • Karma: +0/-0
Como atualizar um componente em outra janela?
« Online: Abril 22, 2014, 07:07:13 pm »
PessoALL,

Boa noite!

Surgiu uma situação aqui que não estamos conseguindo contornar no WebDEV usando nossos antigos paradigmas.

O cenário é o seguinte:

Temos uma tela com uma tabela que mostra uma relação de equipamentos. Ao selecionar uma linha dessa tabela e clicar no botão "Atualizar" ou "Novo", uma nova janela se abre (novo navegador) para que o usuário possa alterar dos dados do equipamento ou incluir um novo. Até aqui tudo Ok, funcionando!

O problema é que depois da alteração ou inclusão de um equipamento, precisamos atualizar a table do formulário anterior e não estamos conseguindo uma maneira de fazer isso. Já tentamos dar um TableDisplay(nomeDaOutraPagina.Tabela) e não funciona; tentamos chamar uma procedure Servidor através de uma Procedure Browser, mas, não conseguimos fazer isso (tem jeito???).

Alguém poderia ajudar-nos?

Grato,


Alexandre Thees

Jose Jorge Matos

  • Jr. Member
  • **
  • Mensagens: 95
  • Karma: +0/-0
Re:Como atualizar um componente em outra janela?
« Responder #1 Online: Abril 22, 2014, 09:27:22 pm »
Alexandre,

Qual a versão do WB?

Se for a 18, sugiro uma página popup em vez de nova página em novo navegador. Tenho explorado e implementado popups e funcionam bem, por exemplo antes da instrução PopupClose(p_pagina_popup) posso fazer:
TableDeleteAll(<pagina master>.Table_1)
TableDisplay(<pagina master>.Table_1,taReExecuteQuery)

Voltando ao seu método de abrir uma nova página que chamarei de PaginaAlterarEquipamento. Como você faz para fechar essa página? PageDisplay(PaginaRelacaoEquipamentos)?

Sabe qual o primeiro evento que é executado depois dessa instrução? No help o Alexandre encontra esta explicação e respetiva sequência de execução:

The following processes are run when the page is displayed:
•Opening code of the page (Initialization of ...)
•Initialization code of controls
•Display the page in the browser
•Javascript code associated with the page and the controls
•WLanguage code following the call to PageDisplay (if any)

No evento Load (onload) of PaginaRelacaoEquipamentos (browser) coloque:
AtualizarPaginaRelacaoEquipamentos()
Criar uma Local Procedure server e não browser como explicou que está fazendo, com o nome AtualizarPaginaRelacaoEquipamentos()
Coloque nessa procedure o código para atualizar a pagina PaginaRelacaoEquipamentos.

Execute PaginaRelacaoEquipamentos e acesse PaginaAlterarEquipamento. Faça uma alteração, encerre esta segunda página e pode observar que PaginaRelacaoEquipamentos foi atualizada.

Para terminar: não vejo vantagem em abrir  PaginaAlterarEquipamento numa nova página do navegador. Isso pode fazer com o usuário abra varias páginas (é isso que você pretende?) em vez de apenas uma de cada vez.

Cptos.
José Jorge Matos

 

eduardowolak

  • Full Member
  • ***
  • Mensagens: 146
  • Karma: +0/-0
Re:Como atualizar um componente em outra janela?
« Responder #2 Online: Abril 23, 2014, 07:23:19 am »
Olá!

     Eu faço isso utilizando o PageDisplayDialog, aonde o Webdev fica aguardando a resposta da janela anterior, e logo após o usuário alterar ou incluir um registro novo eu atualizo o meu Looper ou Table com a função Position(LooperPosition ou TablePosition), isso após realizar um novo "select" daquele registro.
     Mas no Webdev tem um exemplo utilizando JavaScript, o exemplo é "WWBrowserDialog".

Wolak.

Jose Jorge Matos

  • Jr. Member
  • **
  • Mensagens: 95
  • Karma: +0/-0
Re:Como atualizar um componente em outra janela?
« Responder #3 Online: Abril 23, 2014, 07:39:37 am »
Olá!

     Eu faço isso utilizando o PageDisplayDialog, aonde o Webdev fica aguardando a resposta da janela anterior, e logo após o usuário alterar ou incluir um registro novo eu atualizo o meu Looper ou Table com a função Position(LooperPosition ou TablePosition), isso após realizar um novo "select" daquele registro.
     Mas no Webdev tem um exemplo utilizando JavaScript, o exemplo é "WWBrowserDialog".

Wolak.

Alexandre,

Repare que o Wolak também consegue editar um registo sem abrir outra página no browser.

Acredito que com PageDisplayDialog também resolverá a sua dificuldade.

Pessoalmente não (re)atualizo loopers ou tables apenas com base na linha editada. Prefiro reatualizar todo o conteúdo para adequação aos cenários de utilização em ambiente multiusuário.

Dito de outra forma, julgo que é preferível voltar a obter a listagem completa para tornar a preencher o looper ou table em vez de fazer apenas um select ao novo conteúdo da linha que acabou de ser editada. 

Impacto no desempenho da aplicação ou site? Depende, mas na maioria dos casos será praticamente nulo e tem a vantagem de garantir fiabilidade de informação.

Cptos.
JJM

Alexandre Thees

  • Newbie
  • *
  • Mensagens: 9
  • Karma: +0/-0
Re:Como atualizar um componente em outra janela?
« Responder #4 Online: Abril 23, 2014, 10:18:10 am »
Prezados José Jorge e Eduardo,

Obrigado pela atenção e pelas respostas!

Vou implementar as soluções indicadas e ver se consigo obter o resultado desejado.

Att.,

Alexandre Thees

Alexandre Thees

  • Newbie
  • *
  • Mensagens: 9
  • Karma: +0/-0
Re:Como atualizar um componente em outra janela?
« Responder #5 Online: Abril 23, 2014, 10:58:40 am »
Jose Jorge,

Tentei seguir suas orientações:

    No evento Load (onload) of PaginaRelacaoEquipamentos (browser) coloque:
    AtualizarPaginaRelacaoEquipamentos()
    Criar uma Local Procedure server e não browser como explicou que está fazendo, com o nome AtualizarPaginaRelacaoEquipamentos()
    Coloque nessa procedure o código para atualizar a pagina PaginaRelacaoEquipamentos.

Entretanto, quando chamo a função AtualizarPaginaRelacaoEquipamentos() que foi criada como Local Procedure server, ela fica grafada em vermelho no evento Load (onload) of PaginaRelacaoEquipamentos (browser). Daí o motivo da minha pergunta no post inicial "tentamos chamar uma procedure Servidor através de uma Procedure Browser, mas, não conseguimos fazer isso (tem jeito???)"...

Tentei contornar o problema acima criando a mesma função AtualizarPaginaRelacaoEquipamentos() como Local Procedure browser, mas, os comandos que preciso HExecuteQuery() e TableDisplay() não são compatíveis com esse Local.

Com isso fiquei numa sinuca de bico: preciso chamar uma função que só pode ser escrita como Procedure Servidor a partir de um evento que só existe no Browser. Como proceder?

Quanto às outras duas opções POPUP e DialogPage, observeir que ambas são do tipo MODAL e, com isso, uma vez abertas, não permitem a iteração com a página anterior, onde tenho o menu, filtros etc. No nosso caso, o usuário pode necessitar abrir mais de uma janela ao mesmo tempo de forma a buscar informações de uma tela para auxiliar no preenchimento das demais...

Dicas???

Att.,


Alexandre Thees

Jose Jorge Matos

  • Jr. Member
  • **
  • Mensagens: 95
  • Karma: +0/-0
Re:Como atualizar um componente em outra janela?
« Responder #6 Online: Abril 23, 2014, 12:31:46 pm »

Entretanto, quando chamo a função AtualizarPaginaRelacaoEquipamentos() que foi criada como Local Procedure server, ela fica grafada em vermelho no evento Load (onload) of PaginaRelacaoEquipamentos (browser). Daí o motivo da minha pergunta no post inicial "tentamos chamar uma procedure Servidor através de uma Procedure Browser, mas, não conseguimos fazer isso (tem jeito???)"...


Oops ...

Faltou-me precisamente dizer como chamar uma server procedure num evento de código browser.

Recorra à função ExecuteProcess() com a constante trtClick.

Coloque um botão invisível, por exemplo BTN_AtualizarEquipamentos. Tratando-se de um botão, já temos duas áreas para incluir código browser ou servidor. Nesta última (Click of  BTN_AtualizarEquipamentos (server) coloque AtualizarPaginaRelacaoEquipamentos()

Só falta executar o evento Click do botão. No evento Load (onload) of PaginaRelacaoEquipamentos (browser), em vez de chamar a server procedure, coloque  ExecuteProcess(BTN_AtualizarEquipamentos, trtClick ).

Este método serve precisamente para os casos em que nos deparamos com a necessidade de invocar uma server procedure num evento de código browser. É o que acontece consigo, precisa de uma server procedure porque necessita de executar, entre outras, a função HExecuteQuery() que, como você disse e muito bem, só pode ser executada do lado do servidor.

Já agora uma dica: ative o ajax no código de servidor do botão.

Cptos.
José Jorge Matos
 

Silfar

  • Newbie
  • *
  • Mensagens: 4
  • Karma: +0/-0
Re:Como atualizar um componente em outra janela?
« Responder #7 Online: Junho 10, 2014, 09:31:01 am »
José Jorge, também pensei como você em relação a usar popups, me pareceu muito mais pratico, mas me deparei com um problema que talvez vc tenha achado solução.

Usando um popup para cadastro, pode haver necessidade de editar registros numa tabela auxiliar por exemplo tabela tipos de produto, geralmente eu usa uma tela com uma tabela, pois é uma inclusão rápida, e geralmente para usar em combobox, mas aí vem o problema pelo que vi um popup não pode chamar outro, ou até pode mas o resultado não bom.

Como você resolveu este tipo de situação ?

Leonardo Vilani

  • Newbie
  • *
  • Mensagens: 43
  • Karma: +0/-0
Re:Como atualizar um componente em outra janela?
« Responder #8 Online: Junho 10, 2014, 04:59:48 pm »
Pessoal no meu caso resolvi da seguinte forma, inclui no inicialization da pagina que contem a tabela a função taledisplay(nometabel), no formulário sempre depois da gravação retorno a essa página om o pagedisplay(), assim sempre atualiza.

Jose Jorge Matos

  • Jr. Member
  • **
  • Mensagens: 95
  • Karma: +0/-0
Re:Como atualizar um componente em outra janela?
« Responder #9 Online: Junho 10, 2014, 05:04:29 pm »
Silfar,

Uma alternativa é experimentar a função CellDisplayDialog() para abrir o popup de edição do cadastro.

Consulte estes links:
http://help.windev.com/en-US/?1012026
http://help.windev.com/en-US/?1012026#NOTE2_3
http://help.windev.com/en-US/?1000017139&name=celldisplaydialog_function

Nos testes que efetuei, é possível a partir de uma página aberta com a função CellDisplayDialog() abrir outra popup com PopupDisplay() para exibir o conteúdo de uma tabela auxiliar, no seu caso, a tabela de tipos de produto.

Só que, ao fechar esta segunda página do tipo popup, a primeira também é fechada no browser.

Por isso e porque acredito que a tabela de tipos de produto não terá centenas de registos, acredito que a melhor solução será você optar por uma única popup para edição do cadastro, colocando o "Tipo de produto" numa combobox.

José Jorge Matos