MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

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)
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 4463
    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
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 4463
    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
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 4463
    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?
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 4463
    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
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 4463
    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 18 Out 2017, 04:58