MaximoAccess

Caro Usuário, não tire as suas duvidas nas Salas de Repositório, abra sempre um novo tópico relacionado, nas salas destinadas para o efeito, como Sala de Tabelas, Consultas, Formulários, Relatórios, Macros, Módulos e VBA.

Obrigado

Administração do MaximoAccess

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access

    [Resolvido]gravação de dados simultâneos AddNew x Docmd.RunSQL

    Compartilhe

    sergiosdl
    Developer
    Developer

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 122
    Registrado : 04/12/2009

    [Resolvido]gravação de dados simultâneos AddNew x Docmd.RunSQL

    Mensagem  sergiosdl em Qui 08 Jan 2015, 11:45

    Salve Amigos

    Em 2 front And, no mesmo momento 2 usuários foram gravar registros em uma tabela, (mesma hora, minuto e segundo) e o que aconteceu é que de um usuário os dados não foram gravados. Os dados eram gravados na mesma tabela o 1º  usuário na tela que trabalhava estava usando o código:
    Docmd.RunSQL strsql  (strsql = pegar todos os dados da tabela local e enviar para o back end)

    O 2º usuario (em uma outra tela do sistema) disparou o comando :
    set caix = CurrentDb.OpenRecordset("cai")
      caix.AddNew
        caix("num_doc") = me.num_doc
        ........

    Ambos os comandos pegam 8 dados de uma tabela  local e envia para o servidor, e o que aconteceu é que o 2º usuário (que usava o método AddNew) os dados não foram enviados.
    Sempre funcionou perfeitamente (embora nunca tinha observado se acontecia de ser no mesmo momento).

    Minha dúvida é: O problema pode ter sido causado por serem 2 codigos diferentes?
    qual dos 2 métodos é o melhor a se utilizar?
    Pois a quantidade de lacamentos no sistema vem aumentando não posso passar por este problema

    Abraços


    Última edição por sergiosdl em Ter 13 Jan 2015, 17:40, editado 1 vez(es)

    ahteixeira
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 3214
    Registrado : 15/03/2013

    Re: [Resolvido]gravação de dados simultâneos AddNew x Docmd.RunSQL

    Mensagem  ahteixeira em Qui 08 Jan 2015, 11:54

    Ola veja se nunhum dos campos é Id e não pode ser repetido.
    Veja tb se tem setwarnings a esconder o erro, se tem coloque a ver os erros e tente similar.
    Abraço

    sergiosdl
    Developer
    Developer

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 122
    Registrado : 04/12/2009

    Re: [Resolvido]gravação de dados simultâneos AddNew x Docmd.RunSQL

    Mensagem  sergiosdl em Qui 08 Jan 2015, 18:11

    Olá
    -o Id e feito pelo campo de autonumeração que consta apenas no back and.
    em relação a mensagem de erro fiz alguns testes com um loop para forcar o erro. Colocando 2 front and pra gravar simultaneamente;

    Utilizando o método Addnew o erro que aparece é o seguinte:
    Erro 3218 - Não foi possível atualizar; atualmente bloqueado

    utilizando o Docmd.Runsql o erro que aparece é:
    O Access nao pode acrescentar todosos registros na consulta acréscimo.
    O Access definiu 0 campo(s) com o nulo devido a uma falha na conversão do tipo e não adicionou 0 refistro(s) a tabela devido a violações da chave, 1 registro(s) devido a violações de proteção. Você deseja executar a consulta assim mesmo.

    Lembrando que o erro aconteceu por que forcei o loop com vários registros. Caso eu fizer com apenas 100 registros não dá erro algum

    Abraços

    ahteixeira
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 3214
    Registrado : 15/03/2013

    Re: [Resolvido]gravação de dados simultâneos AddNew x Docmd.RunSQL

    Mensagem  ahteixeira em Qui 08 Jan 2015, 21:46

    Ola, aparentemente o erro deve estar acontecer por repetição de campo único.
    Quando está a fazer o addnew tem algum nr. de registo que está a ser processado?
    Vou dar um exemplo meu.
    Tenho uma app que gera o nr. do documento, se for gravado por dois utilizadores ao mesmo tempo dava erro.
    Para contornar a situação quando da erro, vai consultar novamente o nr. do documento a gerar.
    Por uma questão de segurança, para evitar de pendurar, coloquei um contador quando ocorre o erro para tentar 3 vezes gerar o n. se passar, mostraria o erro.
    Nunca tive problemas em rede com vários utilizadores a processar documentos.
    Abraço

    sergiosdl
    Developer
    Developer

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 122
    Registrado : 04/12/2009

    Re: [Resolvido]gravação de dados simultâneos AddNew x Docmd.RunSQL

    Mensagem  sergiosdl em Qui 08 Jan 2015, 23:00

    caros colegas, obrigado pelo retorno
    Não tem nenhum campo de numeração ou algo parecido, apenas o autonumeração "nativo" do access.
    então acredito nao ser este problema, mas em relação as tentativas é interessante. será que no caso do docmd.runsql teria um jeito de tratar o erro?. pois eu não conheço um tratamento para este caso , apenas para o addnew.

    Abraços

    ahteixeira
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 3214
    Registrado : 15/03/2013

    Re: [Resolvido]gravação de dados simultâneos AddNew x Docmd.RunSQL

    Mensagem  ahteixeira em Sex 09 Jan 2015, 10:50

    Olá, para tratamento de erros em vez de usar o docmd.runsql utilize o .Execute

    exemplo:
    Dim db As Database, strSQL As String
    Set db = CurrentDb
    db.Execute "INSERT..."


    Relativamente à questão da mensagem n.º 1 estive analisar melhor e reparei que na instrução Sql são vários registos e do outro posto um registo.
    Não sei até que ponto é viável a instrução do 2º usuario "caix.AddNew" ser efetuada por consulta SQL Insert.
    Abraço


    sergiosdl
    Developer
    Developer

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 122
    Registrado : 04/12/2009

    Re: [Resolvido]gravação de dados simultâneos AddNew x Docmd.RunSQL

    Mensagem  sergiosdl em Sex 09 Jan 2015, 14:00

    Ok Amigo Obrigado
    vou adaptar a este modo a sql, para que em caso de não gravação seja avisado o usuário que os dados não foram gravados.
    eu poderia fazer direto?

    Dim strSQL As String
    strSQL = "INSERT..."
    Currentdb.Execute strSQL


    Você achou que não é viável a gravação de UM registro pelo método Execute ou Runsql?

    ahteixeira
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 3214
    Registrado : 15/03/2013

    Re: [Resolvido]gravação de dados simultâneos AddNew x Docmd.RunSQL

    Mensagem  ahteixeira em Sex 09 Jan 2015, 17:58

    Ola eu sugeria se possível em vez adicionar os registos por

    .addnew

    Usar em sql

    Tanto por Execute ou Runsql

    Desta forma não estava o recordset aberto e possivelmente não teria o erro.
    Seria de testar.
    Abraço

    sergiosdl
    Developer
    Developer

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 122
    Registrado : 04/12/2009

    Re: [Resolvido]gravação de dados simultâneos AddNew x Docmd.RunSQL

    Mensagem  sergiosdl em Sex 09 Jan 2015, 19:38

    Ok amigo
    Obrigado pelo retorno irei fazer o teste, a principio já vi que em caso de loop, o addnew é muito mais rápido que o runsql ou o execute, considerando que o runsql não trata erros acredito não ser viável. Vou testar

    Abraços

    sergiosdl
    Developer
    Developer

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 122
    Registrado : 04/12/2009

    Re: [Resolvido]gravação de dados simultâneos AddNew x Docmd.RunSQL

    Mensagem  sergiosdl em Seg 12 Jan 2015, 19:16

    Caros colegas. Obrigado pelo retorno
    optei por usar o método execute, embora que quando dá erros ele não acusou, apenas nao gravou a quantidade de registros, então fiz no método abaixo onde consigo conferir se o registro foi gravado
       Set b = CurrentDb
       s = "INSERT INTO cai SELECT cai_loc.* FROM cai_loc; "
       DoCmd.Hourglass True
       b.Execute s
       If b.RecordsAffected = 0 Then
           MsgBox "Erro: Os dados não foram gravados no servidor. Contate do Desenvolvedor do Sistema", vbCritical, "Thor"
           DoCmd.Hourglass False
           Exit Sub
       End If
       DoCmd.Hourglass False


    Com isso caso nao for gravado o registro será informado ao usuario. Resolve mas o ideal seria que não tivesse este tipo de erro de gravar simultâneo
    Agradeço por toda ajuda

    Abraços

    ahteixeira
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 3214
    Registrado : 15/03/2013

    Re: [Resolvido]gravação de dados simultâneos AddNew x Docmd.RunSQL

    Mensagem  ahteixeira em Ter 13 Jan 2015, 16:54

    Olá, obrigado pelo retorno.

    Não se esqueça de dar o tópico como resolvido, veja link abaixo:
    [Você precisa estar registrado e conectado para ver este link.]
    Abraço

      Data/hora atual: Qua 07 Dez 2016, 20:15