Como acessar BD Access utilizando Access Basic


Página 1 de 2    1  2 
01-04-2003 por GBastos
Como acessar BD Access utilizando Access Basic
Pessoal,

Estou com um problema, tenho que acessar de um bd access outro bd que tem senha e não estou conseguindo.
Tentei normalmente com Set dbDestino = OpenDatabase(txtBasePrincipal.Text) mas deu que precisava de senha.
Ai estou tentando com:
Set dbDestino = OpenDatabase(txtBasePrincipal.Text) , False, False, "ODBC; pwd=SENHA")
Mas dá erro de ODBC.
O comando é esse mesmo? Ou tenho que acessar o banco de outro jeito? :? :?
Estou precisando com urgencia saber...
01-04-2003 por romulo
Basta fazer assim:

OpenDatabase("c:\caminho\bd.mdb", False, False, ";pwd=senha")
01-04-2003 por GBastos
Citação:
Postado Originalmente por romulo
Basta fazer assim:

OpenDatabase("c:\caminho\bd.mdb", False, False, ";pwd=senha")
Com o set?
Assim?
Set dbDestino = OpenDatabase(txtBasePrincipal.Text, False, False, "pwd=SENHA")
Já tentei e dá:
Erro em tempo de execução 3151
Conexão ODBC--para 'c:\bdcobcaixa.mdb' falhou.
01-04-2003 por romulo
Citação:
Postado Originalmente por GBastos
Com o set?
Assim?
Set dbDestino = OpenDatabase(txtBasePrincipal.Text, False, False, "pwd=SENHA")
Já tentei e dá:
...
Você esqueceu do ponto e vírgula:

";pwd=SENHA"
01-04-2003 por GBastos
Citação:
Postado Originalmente por romulo
Você esqueceu do ponto e vírgula:

";pwd=SENHA"
Cara, por causa de um ponto e virgula... Ja estou revendo minha opiniao sobre VB...
Funcionou mas ele está travando :lol:
Vc sabe se existe no access algo tipo o trace into do Delphi?
E ai vai o código, caso alguem tenha alguma idéia.
Tenho que copiar os dados de um bd para outro modificando apenas um campo.
PS: Não reparem a redundância do código, é pq não tenho tempo para construir um procedimento...
PS 2: Não reparem tb se o tópico ficar com muitas visualizações, é pq eu estou dando refresh toda hora para ver se alguem respondeu.. :lol:
Código:
Private Sub Comando0_Click() Dim dbOrigem As Database Dim tbOrigem As Recordset Dim dbDestino As Database Dim tbDestino As Recordset Dim CodCedente As String Dim I As Integer txtBasePrincipal.SetFocus Set dbDestino = OpenDatabase(txtBasePrincipal.Text, False, False, ";pwd=SENHA") txtBaseVinculado.SetFocus Set dbOrigem = OpenDatabase(txtBaseVinculado.Text, False, False, ";pwd=SENHA") Set tbDestino = dbDestino.OpenRecordset("tbCedentes") Set tbOrigem = dbOrigem.OpenRecordset("tbCedentes") CodCedente = VerificaCodCedente(tbOrigem!Agencia, tbOrigem!Operacao, tbOrigem!Conta, tbDestino) If StrComp(CodCedente, "0") = 0 Then MsgBox Title:="Erro!", Prompt:="Copie primeiro os dados do convênio (tbCedentes) para a base do convênio principal" Exit Sub End If Set tbDestino = dbDestino.OpenRecordset("tbParCedente") Set tbOrigem = dbOrigem.OpenRecordset("tbParCedente") If Parametros.InSelection Then Do Until tbOrigem.EOF tbDestino.AddNew tbDestino.Fields(0) = CodCedente For I = 1 To 36 tbDestino.Fields(I) = tbOrigem.Fields(I) Next I tbDestino.Update Loop End If Set tbDestino = dbDestino.OpenRecordset("tbSacado") Set tbOrigem = dbOrigem.OpenRecordset("tbSacado") If Sacados.InSelection Then Do Until tbOrigem.EOF tbDestino.AddNew tbDestino.Fields(0) = CodCedente For I = 1 To 64 tbDestino.Fields(I) = tbOrigem.Fields(I) Next I tbDestino.Update Loop End If Set tbDestino = dbDestino.OpenRecordset("tbTitulos") Set tbOrigem = dbOrigem.OpenRecordset("tbTitulos") If Titulos.InSelection Then Do Until tbOrigem.EOF tbDestino.AddNew tbDestino.Fields(0) = CodCedente For I = 1 To 64 tbDestino.Fields(I) = tbOrigem.Fields(I) Next I tbDestino.Update Loop End If Set tbDestino = dbDestino.OpenRecordset("tbRetorno") Set tbOrigem = dbOrigem.OpenRecordset("tbRetorno") If Retornos.InSelection Then Do Until tbOrigem.EOF tbDestino.AddNew tbDestino.Fields(0) = CodCedente For I = 1 To 64 tbDestino.Fields(I) = tbOrigem.Fields(I) Next I tbDestino.Update Loop End If Set tbDestino = dbDestino.OpenRecordset("tbRemessa") Set tbOrigem = dbOrigem.OpenRecordset("tbRemessa") If Remessas.InSelection Then Do Until tbOrigem.EOF tbDestino.AddNew tbDestino.Fields(0) = CodCedente For I = 1 To 64 tbDestino.Fields(I) = tbOrigem.Fields(I) Next I tbDestino.Update Loop End If Set tbDestino = dbDestino.OpenRecordset("tbGrupos") Set tbOrigem = dbOrigem.OpenRecordset("tbGrupos") If Grupos.InSelection Then Do Until tbOrigem.EOF tbDestino.AddNew tbDestino.Fields(0) = CodCedente For I = 1 To 64 tbDestino.Fields(I) = tbOrigem.Fields(I) Next I tbDestino.Update Loop End If dbDestino.Close dbOrigem.Close End Sub Function VerificaCodCedente(Agencia, Operacao, Conta As String, tbDestino As Recordset) As String Result = "0" With tbDestino Do Until ((.EOF) Or (StrComp(Result, "0") <> 0)) .Edit If StrComp(!Agencia, Agencia) = 0 Then If StrComp(!Operacao, Operacao) = 0 Then If StrComp(!Conta, Conta) = 0 Then Result = !CodCedente End If End If End If Loop End With End Function
01-04-2003 por romulo
Citação:
Postado Originalmente por GBastos
Cara, por causa de um ponto e virgula... Ja estou revendo minha opiniao sobre VB...
Funcionou mas ele está trav...
Cara, antes de relacionar os recordsets a outra tabela, é melhor fechar antes. Recomendo que você abra o origem como snapshot e o destino como dynaset.

