Lançado Adianti Framework 8.1!
Clique aqui para saber mais
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 userunit...
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:

  1. <?php
  2. //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)
  3. $repository2 = new TRepository('CursoRecord');            
  4. $criteria2 = new TCriteria();
  5. $criteria2->add(new TFilter('biblioteca_id''='13));
  6. $objeto2 $repository2->load$criteria2FALSE );
  7.    if ( !empty( $objeto2 ) ) {
  8.       foreach ( $objeto2 as $objeto ) {
  9.          $teste[] = $objeto->id;
  10.       }
  11.    }
  12. //pega os ids das disciplinas associados aos cursos que estão associados à unidade 13 obtidos na consulta anterior
  13. $repository2 = new TRepository('GradeCurricularRecord');
  14. $criteria2 = new TCriteria();
  15. $criteria2->add(new TFilter('curso_id''in'$teste));
  16. $objeto2 $repository2->load$criteria2FALSE );
  17.    if ( !empty( $objeto2 ) ) {
  18.       foreach ( $objeto2 as $objeto ) {
  19.          $teste2[] = $objeto->disciplina_id;
  20.       }
  21.    }
  22. $repository = new TRepository('DisciplinaRecord');
  23. $criteria = new TCriteria();
  24. //filtra no datagrid de disciplina pelo campo id as disciplinas associadas aos cursos associados à unidade 13
  25. $criteria->add(new TFilter('id''in'$teste2));
  26. $objects $repository->load$criteriaFALSE );
  27. ?>


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).

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (9)


MG

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.
CB

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.
MG

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.
CB

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.
MG

Bom, se as estrutura estão perfeitas, então use SQL, com joins, terá um código enxuto.
MG

Agora, para podemos ajudar nesta construção, seria importante compartilhar o modelo de dados e seus relacionamentos.
CB

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
NR

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
CB

Usar essa consulta manual para popular a grid atendeu perfeitamente às minhas necessidades, obrigada Nataniel!