PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 24 → WX - Como importar uma base de ACCESS ou até mesmo usar uma base ACCESS
WX - Como importar uma base de ACCESS ou até mesmo usar uma base ACCESS
Iniciado por Zeca, jan., 19 2016 2:28 AM - 3 respostas
Membro registado
1 mensagem
Publicado em janeiro, 19 2016 - 2:28 AM
Hi all !

Como muitos, eu venho do GAS / FATHER que são RADs que geram VB e utilizam além de SGDBs, bancos de dados do tipo Access.

Isso posto, considerando que as ferramentas PCsoft estão em um nível diferente, e que ao migrar temos a necessidade de tratar o legado existente, buscamos a alternativa de, ou continuar usando arquivos MDB ou importar os dados para arquivos HFSQL C/S ou classic.

Não existe esse exemplo nos Tutoriais da PCSoft nem nos exemplos que acompanham a ferramenta.

Dessa maneira, como foi uma necessidade nossa, vamos compartilhar a experiência de como fizemos para resolver essa situação da maneira como precisávamos.

Espero que seja útil a todos. Como conectar / usar uma base de dados Access.

1 – Primeira condição
O arquivo MDB não pode ter senha.
2 - Como tirar a senha de um arquivo .MDB
- Você vai ter que usar o VB e gerar uma rotina para eliminar / trocar a senha do arquivo MDB

Sub ChangeDBPassword()
Dim Db As Database, senha As String, nome_do_banco As String
senha = "senha_do_banco_de_dados"
nome_do_banco = "unidade:\caminho\nome.mdb"
Set Db = OpenDatabase(nome_do_banco, True, False, dbLangGeneral & ";PWD=" & senha)
Db.NewPassword senha, ""
Db.Close
End
End Sub

3 – Depois de tirada a senha do banco, faça a conexão





O exemplo acima acontece quando você usa com senha. Sem senha acontece como abaixo:





a) Insira os dados das properties;
b) Não terá senha por que você eliminou ou desabilitou a senha;
c) Após a inclusão dos dados clique no botão TEST indicado na imagem acima e você terá a mensagem de sucesso como mostra na imagem.





Agora já está conectado, vamos pegar a estrutura dos dados.





Vá em analysis, depois em import e selecione a primeira opção, conforme indicado acima.

Vai abrir essa janela:






Clique conforme indicado e a seguir escolha






E de novo




Você terá a seguinte tela:






Selecione como indicado acima e outra vez…




Faça a sua escolha:






Ou você vai acessar os dados no formato Access ou converte passa HFSQL.

E outra vez…




Selecione as tabelas desejadas…






E outra vez…





E recebe a confirmação de que está tudo ok !






E …





Pode acontecer de você receber um aviso de que o wizzard não consegue estabelecer algum link entre as tabelas que ele está importando. E você pode anotar essa informação ou copiar simplesmente para a área de transferência e gravar em arquivo texto para verificação posterior..

Com isso você terá como exemplo…






Então está terminada a primeira parte.

Você importou a estrutura do MDB para dentro do seu sistema.

Mas por exemplo, o objetivo é você importar os dados de arquivos MDB que existem no cliente e que tem essa estrutura. E que você quer passar para HFSQL por exemplo, pelo motivo que você terá maior segurança usando um arquivo HFSQL do que um arquivo MDB e também porque o manuseio dos dados dentro do Windev é muito mais fácil do que arquivos MDB.

Então, eu tenho a seguinte situação:

1 – Tenho uma estrutura importada de um MDB e que quero adequar para HFSQL
2 – Tenho que importar os dados dos clientes que usam o sistema atual e que quero passar para o HFSQL que é mais prático para trabalhar.

Como voou proceder:

1 – Primeiro de tudo crio as mesmas tabelas em HFSQL ou simplesmente mudo o nome dessas e também o tipo da tabela. Como ?

Na análise procedo da seguinte maneira:






Duplo clique na tabela;
Vai abrir a janela Describing the items and indexes of a data file.
Aí você clica conforme indicado pela seta
Vai abrir a tela Describing the data files
Aí, você altera o tipo de tabela conforme indicado.

ATENÇÃO:

Mesmo que você tenha pastas diferentes, as tabelas têm que ter nomes diferentes. Para facilitar, pode manter os nomes e insira só um HF no final do nome e mude o tipo para Hiperfile, Classic ou C/S. No caso do C/s vaias ter que te o servidor para poder conectar. Vamos optar inicialmente por Classic.
Então depois de alterar o tipo, você repete a importação das tabelas, no formato MDB e mantêm o tipo da importação.

