Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

faelwan

[Resolvido] Problemas com Danco de Dados

Recommended Posts

Olá Pessoal! Espero que todos estejam bem! http://forum.imasters.com.br/public/style_emoticons/default/grin.gif

 

Gente tô com umas dúvidas e estou precisando de ajuda,

aceita-se qualquer sugestão! ^^

 

1 - Problemas com queda de conexão MySQL -

 

Tenho operações em meu programa que salvam no BD 'Muitos registros para Um' (em um servidor na rede).

Por exemplo tenho uma rotina de saída de Estoque, onde o usuário insere os ítens em um Flexgrid,

quando clica no salvar, um loop corre o Flexgrid Salvando linha por linha. Dessa forma tenho um registro na tabela de

Saídas, e vários na tabela de Descrição de Saída, entretanto, essa operação altera também uma tabela que guarda os ítens em estoque, diminuíndo as quantidades em estoque.

Funciona bem, mas vi que pode acontecer uma catástrofe!...

 

E se no decorrer dessa operação, no momento em que o loop salva os itens do grid e altera a tabela de estoque, cair a conexão? Independente se for problemas com o servidor MySQL, com a rede ou com o Servidor (Máquina) mesmo. :blink: ?

 

É o Caos!

_

 

2 - Ordenação de registro

 

Para que esta mesma operação funcione, tenho um campo 'cod_saida', que é mantido nas duas tabelas

para que os registros se relacionem, faço da seguinte forma na hora de salvar, um procedimento lê o código do último registro armazenado, o incrementa em '1' e guarda em uma variável, assim todos os itens levam consigo o código guardado na variável. Não sei se essa é a forma correta, mas gera erro no caso de dois usuários cadastrarem ao mesmo tempo, pois por uma fração de segundo, os dois podem ler o mesmo código referente ao último registro cadastrado e gerar duplicidade dos códigos.

_

 

Bom é isso ai gente, agradeço qualquer Ajuda! :rolleyes:

att Rafael Lemes

 

Título errado http://forum.imasters.com.br/public/style_emoticons/default/blush.gif "Problemas com Banco de Dados" desculpa ai ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Faelwan, tudo bem?

 

Caramba, esse seu programa está te dando trabalho mesmo heim.. rs..

 

Quanto a sua primeira dúvida, cara, é legal você pensar dessa forma - em caso de cair a rede, ou energia, ou qualquer coisa do tipo - pois você começa a ter uma visão de prevenção e controle de risco. Mas não é algo muito fácil de resolver não, infelizmente é um risco pequeno, mas que corremos. Acho que uma solução que pode ter é, fazer um backup temporário das informações antes do update, em um bloco de notas por exemplo.

 

Quanto à dúvida 2, você não pode simplesmente utilizar um campo auto numeração para isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Faelwan, tudo bem?

 

Caramba, esse seu programa está te dando trabalho mesmo heim.. rs..

 

Quanto a sua primeira dúvida, cara, é legal você pensar dessa forma - em caso de cair a rede, ou energia, ou qualquer coisa do tipo - pois você começa a ter uma visão de prevenção e controle de risco. Mas não é algo muito fácil de resolver não, infelizmente é um risco pequeno, mas que corremos. Acho que uma solução que pode ter é, fazer um backup temporário das informações antes do update, em um bloco de notas por exemplo.

 

Quanto à dúvida 2, você não pode simplesmente utilizar um campo auto numeração para isso?

http://forum.imasters.com.br/public/style_emoticons/default/grin.gif É Sim Cláudio Neto, alguns probleminhas, há alguns meses, rsrs, acho que é a falta de experiência, pois logo que terminei o Curso Técnico, fui chamado aqui pra empresa. Tô mais aprendendo do que trabalhando.

Sorte ter encontrado o fórum e vcs pra me ajudarem!

^^

 

Seguinte... é uma solução bastante Interessante, essa de fazer backup dos dados localmente,

mas acho que seria um problema na hora da restauração já que o sistema roda em rede, geraria bastante problemas.

eu estava pensando em criar um rotina que sobrescrevesse um backup de toda a base de dados em um intervalo, sei lá de uma hora, mas para isso o programa teria que ficar aberto o dia todo, bom tenho que pensar um pouco. Mas sua dica já me 'deu uma luz'.

 

