Problema com o uso do sc_exec_sql

Estou tentando implementar uma rotina mas estou com problemas na execução da macro sc_exec_sql.

A minha rotina está feita dentro da aplicação de login, depois de setar a conexão através do sc_change_conection, eu verifico a versão do banco de dados do cliente e comparo a a última versão existente numa tabela onde eu armazeno os scripts de atualização.

Ocorre que quando mando executar o script de atualização através da macro sc_exec_sql informando além do script a conexão do cliente, que não é a mesma da aplicação login, ele dá um erro, a sintaxe que estou usando é exatamente esta:

sc_exec_sql($script,$conexao);

onde, a variável $script é o comando sql para ser executado e $conexao é o nome da conexão do cliente.

Só que quando executo isso, o SC me dá a mensagem de erro dizendo que a vírgula ali que separa uma variável da outra, não é esperada.

Que diabos eu estou fazendo de errado, ou isso é mais um bug da nossa versão 8 do SC ?

Tente
sc_exec_sql("$script","$conexão");

Já tentei, dá pau do mesmo jeito:

Parse error: syntax error, unexpected ‘$conexao’ (T_VARIABLE), expecting ‘,’ or ‘;’ in C:\Program Files (x86)\NetMake\v8\wwwroot\scriptcase\app…

Ronaldo,

Será que $conexao não é uma palavra reservada do SC? Veja se mudando o nome funciona… sei lá!

Kelyber,

Acredito que não por que eu uso essa mesma variável para fazer a mudança de conexão e funciona direitinho.

Bom dia, a conexão é diferente da principal ? Se não for monta a macro sem informar a conexão, para assumir a padrão.
sc_exec_sql($script);

Rodrigo,

A questão e o problema é justamente esse, a conexão que tenho que rodar o script é diferente da aplicação onde está sendo executada.

Sempre eu uso conexão estática (sc_exec_sql($sql,“nomecon”)).
Não uso dessa maneira (sc_exec_sql($sql,$con)).

Sua conexão depende de alguma condição de if?
se for faça
if(conexao1)
{
sc_exec_sql($sql,“nome1”);
}
else if(conexao2)
{
sc_exec_sql($sql,“nome2”);
}

ou até se estiver no mesmo servidor em outra base, você pode fazer:
sc_exec_sql(“comando sql porém antes do nome da tabela colocar a base basededados.nometabela”) e sem informar conexão

Espero ter ajudado

Rodrigo,

Essa sua última opção eu não testei ainda, mas vou fazê-lo, grato, apesar que ela não vai resolver o meu problema dentro da rotina automatizada de atualização dos bancos de dados, se eu for criar um script personalizado pra cada banco perde o sentido a rotina automatizada.

Si isto aqui funcionar tenta encobrir a variável com aspas Ronaldo vai que cola :slight_smile:

Meus Caros,

Resolvi o problema da seguinte forma:

Usando a dica do Rodrigo, de apontar a base de dados diretamente no script, alterei meu sistema, passando a usar a rotina de verificação/atualização da base de dados fora da aplicação de login, criei um Blank que é chamado ao final da aplicação login e lá eu já posso usar a conexão da base do cliente e apenas preciso fazer um select na outra base de administração onde estão os scripts de atualização, e usando o nome da base dentro do select funcionou legal.

Eu só preciso dar uma aprimorada por que essa base de administração no ambiente de produção tem um nome, no ambiente de desenvolvimento tem outro nome por conta de outros sistemas coexistindo.

Tem como no OnExecute do Blank eu checar em que ambiente estou rodando a aplicação para então através de um if fazer o select correto ???

Rodrigo, valeu pela dica, resolvou meu problema, apesar de continuar sem entender por que a macro sc_exec_sql não funciona corretamente quando indicada outra conexão que não a da própria aplicação onde está rodando.

Legal que bom ter ajudado, estamos aqui para isso.
Em questão da verificação da conexão no blank, acho que se você tiver setado o nome da conexão como variável global fica simples.

Rodrigo,

A questão não é esse, a questão é saber em que ambiente o sistema está rodando, no de desenvolvimento ou no de produção, preciso de uma variável de ambiente que me diga isso para então eu poder executar o select com um nome de base de dados ou outro.

Entendi, já enfrentei casos assim.
Na verdade deixo sempre em desenvolvimento até publicar, depois mudo tudo para produção e se tiver alguma manutenção volto e ao publicar mudo novamente para producao (nome da base)

Pois é, eu queria um jeito de não ter que fazer isso na unha cada vez que tivesse que mexer nisso.

Bom dia, foram criadas novas macros:
sc_connection_new. Esta macro permite a criação de novas conexões dinamicamente. Macro disponivel na documentação do Scriptcase.
sc_connection_edit. Esta macro edita uma conexão existente em tempo de execução. Macro disponivel na documentação do Scriptcase.

Acho que isso resolve seu problema…

Rodrigo,

Meu problema era com sc_exec_sql, não tinha nada a ver com a questão da conexão, isso funciona bem com o sc_change_conection.

Agora essas duas novas macros vai nos permitir não ter mais a necessidade de criar no ambiente de produção uma conexão específica para cada banco de dados de cada cliente ??? Vou poder ter uma única conexão chamada por exemplo “cliente”, e editar essa conexão para cada banco de dados que eu quiser conectar ??? Se for isso, é show de bola.

Legal não testei ainda mas provavelmente é isso!

Abraços.