Nessa função o loop tá infinito, e no VB não existe o Result do Delphi:

Código:
Function VerificaCodCedente(Agencia, Operacao, Conta As String, tbDestino As Recordset) As String Dim Result as String Result = "0" With tbDestino Do Until ((.EOF) Or (StrComp(Result, "0") <> 0)) If StrComp(!Agencia, Agencia) = 0 Then If StrComp(!Operacao, Operacao) = 0 Then If StrComp(!Conta, Conta) = 0 Then Result = !CodCedente End If End If End If .MoveNext '<--!!!!!! Loop End With VerificaCodCedente = Result End Function
Também não precisa do Edit que tinha.
01-04-2003 por GBastos
Citação:
Postado Originalmente por romulo
Cara, antes de relacionar os recordsets a outra tabela, é melhor fechar antes. Recomendo que você abra o origem como ...
Foi mal, esqueci do MoveNext.. :lol:
Fiz as modificações, mas inexplicavelmente ele dá erro no update do primeiro for informando que não pode criar valores duplicados... Mas a tabela so tem uma chave primaria que exatamente o que eu modifico na linha:
tbDestino.Fields(0) = CodCedente
Eu so modifiquei o tipo de CodCedente para long pq no bd está como longo... Já coloquei pontos de interrupção e vi que os dados estão todos sendo copiados corretamente... Esse erro pode significar outra coisa?
01-04-2003 por romulo
Citação:
Postado Originalmente por GBastos
Foi mal, esqueci do MoveNext.. :lol:
Fiz as modificações, mas inexplicavelmente ele dá erro no update do primeiro ...
Na verdade vai dar erro mesmo, pois nesse loop você está incluindo o mesmo registro da tabela de origem na destino com a mesma chave (CodCedente), também é um loop infinito. Mas mesmo que você coloque o MoveNext da tbOrigem, ainda assim vai continuar dando o erro, pois vai continuar inserindo a mesma chave.

