Usando o SC-5.2 estou tentando fazer uma Consulta onde o nome da tabela seria uma variável e não encontrei nenhum exemplo de como usar “Variavel para Tabela” em “Configuração do SQL”
sc_select_where(add)
É possível, em tempo de execução da aplicação de consulta, adicionar um campo/condição à cláusula WHERE da consulta.
Ex. 1: Adiciona tudo que estra dentro das aspas duplas ao where do select da consulta.
if (empty({sc_where_atual})){
sc_select_where(add) = “where campoX > [variavel_global]”;
}
else{
sc_select_where(add) = “AND campoX > [variavel_global]”;
}
Obs: Este comando deve estar no contexto de “processar antes do select”.
Caro George
Eu preciso alterar em tempo de execução o nome da “Tabela” que fica na clausura “From” e não as condições de filtro que ficam na clausura “Where”.
Agradeço a sua atenção em ajudar.
Abçs
Andre Guimaraes
ola, so por curiosidade, qual a utilizada-de de se alterar o nome de uma tabela, nao seria o caso de se criar as tabelas auxiliares e fazer um vinculo por consulta
porem as modificações, alterações e inserções podem ser utilizadas com a macro sc_exec_sql.
Coema
É na definição do select da grid. Não é em nenhum evento onde possa usar a macro sc_exec_sq.
O uso?
Tenho um aplicativo de atualização de sites com metodologia CMS que desejo usar para vários sites diferentes onde os nomes das tabelas são diferentes para cada site (questão de segurança) embora as estruturas das tabelas sejam as mesmas.
Como na seção “Configuração SQL” da “Consulta” tem a opção “Variavel para Tabela” estou supondo que posso criar uma variável onde entraria com o nome da tabela (que tem nomes diferentes embora tenham estruturas iguais).
Gostaria de saber se alguem já usou “Variável para Tabela”.
Abçs
Andre Guimaraes
Perfeito companheiro agora entendi, sugiro porem que voce crie um tabela com o nome de site, onde identifique que site é esse, em todas as outras tabelas voce colocar de a ID dessa nova tabela, ai depois é so fazer uma where pela tabela site. Dessa maneira seria mais prudente e iria obedecer as normas de banco.
Coema
Mais uma vez eu agradeço a sua atenção em resolver o meu problema, só que, eu acho que não estou me fazendo entender.
A forma de variar o nome da Tabela eu já tenho através de um Aplicativo “Control”.
O eu preciso é no select da grid chamada passar essa variável global com o nome da Tabela no “from”.
A minha dúvida é como usar “Variavel para Tabela” dentro de “Configuração do SQL” na “Consulta”.
Abçs
Andre Guimaraes
qual o banco que voce estar utilizando?
Coema
Acho que não é relevante essa informação uma vez que tudo se passa na interface do SC5 que então irá gerar o código independentemente de DBs.
Mas, estou usando MySql.
Abçs
Andre Guimaraes
ai é que voce se engana, o sc nao possue uma macro para colocar o nome da tabela como global, voce tera que fazer uma consulta sql dentro da rais do banco, tipo de for no postgres voce tera que fazer uma consulta dentro do catalogo e na pg_ onde ficar as tabelas voce selecionar o nome da tabela e colocala como global, eu irei pesquisa onde fica e colocarei o codigo abaixo
voce deve colocar uma clausura where identificar qual nome de tabela voce quer receber como global utilizando o codigo abaixo
sc_lookup(ds, "SELECT table_name FROM information_schema.TABLES ");
$table_name = {table_name };
sc_set_global($table_name);
Coema
Mais uma vez agradeço a seu esforço em colaborar com as dúvidas desse Forum, mas, o que eu preciso é bem mais simples e não passa por acessar a “information_schema”.
Vou tentar explicar de outra forma:
Imagine que eu vou criar uma grid (do zero).
Depois de criada eu quero usar essa grid (sem ter que duplica-la) para várias tabelas que tem a mesma estrutura e nomes diferentes (cada cliente usou prefixo+nomes de Tabela diferentes e eu nao posso mudar isso).
Na “Consulta” na seção “Configuração de SQL” existe um campo “Variável para Tabela” (ver imagem). Para que serve esse campo? Posso usar uma variável para mudar o nome da Tabela no Select??
Abçs
Andre Guimaraes
companheiro, infelizmente nunca utilizei essa funcionalidade do sc, e nao sei responder essa pergunta, vou ficar te devendo e espero que alguem possa sanar sua duvida. vai desculpando ai.
Coema
Eu só tenho que lhe agradecer por todo o seu interesse em ajudar…
Um grande abraço
Andre Guimaraes
Rapaz, tinha alguém há algum tempo no fórum passando pelo mesmo problema. Acho que a solução dele foi fazer um banco para cada cliente, mudando a conexão de acordo com o cliente.
Bom pessoal, primeiramente desculpe desenterrar um tópico tão antigo.
Fiz pelo fato de já existir e não criar entradas duplicadas no forum para o mesmo assunto.
Como ninguém tinha respondido, e eu entrei aqui meia hora atrás pesquisando a solução para o mesmo problema, então resolvi voltar e postar como resolvi. Acredito que todos conseguiram resolver seus problemas, mas fica a dica para novatos que ainda vão passar por isso.
O uso do recurso VARIÁVEL PARA TABELA, em forms e grid se dá da seguinte forma.
Digamos que eu tenha 3 tabelas exatamente iguais em estrutura, sendo elas Clientes, Fornecedores e Contatos_diversos.
No caso de haver várias tabelas com a mesma estrutura, essa opção permite criar um único form e grid para manipular essas várias tabelas iguais.
Cria-se o form e grid a partir de 1 das tabelas. Neste caso usei a tabela “Clientes” e chamei a apl form de “form_padrao” e a grid de “grid_padrao”
No campo “VARIÁVEL PARA TABELA”:
No campo de cima, eu uso a palavra “nome_tabela” (trata-se de uma global, mas não se deve usar os ‘[]’.
No campo de baixo, eu escrevo o nome da tabela original “Clientes”
O que o SC faz é trocar a palavra “Clientes” (do campo de baixo) pela conteúdo da global (campo de cima), nesse caso “nome_tabela”.
Como fazer com que o menu abra a mesma aplicação de form ou grid, usando as tabelas diferentes.
Crie a estrutura do menu normalmente:
ID (item_1)
Label: Clientes
Link: form_padrao
ID (item_2)
Label: Fornecedores
Link: form_padrao
ID (item_3)
Label: Contatos diversos
Link: form_padrao
Os 3 itens do menu chamarão a mesma aplicação.
No evento onExecute do menu, use o código:
if ({sc_menu_item} == “item_1”) { $nome_tabela = “clientes”; $titulo_cabecalho = “Clientes”; sc_set_global($nome_tabela, $titulo_cabecalho); }
if ({sc_menu_item} == “item_2”) { $nome_tabela = “fornecedores”; $titulo_cabecalho = “Clientes”; sc_set_global($nome_tabela, $titulo_cabecalho); }
if ({sc_menu_item} == “item_3”) { $nome_tabela = “contatos_diversos”; $titulo_cabecalho = “Clientes”; sc_set_global($nome_tabela, $titulo_cabecalho); }
A variável global criada com o nome “titulo_cabecalho”, como o próprio nome diz, eu utilizo no cabeçalho das aplicações.
A mesma coisa deve ser feita com os grids.
Dessa forma usa-se um mesmo form e grid para várias tabelas. Estou fazendo um sistema com 82 tabelas exatamente iguais e esse recurso me poupará muito tempo e esforço.
Espero que a explicação ajude alguém a resolver como se usa esse recurso. Se errei em alguma coisa me corrijam, digitei tudo de uma vez só e sem reler nada.
Abraço a todos.
Rodrigo Araújo
andreguimas
Me diz que você achou a solução?
Estou com o mesmo problema.
Abraço
Modificar mensagem
funciona legal!!!