Variável Mestre/Detalhes em várias Abas

Olá pessoal,

estou com um seguinte problema que vou tentar resumir aqui:

tenho como modelagem 2 tabelas

create table pai (
id int autoincrement,
nome text
);

create table filho (
id int autoincrement,
nome text,
pai_id int foreign key pai(id)
);

depois criei como “Aplicações em lotes”, uma consulta e um form para cada tabela, gerando:

Consulta pais;
Form pai;
Consulta filhos;
Form filho.

Na Consulta filhos, dentro do SQL coloquei um WHERE pai_id=[var_pai_id].

Dentro do form pai criei uma relação do tipo Mestre/Detalhes para a Consulta filhos tendo como parâmetro var_pai_id recebe campo id.

Dentro do form filho, no campo pai_id coloquei o “Valor Inicial (tipo)” como “Valor Definido” e “Valor Inicial” como [var2_pai_id].

  • Na Consulta filhos, alterei a Ligação entre Aplicações para o form filho, sendo que agora aparece o parâmetro var2_pai_id que coloquei como recebe campo pai_id.

Gerei os códigos, publiquei num lamp e ao acessar a url http://localhost/scriptcase/pais, consegui inserir o pai A, o pai B e o pai C.

Editei o pai A e inseri o filho A1.

Abri outra aba, mantendo a primeira, com a url http://localhost/scriptcase/pais, editei o pai B, e inseri os filhos B1 e B2.

Quando volto no primeira aba, ao tentar inserir um novo filho, o valor inicial do pai_id é do pai B ao invés do A.

Alterei a consulta filhos, na Ligação entre Aplicações para simular outras alternativas, por exemplo, var2_pai_id recebe a variavel var_pai_id, mas o erro permanece.

Tentei alterar o comportamento das variáveis globais para somente GET, porém sem diferença alguma.

Alguém já passou por isso e tem uma alternativa?

OBS: tive que usar a consulta filhos pois na tabela existem vários campos que não são apresentados no mestre/detalhe, somente em edição.

No Scriptcase a variável global ela é persistente e compartilhada, você não pode abrir
a mesma aplicação mais que 1x, tipo a mesma aplicação na ABA1, ABA2, ABA3, etc.
a variável Global vai ser compartilhada entre elas, por isso que você alterou a ABA2
e voltou para a ABA1 ele veio com a variável memorizada que foi atualizada na ABA2.

Mas qual o motivo de abrir a mesma aplicação igualzinha em várias ABAS?

Essa aplicação vai trabalhar com projetos em produção. Então, por mais que orientamos ou restringimos o uso de múltiplas abas, alguns usuários, para fazer a cópia de especificações, acabam por ir na opção de “Abri link em outra aba” dos navegadores. E quando esse usuário abre um projeto para visualizar e outra aba para copiar, as vezes tem a ideia de ir alterando em conjunto os dois projetos, gerando essa inconsistência.

Pensei que essa opção na parte de Variáveis Globais onde setamos SESSION, POST ou GET servisse para alguma coisa. Tentei setar como GET para que por meio do request fosse propagada a informação do mestre para o “subdetalhe” porém não obtive sucesso.

Alguma sugestão para contornar essa situação?

Uma alternativa que tive usando JQuery foi colocar no onLoad do form filho o código:

?>
<script>
	$(document).ready(function() {
		document.getElementById('id_sc_field_pai_id').value = window.parent.document.getElementById('id_read_on_id').innerText;
	});
</script>
<?php

Mas não existe uma opção de passar via parâmetro essa variável de forma única por aba? Ou por POST ou GET?

Não porque você esta usando a mesma aplicação 2 vezes em Abas separadas, para poder fazer isso você teria que duplicar a aplicação renomear ela e usar na outra tela outra variável global renomeada para eles nunca se misturarem.

Mas você não é o primeiro a tentar essa ‘proeza’ hehehe

Sempre aparece alguém aqui no forum tentando isso e com o mesmo problema,
um caso recente:
Conflito entre Abas - Bugs - Scriptcase

O “porque” de usar a aplicação mais de uma vez vem do usuário. Por mais que a gente orienta a não utilizar multi abas, ou até mesmo browsers diferentes, eles acabam fazendo essas façanhas. Daí num teste de uso vi esse comportamento que pode comprometer a consistência do banco.

Como na edição da ligação entre aplicações permite passar um valor de parâmetro, tanto a referente a campo como variável, pensei que isso pudesse ser passado nativamente como parâmetro para a aplicação detalhe e de alguma forma ser recuperada nessa, por exemplo, dentro do detalhe poderia ter alguma macro ou forma de atribuir/acessar esse valor passado por parâmetro.

Infelizmente não, este é o padrão do Scriptcase, o nome da variável global ela
é persistente e única por Sessão do PHP, ai ele vai usar a mesma em qualquer Aba,
Janela ou modal que chamar na aplicação principal chamada.

Esse é numa problema de aplicações php baseadas no script abertas em iframe.
Aplicações baseadas e classe onde podem ser instanciadas inúmeras vezes não sofrem por esse problema, pois cada instância tem um handle diferente na sessão do php.

Não tem jeito e não perca seu tempo com um assunto que se discute a anos e soluções seriam tão desgastantes que não compensa.

Se for necessário a solução é clonar a aplicação n x na quantidade máxima que deseja abrir simultaneamente e controlar quantas já estão abertas.

2 Curtidas