Usuário com melhor resposta
Acessar Banco mais Rapidamente

Pergunta
-
Boa Tarde possuo uma planilha do excel (=Buscar.BuscaChassi ) que acessa meu banco e busca informação do Chassi de veiculos, na planilha excel coloco o chassi e se tiver igual no banco me retorna toda a informação do veiculo, mas como é um volume muito grande de informação demora demais para a verificação, gostaria de saber se tem um modo em que seja mais rapido a busca.
Segue o codigo se tiver alguem pra ajudar
Function BuscaChassi(Banco As String, Chassi As String, Retorno As String) As StringDim Conexao As ADODB.Connection 'Variável que fará a conexão com o bancoDim RS As ADODB.Recordset 'Variável que retornará o resultadoDim SQL As String 'Variável que vai armazenar a instrução SQLDim Resultado As String 'Resultado da função'Define a conexão com o banco de dadosSet Conexao = New ADODB.ConnectionConexao.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + BancoConexao.Open
'Monta a instrução SQLSet RS = New ADODB.RecordsetSQL = "SELECT " & Retorno & " FROM [Tabela de Frota] WHERE [CHA_NUMERO] = '" & Chassi & "'"RS.Open SQL, Conexao
'Descobre se achou ou nãoIf Not (RS.EOF) ThenIf IsNull(RS.Fields(0).Value) ThenResultado = ""ElseResultado = RS.Fields(0).ValueEnd IfElseResultado = "NÃO ENCONTRADO"End If'Retorna o resultado de achou para a funçãoBuscaChassi = ResultadoEnd Function
Grato.terça-feira, 1 de fevereiro de 2011 16:27
Respostas
-
Sub pega_BuscaChassi()dim banco as string 'variável que contém o nome do bancoDim Conexao As ADODB.Connection 'Variável que fará a conexão com o bancoDim RS As ADODB.Recordset 'Variável que retornará o resultadoDim SQL As String 'Variável que vai armazenar a instrução SQLdim onde_por as range ' local onde os dados serão copiadosdim campos as string ' lista de campos na ordem em que ficarão na colunadim quais_chassis as stringdim faixa_chassis as range ' faixa que conterá os chassis a serem buscados
set banco = "banco tal" ' coloque aqui o nome do banco de dados
set onde_por = range( "B10:F1000" ) ' coloque aqui a faixa onde os dados serão colocados' deve ser grande suficiente para caber tudo, ou ele vai truncar.
set faixa_chassis = range( "A10:A10000" ) ' coloque aqui a faixa que contém os' chassis a serem buscados
quais_chassis = " ( 'XXXXX' "
for each um_chassis in faixa_chassisquais_chassis = quais_chassis & " , '" & um_chassis.value & "'"nextquais_chassis = quais_chassis & ")"
' coloque na variável campos, na ordem desejada, os campos do banco de dados
campos = " renavam, cor, modelo, tipo, fabricante, data_de_emissao "'Define a conexão com o banco de dadosSet Conexao = New ADODB.ConnectionConexao.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + BancoConexao.Open
'Monta a instrução SQLSet RS = New ADODB.RecordsetSQL = "SELECT " & campos & " FROM [Tabela de Frota] WHERE [CHA_NUMERO] in " & quais_ChassisRS.Open SQL, Conexao
'Descobre se achou ou nãoIf RS.recordcount = 0 Thenmsgbox( " Acredita que num achou sequer 1 chassis ?!!!! " )exit subendifonde_por.cells.copyfromrecordset rs
End sub
experimente
João Eurico Consultor Manguetown - Brazil- Marcado como Resposta langoBel segunda-feira, 21 de fevereiro de 2011 11:50
quinta-feira, 3 de fevereiro de 2011 18:54
Todas as Respostas
-
Analisando a sua função ela tem nada de errado.
Então qual é o problema ? O problema é de concepção da solução. Você está chamando a função a cada ítem e para cada ítem vc está chamando a função para cada CAMPO da tabela. Só que a cada chamada da função, a conexão com o banco é estabelecida. Isso é o que está causando a lentidão.
Como resolver ? Redesenha completamente, em vez de usar uma função, fazer uma macro para submeter a query de uma vez só ao banco e trazer todos os dados de uma só vez. Isso vai ficar SUPER mais rápido.
Outra forma é vc tentar estabelecer a conexão com o banco e salvá-la, fazer as queries usando a conexão pré-estabelecida (já poupa o tempo de estabelecer a conexão). Mesmo assim, vai fazer uma query para cada ítem x cada campo. Suponha que sejam 1000 ítems e 10 campos
1000 ítens x 10 campos = 10 mil queries e 10 mil criações de conexão.
A forma mais eficiente seria criar uma query só assim numa macro
'select campo1, campo2, campo3, campo4 from [Tabela de Frota] where [CHA_NUMERO] in ( ' & string_com todos os chassis desejados ' )'
Essa string com todos os chassis desejados seria a concatenação dos chassis desejados, entre aspas e separados por , (vírgula)
A macro montaria essa string ao varrer a faixa dos chassis desejados.
Depois que o result set estivesse populado, aí era só dar um copy from result set para a faixa destino.
A ordem dos campo1, campo2, campo3 é fundamental pois tem que ser a mesma que vc quer na sua planilha.
QUe tal ? Que achou da idéia ?
João Eurico Consultor Manguetown - Brazilterça-feira, 1 de fevereiro de 2011 19:26 -
Bom dia !!!
João sou iniciante e o maximo que consegui foi isso, tem alguma forma de vc me ajudar ???
Grato.
quarta-feira, 2 de fevereiro de 2011 09:53 -
Sim, vou tentar fazer a macro aqui e depois eu mando para vc. Talvez precise de ajustes na vida real.
João Eurico Consultor Manguetown - Brazilquinta-feira, 3 de fevereiro de 2011 09:57 -
Sub pega_BuscaChassi()dim banco as string 'variável que contém o nome do bancoDim Conexao As ADODB.Connection 'Variável que fará a conexão com o bancoDim RS As ADODB.Recordset 'Variável que retornará o resultadoDim SQL As String 'Variável que vai armazenar a instrução SQLdim onde_por as range ' local onde os dados serão copiadosdim campos as string ' lista de campos na ordem em que ficarão na colunadim quais_chassis as stringdim faixa_chassis as range ' faixa que conterá os chassis a serem buscados
set banco = "banco tal" ' coloque aqui o nome do banco de dados
set onde_por = range( "B10:F1000" ) ' coloque aqui a faixa onde os dados serão colocados' deve ser grande suficiente para caber tudo, ou ele vai truncar.
set faixa_chassis = range( "A10:A10000" ) ' coloque aqui a faixa que contém os' chassis a serem buscados
quais_chassis = " ( 'XXXXX' "
for each um_chassis in faixa_chassisquais_chassis = quais_chassis & " , '" & um_chassis.value & "'"nextquais_chassis = quais_chassis & ")"
' coloque na variável campos, na ordem desejada, os campos do banco de dados
campos = " renavam, cor, modelo, tipo, fabricante, data_de_emissao "'Define a conexão com o banco de dadosSet Conexao = New ADODB.ConnectionConexao.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + BancoConexao.Open
'Monta a instrução SQLSet RS = New ADODB.RecordsetSQL = "SELECT " & campos & " FROM [Tabela de Frota] WHERE [CHA_NUMERO] in " & quais_ChassisRS.Open SQL, Conexao
'Descobre se achou ou nãoIf RS.recordcount = 0 Thenmsgbox( " Acredita que num achou sequer 1 chassis ?!!!! " )exit subendifonde_por.cells.copyfromrecordset rs
End sub
experimente
João Eurico Consultor Manguetown - Brazil- Marcado como Resposta langoBel segunda-feira, 21 de fevereiro de 2011 11:50
quinta-feira, 3 de fevereiro de 2011 18:54 -
Vou tentar fazer depois te aviso !!!!!!!
Grato.
Langosegunda-feira, 7 de fevereiro de 2011 10:35