Código:
Do Until tbOrigem.EOF tbDestino.AddNew tbDestino.Fields(0) = CodCedente For I = 1 To 64 tbDestino.Fields(I) = tbOrigem.Fields(I) Next I tbDestino.Update Loop
01-04-2003 por GBastos
Já descobri o erro acima, tinha viajado total e botado o update dentro do for... :lol:
Porém no segundo for dá o mesmo erro agora e o update está fora.
Verifiquei no bd que ele so copiou um registro. Tem que usar o movenext depois do update do addnew, ou o addnew já fiz isso automaticamente?
01-04-2003 por romulo
Citação:
Postado Originalmente por GBastos
Já descobri o erro acima, tinha viajado total e botado o update dentro do for... :lol:
Porém no segundo for dá o me...
Cara, atualiza o código colocando as tuas alterações, pra ver como tá agora.
01-04-2003 por GBastos
Citação:
Postado Originalmente por romulo
Cara, atualiza o código colocando as tuas alterações, pra ver como tá agora.
Consegui!
Hehehehehehe
Quando eu ganhar na Mega Sena, 1 milhao vai pra vc! :lol:
Valeu mesmo!

Agora, tem outras questoes, primeiro as linhas com InSelection estão dando o seguinte erro:
Erro em tempo de execução '2187'
Esta propriedade só está disponível em modo Estrutura.
Segundo, como faço para o checkbox ficar desmarcada por padrão? (checked = false no Delphi)
Terceiro, existe alguma função para procurar arquivos no diretório, tipo o FindFirst(*.*', faArchive, Arquivo) do Delphi?

Valeu mais uma vez!
01-04-2003 por romulo
Citação:
Postado Originalmente por GBastos
Consegui!
Hehehehehehe
Quando eu ganhar na Mega Sena, 1 milhao vai pra vc! :l...
Para procurar o arquivo pode usar a função "Dir". Pra marcar e desmarcar a checkbox, basta fazer o value = true ou false. O InSelection até hoje nunca usei...
01-04-2003 por GBastos
Citação:
Postado Originalmente por romulo
Para procurar o arquivo pode usar a função "Dir". Pra marcar e desmarcar a checkbox, basta fazer o value = true ou fa...
Valeu, consegui com o value...
Agora, existe uma função que pegue uma string e verifique se tem outra dentro desta? Não achei no help do Access...
Outra coisa, vi no help que não é aconselhável passar tipos muito complexos para funções.. Entao eu queria saber se posso passar recordset e database e se tem alguma restrição ou posso passar por referencia sem problemas?
01-04-2003 por romulo
Citação:
Postado Originalmente por GBastos
Valeu, consegui com o value...
Agora, existe uma função que pegue uma string e verifique se tem outra dentro desta? ...
Pra verificar se há uma string dentro da outra você pode usar a função "InStr".

O problema de se passar objetos grandes por valor para funções é que eles são copiados novamente na memória, o que além de consumir mais memória é um processo lento. Mas se você passar por referência resolve o problema, desde que você se assegure que não vai modificar os valores dentro da função (se não desejar, é claro).
01-04-2003 por GBastos
Valeu!

A ultima dúvida, vc sabe como utilizar o componente barra de progresso do Access? Não achei absolutamente nada no help sobre ele...
E alguma dica de livro?
01-04-2003 por romulo
Citação:
Postado Originalmente por GBastos
Valeu!

A ultima dúvida, vc sabe como utilizar o componente barra de progresso do Access? Não achei absolutamente n...
Você diz a barra de progresso ActiveX ou a barra de progresso da statusbar? Se for o ActiveX, é só gerenciar as propriedades Min, Max e Value. A da statusbar eu usei muito, mas faz tanto tempo que nem lembro mais... ops:
02-04-2003 por GBastos
É do activex, valeu!
Outra coisa, existe uma funçao que retorno a quantidade de campos de um registro?
02-04-2003 por romulo
Citação:
Postado Originalmente por GBastos
É do activex, valeu!
Outra coisa, existe uma funçao que retorno a quantidade de campos de um registro?
Recordset.Fields.Count
02-04-2003 por GBastos
Citação:
Postado Originalmente por romulo
Recordset.Fields.Count
Beleza, ja adaptei.

Agora outra coisa, notei que o Dir devolve somente o nome do arquivo, mas eu preciso tb do path para usar o opendatabase, como faço?
02-04-2003 por romulo
Citação:
Postado Originalmente por GBastos
Beleza, ja adaptei.

Agora outra coisa, notei que o Dir devolve somente o nome do arquivo, mas eu preciso tb do pat...
Posta aí a parte do código em que você está usando.
 
Guia do Hardware Melhores Tópicos