[OFF] ONDE ESTA O ERRO NA ROTINA DE EXCLUSAO
Prezados,
Abaixo código da rotina de exclusao de um form para registro de Pagamentos Cheques.
Não existe erro de sintaxe.
O BD é Access o projeto é em VB6 SP6 usando ADO e SQL para transações no BD.
Quando a rotina é executada, todos os comandos SQL são executados sem erro, entretanto ao finalizar o projeto nenhuma alteração é EFETIVADA no BD.
Trata-se de um erro de lógica simples.
Quem acertar primeiro leva a pontuação, se ninguém acertar eu posto a correção em 48 horas.
Não vale pedir mais informações. Todo o código necessário para resolver a questão está abaixo.
BOA SORTE A TODOS!
------------------------------------------------------------------------------------------------
Abaixo código da rotina de exclusao de um form para registro de Pagamentos Cheques.
Não existe erro de sintaxe.
O BD é Access o projeto é em VB6 SP6 usando ADO e SQL para transações no BD.
Quando a rotina é executada, todos os comandos SQL são executados sem erro, entretanto ao finalizar o projeto nenhuma alteração é EFETIVADA no BD.
Trata-se de um erro de lógica simples.
Quem acertar primeiro leva a pontuação, se ninguém acertar eu posto a correção em 48 horas.
Não vale pedir mais informações. Todo o código necessário para resolver a questão está abaixo.
BOA SORTE A TODOS!
Private Sub ApagaPagamentosCheques()
' Confirmada a Exclusao
' Elimina Frete da Tabela PagamentosFretes se for o caso
If txtValorPgtoFrete.Text <> "" Then
' Elimina Frete
strSQL = ""
strSQL = "DELETE * FROM PagamentosFretes WHERE Vale = " & CLng(Format(txtVale.Text, "#####0"))
' Inicio da Transacao SQL
cnCeramica.BeginTrans
' Nomeia Label para Tratamento de Erro
On Error GoTo ErrPgtoChequeEXC
' Limpa Tabela de Errors
cnCeramica.Errors.Clear
' Executa Comando SQL
cnCeramica.Execute (strSQL)
End If
' Elimina Cheque da Tabela PagamentosCheques
strSQL = ""
strSQL = "DELETE * FROM PagamentosCheques WHERE NumeroPagamento = " & txtNumeroPagamento.Text
' Inicio da Transacao SQL
cnCeramica.BeginTrans
' Nomeia Label para Tratamento de Erro
On Error GoTo ErrPgtoChequeEXC
' Limpa Tabela de Errors
cnCeramica.Errors.Clear
' Executa Comando SQL
cnCeramica.Execute (strSQL)
' GRAVA CC de Clientes - EXCLUSAO de Pagamentos CHEQUES
Dim StrErr As Boolean
GravaCC txtCodigoCliente.Text, txtCodigoVendedor.Text, dteDataEmissao.Text, _
"EXCLUSAO Pagamento CHEQUE Numero: " & txtNumeroPagamento.Text, _
txtValorDoc, "0", "X", txtNumeroPagamento.Text, StrErr
If StrErr Then
' Erro Na Gravacao do CC do Cliente
MsgBox "EXCLUSAO - Erro na Gravacao do CC do Cliente."
Exit Sub
End If
' Efetiva a Transacao SQL nas Tabelas
cnCeramica.CommitTrans
Exit Sub
ErrPgtoChequeEXC:
' No caso de Erro Desfazer alteracoes nas Tabelas
cnCeramica.RollbackTrans
funGravaErro Err.Number, Err.Description, Err.Source
End Sub
------------------------------------------------------------------------------------------------
Public Function GravaCC(ByVal strCodigoCliente As String, ByVal strCodigoVendedor As String, _
ByVal strDataLancamento As String, ByVal strDesc As String, _
ByVal strValor As String, ByVal strValorComissao As String, _
ByVal strTipo As String, ByVal strNumero As String, _
ByVal bolErro As Boolean)
' Grava Dados na Tabela de Conta Corrente dos Clientes e Vendedores
' Ativa Tratamento de Erros
On Error GoTo ErrGravaCC
' Inicializa Variavel para Controle das transacoes SQL
bolSQLBeginTrans = False
' Definicao de Variveis Locais
....... (Diversos Comandos)
' Inicia Transacao SQL
cnCeramica.BeginTrans
bolSQLBeginTrans = True
........ (Diversos Comandos)
' Executa os Comandos SQL nas Tabelas do BD
cnCeramica.CommitTrans
bolSQLBeginTrans = False
Exit Function
ErrGravaCC:
' Se deu Erro DESFAZ alteracoes no BD
If bolSQLBeginTrans Then
cnCeramica.RollbackTrans
End If
funGravaErro Err.Number, Err.Description, Err.Source
End Function
kra posso tah enganado mais no mysql num se usa * no delete
foi a unica coisa q eu axei de estranho
ahuahuuhah to cum sono
mais a tarde se tive sem resposta ainda eu vejo de novo
falo
foi a unica coisa q eu axei de estranho
ahuahuuhah to cum sono
mais a tarde se tive sem resposta ainda eu vejo de novo
falo
Bom, isso é verdade e na minha opinião o tópico já está errado ... o nosso amigo ROBERTO disse que o erro iria ser apenas na lógica e como podemos ver já teve um erro na sintaxe.
Nenhum na instrução DELETE usa o * ... motivo ? Simples na lógica a instrução "SELECT *" indica para o gerenciador selecionar todos os campos, até ai tudo bem, mais oque tem o SELECT haver com o DELETE ? Simples se colocarmos DELETE * basicamente estamos querendo que ele exclua todos os campos da tabela <tal> cujo a ID seja igual a 1 ... hora isso é meio sem lógica, como vamos pedir para excluir todos os campos cujo a ID seja 1 ? Seria meio impossivel, por isso não existe o * na instrução DELETE.
Abraços, tbm estou com sono rsrsrs amanhã ... ou melhor hoje tenho que acordar às 06:45 !!
Nenhum na instrução DELETE usa o * ... motivo ? Simples na lógica a instrução "SELECT *" indica para o gerenciador selecionar todos os campos, até ai tudo bem, mais oque tem o SELECT haver com o DELETE ? Simples se colocarmos DELETE * basicamente estamos querendo que ele exclua todos os campos da tabela <tal> cujo a ID seja igual a 1 ... hora isso é meio sem lógica, como vamos pedir para excluir todos os campos cujo a ID seja 1 ? Seria meio impossivel, por isso não existe o * na instrução DELETE.
Abraços, tbm estou com sono rsrsrs amanhã ... ou melhor hoje tenho que acordar às 06:45 !!
Volto a dizer que não tem erro de sintaxe. o "*" funciona perfeitamente no Access.
Não tem erro no comando SQL.
:-)
Não tem erro no comando SQL.
:-)
roberto nao achei nada de errado a nao ser nessa linha
cnCeramica.Execute (strSQL)
eu uso sem os parenteses so isso, mas pode ser que funciona com eles tambem,
cnCeramica.Execute strSQL
cnCeramica.Execute (strSQL)
eu uso sem os parenteses so isso, mas pode ser que funciona com eles tambem,
cnCeramica.Execute strSQL
Citação:strSQL = "DELETE * FROM PagamentosFretes WHERE Vale = " & CLng(Format(txtVale.Text, "#####0"))
Acredito que seja o tipo de dados passados.. ex.:
se o campo Vale for do tipo TEXTO, o parâmetro passado deve ter um "'" entr ele, caso Numerio ae fica sem o sinal.
Se não retorna nenhum erro, então a sua SQL não encontra o registro para ser excluÃÂÂdo, logo o erro é sim na SQL. verifique o tipo d campo e como você passa o parâmetro.
Boa Sorte,
Cris
Também acho que deveria retirar o asterisco (*).
Outra coisa, é mesmo necessário ecluir fisicamente esta linha? Não prefere um update alterando um campo booleano por exemplo Excluido = True?
Outra coisa, é mesmo necessário ecluir fisicamente esta linha? Não prefere um update alterando um campo booleano por exemplo Excluido = True?
Não existe problemas com o "*".
Volto a dizer o problema não é de sintaxe.
Todos os comandos SQL são executados corretamente.
O erro de lógica/estrutura já foi descoberto.
O objetivo aqui é repassar "conhecimento", ou seja, quando existe um erro simples que não se consegue explicar.
RESUMINDO O ERRO:
Após executar a procedure, todos os comandos SQL são executados corretamente. Entretanto ao dar LOGOUT no Sistema o BD dá um "rollback" e desfaz as alterações.
Esse "rollback" se dá por um erro no código acima.
A questão é ONDE ESTàO ERRO?
Volto a dizer o problema não é de sintaxe.
Todos os comandos SQL são executados corretamente.
O erro de lógica/estrutura já foi descoberto.
O objetivo aqui é repassar "conhecimento", ou seja, quando existe um erro simples que não se consegue explicar.
RESUMINDO O ERRO:
Após executar a procedure, todos os comandos SQL são executados corretamente. Entretanto ao dar LOGOUT no Sistema o BD dá um "rollback" e desfaz as alterações.
Esse "rollback" se dá por um erro no código acima.
A questão é ONDE ESTàO ERRO?
eu não disse que tem erro com o *, pois as vezes eu uso também, eu me refiro ao fato de encontrar ou não o Registro a ser excluÃÂÂdo, se o campo for texto é possÃÂÂvel que o registro não seja encontrado para ser excluÃÂÂdo, poi isso o "'" (Apóstrofo).
Tive casos onde usei como parâmetros um TEXTO, e me esqueci de colocá-lo entre os Apóstrofos, ficando "'TEXTO'" isso não gerava nenhum erro, mas também o registro continuava no DB.
Ou.. no seu caso.. se você passa 000001 na SQL acredito que seja Diferente de 1 no SQL.
Você usa transações, logo teria um "Commit Transaction" no final o que impede o Rollback.
Opnião não é crÃÂÂtica! mas vale apena testar!
Boa Sorte
Tive casos onde usei como parâmetros um TEXTO, e me esqueci de colocá-lo entre os Apóstrofos, ficando "'TEXTO'" isso não gerava nenhum erro, mas também o registro continuava no DB.
Ou.. no seu caso.. se você passa 000001 na SQL acredito que seja Diferente de 1 no SQL.
Você usa transações, logo teria um "Commit Transaction" no final o que impede o Rollback.
Opnião não é crÃÂÂtica! mas vale apena testar!
Boa Sorte
Roberto,
Talvez o erro esteja justamente porque a transação é iniciada e logo após há uma nova inicialização da transação. O certo não seria um begintrans e um commitrans com rollback no caso de alterações ?
Talvez o erro esteja justamente porque a transação é iniciada e logo após há uma nova inicialização da transação. O certo não seria um begintrans e um commitrans com rollback no caso de alterações ?
CRIS,
O campo vale é numérico na Tabela (Clng...).
Volto a dizer que não existe erro de sintaxe.
O problema já foi resolvido, existe um erro de lógica/estrutura que não "efetiva" as alterações no BD.
Minha idéia é disseminar "conhecimento" e ao mesmo tempo colocar um problema "real" para ser analisado. Volto a dizer a solução é "simples".
Airton Ferreira,
Se vc tem uma sugestão no BginTans/CmmitTrans/RollBack favor postar.
At,
O campo vale é numérico na Tabela (Clng...).
Volto a dizer que não existe erro de sintaxe.
O problema já foi resolvido, existe um erro de lógica/estrutura que não "efetiva" as alterações no BD.
Minha idéia é disseminar "conhecimento" e ao mesmo tempo colocar um problema "real" para ser analisado. Volto a dizer a solução é "simples".
Airton Ferreira,
Se vc tem uma sugestão no BginTans/CmmitTrans/RollBack favor postar.
At,
Tópico encerrado , respostas não são mais permitidas