Conclusão:
Vou ter duas análises iguais, com tabelas com os mesmos campos, sendo uma analysis com tabelas HFSQL e outra analise com tabelas do tipo OLEDB com a conexão access.

Para evitar poluição visual, crie uma pasta dentro da analysis, e mova todas as tabelas do OLEDB para lá dando um nome a essa pasta, por exemplo Tab_Access.

Bom até tudo tranquilo.

Na prática eu tenho uma analise para HFSQL e outra para Access conectada a uma tabela.
Mas eu quero que essa conexão que eu tenho definida para um arquivo MDB possa ser alterada no cliente e eu possa fazer a importação dos dados e também os meus ajustes transformando os dados de Access para HFSQL.
Então, no cliente, não posso esquecer que, se tiver senha na base MDB eu tenho que eliminar essa base. Faço isso executando aquela rotina que informei lá na primeira página.

Pode fazer isso usando o comando

ExeRun(“nome_do_programa_que_tira_a_senha”)

Ok. Já exclui a senha do arquivo. Agora, tenho que trocar a conexão do arquivo definido anteriormente para o arquivo do cliente.

sBanco_Mdb is string = fSelect("C:\","XLAP","Selecione o arquivo ... ","*.MDB","*.mdb",fselExist)
IF NOT HDescribeConnection("MyConnection", "", "", sBanco_Mdb, "", ...
hOledbAccess2000, hOReadWrite) THEN
Error(HErrorInfo())
RESULT False
ELSE
IF NOT HOpenConnection("MyConnection") THEN
Error(HErrorInfo())
RESULT False
ELSE

HChangeConnection(Tab_Access,"MyConnection")
END
END

Aí, o que vai acontecer, a conexão vai apontar para o arquivo MDB que está no cliente e que ele localizou quando abrir a janela provocada pelo comando fSelect.

Caso ocorra algum erro, ele vai ser anunciado.


Assim você pode fazer as demais rotinas de importação dos dados.

Eu sugiro o feijão com arroz do tipo abre a tabela access, lê e grava na tabela hfsql. Simples assim.

Algumas recomendações:

1 – Se você tem tabela de parâmetros, primeiro a de parâmetros.

2 – Se você tiver tabelas com ligações, importe na sequência:

- Tabela Pai,
- Tabela Filho,
- Tabela neta;

Qualquer dúvida estamos a disposição.

Boa sorte!

José Carlos Warpechowski – Zeca
Skype: jzwarpe@yahoo.com.br
jwarpe@gmail.com
Publicado em janeiro, 19 2016 - 1:10 PM
Muito boa contribuição José Carlos.

Somente gostaria de complementar dizendo que para tirar as senhas dos MDBs, pode-se fazer também através do Access, e no momento de Abrir o MDB, escolher a opção "Abrir no modo exclusivo". Depois usar as Ferramentas do Banco de Dados, ou o recurso no menu Arquivo, para Retirar Senha do Banco de Dados. Vai pedir a senha atual e se confirmada, o BD vai ficar sem senha e pronto para uso.
Membro registado
2.962 mensagems
Popularité : +89 (91 votes)
Publicado em maio, 17 2017 - 7:03 PM
:obrigado:

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membro registado
123 mensagems
Popularité : +5 (5 votes)
Publicado em maio, 17 2017 - 9:17 PM
Conexão dinamica com ACCESS (Via ODBC) em ambiente de produção
s_nome_odbc is string = "NOME_MEU_ODBC"//nome do ODBC para ser usado na conexão do Windev
s_chave_registro_principal_32bits_em_64bits is string = "HKEY_LOCAL_MACHINE\Software\Wow6432Node\ODBC\ODBC.INI\"+s_nome_odbc //este seria no caso da maquina ser de 64 bits
s_chave_registro_principal_32bits is string = "HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\"+s_nome_odbc //este seria no caso da maquina ser de 32 bits
s_sub_key1 ,s_sub_key2 are strings
s_sub_key1 = "\Engines"
s_sub_key2 = s_sub_key1 + "\Jet"

s_driver is string = "C:\Windows\system32\odbcjt32.dll"
s_dbq is string = "C:\meu_arquivo_Access.mdb" //Pasta/direção completa do arquivo .mdb/.accdb
s_fil is string = "MS Access;"
s_password is string = "123" //no caso de ter PASSOWORD

IF SysWindowsVersion(sysProcessor) = 32 THEN
RegistryDeleteKey(s_chave_registro_principal_32bits)//delete para logo criar novamente caso ja exista

RegistryCreateKey(s_chave_registro_principal_32bits)
RegistryCreateKey(s_chave_registro_principal_32bits+s_sub_key1)
RegistryCreateKey(s_chave_registro_principal_32bits+s_sub_key2)

RegistrySetValue(s_chave_registro_principal_32bits, "DBQ", s_dbq)
RegistrySetValue(s_chave_registro_principal_32bits, "Driver", s_driver)
RegistrySetValue(s_chave_registro_principal_32bits, "DriverId", 25,RegistryTypeInt)
RegistrySetValue(s_chave_registro_principal_32bits, "FIL", s_fil)
RegistrySetValue(s_chave_registro_principal_32bits, "SafeTransactions", 0, RegistryTypeInt)
RegistrySetValue(s_chave_registro_principal_32bits, "UID", "")
IF Length(s_password) > 0 THEN RegistrySetValue(s_chave_registro_principal_32bits, "PWD", s_password)

//SubKeys Auxiliares
RegistrySetValue(s_chave_registro_principal_32bits+s_sub_key2,"ImplicitCommitSync","")
RegistrySetValue(s_chave_registro_principal_32bits+s_sub_key2,"MaxBufferSize",2048,RegistryTypeInt)
RegistrySetValue(s_chave_registro_principal_32bits+s_sub_key2,"PageTimeout",5,RegistryTypeInt)
RegistrySetValue(s_chave_registro_principal_32bits+s_sub_key2,"Threads",3,RegistryTypeInt)
RegistrySetValue(s_chave_registro_principal_32bits+s_sub_key2,"UserCommitSync","Yes")

//verificamos si o registro foi criado
IF NOT RegistryExist(s_chave_registro_principal_32bits) THEN
Error("Erro ao criar os registros")
RETURN
END
ELSE
//no caso si for Win 64 criar apenas dentro do Node WOW6432Node
RegistryDeleteKey(s_chave_registro_principal_32bits_em_64bits)//delete para logo criar novamente caso ja exista

RegistryCreateKey(s_chave_registro_principal_32bits_em_64bits)
RegistryCreateKey(s_chave_registro_principal_32bits_em_64bits+s_sub_key1)
RegistryCreateKey(s_chave_registro_principal_32bits_em_64bits+s_sub_key2)

RegistrySetValue(s_chave_registro_principal_32bits_em_64bits, "DBQ", s_dbq)
RegistrySetValue(s_chave_registro_principal_32bits_em_64bits, "Driver", s_driver)
RegistrySetValue(s_chave_registro_principal_32bits_em_64bits, "DriverId", 25,RegistryTypeInt)
RegistrySetValue(s_chave_registro_principal_32bits_em_64bits, "FIL", s_fil)
RegistrySetValue(s_chave_registro_principal_32bits_em_64bits, "SafeTransactions", 0, RegistryTypeInt)
RegistrySetValue(s_chave_registro_principal_32bits_em_64bits, "UID", "")
IF Length(s_password) > 0 THEN RegistrySetValue(s_chave_registro_principal_32bits_em_64bits, "PWD", s_password)

//SubKeys Auxiliares
RegistrySetValue(s_chave_registro_principal_32bits_em_64bits+s_sub_key2,"ImplicitCommitSync","")
RegistrySetValue(s_chave_registro_principal_32bits_em_64bits+s_sub_key2,"MaxBufferSize",2048,RegistryTypeInt)
RegistrySetValue(s_chave_registro_principal_32bits_em_64bits+s_sub_key2,"PageTimeout",5,RegistryTypeInt)
RegistrySetValue(s_chave_registro_principal_32bits_em_64bits+s_sub_key2,"Threads",3,RegistryTypeInt)
RegistrySetValue(s_chave_registro_principal_32bits_em_64bits+s_sub_key2,"UserCommitSync","Yes")

//verificamos si o registro foi criado
IF NOT RegistryExist(s_chave_registro_principal_32bits_em_64bits) THEN
Error("Erro ao criar os registros")
RETURN
END
END

//pequeno teste de conexão
ctConn_test is Connection

ctConn_test..Provider = hODBC
ctConn_test..Source = s_nome_odbc
ctConn_test..Access = hOReadWrite
IF HOpenConnection(ctConn_test) THEN
Info("Conn OK")
ELSE
Error("Error Conn",HErrorInfo())
END
HCloseConnection(ctConn_test)



Podem colocar isso em um Botão , executar e logo podem também usar esa configuração em desenvolvimento para criar/importar o banco para a anlisys













Vai ficar assim





--
Atte. Willian Fernando