SELECT MAIS RAPIDO

USUARIO.EXCLUIDOS 29/11/2006 15:44:35
#187001
Senhores,

TENHO UM PROJETO ONDE GERO UM AQUIVO TXT. EM ALGUMAS TABELAS QUE TEM MUITOS DADOS, DEMORA PARA COMEÇAR A GERAÇÃO.
ISSO ACONTECE ASSIM QUE ELE PASSA PELA LINHA QUE TEM O CÓ“DIGO (VERIFIQUEI ISSO COM F8):
rec.Open sSql, dbBanco, adOpenKeyset

NESTE MOMENTO ELE FICA CONTANDO OS REGISTROS.ENTÃO SE A TABELA TEM 50.000 REGISTROS, SÓ“ VAI COMEÇAR A GERAR O AQUIVO QUANDO TERMINAR DE CONTAR.

A PERGUNTA é: TEM ALGUMA FORMA DE AGILIZAR ISSO???

Vejam como está meu código:

Private Function Exportar_Arquivo(ByRef sMsg As String) As Boolean

Dim lContinua As Boolean
Dim sSql As String
Dim rec As New ADODB.Recordset
Dim sCNPJ As String
Dim sNMCLIENTE As String

On Error GoTo Fim

Arquivo.sArquivo = txtArquivo.Text

lContinua = True

If Trim(Arquivo.sArquivo) = "" Then
sMsg = "Informe o Nome do Arquivo!"
Else

If Dir(Arquivo.sArquivo) <> "" Then
lContinua = (MsgBox("Arquivo " + Arquivo.sArquivo & " já Existe. Sobrescrever?", vbQuestion + vbYesNo, Me.Caption) = vbYes)
End If

If lContinua Then
sSql = "Select * from Clientes "
sSql = sSql & "Where Dt_Cadastro >= '01-JAN-2000' "

rec.CursorLocation = adUseClient
rec.Open sSql, dbBanco, adOpenKeyset

If rec.RecordCount = 0 Then
sMsg = "Nenhum Registro Encontrado!"
Else

Arquivo.nArquivo = FreeFile
Open Arquivo.sArquivo For Output As #Arquivo.nArquivo
Arquivo.sRegistro = ""
nQtdeRegistros = 0

Arquivo.sRegistro = "000 - CABEÇALHO "

Print #Arquivo.nArquivo, Arquivo.sRegistro

Do While Not rec.EOF
nQtdeRegistros = nQtdeRegistros + 1
LblQtde.Caption = nQtdeRegistros
LblQtde.Refresh

Arquivo.sRegistro = Right("" & "", 1)

sCNPJ = IIf(Not IsNull(rec!CNPJ), rec!CNPJ, "")
sNOME = IIf(Not IsNull(rec!NOME), rec!NOME, "")

Arquivo.sRegistro = Arquivo.sRegistro & sCNPJ & ";"
Arquivo.sRegistro = Arquivo.sRegistro & sNOME & ";"

Print #Arquivo.nArquivo, Arquivo.sRegistro

rec.MoveNext

Loop

Close #Arquivo.nArquivo
'rtb.FileName = Arquivo.sArquivo

End If

End If

End If

rec.Close
Set rec = Nothing

Fim:

If Err.Number <> 0 Then
sMsg = Err.Number & "-" & Err.Description
End If

Exportar_Arquivo = (Trim(sMsg) = "")

End Function

USUARIO.EXCLUIDOS 29/11/2006 15:51:03
#187002
Bem, estou sem o vb aqui no momento, porém, você pode declarar o seu recordset da seguinte forma (nçao mebro a posição exata do withevents):

Dim withevents rs as new adodb.recordset

aparecerá na combo de eventos (onkeypress, onresize..) alguns eventos relativos ao recordset.

um deles se não me engano é whileFetching, ou seja, euqnato esta preenchendo o recordset.

Tente ver se te ajuda, nunca usei para esta finalidade, mas não vejo outra forma.

Espero que te ajude.


USUARIO.EXCLUIDOS 29/11/2006 15:55:20
#187004
Qual é o banco?
USUARIO.EXCLUIDOS 29/11/2006 16:04:12
#187006

O banco que uso é ORACLE
USUARIO.EXCLUIDOS 29/11/2006 16:32:56
#187011
MARCOSA,

NÃO DEU CERTO. é ASSIM MESMO?

Dim withevents rs as new adodb.recordset ????


USUARIO.EXCLUIDOS 29/11/2006 16:58:35
#187016
declare a variavel fora de qualquer funçao, ou seja, no ínício do seu form da seguinte forma:

Private WithEvents rs As new adodb.recordset

ou

Private WithEvents rs As adodb.recordset

Não lembro exatamente e estou sem o vb aqui.

Assim quando você for na lista de objetos do form, irá aparecer rs, você irá seleciona-lo e ao lado irão aparecer os eventos que temos ligados ao rs, você escolhe o evento que desejar...

Ai você terá de ver qual evento irá se adequr melhor ao que você deseja.

Espero que te ajude....

Se estiver errado, desculpe é que estou sem vb, então nem tenho como validar o código.
USUARIO.EXCLUIDOS 29/11/2006 17:03:41
#187017
Então pq não usa o cursor no servidor?
USUARIO.EXCLUIDOS 29/11/2006 17:34:36
#187022
é, não tá funcionando. Tem algo errado. Vc pode ver pra mim e me mandar o código amanhã?



USUARIO.EXCLUIDOS 29/11/2006 18:20:21
#187034
ELSVB,

Vi que no seu select vc filtra tudo que foi cadastrado após uma certa Data.
"Where Dt_Cadastro >= '01-JAN-2000'"

Este campo Dt_Cadastro está indexado?

Se não, crie o indíce, isto pode agilizar uma consulta.
FLAVIOALBIERO 30/11/2006 11:41:12
#187148
Se o seu banco eh ORACLE
Muda a sua conexão
para MSDAORA

e rode a sua sql novamente
aqui no supermercado acessamos bases de dados com até 3 milhões de
registros e tinhamos um problema parecido pois utilizamos na maioria dos aplicativos
ORAOLEDB.ORACLE

porém nas telas onde temos necessidade de maior agilidade
mudamos a conexão para MSDAORA

espero ter ajudado

abçs
t+


USUARIO.EXCLUIDOS 30/11/2006 11:49:26
#187156
MarceloHF

esse campo já é indice!

Página 1 de 3 [26 registro(s)]
Tópico encerrado , respostas não são mais permitidas