DUVIDA CRUD DESCONECTADO

THIAGOMANZ 17/11/2011 07:35:34
#389260
Pessoal

Estou estudando e me surgiu uma duvida em CRUD com BD Desconectado
minha duvida é de qual ou quais as melhores formas de se agir...


Duvida:


No Load da tela faço a consulta ao BD jogos tudo em um Array e num
DatagridView , faço todo o codigo de Consulta,exclusão,alteraçãoe
inclusão sempre trabalhando com esse array... agora as duvidas rsss


O melhor momento para atualizar o BD seria no fechamento da tela
correto?senão seria mais util trabalhar conectado estou certo?


E se o usuário abrir a tela alterar ,incluir, excluir itens e deixar a
tela aberta durante um bom tempo e na hora q resolver fechar a chance
de se ter problemas é muito grande... Quias as alternativas para
resolver esse tipo de situações?


Seria melhor toda vez que for modificar os registros em vez de ser
desconectado eu abrir o BD executar a ação e fechar o BD? mas mesmo
assim o problema de concorrencia iria existir....


Estou vendo a teoria e ainda mostram sob situações controladas e etc..
mas na realidade temos que pensar em tudo que o usuário pode fazer de
errado e evitar essas situações no nosso software ou site, por isso
quero saber na experiencia de vcs quais as melhores formas práticas e
profissionais de se resolver esses problemas..


Conto com a ajuda de vcs e peço paciencia com minha falta de
conhecimento rssss


Abraços a todos



LUIS.HERRERA 17/11/2011 09:07:06
#389268
Thiago bom dia.
Primeiro tem que avaliar qual a aplicação e a situação de uso do sistema, pois cada situação pode exigir uma estratégia diferente, que simplifique ou dificulte a programação. Ex: Uma frente de caixa ou um simples cadastro de documentos.

A regra da melhor programação é abrir o banco executar a ação e fechar o banco. Lembrando que a primeira abertura é um pouco mais demorada (3 segundos) e nas demais é quase instantâneo, visto que os SOs atuais guardam tudo em memório para acesso rápido, após o primeiro acesso. Assim você libera a conexão, reduzindo fluxo na rede e problemas com o banco.

Quando a pergunta de como proceder nas ações do banco, eu adoto a seguinte regra: Nas consultas aplico filtros para reduzir os dados exibidos e povôo o grid. quando o usuário seleciona um registro no grid, exibo os dados nos campos e ele seleciona a ação, editar, após alterar clica no botão gravar e salva no banco, depois atualiza a linha (registro no grid), assim não precisa fazer outra consulta. Se clicar em incluir, limpa tudo e pronto, mas se clicar em excluir, faz um delete pelo ID do registro.

Dependendo da aplicação pode usar os bloqueios de registros nos bancos, eu não uso isso nas minhas aplicações. Uma alternativa que já vi bem debatido é usar um flag no banco para o registro que for editado. Caso alguém solicite uma edição de um registro, um campo flag é alterado no banco. Esse campo é geralmente um número sequencial, onde se soma um ao último gravado. Assim, caso alguém vá gravar a alteração de um regitro, no Where do SQL se coloca flag = valorDoCampoLido + 1, se for igual ele grava se for diferente significa que alguém já fez alguma gravação (edição) enquanto você estava editando. Nesse ponto você pode refazer a consulta, comparar campo a campo e informar ao usuário que campos e conteúdo foram alterados e se quer gravar por cima ou cancelar a edição.

Não esquecer que a alteração do flag deve ser feita também no momento da gravação, ou seja, acrescentando 1 ao número para que outros usuário tenham o mesmo procedimento de confirmação após a edição.
FOXMAN 17/11/2011 21:01:29
#389330
Resposta escolhida
Thiago, eu PARTICULARMENTE abomino este tipo de transação....
Você está no risco eminente a todo tempo.....

Vamos por parte como Jack .....

1º - Carregar dados durante o LOAD DE UM FORM.
Este tipo de processo ocasiona lentidão na abertura do formulário, o carregamento de dados no formulário deverá se dar mediante alguma ação do usuário, e de preferência que ele informe alguma condição para que a consulta traga apenas os dados necessários.


Citação:

O melhor momento para atualizar o BD seria no fechamento da tela
correto?senão seria mais util trabalhar conectado estou certo?


Não, o melhor momento para atualizar o banco é na hora, alterou, salvou, atualizou, pronto.
Imagine você as seguintes situações....

Usuario abriu o formulário(que carregou 16.000 itens), pegou um item e alterou diversos campos, e durante esse processo caiu a energia(considerando que vc não tenha no-break), PRONTO, JÁ ERAAAAA.....

Outra situação é : Um usuário inicia uma edição em um cadastro(caso não tenha nada para controlar registro), e resolve ir tomar um café, nesse mesmo tempo outro usuario entra faz outra alteração. O primeiro usuario volta e conclui a alteração inicial, e salva. Todo o processo do segundo usuário foi perdido....

Resumindo,
Abra a conexão, carregue os dados, faça o que deseja no REGISTRO, salve.



ALTAIR148 17/11/2011 21:19:00
#389334
Pegando uma carona aqui, uma pergunta para o FOXMAN

Citação:

Outra situação é : Um usuário inicia uma edição em um cadastro(caso não tenha nada para controlar registro), e resolve ir tomar um café, nesse mesmo tempo outro usuario entra faz outra alteração. O primeiro usuario volta e conclui a alteração inicial, e salva. Todo o processo do segundo usuário foi perdido....



Como se pode evitar esse tipo de situação?
FOXMAN 17/11/2011 21:58:30
#389339
Altair, O Luis postou a utilização de Flag.
Eu particularmente prefiro a utilização de um campo booleano, onde se vc abrir o registro para edição, lança-se uma consulta para verificar se o campo edit(por exemplo) está TRUE ou False, Caso esteja False(é porque não tem ninguém editando) e vc muda para True. Caso esteja True você informa ao usuário que já existe alguem editando esse registro.

No entanto pode ocasionar que, um usuário fique durante um longo periodo com a tela aberta, e neste caso terá que colocar um controle para fazer esta verificação.
Há também os casos em que o usuário inicia a alteração(mudando o campo para True) e acaba a enregia.Para evitar este problema ( o campo ficar TRUE permanentemente) deve-se utilizar as Transaction, possibilitando a confirmação da edição ou não do registro.

Assim como o Luis eu também não utilizo o controle de concorrência no registro.Não há nenhum motivo em especial.



ALTAIR148 17/11/2011 22:03:22
#389340
Valeu ai Foxman. Deu para entender, e achei uma ótima idéia, pois estou a desenvolver um sistema que será utilizado em várias máquinas e assim evita bastante casos em substituição de dados.

Abraços.
THIAGOMANZ 19/11/2011 17:23:10
#389495
Fox

Entendi o que quis dizer porem então eu inicio a tela com um datagrid vazio e espero o usuario solicitar uma consulta p poder carregar os itens nele correto?
Qto a salvar,editar,excluir faço tudo na hora abro conexão faço a aação e fecho conexão blz,mas no caso de usar esse lock no banco não entendi no caso de acabar a energia como retirar esse valor true do campo.. poderia me explicar esse caso mais detalhado?

Abraços e ja agradeço a ajuda...
Tópico encerrado , respostas não são mais permitidas