PROBLEMA COM CONEXAO

FRU1 08/06/2007 16:05:38
#220408
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

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


FRU1 08/06/2007 16:28:20
#220412
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.
USUARIO.EXCLUIDOS 08/06/2007 16:30:20
#220415
  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....
USUARIO.EXCLUIDOS 08/06/2007 16:39:20
#220417
Colega, ñ seira melhor vc fazer assim:

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


FRU1 08/06/2007 17:05:00
#220421
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 ?
FRU1 08/06/2007 17:53:54
#220432
pessoal to pensando em voltar tudo pro Dao novamente, porque nao estou conseguindo o vcs acham ?
FRU1 08/06/2007 19:27:57
#220442
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.

USUARIO.EXCLUIDOS 08/06/2007 21:09:02
#220450
Resposta escolhida
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 ?


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 ...
USUARIO.EXCLUIDOS 08/06/2007 21:21:55
#220451
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":

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 !
FRU1 13/06/2007 14:40:36
#221181
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.
Tópico encerrado , respostas não são mais permitidas