PROBLEMA COM CONEXAO
Pessoal o programa tava funcionado certinho, estava usando DAO porem em certos casos com buscar dados de duas tabelas ao mesmo tempo com esta conexao nao dava certo ai resolvi mudar todo o programa para ADO
tudo isso com Access 2000 o problema e que nao exclui mais os dados nao altera mais ta tudo loco, gente o que acontece por favor me ajudem que ja eu ja to queimando a pestana e nao consigo resolver, segue abaixo o codigo. desde ja agradeco. sera que precisa ser retirado algo em referencia ou em componentes.
modulo
Public cnn As ADODB.Connection
Public rst As ADODB.Recordset
Dim Fonte As String
em um form
tudo isso com Access 2000 o problema e que nao exclui mais os dados nao altera mais ta tudo loco, gente o que acontece por favor me ajudem que ja eu ja to queimando a pestana e nao consigo resolver, segue abaixo o codigo. desde ja agradeco. sera que precisa ser retirado algo em referencia ou em componentes.
modulo
Public cnn As ADODB.Connection
Public rst As ADODB.Recordset
Dim Fonte As String
sub Conexao()
Set cnn = New ADODB.Connection
On Error GoTo Erro_Drive
Set DriveF = Fs.GetDrive("F:\")
If Not DriveF.IsReady Then
mdiInicio.txtConexao.Text = "Conexão Local"
MsgBox "Atenção você não esta conectado na rede!", vbCritical, "Drive F"
Fonte = App.Path & "\MedicalDados.mdb"
cnn.CursorLocation = adUseServer
With cnn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.Properties("Data Source") = Fonte
.Properties("Jet OLEDB:Database Password") = "1255"
.Open
End With
Else
mdiInicio.txtConexao.Text = "Conectado Rede"
Fonte = ("F:\Quick-Fonte\MedicalDados.mdb")
cnn.CursorLocation = adUseClient
With cnn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.Properties("Data Source") = Fonte
.Properties("Jet OLEDB:Database Password") = "info"
.Open
End With
End If
Exit Sub
Set Fs = Nothing
Erro_Drive:
If Err.Number = 68 Then
Resume Next
ElseIf Err.Number = 91 Then
Resume Next
End If
End Sub
em um form
Sub Excluir_Horario
If MsgBox("Tem certeza que deseja excluir?", vbQuestion + vbYesNo) = vbNo Then Exit Sub
Set rst = New ADODB.Recordset
SQL = "select * from Agenda where Indice = '" &
rst.Open SQL, cnn, adOpenKeyset, adLockOptimistic
rst("Indice") = Empty
rst("Data") = Empty
rst("Semana") = Empty
rst("Codigo") = Empty
rst("Paciente") = Empty
rst("Mes") = Empty
rst("Ano") = Empty
rst("Hora") = Empty
rst("HoraTerm") = Empty
rst("Obs") = Empty
rst("Usuario") = Empty
rst("Presenca") = Empty
rst("Posicao") = Empty
rst("Sequencia") = Empty
rst("ValorProf") = Empty
rst("PercProf") = Empty
rst("PercClin") = Empty
rst("ValorClinica") = Empty
rst("ValorSessao") = Empty
rst.Delete
rst.Close
Call frmAgenda.Limpar
Call frmAgenda.BuscaFrequencia
Unload Me
End Sub
eu retirei o tratamento de erro e deu o seguinte erro no rst.Delete
run time error 2147467259 (80004005)':
As alteracoes solicitadas para tabela nao foram satisfatorias ja que criaram valores duplicados no indice, chave primaria ou relacao. altere os dados no campo que contem os dados duplicados, remova o indice ou redefina o indice para possibilitar entradas duplicadas.
o problema e que nem chave primaria tinha e dava este erro, agora eu coloquei um indice como chave primaria e continua dando o erro.
run time error 2147467259 (80004005)':
As alteracoes solicitadas para tabela nao foram satisfatorias ja que criaram valores duplicados no indice, chave primaria ou relacao. altere os dados no campo que contem os dados duplicados, remova o indice ou redefina o indice para possibilitar entradas duplicadas.
o problema e que nem chave primaria tinha e dava este erro, agora eu coloquei um indice como chave primaria e continua dando o erro.
Set rst = New ADODB.Recordset
SQL = "select * from Agenda where [txt-color=#ff0000]Indice = '" [/txt-color]&
rst.Open SQL, cnn, adOpenKeyset, adLockOptimistic
nao deveria ter uma variavel indicando o que voce quer excluir....
Colega, ñ seira melhor vc fazer assim:
supondo q vc tenha como chave o campo "Indice"
supondo q vc tenha como chave o campo "Indice"
If MsgBox("Tem certeza que deseja excluir?", vbQuestion + vbYesNo) = vbYes then
cnn.Execute "DELETE FROM AGENDA WHERE INDICE = " & txtIndice
End If
Set rst = New ADODB.Recordset
SQL = "select * from Agenda where Indice = '" &
rst.Open SQL, cnn, adOpenKeyset, adLockOptimistic
nao deveria ter uma variavel indicando o que voce quer excluir....
aqui no site eu escrevi errado mas na string esta certo
agora um duvida mesmo que a conexao e feita la no modulo e as vezes conecta com a rede e a vezes nao , na frente de cada sql = "Select eu coloco cnn.execute, e quando for alteraçao como coloco ?
SQL = "select * from Agenda where Indice = '" &
rst.Open SQL, cnn, adOpenKeyset, adLockOptimistic
nao deveria ter uma variavel indicando o que voce quer excluir....
aqui no site eu escrevi errado mas na string esta certo
agora um duvida mesmo que a conexao e feita la no modulo e as vezes conecta com a rede e a vezes nao , na frente de cada sql = "Select eu coloco cnn.execute, e quando for alteraçao como coloco ?
pessoal to pensando em voltar tudo pro Dao novamente, porque nao estou conseguindo o vcs acham ?
pessoal aparentemente deu certo da seguinte forma:
Set rst = New ADODB.Recordset
SQL = "select * from Agenda where Indice = '" & frmAgenda.lstData.SelectedItem.ListSubItems(7) & "'"
rst.CursorLocation = adUseServer
rst.CursorType = adOpenKeyset
rst.LockType = adLockOptimistic
rst.Open SQL, cnn
!campo = empty
!campo2 = empty
rst.Delete
ta funcionando, a unica coisa que acrescentei foi rst.CursorLocation = AdUseServer
valeu pessoal muito grato.
Set rst = New ADODB.Recordset
SQL = "select * from Agenda where Indice = '" & frmAgenda.lstData.SelectedItem.ListSubItems(7) & "'"
rst.CursorLocation = adUseServer
rst.CursorType = adOpenKeyset
rst.LockType = adLockOptimistic
rst.Open SQL, cnn
!campo = empty
!campo2 = empty
rst.Delete
ta funcionando, a unica coisa que acrescentei foi rst.CursorLocation = AdUseServer
valeu pessoal muito grato.
Particularmente espero que F NÃO seja um Drive de rede, por que se for Access te causará sérios problemas se o objetivo for criar uma aplicação robusta, segura, rapida e escalonável.
A sua Conexão nem dei muito importancia, suponho que esteja correta uma vez que funciona para outros processos.
No seu caso eu Criaria uma função DeleteHorario e dentro dela utilizaria um Command ou Senão a Propria Conexão para executar uma String SQL para o Delete. Nada de ficar utilizando esses métodos do ADO, String SQL é mais Escalonável e via de regra mais rápidas por que dependendo do BD manda o gerenciamento da execução para ele (não é o caso do Access ou qualquer outro BD de arquivo tal qual DBF, DAT etc).
Vamos a função ?
Rápida pois utiliza String de Comando, Escalonável pois se A tabela cliente receber mais algum campo na sua chave acrescentamos este campo aqui (somente aqui) e funfa no projeto inteiro.
Como está numa DLL é utilizada inclusive pelas páginas ASP para realizar a mesma operação.
Para projetos mais simples utilize num módulo ...
A sua Conexão nem dei muito importancia, suponho que esteja correta uma vez que funciona para outros processos.
No seu caso eu Criaria uma função DeleteHorario e dentro dela utilizaria um Command ou Senão a Propria Conexão para executar uma String SQL para o Delete. Nada de ficar utilizando esses métodos do ADO, String SQL é mais Escalonável e via de regra mais rápidas por que dependendo do BD manda o gerenciamento da execução para ele (não é o caso do Access ou qualquer outro BD de arquivo tal qual DBF, DAT etc).
Vamos a função ?
Public Function ExcluiCliente(ID_CLIENTE As Long) As Boolean
On Error GoTo trataErro
strSQL = "DELETE FROM cliente"
strSQL = strSQL & " WHERE id_cliente=" & ID_CLIENTE
'Veja quem executou nossa operação
CNN.Execute strSQL
MSG = "Cliente excluÃÂÂdo com sucesso !!!"
ICONE = 1
Call SysMessage(MSG, ICONE)
ExcluiCliente = True
Exit Function
trataErro:
MSG = Err.Description
ICONE = 2
Call SysMessage(MSG, ICONE)
End Function
Rápida pois utiliza String de Comando, Escalonável pois se A tabela cliente receber mais algum campo na sua chave acrescentamos este campo aqui (somente aqui) e funfa no projeto inteiro.
Como está numa DLL é utilizada inclusive pelas páginas ASP para realizar a mesma operação.
Para projetos mais simples utilize num módulo ...
Vamos aproveitar e tentar entender o que deve estar dando errado no seu código ?
Neste momento vc está realizando uma operação de UPDATE "escondida":
Neste outro, o sistema deve tentar atualizar este update antes de realizar a operação só que ja deve haver um registro de chave "empty" e provavelmente é a linha do erro (Pow vc não tratou erros no seu sistema ?)
O restante nem passa, o erro nao está tratado
Primeiramente abomine a idéia de utilizar DAO por que os BD modernos ou não dão suporte ou senão simplesmente não receberão atualizações o que poderá comprometer terrivelmente seus sistemas numa migração
http://www.vbmania.com.br/vbmania/vbmforum.php?varMethod=Abrir&varID=219479&varPagina=2
Para saber minha opinião sobre sistemas Access e em que momentos podemos utilizá-los de forma adequada.
http://www.vbmania.com.br/vbmania/vbmforum.php?varMethod=Abrir&varID=215641
Para entender o tratamento de Erros em processos com BD, sei que vc entende ... mas axo que não custa observar uma 2a opinião.
http://www.vbmania.com.br/vbmania/vbmforum.php?varMethod=Abrir&varID=220168
Auto propaganda ? Sei la, entendam como quiser .. apenas espero que tenha ajudado em algo !
Neste momento vc está realizando uma operação de UPDATE "escondida":
rst("Indice") = Empty
rst("Data") = Empty
rst("Semana") = Empty
rst("Codigo") = Empty ...
Neste outro, o sistema deve tentar atualizar este update antes de realizar a operação só que ja deve haver um registro de chave "empty" e provavelmente é a linha do erro (Pow vc não tratou erros no seu sistema ?)
rst.Delete
O restante nem passa, o erro nao está tratado
Primeiramente abomine a idéia de utilizar DAO por que os BD modernos ou não dão suporte ou senão simplesmente não receberão atualizações o que poderá comprometer terrivelmente seus sistemas numa migração
http://www.vbmania.com.br/vbmania/vbmforum.php?varMethod=Abrir&varID=219479&varPagina=2
Para saber minha opinião sobre sistemas Access e em que momentos podemos utilizá-los de forma adequada.
http://www.vbmania.com.br/vbmania/vbmforum.php?varMethod=Abrir&varID=215641
Para entender o tratamento de Erros em processos com BD, sei que vc entende ... mas axo que não custa observar uma 2a opinião.
http://www.vbmania.com.br/vbmania/vbmforum.php?varMethod=Abrir&varID=220168
Auto propaganda ? Sei la, entendam como quiser .. apenas espero que tenha ajudado em algo !
Emerson a funcao e simples e funcional muito obrigado ajudou muito.
agora estou pensando, eu estou usando o access e esse projeto e para funcionar na rede, embora so tera um micro e um notebook, mesmo assim sera que o access me dara problemas ? eu nao conheco o sql, mas vou pesquisar sobre ele, valeu muito obrigado.
agora estou pensando, eu estou usando o access e esse projeto e para funcionar na rede, embora so tera um micro e um notebook, mesmo assim sera que o access me dara problemas ? eu nao conheco o sql, mas vou pesquisar sobre ele, valeu muito obrigado.
Tópico encerrado , respostas não são mais permitidas