Como fazer um Mestre-Detalhe igual ao MD do Desktop?

Olá pessoal, essa semana me apareceu um pedido de um cliente se queixando da forma que estava usando os meus Mestres-Detalhes nativos do SC. Então resolvi estudar de como fazer parecido com o velho Mestre-Detalhe “Delphiano”.

Ficou muito bom, se não fosse pelo Bug do SC estaria 100%. Mas da pra usar!

Espero que gostem!

Link: https://www.youtube.com/watch?v=b8UNKps4NiA&feature=youtu.be

Abraço a todos!

Parabéns, ficou muito bom esta quase igual ao EJS TreeGrid:
Nesse link tem um demo ativo, é só brincar nele ao vivo.
http://www.treegrid.com/treegrid/www/?gclid=CMWnz7v8hcMCFfLm7Aod1XgAcg

Legal compartilhar, eu uso esse esquema há bastante tempo mas não tinha pensado em compartilhar…

o show de bola.

Muito bom mesmo… Nunca pensei que dava para fazer isso tão simples assim e bem funcional. Só não conseguir ver o que pode dar errado. Parabéns e com certeza vai ser muito útil a todos.

Fica ai a dica para NM fazer isso por default.

Concordo Celso, isso já deveria vir como Default na ferramenta. Não só isso mas por exemplo: botões de update e delete em consultas nativo e os botões com mensagens de pré-avisos a serem predefinidas. Também no menu Horizontal colocar SETAS (Esquerda e Direita) para os itens pais de menu deslizar caso tenha muito itens. Mas até ai blz… da pra se virar, contando que a NM corrija os Bug’s que nesse caso só eles podem resolver, ai o resto a gente se vira nos 30 né… hehehe!

So para matar minha duvida si por acaso o cliente resolve abortar a operação como fica o registro na BD?
vai ficar um ID vazio certo?

Wilian vai ficar um registro apenas com o campo ID preenchido pelo que vi no vídeo, para não deixar estes registros incompletos na base seria necessário uma job para excluí-los de tempos em tempos. E ainda tem a questão de não poder colocar nenhum campo como not null, pois o único campo obrigatório será a chave primária.

Não, a ID é a primeira a ser gravada, não fica vazia! Na verdade o processo fica em “aberto” como um pedido em aberto por exemplo.
O exemplo no vídeo é pra mostrar que existe a possibilidade de Mestre-Detalhe mais dinâmico. Agora basta usar a criatividade e usar a ideia pra vários outros tipos de processos (Compras, Faturamento, NFe, etc…) ou seja, tudo que tiver “MD”.

Lembrando que as tabelas no banco tem que ser relacionais. E no fk do id detalhe coloque (Cascade) caso deletar o Mestre irá deletar os filhos. Existe “N” maneiras de trabalhar dessa forma, e com segurança.

Fred,

Só para realçar, LAST_INSERT_ID pega o valor do autoincrement para o último insert, é uma variável em memória do banco.

Se entre as instruções INSERT e LAST_INSERT_ID (que são realizadas pelo php demandando maior delay) corre-se o risco de outro insert (outro usuário entrar). Sua garantia multiusuário não esta segura.

E na época do desktop top ao salvar o item o mesmo já salvava o mestre caso este tivesse alterações.

São duas ressalvas importantes pois o usuário pde esquecer de clicar em atualizar no mestre e perder dados digitados.

Respondendo: Vai ficar com um mestre sem detalhes, terá que excluir o mestre.
Ideal é gravar o mestre apenas ao salvar o primeiro item do detalhe.

Exato foi o que eu pensei. mais agora como gravar o mestre apenas ao salvar o primeiro item do detalhe…??? pois o SC não disponibiliza o detalhe sem antes a pk do Mestre

Nesse caso ‘JÁ ELVIS’…

Deve-se usar um segundo campo chave exclusiva para o relacionamento entre mestre e detalhe, não ter foreinkey.

Nesse campo usar a sessão do php. (Evita falha multiusuário)

no caso do abandono, se não foi salvo nenhum item, ao carregar a app executar SP (StoredProcedure) para eliminar todos cujo status=null (por exemplo e data < hoje) para não ficar mestre sem detalhe.

Na trigger before_insert do detalhe criar o mestre pegar seu id e salvar o item se for o primeiro item.

Uma sugestão: Alguém com uma experiência maior, fazer um exemplo e disponibilizar no fórum.

Mesmo se o usuário não salvar o ID fica arquivado. Ta explicado no vídeo através do esquema no desenho.

Com relação a multi-usuário eu sei disso, como expliquei pro Willian, o fato do vídeo é apenas uma dica (demonstração) feita com intuito de melhorias pra que se interessou.

A proposito seria muito interessante os interessados melhorar a ideia e postar aqui, assim todos ganham… :wink: O que acham?

Não vai ficar mestre sem detalhes.

Nativamente não, mas nesse exemplo “sim” (entre aspas) por se tratar de insert simultâneo, ainda não to entendendo a dúvida. Nesse exemplo Tanto mestre quanto detalhe é gravado simultaneamente. O Insert na realidade seria um UPDATE, expliquei isso no vídeo rsrs

No seu video Fred, você inseri os detalhes depois clica em atualizar no mestres para salvar aos demais campos preenchidos.

Estou enganado?

A outra questão é clicar no botão cadastrar, não inserir nenhum detalhe e sair da tela, cmo fica o banco de dados no seu exemplo?