Menu com problema em componentes compartilhados

Boa tarde!

No meu projeto tenho alguns forms e grids “internos” que são reutilizados por varios forms e grids chamados diretamente por itens de menu diferentes. Até aí tudo bem…

Enquanto estava executando as aplicações “soltas”, tudo corria bem com esse compartilhamento, pois ao executar, a nova aplicação fechava a que estava aberta e me parecia abrir uma nova instância (desconfio)… até aí tudo bem novamente…

Mas ao colocar as aplicações no menu horizontal, como ele vai abrindo cada aplicação em novas abas (mantendo as aplicações abertas até que fechemos no “x”), estou tendo problema com os forms e grids internos compartilhados, pois a variável em memória não me parece ser independente e faz com que os dados de ultimo app aberto influencie nos apps abertos anteriormente. Ou seja, prevalece sempre os dados do último aberto.

O menu não deveria criar uma “instância” diferente e independente para cada item de menu aberto?

OBS: O problema ocorre somente quando a opção do item de menu está em “Abrir na mesma janela”. Por enquanto estou contornando o problema com a opção “Abrir em outra janela”, mas acho a primeira opção mais organizada.

Desde já agradeço a ajuda.

Obviamente estas informações derivam-se de variáveis globais, dados esta situação você deverá resetar sempre as variáveis globais, veja esta questão lá no login, já tem por padrão que é feito este reset, caso seja necessário antes do select que é feito em uma determinada aplicação para gerar esta global, realize também antes deste select em questão este reset, e logo não terá mais problemas com a permanência destas informações…

Favor clicar no ícone de “coração”, para que eu possa estar colaborando com outras respostas.

Desde já agradeço pela sua ajuda.