Mas em relação ao campo com autonumeração, isso acho que funcionaria, mas de que forma eu poderia repassar esse código para os ítens da tabela descrição?

 

Valeu pela Força Cláudio! Abração!

Agradecido Rafael Lemes

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro amigo, não sou um grande conhecedor de mysql, mas posso expor algumas idéias:

 

1 - mysql pode aceitar transações e rollback, ou seja, se a tabela foi criada usando innoDB você pode usar rollback para desfazer um insert quando este for mal sucedido. Sugiro a você pesquisar a documentação do mysql para se informar melhor.

 

2 - Quanto ao autonumeração, acho que você poderia usar uma tabela de controle para gerar esse código, assim sempre que um usuário solicitar uma nova sequencia, você poderia controlar nessa tabela o proximo valor da mesma.

 

Enfim é apenas uma sugestão, claro que possa haver outras até mais inteligentes que estas.

 

Abraço e boa sorte!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala mibnetweb http://forum.imasters.com.br/public/style_emoticons/default/grin.gif

 

Puxa! Excelente esse recurso das transações, funcionou perfeitamente!

Vou postar aqui como acontece, para informação, caso outros membros tenham o mesmo problema.

 

Tomei como referência um artigo do nosso grande amigo Macorrati - Usando Transações

 

No procedimento 'Salvar', que é o que executa as operações de Saída de estoque citadas no Início do Tópico...

Sub Salvar()

'antes de mais nada define-se um ponto de partida, destacando que a transação começa aqui

cnConecta.BeginTrans
'No caso cnConecta é o nome da variável que referencia o Objeto Connection

'nesse ponto atribuo os valores ao Banco de Dados

tblSaida("cliente_saida") = txtCliente.Text  'Sendo tblCadSaida, uma tabela do Bd
'[...]

'Executo o Procedimento que realiza os cálculos e faz as devidas alterações nas outras tabelas

Operacoes_de_Saida

tblSaida.Update

'Abaixo chamo uma função do Objeto Connection que define que todas as operações 
'foram realizadas com Sucesso no Banco de Dados, finalizando a transação

cnConecta.CommitTrans

End Sub

Executando a função 'cnConecta.CommitTrans', o BD Salva as alterações, finalizando a transação.

Executando a função 'cnConecta.RollbackTrans', o BD Desfaz as alterações voltando ao ponto de partida e finalizando a transação

(Nota: Esse ponto de partida refere-se às informações do BD e não à linha de código do VB como no caso de GoTo)

 

Se não for instruído ao VB, a função 'cnConecta.CommitTrans' o BD não confirma as alterações, como se tivesse sido instruído com um 'cnConecta.RollbackTrans',

dessa forma, se a energia cair não geraria nenhum erro do que diz respeito as informações,

pois na verdade, nada teria sido feito!

 

Para o caso de cair a Rede durante as operações, adicionei o seguinte tratamento:

 

'erro -2147467259 é o erro retornado quando a conexão como Banco de dados é perdida

If Err.Number = -2147467259 Then
MsgBox "A Conexão com o Servidor do Banco de Dados foi Perdida. Suas ações realizadas no momento foram canceladas e o Programa será encerrado.", vbCritical, "Estoque"

Set cnConecta = Nothing 
Unload mdiPrincipal
Exit Sub
End If

Da mesma forma não gera erro, pois se não foi instruído ao VB que a transação terminou, assim o Banco de Dados desfaz as alterações e considera que nada aconteceu.

 

http://forum.imasters.com.br/public/style_emoticons/default/clap.gif Bom é meio complicado mas funciona!

 

Valeu mesmo mibnetweb! http://forum.imasters.com.br/public/style_emoticons/default/grin.gif

 

Um Abraço

att Rafael Lemes

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gente não querendo incomodar...rsrs

 

Ainda tenho o problema da Autonumeração.

 

A sugestão do mibnetweb, é semelhante ao que acontece atualmente,

não resolvendo o Problema.

 

Já a sugestão do Cláudio Neto, parece viável, mas de que forma

eu poderia repassar esse código para os ítens da tabela descrição?

 

Desde já eu Agradeço Pessoal!

Peço até desculpas por qualquer coisa ai

 

att Rafael Lemes

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.