MEU PRIMEIRO ERP - COMO BLOQUEAR DADOS?
Bom dia.
Estou desenvolvendo um software tenando baseado em um ERP que tivemos, mas como o ERP era muito para o que precisávamos e ao mesmo tempo faltava campos e funcionalidades especÃficas, resolvi desenvolver.
Está indo tudo muito bem, já tenho cerca de 20.000 linhas...
Mas a questão é a seguinte. Como são várias e várias telas, algumas sendo acessadas simultaneamente na rede, tive uma dúvida em relação à concorrência na atualização de registros.
Por exemplo. Existe um formulário que gera pedidos de compra com base no status da cotação. Se a cotação está com status [Ô]processada[Ô] o pedido pode ser gerado, mas se ela estiver com o status [Ô]pedido de compra[Ô] ela não pode ser mais utilizada para gerar o pedido.
Para exibir as cotações e seus respectivos status utilizo uma MsFlexGrid's. Desta forma, a verificação do status é feita com base no que está escrito na coluna [ô]status[ô] da grid.
Mas isso não é correto. Pois se o usuáruio1 carregar a grid deixá-la lá... paradinha... E for atender o telefone e ficar 30 minutos, se o usuário2 alterar o status de um item desta grid, a alteraçao não vai ser mostrada em tempo real. No banco foi alterada mas na grid não, a menos que for recarregada.
E isso não é viável. Já pensou o comprador ter que lembrar de atualizar a grid toda vez q for emitir um pedido? Fora que se o usuário2 alterar o item segundos antes do usuário1, os pedidos vão sair de maneira incoerente.
Para resolver isso, escrevi que antes de qualquer operação de escrita no banco faço uma consulta para saber como está o status do item. Se for diferente do que está exibido na grid, o programa solicita ao usuário que feche e abra novamente o formulário (ou recarregar... tanto faz).
Gostaria de saber se existe (ou é viável) bloquear uma linha na qual o usuário pretende realizar alguma operação de gravação. Sei que dá pra fazer isso com setando os recordsets, mas isso seria para o caso de muitas gravações simultâneas no banco em um curto espaço de tempo.
O que eu gostaria de fazer é: Supondo que o camarada clique em algum item da grid (que carrego os id's na primeira colula). Como sei o id, tem como bloquear aquela linha no banco até que o camarada não pretenda mais utilizá-la?
Um exemplo disso é quando o usuário vai fazer um pedido com base no status da cotação. Ele vê que o status é [Ô]processada[Ô] e clica na grid para poder digitar as informações do pedido. Mas esse usuário é muito lento... e demora 10 minutos para fazer isso. Ao mesmo tempo, um outro usuário, em outra sala, resolve fazer um pedido e também vê que a cotação está com status [Ô]processada[Ô] e resolve fazer o pedido.
é nesse instante que eu gostaria de saber se o segundo usuário pode receber algum aviso indicando que o registro está sendo utilizado por outro usuário (só que o usuário1, aquele lerdo, pode ou não concluir a operaçao).
Tem como fazer isso direto no banco?
Da maneira que eu faço hj (verificar o status no banco para saber [Ô]se bate[Ô] com o status na grid) é correto?
[ ]'s
Estou desenvolvendo um software tenando baseado em um ERP que tivemos, mas como o ERP era muito para o que precisávamos e ao mesmo tempo faltava campos e funcionalidades especÃficas, resolvi desenvolver.
Está indo tudo muito bem, já tenho cerca de 20.000 linhas...
Mas a questão é a seguinte. Como são várias e várias telas, algumas sendo acessadas simultaneamente na rede, tive uma dúvida em relação à concorrência na atualização de registros.
Por exemplo. Existe um formulário que gera pedidos de compra com base no status da cotação. Se a cotação está com status [Ô]processada[Ô] o pedido pode ser gerado, mas se ela estiver com o status [Ô]pedido de compra[Ô] ela não pode ser mais utilizada para gerar o pedido.
Para exibir as cotações e seus respectivos status utilizo uma MsFlexGrid's. Desta forma, a verificação do status é feita com base no que está escrito na coluna [ô]status[ô] da grid.
Mas isso não é correto. Pois se o usuáruio1 carregar a grid deixá-la lá... paradinha... E for atender o telefone e ficar 30 minutos, se o usuário2 alterar o status de um item desta grid, a alteraçao não vai ser mostrada em tempo real. No banco foi alterada mas na grid não, a menos que for recarregada.
E isso não é viável. Já pensou o comprador ter que lembrar de atualizar a grid toda vez q for emitir um pedido? Fora que se o usuário2 alterar o item segundos antes do usuário1, os pedidos vão sair de maneira incoerente.
Para resolver isso, escrevi que antes de qualquer operação de escrita no banco faço uma consulta para saber como está o status do item. Se for diferente do que está exibido na grid, o programa solicita ao usuário que feche e abra novamente o formulário (ou recarregar... tanto faz).
Gostaria de saber se existe (ou é viável) bloquear uma linha na qual o usuário pretende realizar alguma operação de gravação. Sei que dá pra fazer isso com setando os recordsets, mas isso seria para o caso de muitas gravações simultâneas no banco em um curto espaço de tempo.
O que eu gostaria de fazer é: Supondo que o camarada clique em algum item da grid (que carrego os id's na primeira colula). Como sei o id, tem como bloquear aquela linha no banco até que o camarada não pretenda mais utilizá-la?
Um exemplo disso é quando o usuário vai fazer um pedido com base no status da cotação. Ele vê que o status é [Ô]processada[Ô] e clica na grid para poder digitar as informações do pedido. Mas esse usuário é muito lento... e demora 10 minutos para fazer isso. Ao mesmo tempo, um outro usuário, em outra sala, resolve fazer um pedido e também vê que a cotação está com status [Ô]processada[Ô] e resolve fazer o pedido.
é nesse instante que eu gostaria de saber se o segundo usuário pode receber algum aviso indicando que o registro está sendo utilizado por outro usuário (só que o usuário1, aquele lerdo, pode ou não concluir a operaçao).
Tem como fazer isso direto no banco?
Da maneira que eu faço hj (verificar o status no banco para saber [Ô]se bate[Ô] com o status na grid) é correto?
[ ]'s
Já tentou adicionar um NOVO CAMPO (p. ex, BLOQUEADO) à TABELA, e setar o mesmo com um * (asterisco) quando estiver em [Ô]preso[Ô] em consulta por um usuário?
qual banco vc esta usando?
se for sql server
da uma olhanda neste comando
SELECT idtabela FROM tabela WITH(NOLOCK) WHERE idtabela = 2
da uma olhanda neste comando
SELECT idtabela FROM tabela WITH(NOLOCK) WHERE idtabela = 2
Opa...
O banco é o MySQL.
TECLA, essa opção parece ser boa. Eu até tinha pensado (embora não tivesse dito) em fazer assim, mas não sabia se era correto. Tinha imaginado igual ao GRECO disse. Mas esqueci de dizer que o banco é MySQL.
Dá pra fazer isso no MySQL.
Embora eu ainda goste mais da primeira opção. :)
[ ]'s
O banco é o MySQL.
TECLA, essa opção parece ser boa. Eu até tinha pensado (embora não tivesse dito) em fazer assim, mas não sabia se era correto. Tinha imaginado igual ao GRECO disse. Mas esqueci de dizer que o banco é MySQL.
Dá pra fazer isso no MySQL.
Embora eu ainda goste mais da primeira opção. :)
[ ]'s
Não esquece que se for usar a técnica do campo BLOQUEADO, você precisa fazer uma rotina que zera esse campo, em que essa rotina receba a chave do registro a desbloquear ou, se for nulo, zere todos os bloqueios da tabela. Isso porque INEVITÃVELMENTE vai ter queda de energia, usuário que desliga o sistema com a tela de edição aberta, etc
Ok RCMRO! Bem lembrado.
[ ]'s
[ ]'s
Tópico encerrado , respostas não são mais permitidas