Estou substituindo algumas funções no meu programa para atualizado, estou precisando de um exemplo do FWDBAccess
Estou substituindo algumas funções no meu programa para atualizado, estou precisando de um exemplo do FWDBAccess
Bom dia
Espero que te ajude esse link da Totvs https://tdn.totvs.com/display/public/PROT/FWDBAccess
Paulo,
Abaixo um exemplo bem simples de como utilizar a classe FWDBAccess baseado na documentação presente no TDN:
#include "protheus.ch"
//-----------------------------------------------------------------
/*/{Protheus.doc} DnlFWDBAccess
Exemplo de utilização da classe FWDBAccess
@sample U_DnlFWDBAccess()
@author Daniel Mendes
@since 27/10/2020
@version 1.0
/*/
//-----------------------------------------------------------------
user function DnlFWDBAccess()
local oPostgres as object
local oMsSql as object
local cPostgAlias as char
local cSqlAlias as char
local cQuery as char
//Crio os objetos de acesso aos bancos distintos
oPostgres := FWDBAccess():New("postgres/bra_db_27", "localhost", 7890)
oMsSql := FWDBAccess():New("mssql/mssqlunittest", "localhost", 7890)
//Abro a conexão com os bancos
if oPostgres:OpenConnection() .and. oMsSql:OpenConnection()
cQuery := "SELECT * FROM TOP_PARAM" //Query BEM genérica...
cPostgAlias := oPostgres:NewAlias(cQuery, GetNextAlias(), {})
cSqlAlias := oMsSql:NewAlias(cQuery, GetNextAlias(), {})
//Exibo dados sobre a query no console
if Select(cPostgAlias) > 0
ConOut("Query aberta no Postgres")
(cPostgAlias)->(DBCloseArea())
else
ConErr(oPostgres:ErrorMessage())
oPostgres:ClearError()
endif
if Select(cSqlAlias) > 0
ConOut("Query aberta no MSSQL")
(cSqlAlias)->(DBCloseArea())
else
ConErr(oMsSql:ErrorMessage())
oMsSql:ClearError()
endif
cQuery := "INSERT INTO TOP_PARAM (PARAM_NAME, PARAM_SESSION, PARAM_VALUE) VALUES ("
//Faço um inserção de dados na tabela
if !oPostgres:SQLExec(cQuery + "'Xisto', 13, 'Xpto')")
ConErr(oMsSql:ErrorMessage())
oPostgres:ClearError()
endif
//Faço um inserção de dados na tabela
if !oMsSql:SQLExec(cQuery + "'Xpto', 69, 'Xisto')")
ConErr(oMsSql:ErrorMessage())
oMsSql:ClearError()
endif
cQuery := "SELECT * FROM TOP_PARAM WHERE PARAM_NAME = "
//Faço uma query para trazer o registro inserido
cPostgAlias := oPostgres:NewAlias(cQuery + "'Xisto'", GetNextAlias(), {})
cSqlAlias := oMsSql:NewAlias(cQuery + "'Xpto'", GetNextAlias(), {})
//Exibo os dados do registro encontrado no console
if Select(cPostgAlias) > 0
ConOut("Dados do Postgres")
ConOut("PARAM_NAME=" + (cPostgAlias)->PARAM_NAME)
ConOut("PARAM_NAME=" + cValToChar((cPostgAlias)->PARAM_SESSION))
ConOut("PARAM_NAME=" + (cPostgAlias)->PARAM_VALUE)
(cPostgAlias)->(DBCloseArea())
else
ConErr(oPostgres:ErrorMessage())
oPostgres:ClearError()
endif
if Select(cSqlAlias) > 0
ConOut("Dados do MSSQL")
ConOut("PARAM_NAME=" + (cSqlAlias)->PARAM_NAME)
ConOut("PARAM_NAME=" + cValToChar((cSqlAlias)->PARAM_SESSION))
ConOut("PARAM_NAME=" + (cSqlAlias)->PARAM_VALUE)
(cSqlAlias)->(DBCloseArea())
else
ConErr(oMsSql:ErrorMessage())
oMsSql:ClearError()
endif
cQuery := "DELETE FROM TOP_PARAM WHERE PARAM_NAME = "
//Faço um inserção de dados na tabela
if !oPostgres:SQLExec(cQuery + "'Xisto'")
ConErr(oMsSql:ErrorMessage())
oPostgres:ClearError()
endif
//Faço um inserção de dados na tabela
if !oMsSql:SQLExec(cQuery + "'Xpto'")
ConErr(oMsSql:ErrorMessage())
oMsSql:ClearError()
endif
else
ConOut("Nao conectou em um dos bancos... =(")
endif
//Fecho e finalizo a conexão com ambos os bancos
if oMsSql:CloseConnection()
oMsSql:Finish()
endif
if oPostgres:CloseConnection()
oPostgres:Finish()
endif
FreeObj(oPostgres)
FreeObj(oMsSql)
return
Obs: Para utilizar alguns métodos da classe, como TransBegin
, TransEnd
, TransDisarm
e FileExists
é necessário que o ambiente Protheus esteja preparado, pois são métodos que usam de parametrizações feitas no Protheus, então você pode utilizar deles abrindo o ambiente com RpcSetEnv
ou já dentro de uma thread do Protheus, como uma rotina de menu.
Importante: Eu utilizei no exemplo uma tabela que o DBAccess cria só de conectar ao mesmo, para ficar simples de exemplificar e testar, mas NÃO RECOMENDO A UTILIZAÇÃO DA MESMA! =D
Documentação:
Paulo, essa classe é indicada para quando você tem mais de uma conexão com o banco de dados, normalmente bancos distintos, é esse o seu cenário?
— Daniel Mendes 26 de Oct de 2020Sim, alem de ter o Banco do Protheus que é Oracle estou tentando acessar o banco do SITEF que é em MSSQL
— Paulo Lenzi 27 de Oct de 2020