{"id":68,"date":"2022-01-28T21:03:51","date_gmt":"2022-01-28T21:03:51","guid":{"rendered":"http:\/\/jcoltro.com.br\/?p=68"},"modified":"2022-01-28T21:42:05","modified_gmt":"2022-01-28T21:42:05","slug":"usando-ms-access-com-tabelas-sql-server-sem-necessidade-de-criar-um-dsn","status":"publish","type":"post","link":"https:\/\/jcoltro.com.br\/index.php\/2022\/01\/28\/usando-ms-access-com-tabelas-sql-server-sem-necessidade-de-criar-um-dsn\/","title":{"rendered":"Usando MS-Access com tabelas SQL Server sem necessidade de criar um DSN"},"content":{"rendered":"\n<p>Uma das dificuldades enfrentadas pelo desenvolvedor, ap\u00f3s criar um front-end MS-Access que usa tabelas vinculadas, \u00e9 explicar para o pessoal respons\u00e1vel pela instala\u00e7\u00e3o nas esta\u00e7\u00f5es dos usu\u00e1rios, a necessidade de criar um DSN (Data Source Name)  para acesso ao banco de dados.<\/p>\n\n\n\n<p>\u00c9 mais um motivo para torcerem o nariz e dizerem &#8220;eu falei que n\u00e3o deviam usam MS-Access&#8221;.<\/p>\n\n\n\n<p>Recentemente eu encontrei uma solu\u00e7\u00e3o que nos livra do DSN e da pouca receptividade de alguns para solu\u00e7\u00f5es baseadas em MS-Access. Por enquanto, at\u00e9 onde sei, funciona apenas se as tabelas forem SQL Server. A solu\u00e7\u00e3o que encontrei est\u00e1 em: <br><a rel=\"noreferrer noopener\" href=\"https:\/\/docs.microsoft.com\/pt-br\/office\/troubleshoot\/access\/create-dsn-less-connection-linkted-table\" target=\"_blank\">https:\/\/docs.microsoft.com\/pt-br\/office\/troubleshoot\/access\/create-dsn-less-connection-linkted-table<\/a> <\/p>\n\n\n\n<p>Dos dois m\u00e9todos l\u00e1 descritos, utilizei a criando da fun\u00e7\u00e3o <em>AttachDSNLessTable<\/em>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>'\/\/Name : AttachDSNLessTable\n'\/\/Purpose : Vincula tabela do SQL Server sem DSN\n'\/\/Parameters\n'\/\/ stLocalTableName: Nome da tabela no front-end MS Access\n'\/\/ stRemoteTableName: Nome da tabela no banco SQL Server\n'\/\/ stServer: Nome do servidor SQL Server que armazena a tabela\n'\/\/ stDB: Nome do banco de dados no servidor SQL Server\n'\/\/ stUsername: Nome do usu\u00e1rio no banco de dados SQL Server (deixe em branco para usar Trusted Authentication )\n'\/\/ stPassword: Senha do usu\u00e1rio no SQL Server\nFunction AttachDSNLessTable(stLocalTableName As String, stRemoteTableName As String, stServer As String, stDB As String, Optional stUsername As String, Optional stPassword As String)\n  On Error GoTo AttachDSNLessTable_Err\n  Dim td As TableDef, stConnect As String\n  For Each td In CurrentDb.TableDefs\n    If td.Name = stLocalTableName Then\n      CurrentDb.TableDefs.Delete stLocalTableName\n    End If\n  Next\n  If Len(stUsername) = 0 Then\n    '\/\/Usar\u00e1 Trusted Authentication se o nome do usu\u00e1rio n\u00e3o for fornecido.\n    stConnect = \"ODBC;DRIVER=SQL Server;SERVER=\" &amp; stServer &amp; \";DATABASE=\" &amp; stDB &amp; \";Trusted_Connection=Yes\"\n  Else\n    '\/\/CUIDADO: Isto salvar\u00e1 o nome do usu\u00e1rio do banco de dados e sua senha nas informa\u00e7\u00f5es da tabela vinculada.\n    stConnect = \"ODBC;DRIVER=SQL Server;SERVER=\" &amp; stServer &amp; \";DATABASE=\" &amp; stDB &amp; \";UID=\" &amp; stUsername &amp; \";PWD=\" &amp; stPassword\n  End If\n  Set td = CurrentDb.CreateTableDef(stLocalTableName, dbAttachSavePWD, stRemoteTableName, stConnect)\n  CurrentDb.TableDefs.Append td\n  AttachDSNLessTable = True\n  Exit Function\nAttachDSNLessTable_Err:\n  AttachDSNLessTable = False\n  MsgBox \"A fun\u00e7\u00e3o de vincula\u00e7\u00e3o de tabelas sem DSN encontrou um erro inesperado: \" &amp; Err.Description\nEnd Function<\/code><\/pre>\n\n\n\n<p>Para facilitar a rotina de abertura do front-end, criei uma tabela interna no MS-Access e nela coloquei todos os nomes de tabelas a serem vinculadas, da forma que a fun\u00e7\u00e3o espera receber (nome atribu\u00eddo \u00e0 tabela no front-end e nome da tabela no banco SQL Server). Para finalizar, coloquei a chamada da fun\u00e7\u00e3o dentro de um loop que percorre os registros da tabela que acabei de citar:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted has-small-font-size\"><code>...\nDim rs_tabelas As Recordset, tot_tabelas As Integer\nSet rs_tabelas = CurrentDb.OpenRecordset(\"SELECT * FROM tblODBCDataSources;\")\nIf rs_tabelas.EOF Then\n    MsgBox \"Imposs\u00edvel vincular as tabelas do banco de dados. Acione o suporte.\", vbCritical, \"SCF\"\n    DoCmd.Quit\nElse\n    rs_tabelas.MoveLast: rs_tabelas.MoveFirst\nEnd IfFor tot_tabelas = 1 To rs_tabelas.RecordCount\n    If AttachDSNLessTable(rs_tabelas(\"LOCALTABLENAME\"), rs_tabelas(\"ODBCTABLENAME\"), \"brcwbsql\", \"scf\", \"scf_user\", \"scf@rauco!!\") Then\n    Else\n      MsgBox \"Imposs\u00edvel vincular a tabela de banco de dados \" &amp; rs_tabelas(\"LOCALTABLENAME\") &amp; \". Imposs\u00edvel prosseguir. Acione o suporte.\", vbCritical, \"SCF\"\n    End If\n    rs_tabelas.MoveNext\nNext\n...<\/code><\/pre>\n\n\n\n<p>Desta forma, conseguimos simplificar o processo de &#8220;instala\u00e7\u00e3o&#8221; do front-end. Basta copiar o arquivo .accdb ou .accde para o computador do futuro usu\u00e1rio.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uma das dificuldades enfrentadas pelo desenvolvedor, ap\u00f3s criar um front-end MS-Access que usa tabelas vinculadas, \u00e9 explicar para o pessoal respons\u00e1vel pela instala\u00e7\u00e3o nas esta\u00e7\u00f5es dos usu\u00e1rios, a necessidade de criar um DSN (Data Source Name) para acesso ao banco de dados. \u00c9 mais um motivo para torcerem o nariz e dizerem &#8220;eu falei que&hellip; <br \/> <a class=\"read-more\" href=\"https:\/\/jcoltro.com.br\/index.php\/2022\/01\/28\/usando-ms-access-com-tabelas-sql-server-sem-necessidade-de-criar-um-dsn\/\">Leia mais<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-68","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/jcoltro.com.br\/index.php\/wp-json\/wp\/v2\/posts\/68","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jcoltro.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jcoltro.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jcoltro.com.br\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jcoltro.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=68"}],"version-history":[{"count":6,"href":"https:\/\/jcoltro.com.br\/index.php\/wp-json\/wp\/v2\/posts\/68\/revisions"}],"predecessor-version":[{"id":76,"href":"https:\/\/jcoltro.com.br\/index.php\/wp-json\/wp\/v2\/posts\/68\/revisions\/76"}],"wp:attachment":[{"href":"https:\/\/jcoltro.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=68"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jcoltro.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=68"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jcoltro.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=68"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}