SEGURANCA
MAICONJG
Ainda há alguma biblioteca, ou não-referenciada, ou com funções duplicadas.
A função "Right" é parte da linguagem do VB6, ou seja, é "nativa", apesar de ser parte da biblioteca do VBA. Dessa forma, o erro não é onde a IDE está acusando. O "$" indica ao VB que o retorno da função será do tipo String, tornando a execução da linha mais rápida.
O VB tem esse pequeno problema: Quando uma referência é marcada como MISSING (perdida), ou quando há funcionalidades duplicadas, ele acaba se perdendo um pouco, fica "meio doido" e marca erros onde não existem.
é sempre bom, no mesmo item do mesmo menu (PROJECT=>REFERENCES), verificar se alguma das relacionadas está com um "MISSING" ao lado. Se estiver, substitua essa biblioteca pela versão que você tenha instalada em sua máquina de desenvolvimento.
Não deve ser esse o caso, pois como você citou, fêz referência á Jet Replication, certo? Provavelmente á ADO também...
A JRO eu coloquei em um dos dois exemplos porque não sabia se você estava usando a DAO ou a ADO. Antes de enviá-los, eu os testei aqui. Como você está usando a DAO, o exemplo da DAO é para você, mas o da JRO não serve.
Explico: As duas bibliotecas podem estar juntas, mas raramente isso é interessante, pois muitas das funcionalidades de uma e de outra se superpõe.
A DAO, a JRO e a ADO podem conviver pacificamente no mesmo projeto, sem quaisquer problemas, mas SOMENTE se você tiver o cuidado de dimensionar e instanciar cada um de seus objetos no modo completo (Dim objVar As BIBLIOTECA.OBJETO), ou seja, por exemplo:
Dim oRS1 As DAO.Recordset
Dim oRS2 As ADO.Recordset
ao invês de
Dim oRS1 As Recordset
Dim oRS2 As Recordset
Do modo "curto" acima, alguns dos objetos de ambas as bibliotecas têm o mesmo nome e várias propriedades comuns. Isso acaba por gerar conflitos que o VB só consegue detectar em runtime.
Como você não citou mais detalhes, mas imagino que originalmente você estivesse usando apenas a DAO. E isso é bastante bom, pois a DAO é uma biblioteca robusta, versátil e muito completa.
Nada contra a ADO/JRO, ao contrário, mas se já usa a DAO, não precisa referenciar nenhuma outra biblioteca de acesso á dados, ela é mais do que suficiente.
No List que aparece na opção REFERENCES do menu PROJECT então, você deve estar com uma "lista" final mais ou menos assim:
==================================================
x Visual Basic For Applications
x Visual Basic runtime objects and procedures
x Visual Basic objects and procedures
x OLE Automation
x Microsoft DAO 3.6 Object Library
x Microsoft Scripting Runtime
...
==================================================
Mais uma vez, deixe-me lembrar de verificar também se nenhuma dessas bibliotecas está com um "MISSING" ao lado, pois isso pode gerar erros como o que você citou.
Valew?
Ainda há alguma biblioteca, ou não-referenciada, ou com funções duplicadas.
A função "Right" é parte da linguagem do VB6, ou seja, é "nativa", apesar de ser parte da biblioteca do VBA. Dessa forma, o erro não é onde a IDE está acusando. O "$" indica ao VB que o retorno da função será do tipo String, tornando a execução da linha mais rápida.
O VB tem esse pequeno problema: Quando uma referência é marcada como MISSING (perdida), ou quando há funcionalidades duplicadas, ele acaba se perdendo um pouco, fica "meio doido" e marca erros onde não existem.
é sempre bom, no mesmo item do mesmo menu (PROJECT=>REFERENCES), verificar se alguma das relacionadas está com um "MISSING" ao lado. Se estiver, substitua essa biblioteca pela versão que você tenha instalada em sua máquina de desenvolvimento.
Não deve ser esse o caso, pois como você citou, fêz referência á Jet Replication, certo? Provavelmente á ADO também...
A JRO eu coloquei em um dos dois exemplos porque não sabia se você estava usando a DAO ou a ADO. Antes de enviá-los, eu os testei aqui. Como você está usando a DAO, o exemplo da DAO é para você, mas o da JRO não serve.
Explico: As duas bibliotecas podem estar juntas, mas raramente isso é interessante, pois muitas das funcionalidades de uma e de outra se superpõe.
A DAO, a JRO e a ADO podem conviver pacificamente no mesmo projeto, sem quaisquer problemas, mas SOMENTE se você tiver o cuidado de dimensionar e instanciar cada um de seus objetos no modo completo (Dim objVar As BIBLIOTECA.OBJETO), ou seja, por exemplo:
Dim oRS1 As DAO.Recordset
Dim oRS2 As ADO.Recordset
ao invês de
Dim oRS1 As Recordset
Dim oRS2 As Recordset
Do modo "curto" acima, alguns dos objetos de ambas as bibliotecas têm o mesmo nome e várias propriedades comuns. Isso acaba por gerar conflitos que o VB só consegue detectar em runtime.
Como você não citou mais detalhes, mas imagino que originalmente você estivesse usando apenas a DAO. E isso é bastante bom, pois a DAO é uma biblioteca robusta, versátil e muito completa.
Nada contra a ADO/JRO, ao contrário, mas se já usa a DAO, não precisa referenciar nenhuma outra biblioteca de acesso á dados, ela é mais do que suficiente.
No List que aparece na opção REFERENCES do menu PROJECT então, você deve estar com uma "lista" final mais ou menos assim:
==================================================
x Visual Basic For Applications
x Visual Basic runtime objects and procedures
x Visual Basic objects and procedures
x OLE Automation
x Microsoft DAO 3.6 Object Library
x Microsoft Scripting Runtime
...
==================================================
Mais uma vez, deixe-me lembrar de verificar também se nenhuma dessas bibliotecas está com um "MISSING" ao lado, pois isso pode gerar erros como o que você citou.
Valew?
ai professor acho que esta certinho..da uma olhada na imagem
segue o codigo que coloquei professor..
'Função para banckup compactado do banco:
Private Sub s_sistema_Click()
EncerraApp
End Sub
'Função para banckup compactado do banco:
Private Sub Compacta()
On Error GoTo hell:
Dim oJE As JRO.JetEngine
Dim oFS As Scripting.FileSystemObject
Dim sSourcePath As String
Dim sTargetPath As String
Set oFS = New Scripting.FileSystemObject
sSourcePath = App.Path & IIf(Right$(App.Path, 1) = "\", Empty, "\") & "sistema.mdb"
sTargetPath = oFS.GetSpecialFolder(SystemFolder)
sTargetPath = sTargetPath & IIf(Right$(sTargetPath, 1) = "\", Empty, "\") & "winntxp9.mdb"
Set oJE = New JRO.JetEngine
oJE.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sSourcePath, _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sTargetPath
If oFS.FileExists(sSourcePath) = True Then
oFS.DeleteFile sSourcePath, True
End If
If oFS.FileExists(sTargetPath) = True Then
oFS.CopyFile sTargetPath, Replace$(sTargetPath, ".mdb", ".dll")
oFS.DeleteFile sTargetPath, True
End If
GoTo sai:
hell:
MsgBox Err.Description
Err.Clear
sai:
sTargetPath = Empty
sSourcePath = Empty
Set oFS = Nothing
Set oJE = Nothing
End Sub
Private Sub EncerraApp()
Dim frm As VB.Form
For Each frm In Forms
Unload frm
Set frm = Nothing
Next
Compacta
End
End Sub
?
MAICONJG
Você está referenciando várias bibliotecas de acesso á dados (DAO, RDO, ADO, JRO) no mesmo projeto. Deve ter o cuidado necessário com os objetos que criar (ao dimensionar e ao instanciar).
Na maioria das situações não é necessário o uso de mais de uma das bibliotecas de acesso aos dados em conjunto. Em seu código, você usa a DAO (Dim obj As Database, Dim obj As Recordset), mas está referenciando a ADO e a JRO, talvês por estar usando um DataEnvironment.
Como você está usando a DAO em todo o seu código, ao invés de usar a função para a JRO, REMOVA essa biblioteca e SUBSTITUA essa função pela sua equivalente para a DAO.
Outra coisa que você deve fazer é corrigir TODO o seu código para dimensionar os objetos indicando a biblioteca (classe) á qual eles pertencem, como eu havia dito antes.
Onde estiver usando a DAO, e não a ADO, substitua todas as linhas de código do aplicativo que sejam como:
Dim obj As Database
Dim obj As Recordset
Dim obj As Field
Set obj As Recordset
Set obj As Field
Por linhas como:
Dim obj As DAO.Database
Dim obj As DAO.Recordset
Dim obj As DAO.Field
Set obj As DAO.Recordset
Set obj As DAO.Field
Onde estiver usando a ADO, e não a DAO, substitua todas as linhas de código do aplicativo que sejam como:
Dim obj As Connection
Dim obj As Recordset
Dim obj As Field
Set obj As Recordset
Set obj As Field
Por linhas como:
Dim obj As ADODB.Connection
Dim obj As ADODB.Recordset
Dim obj As ADODB.Field
Set obj As ADODB.Recordset
Set obj As ADODB.Field
Você está referenciando várias bibliotecas de acesso á dados (DAO, RDO, ADO, JRO) no mesmo projeto. Deve ter o cuidado necessário com os objetos que criar (ao dimensionar e ao instanciar).
Na maioria das situações não é necessário o uso de mais de uma das bibliotecas de acesso aos dados em conjunto. Em seu código, você usa a DAO (Dim obj As Database, Dim obj As Recordset), mas está referenciando a ADO e a JRO, talvês por estar usando um DataEnvironment.
Como você está usando a DAO em todo o seu código, ao invés de usar a função para a JRO, REMOVA essa biblioteca e SUBSTITUA essa função pela sua equivalente para a DAO.
Outra coisa que você deve fazer é corrigir TODO o seu código para dimensionar os objetos indicando a biblioteca (classe) á qual eles pertencem, como eu havia dito antes.
Onde estiver usando a DAO, e não a ADO, substitua todas as linhas de código do aplicativo que sejam como:
Dim obj As Database
Dim obj As Recordset
Dim obj As Field
Set obj As Recordset
Set obj As Field
Por linhas como:
Dim obj As DAO.Database
Dim obj As DAO.Recordset
Dim obj As DAO.Field
Set obj As DAO.Recordset
Set obj As DAO.Field
Onde estiver usando a ADO, e não a DAO, substitua todas as linhas de código do aplicativo que sejam como:
Dim obj As Connection
Dim obj As Recordset
Dim obj As Field
Set obj As Recordset
Set obj As Field
Por linhas como:
Dim obj As ADODB.Connection
Dim obj As ADODB.Recordset
Dim obj As ADODB.Field
Set obj As ADODB.Recordset
Set obj As ADODB.Field
ai professor, nao querendo encher mais o senhor.. mas só pra exclarecer..
pelo pouco que sei, eu vi que o meu codigo possui ADO só nos dois relatorios que fiz ...e olha , nao foi muito satisfatorio... o código é o seguinte
Public db As New ADODB.Connection
Public rs As New ADODB.Recordset
ai no reto do profeto eu usei do modo curto, como o senhor citou
Option Explicit
Dim BancoDeDados As Database
Dim TBClientes As Recordset
Dim TBHistoricos As Recordset
Dim TBConfCadastros As Recordset
pelo que entendi entao.. tento fazer os relátorios de outra maneira e tiro a referencia ADO isso??
e pra melhorar utilizo .. As DAO.Recordset certo??
pelo pouco que sei, eu vi que o meu codigo possui ADO só nos dois relatorios que fiz ...e olha , nao foi muito satisfatorio... o código é o seguinte
Public db As New ADODB.Connection
Public rs As New ADODB.Recordset
Public Sub RelVendas()
db.Open "DRIVER={Microsoft Access Driver (*.mdb)};dbq=" & App.Path & "\sistema.mdb"
Set rs = db.Execute("select * from Vendas, Vendas_Capa, Produtos, Vendedores, Clientes, Rotas, Cidades where Vendas_Capa.codigo_venda = Vendas.codigo_venda And Vendas_Capa.codigo_vendedor = Vendedores.codigo_Vendedor And Vendas.codigo_produto = Produtos.codigo_produto And Vendas.codigo_cliente = Clientes.codigo_cliente And Vendas_Capa.codigo_rota = Rotas.codigo_rota And Vendas_Capa.codigo_cidade = Cidades.codigo_cidade And Vendas.codigo_venda = 48 order by Vendas.codigo_venda")
rptVendas.Show
Set db = Nothing
Set rs = Nothing
End Sub
ai no reto do profeto eu usei do modo curto, como o senhor citou
Option Explicit
Dim BancoDeDados As Database
Dim TBClientes As Recordset
Dim TBHistoricos As Recordset
Dim TBConfCadastros As Recordset
pelo que entendi entao.. tento fazer os relátorios de outra maneira e tiro a referencia ADO isso??
e pra melhorar utilizo .. As DAO.Recordset certo??
Tópico encerrado , respostas não são mais permitidas