O problema não está em variáveis globais de sessão e sim nas globais da aplicação, que no meu entender deveriam estar em “instâncias” separadas (uma para cada item de menu aberto.

As variáveis globais da aplicação (sem ser sessão) estão sendo resetadas quando as aplicações são abertas, mas não é esse o problema.

Ocorre que quando estou com uma aplicação já aberta, com todos os selects e regras de exibição de itens de acordo com uma condição específica, e resolvo abrir um outro item de menu que chame outra aplicação que compartilhe dos mesmos forms/grids internos, a aplicação que já estava aberta assume os dados em memória da ultima aplicação. Isso faz com que eu esteja, por exemplo, com os dados de uma Pessoa Física na tela e se clicar em Salvar, a aplicação tenta salvar os dados de uma Pessoa Jurídica que foi carregada na ultima aplicação.

O problema é de convivência de duas aplicações que compartilham dos mesmos componentes internos, enquanto estão abertas simultaneamente.

Tenho questões parecidas… no início da aplicação faça assim:
{variavelLocal} = ’ ';
Resolverá teu problema, mas normalmente este problema é pertinente em modo de desenvolvimento, em produção nunca vi ocorrer.

Favor clicar no ícone de “coração”, para que eu possa estar colaborando com outras respostas.

Eu já faço esse tratamento. Como disse antes, o problema não é na inicialização. A aplicação aberta por ultimo sempre vai funcionar corretamente.

O problema está na aplicação que já estava aberta e que já passou pela inicialização, realizou select, exibiu ou inibiu blocos/campos de acordo com o parâmetro de entrada… e de repente as variáveis são sobrepostas pelo conteúdo da execução mais recente.

Um exemplo:
Imagine que você um cadastro de Cliente Pessoa Física e Pessoa Jurídica.
Como ambos são Pessoas, você faz a opção de criar uma única tabela.
Sabendo que cada tipo de Pessoa tem algumas especificidades, resolve criar dois itens de Menu, um para Pessoa Física e Outro para Pessoa Jurídica… ambos sendo uma grid que depois chamam um mesmo form de Pessoa que de acordo com o tipo de Pessoa, apresenta um layout diferente.

Você chama o item de Menu Pessoa Física, a grid é carregada, você escolhe uma Pessoa Física, faz uma ligação com o form Pessoa e esse form identificando ser a pessoa e o tipo, carrega os dados e apresenta o layout Pessoa Física… OBS: Aqui já se resetou a variavel global de entrada.

Você deixa a tela com o form Pessoa com os da de PF aberta e resolve abrir outro item de Menu Pessoa Jurídica…

Você chama o item de Menu Pessoa Jurídica, a grid é carregada, você escolhe uma Pessoa Jurídica, faz uma ligação com o form Pessoa (que é o mesmo form usado anteriormente) e esse form identificando ser a pessoa e o tipo, carrega os dados e apresenta o layout Pessoa Jurídica… OBS: Aqui também já se resetou a variavel global de entrada e os dados são carregados perfeitamente.

Agora volte na aplicação anterior que carregou os dados de Pessoa Física e tente fazer alguma operação que dependa da variavel global que deveria estar com o id da Pessoa Física… verá que ela foi atualizada com o id da Pessoa Jurídica.

O esquema está nesta ligação…

Para que uma aplicação seja utilizada como subconsulta, ela deve ter dentro de seu Comando SQL ( Consulta > SQL ) uma cláusula WHERE com variável global.

*Configuração do SQL da Consulta que será usada como subconsulta através de ligação.

Veja esta parte na documentação, só leve em conta esta parte, é muito importante não criar variáveis antes somente para ligar aplicações, mas criar uma cláusula e passar como parâmetro…

  • Definição dos parâmetros : Definindo o valor que será passado para a(s) variável(is) do Comando SQL da subconsulta.

Passagem de parâmetro para variável

Joelton, te agradeço por estar tentando ajudar, me desculpe por ocupar seu tempo num Domingo de Páscoa (Aliás, Feliz Páscoa pra ti), mas estou falhando em lhe transmitir o problema que está ocorrendo.

O que você transcreveu acima, eu já faço.

Nesse Mapa tento explicitar o que descrevo.

O problema ocorre somente se os dois itens de Menu estiverem abertos simultâneamente na mesma tela do Menu… nessa situação, as variáveis globais da aplicação form_Pessoa_Atual pra frente (forms e grids seguintes) sempre ficarão sendo sobrepostas em Pessoa Física e Pessoa Jurídica… quem alterar a variável por ultimo, prevalece…

Se form_pessoa_atual é carregado mais de uma vez dentro do menu simultaneamente e esta se utiliza de globais cujos os valores são diferentes em cada carregamento do app, terás problema realmente.Aplicações SC se utiliza de sessões do tipo array cujo o índice principal é o nome da aplicação. Ao realizar a segunda carga da app com ela já aberta em aba anterior do menu vai estar reiniciando as globais que afetarão os valores das mesmas globais na primeira carga.

Haroldo, obrigado pelo esclarecimento!

Esse tipo de situação não tem jeito? Acho ruim ser obrigado a duplicar componentes que poderiam e por “melhores práticas” deveriam ser compartilhados.

No meu entendimento é uma grande falha não criar instâncias independentes para cada item de menu aberto.

O contorno que estou usando por enquanto é a opção de abrir em nova janela, mas a opção do menu de abrir na mesma janela deixa muito mais organizado. Sendo assim, poderei resolver colocando um app antes onde selecionarei o tipo de pessoa e aí sim redirecionar para Física ou Jurídica. Desta forma nunca ficará um form de Pessoa Física e outro de Pessoa Jurídica abertos simultaneamente.

Mas de fato acho ruim isso, pois podemos ter situações onde queremos fazer reuso de componentes e não poderemos.

Não considera isso um bug?

Não é BUG.
Não é um problema do Scriptcase.
É uma questão do PHP. Mesmo browser mesmo id de sessão.
Tente abrir duas instâncias do Facebook com usuários diferentes no mesmo Browser…

Daria para :
carregamento 1 app xyz->
session_name(“sessao1”):
session_start();

carregamento 2 app xyz->
session_name(“sessao2”):
session_start();

Mas como controlar dinamicamente o nome da sessão e tem que executar antes do session_start() já embutido nas aplicações Scriptcase?

Talvez chamando um script php (não pode ser app Scriptcase) passando um id de sessão diferente e o nome da app a ser carregada via iframe. Não sei, só fazendo testes.

2 Curtidas

Entendi Haroldo. Você tem razão!

Vou tentar uma solução, o caminho pode ser esse que indicou…

Tenho muitos componentes reutilizados em várias situações, então não dá pra ficar dependente dessa limitação.

1 Curtida