CB
Usar Unidade sem adicionarcoluna de unidade nas tabelas
Gostaria de usar a Unidade cadastrada para o usuário para filtrar os datagrids, mas sem ter que adicionar um campo de unidade em todas as minhas tabelas para usar como filtro.
Eu vi que dá para pegar a unidade do usuário logado com TSession::getValue('userunitid')
mas para fazer esse filtro no datagrid eu teria que ter um campo na tabela que estou exibindo para poder comparar com o userunitid,
fazendo isso: $criteria->add(new TFilter('unidade ','=', TSession::getValue('userunitid')));
Assim, eu teria que adicionar uma coluna "unidade" em todas as minhas tabelas, e guardar a unidade a que cada registro está associado, e não é isso que eu gostaria. Eu queria que essa informação ficasse salva em apenas uma tabela, e as outras tabelas associadas puxassem esse valor.
Situação prática:
Tenho as tabelas: curso, disciplina, gradecurricular (intermediária de curso e disciplina), livro, bibliografia (intermediária de disciplina e livro)
tabela curso: idcurso, nomecurso, unidade_id
tabela disciplina: iddisciplina, nomedisciplina,
tabela gradecurricular: idgrade, curso_id, disciplina_id
tabela livro: idlivro, nomelivro
tabela bibliografia: idbibliografia, disciplina_id, livro_id
então em vez de adicionar uma coluna "unidade" em todas as tabelas, quero que no datagrid de livro, por exemplo, eu consiga verificar que ele está associado a uma disciplina (através de bibliografia), que está associada a um curso (através de gradecurricular) e esse curso sim tem uma unidade, se for a mesma do usuário logado, esse livro aparece no datagrid.
Eu consegui fazer isso no datagrid de disciplina usando o seguinte código no meu onReload:
Mas achei essa solução muito estranha... se eu fosse usar algo parecido para o datagrid de livro ia ter que criar filtro na tabela bibliografia para pegar os ids dos livros associados às disciplinas, e depois na tabela livro criar um filtro com os ids da consulta anterior, e como são muitos registros, não creio que seja muito adequado.
Há alguma outra forma de fazer isso?
Nessa postagem a solução proposta foi adicionar uma coluna com a unidade do usuário em todas as tabelas
https://www.adianti.com.br/forum/pt/view_3130?utilizacao-do-novo-campo-unidade-n
o mesmo acontece nessa postagem (ao menos pelo que eu entendi)
https://www.adianti.com.br/forum/pt/view_3715?filtrar-dados-do-datagrid-pela-uni
Iniciante em programação (e banco de dados também).
Eu vi que dá para pegar a unidade do usuário logado com TSession::getValue('userunitid')
mas para fazer esse filtro no datagrid eu teria que ter um campo na tabela que estou exibindo para poder comparar com o userunitid,
fazendo isso: $criteria->add(new TFilter('unidade ','=', TSession::getValue('userunitid')));
Assim, eu teria que adicionar uma coluna "unidade" em todas as minhas tabelas, e guardar a unidade a que cada registro está associado, e não é isso que eu gostaria. Eu queria que essa informação ficasse salva em apenas uma tabela, e as outras tabelas associadas puxassem esse valor.
Situação prática:
Tenho as tabelas: curso, disciplina, gradecurricular (intermediária de curso e disciplina), livro, bibliografia (intermediária de disciplina e livro)
tabela curso: idcurso, nomecurso, unidade_id
tabela disciplina: iddisciplina, nomedisciplina,
tabela gradecurricular: idgrade, curso_id, disciplina_id
tabela livro: idlivro, nomelivro
tabela bibliografia: idbibliografia, disciplina_id, livro_id
então em vez de adicionar uma coluna "unidade" em todas as tabelas, quero que no datagrid de livro, por exemplo, eu consiga verificar que ele está associado a uma disciplina (através de bibliografia), que está associada a um curso (através de gradecurricular) e esse curso sim tem uma unidade, se for a mesma do usuário logado, esse livro aparece no datagrid.
Eu consegui fazer isso no datagrid de disciplina usando o seguinte código no meu onReload:
- <?php
- //pego os ids dos cursos que estão associados à unidade do usuário logado (coloquei logo a unidade 13 para não precisar pegar dinamicamente)
- $repository2 = new TRepository('CursoRecord');
- $criteria2 = new TCriteria();
- $criteria2->add(new TFilter('biblioteca_id', '=', 13));
- $objeto2 = $repository2->load( $criteria2, FALSE );
- if ( !empty( $objeto2 ) ) {
- foreach ( $objeto2 as $objeto ) {
- $teste[] = $objeto->id;
- }
- }
- //pega os ids das disciplinas associados aos cursos que estão associados à unidade 13 obtidos na consulta anterior
- $repository2 = new TRepository('GradeCurricularRecord');
- $criteria2 = new TCriteria();
- $criteria2->add(new TFilter('curso_id', 'in', $teste));
- $objeto2 = $repository2->load( $criteria2, FALSE );
- if ( !empty( $objeto2 ) ) {
- foreach ( $objeto2 as $objeto ) {
- $teste2[] = $objeto->disciplina_id;
- }
- }
- $repository = new TRepository('DisciplinaRecord');
- $criteria = new TCriteria();
- //filtra no datagrid de disciplina pelo campo id as disciplinas associadas aos cursos associados à unidade 13
- $criteria->add(new TFilter('id', 'in', $teste2));
- $objects = $repository->load( $criteria, FALSE );
- ?>
Mas achei essa solução muito estranha... se eu fosse usar algo parecido para o datagrid de livro ia ter que criar filtro na tabela bibliografia para pegar os ids dos livros associados às disciplinas, e depois na tabela livro criar um filtro com os ids da consulta anterior, e como são muitos registros, não creio que seja muito adequado.
Há alguma outra forma de fazer isso?
Nessa postagem a solução proposta foi adicionar uma coluna com a unidade do usuário em todas as tabelas
https://www.adianti.com.br/forum/pt/view_3130?utilizacao-do-novo-campo-unidade-n
o mesmo acontece nessa postagem (ao menos pelo que eu entendi)
https://www.adianti.com.br/forum/pt/view_3715?filtrar-dados-do-datagrid-pela-uni
Iniciante em programação (e banco de dados também).
Veja, é necessário que exista uma chave para distinguir os registros em sua respectiva unidade você terá que criar as colunas "unidade_id" em cada uma das tabelas que de fato tenha a unidade como referência.
Pode ser que curso não tenha sentido ter a unidade, mas se um determinado curso exista apenas em um das unidades do colégio/faculdade/curso, você precisa ter a coluna nesta tabela para quando filtrar o curso, o sistema permita listar as unidades as quais o curso é ministrado.
Já a disciplina se existir em todas as unidades, não precisaria ter a coluna "unidade_id". E assim por diante.
É um trabalho de análise do MER.
Não é essa minha dúvida.
Cada curso deve estar associado à uma única unidade, é por isso que na tabela curso existe um campo de unidade. Mas uma disciplina pode estar associada a vários cursos, de unidades diferentes, o mesmo ocorre com livros. Se eu criar um campo unidade na tabela de livros, por exemplo, seria errado, porque estaria obrigatoriamente associado cada livro a uma única unidade, só que um livro pode estar associado a mais de uma unidade, porque pode estar associado à disciplina A, que pertence ao curso C e D, e o curso C é da unidade 1, e o curso D é da unidade 2, então o livro estaria associado às unidades 1 e 2.
Minha dúvida é como eu vou fazer o filtro no datagrid da tabela livro, por exemplo, já que ele não tem um campo de unidade (mas está associado a uma disciplina, que está associada a um curso e esse sim tem o campo unidade). Com o código que eu postei eu sei que dá certo, mas não me parece uma boa alternativa.
Ok, não é algo físico. Então eu acho que vc deve normalizar a tabela. Criar tabela(s) intermediária(s) como é feito para relacionamentos "muito para muitos".
Já tentou?
Talvez algo como: curso_id, disciplina_id, livro_id
Tentando exemplificar:
Curso 1, Unidade 1
Curso 2, Unidade 1
Livro 100
Livro 101
Disciplina 200
Disciplina 300
Tabela
curso_id disciplina_id livro_id
1 (und 1) 200 100
1 (und 1) 300 101
2 (und 1) 200 100
Veja, é uma ideia, é preciso analisar o modelo e ver a melhor forma.
Obrigada pela ajuda, mas é sim algo físico.
As estruturas das tabelas estão perfeitas. Já existem as tabelas intermediárias, que são gradecurricular e bibliografia.
Eu preciso do código que execute o filtro.
Bom, se as estrutura estão perfeitas, então use SQL, com joins, terá um código enxuto.
Agora, para podemos ajudar nesta construção, seria importante compartilhar o modelo de dados e seus relacionamentos.
Eu já tentei criar o TFilter com SQL para adicionar na TCriteria, mas não consegui fazer funcionar.
O principal das estruturas das tabelas eu já coloquei:
tabela curso: idcurso, nomecurso, unidade_id
tabela disciplina: iddisciplina, nomedisciplina,
tabela gradecurricular: idgrade, curso_id, disciplina_id
tabela livro: idlivro, nomelivro
tabela bibliografia: idbibliografia, disciplina_id, livro_id
idalgumacoisa é sempre chave primária,
algumacoisa_id é sempre chave estrangeira
Uma correção: na linha 27 do código que postei, em vez de id é iddisciplina
1 - Você pode fazer o filtro usando subselects:
adianti.com.br/framework_files/tutor/index.php?class=CriteriaView
2 - Você pode criar uma view com todas as colunas e cruzamentos necessários. Depois basta criar o model e a grid com base nessa view ao invés de usar a tabela atual.
3 - Você pode fazer uma consulta manual para popular a grid ao invés de usar o TRepository:
adianti.com.br/framework_files/tutor/index.php?class=SetupTransactio
Usar essa consulta manual para popular a grid atendeu perfeitamente às minhas necessidades, obrigada Nataniel!