Estou criando uma aplicação web e vou precisar aplicar alguns filtros. Todos os tópicos que encontro perguntam sobre filtros mais básicos, como por exemplo como trazer colunas das tabelas dinamicamente. Isso pode ser feito pela construção da String. No meu problema não é simplesmente uma ou duas tabelas que tem colunas que ora vão ser trazidas, ora não vão ser trazidas.
O meu problema é o seguinte: tenho uma banco de dados com mais ou menos umas 10 tabelas. Elas têm relacionamentos entre si. Dependendo dos filtros, vou precisar trazer dados de uma ou outra tabela. Não são apenas as colunas que vão vir dinamicamente.
Por exemplo, tenho tabela1, tabela2, tabela3, tabela4.
A tabela2 implementa o relacionamento NxN entre a tabela1 e tabela3. E a tabela3 se liga à tabela4 de uma forma 1xN.
Vou ter um filtro que pode trazer dados de qualquer forma, vindo de apenas uma das tabelas, de duas, de três… Não tenho como prever como será a consulta. Como posso fazer algo assim??? Estou meio perdido…
Essa necessidade é real? Não seria melhor fazer os relatórios específicos que o cliente esteja necessitando no momento e depois desenvolver outros conforme realmente for precisando, de forma mais otimizada e de alto nível? Você será mais valorizado assim.
Se for seguir diretamente o que você falou, dê uma copiada na ideia do MS Access, na parte de Consulta/SQL.
Querem colocar uma parte na aplicação em que se tenha uma lista de clientes, fornecedores, etc. E aí o usuário vai clicar no que ele quiser trazer e isso tudo vem de tabelas diferentes. Vai ter que ser feito assim, mesmo.
Eu não entendi a dica… Eu queria algouam ideia de como fazer o código. Existe algum framework que poderia ajudar? Qual seria a ideia para implementar o meu problema? Estou pesquisando, mas não estou encontrando muita coisa relacionada a isso…
A ideia foi de copiar a ideia do Access. A parte de código vai da sua lógica, modelagem de dados e a obtenção da estrutura das tabelas. Por exemplo, o usuário quer fazer uma consulta dos itens de pedido de um pedido com a descricao do produto, são três tabelas envolvidas Pedido, ItemPedido e Produto, então ele selecionando as três tabelas, você vai gerar o SQL com os joins de acordo com as chaves primárias e estrangeiras. A primeira coisa é então você pesquisar sobre como obter os campos que fazem parte da PKs e FKs de cada tabela. Qual banco de dados está usado? Deverá pesquisar isso em relação a ele. Exemplo de uma parte do que você poderia precisar (exemplo em Oracle):
SELECT c_list.CONSTRAINT_NAME as NAME,
substr(c_src.COLUMN_NAME, 1, 20) as SRC_COLUMN,
c_dest.TABLE_NAME as DEST_TABLE,
substr(c_dest.COLUMN_NAME, 1, 20) as DEST_COLUMN
FROM ALL_CONSTRAINTS c_list, ALL_CONS_COLUMNS c_src, ALL_CONS_COLUMNS c_dest
WHERE c_list.CONSTRAINT_NAME = c_src.CONSTRAINT_NAME
AND c_list.R_CONSTRAINT_NAME = c_dest.CONSTRAINT_NAME
AND c_list.CONSTRAINT_TYPE = 'R'
AND c_src.TABLE_NAME = 'SUA_TABELA'
GROUP BY c_list.CONSTRAINT_NAME, c_src.TABLE_NAME, c_src.COLUMN_NAME, c_dest.TABLE_NAME, c_dest.COLUMN_NAME;
Eu acho que o Primefaces dataTable ajudaria você com duas características:
1 - Tabelas com colunas dinâmicas, ou seja, o cliente pode escolher quais colunas quer ver na tabela.
2 - Filtro nas colunas - eu uso e é muito bom - se você montar direitinho suas colunas, consegue filtrar qualquer coisa que estiver dentro delas, conforme o cliente vai digitando.
Mas sinceramente, quando o cliente quer ter o poder de ver tudo e filtrar tudo, é a mesma história de querer ver todos os registros de uma vez só na tabela, sendo que só cabem uns 20 na tela…
O M$Access realmente é muito bom na filtragem, mas implementar sozinho tudo o que a equipe inteira implementou durante anos, é loucura… eu já tentei e desisti disso faz tempo, e agora estou só na filtragem por colunas.
[quote=Roselito Fávero da Silva]Eu acho que o Primefaces dataTable ajudaria você com duas características:
1 - Tabelas com colunas dinâmicas, ou seja, o cliente pode escolher quais colunas quer ver na tabela.
2 - Filtro nas colunas - eu uso e é muito bom - se você montar direitinho suas colunas, consegue filtrar qualquer coisa que estiver dentro delas, conforme o cliente vai digitando.
Mas sinceramente, quando o cliente quer ter o poder de ver tudo e filtrar tudo, é a mesma história de querer ver todos os registros de uma vez só na tabela, sendo que só cabem uns 20 na tela…
O M$Access realmente é muito bom na filtragem, mas implementar sozinho tudo o que a equipe inteira implementou durante anos, é loucura… eu já tentei e desisti disso faz tempo, e agora estou só na filtragem por colunas.[/quote]
Realmente seria loucura, mas é só pra ele ter uma idéia do que seria gerar o SQL baseado em tabelas selecionadas, não precisando chegar ao ponto de fazer um designer visual para consultas. Seria só mesmo para o usuário selecionar as tabelas, campos e o sistema gerar filtros e a consulta baseado no metadados do banco. Tambem não gosto dessas soluções genéricas para usuário final, mas já que existe essa solicitação…