MaximoAccess

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

Obrigado

Administração do MaximoAccess

MaximoAccess

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

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

    Inserir dados no MySql

    marcos_novack
    marcos_novack
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 67
    Registrado : 19/01/2011

    Inserir dados no MySql Empty Inserir dados no MySql

    Mensagem  marcos_novack em 5/10/2019, 19:42

    Boa noite!

    Qual a melhor forma de salvar registros em massa na No banco MySql com MS Access?

    Tenho uma tabela com os Roteiros de produção, abrindo um recordset da tb Roteiros, percorre linha por linha salvando o roteiro na tabela (tbl_situacao_referencia), quando uso a primeira opção o desempenho é péssimo, percebi (tenho duvida aqui) que estava abrindo a tabela com todos os registros para salvar dados e por isso estava com baixo desempenho,então fiz um teste limitando a quantidade de registro com "limite 0 registro) o desempenho melhorou e resolveu o problema, ai me surgiu essa duvida agora.

    (tbl_situacao_referencia,  tem: 48.567 registros)
         

    Opção 1  (Desempenho - Ruim)

      Call Conexao_Open("SELECT id_referencia, fluxo, fases, situacao, data_liberacao FROM tbl_situacao_referencia ")  

       rs.AddNew
       
               rs("fases").Value = Rs_Stored("operacao").Value
                       
       rs.Update
    ----------------------------------------------------------------------------
    Opção 2 (Desempenho - Bom) Exemplo do teste com limite de registro:


      Call Conexao_Open("SELECT id_referencia, fluxo, fases, situacao, data_liberacao FROM inc.tbl_situacao_referencia LIMIT 0;")
     

       rs.AddNew
       
               rs("fases").Value = Rs_Stored("operacao").Value
                       
       rs.Update
    -----------------------------------------------------------------------------
    Opção 3 (Desempenho - Bom)

    Set rs = Cn.Execute("INSERT INTO tbl_situacao_referencia (id_referencia, fluxo, fases, situacao, data_liberacao) " & _
                                                             "Values " & Reg & ";")

    Qual é a experiencia dos senhores? podem me corrigir e indicar o certo?

    obrigado!!
    avatar
    renpv
    Avançado
    Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 323
    Registrado : 12/01/2015

    Inserir dados no MySql Empty Re: Inserir dados no MySql

    Mensagem  renpv em 5/10/2019, 20:50

    Via de regra não é uma boa prática nos bancos de dados ter cópia dos dados em tabelas diferentes.

    Mas, pensando que no seu caso é realmente necessário, presumo que não terá que copiar todos os registros, portanto, tente limitar com a cláusula Where.

    Para selecionar os registros a serem copiados crie um recordset, para inserir na outra tabela tente usar Docmd.ExecutarSQL ao invés de criar outro recordset.

    Faça os testes limitando os dados e veja qual solução é mais eficiente.



    marcos_novack
    marcos_novack
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 67
    Registrado : 19/01/2011

    Inserir dados no MySql Empty Re: Inserir dados no MySql

    Mensagem  marcos_novack em 5/10/2019, 21:28

    Segue a tela de cadastro de pedido para uma melhor compreensão;

    minha tela

    estrutura das tabelas:

    tbl_cadastro_referencia 1>>>> para muitos >>> tbl_situacao_referencia

    depois tenho 7 tabelas de fluxos ex; tblfluxo05, tblfluxo10.... o usuário seleciona o tipo de fluxo que deseja gerar (isso é definido pelo tipo de produto que esta cadastrando, no caso roteiro de produção que vai ser feito até finalizar)

    A tabela tbl_situacao_referencia recebe apenas o roterio pré definido, na tabela fluxo tem as datas do cronograma para produção seguir, depois as baixas vão acontecer nesta tabela.

    exemplo da tabela de fluxos
    Minha tabela
    DamascenoJr.
    DamascenoJr.
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 2455
    Registrado : 21/11/2016

    Inserir dados no MySql Empty Re: Inserir dados no MySql

    Mensagem  DamascenoJr. em 5/10/2019, 21:50

    marcos_novack escreveu:Qual a melhor forma de salvar registros em massa na No banco MySql com MS Access?
    1. Abra a conexão garantindo que ela fique aberta até o final da execução dos comandos
    2. Execute os comandos de adição
    3. Feche a conexão

    Pode parecer óbvio, mas muitos abrem e fecham a conexão para cada linha de registro a ser adicionado. Um pecado!

    Em DAO, existe a opção de abrir recordsets com parâmetro dbAppendOnly, isto é, um recordset próprio para adição de registros. Parecido com o seu LIMIT 0. Afinal, não é necessário trazer o recordset completo quando apenas o queremos para adição de novos registros.

    Em acessos locais não sentimos muito a diferença de não refinar os parâmetros das conexões, mas ao fazer integrações com bancos na WEB temos que ficar atentos a isto.

    Particularmente, não uso recordsets para adição, atualização ou exclusão de registros. Uso recordsets apenas para consultas.

    Veja um trecho do artigo que indico ao final desta mensagem
    "9-) Use Connection.Execute para processamento simples.

    Se você precisa somente abrir uma conexão, executar um processamento que retorne poucas colunas ou não retorna nada, processar o resultado e fechar a conexão, use Connection.Execute Very Happy ao invés de Recordset.Open No ou Command.Execute Evil or Very Mad .

    Ao utilizar Connection.Execute a ADO não preserva a informação do estado do comando o que aumenta o desempenho de sua aplicação."

    Já leu o artigo do link abaixo?
    macoratti.net/ado_fast.htm


    .................................................................................
    Ajude-se a ser ajudado, anexe seu projeto.
    Sempre tente entender o código,
    não somente copie e cole.
    Positive as mensagens que achar útil clicando no '+' no canto superior direito delas.
    marcos_novack
    marcos_novack
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 67
    Registrado : 19/01/2011

    Inserir dados no MySql Empty Re: Inserir dados no MySql

    Mensagem  marcos_novack em 6/10/2019, 21:01

    Boa Noite!!

    Ivan, Ótima leitura, obrigado!

    Renpv, uso tabelas desvinculadas com Mysql, não uso Tabela local nesse caso.

    Bem, para este post é isso, segue meu código, caso alguém queira fazer alguma observação fica aberto.

    Código:
    Sub Gera_Roteriro(nome_tabela As String, ID_Referencia As Integer)

    '-------------------------------------------------
    'Gerar os Fluxos na tabela tbl_situacao_referencia
    '-------------------------------------------------
    Dim DataEntrega
    Dim strVerifica As Integer
    Dim Reg As String

    strVerifica = DCountX("fases", "tbl_situacao_referencia", "id_referencia = '" & Me.ID_Referencia & "'")

    If strVerifica = 0 Then

      DataEntrega = Me.Data

        Call Conexao_Open_Stored 'Abre a conexão com MySql

             Set rs = Cn.Execute("call inc.Gera_Roteiro('" & nome_tabela & "');") 'Executa Stored Procedure armazenada no Mysql
              
                 Reg = ""
                
                      While (Not rs.EOF)
                      
                         'Adiciona as fases da tabela Fluxo na tabela tbl_situacao_referencia (cria o roteiro de produção para o pedido cadastrado com cronograma)
                        
                             Reg = Reg & "("
                             Reg = Reg & "'" & Me.ID_Referencia & "',"
                             Reg = Reg & "'" & Me.fluxo & "',"
                             Reg = Reg & "'" & rs("operacao").Value & "',"
                             Reg = Reg & "'" & "NÃO LIBERADO" & "',"
                                              
                             If rs("operacao") = "Entrega Cliente" Then
                                Reg = Reg & " STR_TO_DATE('" & DateAdd("d", Nz(rs("dias").Value), DataEntrega) & "'," & "'%d/%m/%Y'" & ")" & ") " & vbCrLf
                              Else
                                Reg = Reg & " STR_TO_DATE('" & DateAdd("d", Nz(rs("dias").Value), DataEntrega) & "'," & "'%d/%m/%Y'" & ")" & ") , " & vbCrLf
                             End If
                            
                              
                         rs.MoveNext    'vai para o proximo registro
                
                     Wend
                     'MsgBox Reg
                      
                Set rs = Cn.Execute("INSERT INTO tbl_situacao_referencia (id_referencia, fluxo, fases, situacao, data_liberacao) " & _
                                                              "Values " & Reg & ";")
             Cn.Close    'fecha o banco de dados
        
            Set rs = Nothing 'apagando o local que foi criado
           Set Cn = Nothing 'apagando o local que foi criado
                      
         Call Carrega_Grid_Fluxo(Me.ID_Referencia)

     Else
        
        MsgBox "já existe roteiro criado para referencia: " & Me.referencia, vbCritical, Msg_Inc
        
        Call Carrega_Grid_Fluxo(Me.ID_Referencia)
        
    End If

    End Sub

    Se alguém tiver uma forma melhor para montar os valores do Insert fico grato!

    obrigado pessoal!

      Data/hora atual: 4/12/2020, 11:06