Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

alex_fsi

Criação de Recordset em tempo exec.

Recommended Posts

Galera, consegui resolver o problema, se alguem tiver alguma duvida, só postarem aki q coloco o código depois

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Kra.. to com um problema semelhante. Preciso criar um tipo de paginação para um GRID.

Tenho um Recordset com todos os meus dados.

Preciso então selecionar os meus dados em partes, provavelmente de mil em mil registros.

 

Quando o usuário clicar em um botão próximo, pegarei os mil registros posteriores aos atuais.

 

Se eu for fazer isso com um for, ficaria mais ou menos assim:

 

recebo um index informando até onde os dados foram carregados. Por exemplo: de 1 até 1000, meu índex é mil.

Então utilizaria move para posicionarme no registro 1000 +1. Então faria um for para ir adcionando em um Recordset temporário os mil registros seguintes e colocaria no GRID.

 

É possível mas é dispendioso e trabalhoso.

 

O que eu queria é uma expressão como a seguinte:

recordsettemporario = recordsetoriginal(indexfinalatual +1, 1000)

 

uma assinatura semelhante: pegardados(recordsetatual, posiçãode, posiçãoate) que retornaria os meus dados e colaria no meu recordset temporario.

 

Agradeço pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Criei uma função em VB6 que tenta criar um controle de exibição em um grid(MSFLEXGRID).

 

O problema é que a quantidade de dados que trabalho é muito grande(no mínimo 8000 registros). Então estou tentando fazer um controle com quatro botões que "passam páginas de dados", para frente e para trás.

 

Uso a propriedade MOVE do recordset para ir para um registro em específico e então preencho o grid em certo intervalo, geralmente em 1000 em 1000(já me preparei para exceções quando o meu intervalo que efetuarei o laço for maior que o número de registros).

 

Então quero criar um recordset de acordo com o que vou preencher meu grid.

 

Passo o meu RECORDSET com todos os meus dados para o método por referência( o método também retorna um objeto) e armazeno o retorno em um recordset no método datasource.

 

Quando faço um laço para igualar as minhas recordsets, uso um índex para navegar no meu recordset inicial( rs.fields(0).name, type) e a propriedade "append" para inserir a coluna com estes valores no meu recordset. Nos meus exemplos, o recordset original tem 6 colunas. A sintax é semelhante a esta:

 

For CONTADOR = 0 To (OBJ_TABLEORIGINAL.Fields.Count - 1)

OBJ_TABLETEMPORARIA.Fields.Append OBJ_TABLEORIGINAL.Fields(CONTADOR).Name, OBJ_TABLEORIGINAL.Fields(CONTADOR).Type

MsgBox OBJ_TABLETEMPORARIA.Fields.Count 'PARA TESTE ELE ADCIONA A PRIMEIRA COLUNA

Next CONTADOR

 

O erro retornado é:

OS ARGUMENTOS SÃO INCORRETOS, ESTÃO FORA DO INTERVALO ACEITÁVEL OU ESTÃO EM CONFLITO

 

RUN TIME ERROR '3001'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Alex.

 

Primeiramente, vou pedir para postar qual linha o erro está acusando.

 

Depois me diga se entendi bem o processe de preenchimento da sua grid.

Seu banco tem 8000 registros né. E você quer exibir de 1000 em 1000, e para isso desenvolveu uma função que conta quando chega em 1000 pára, depois quando clica em próximo exibe os próximos 1000, correto?

 

Se for isso mesmo e se estiver usando ADO para se conectar, existe algo que vai facilitar sua vida. O ADO tem uma propriedade chamada pagesize. O pagesize serve justamente para isso, para você determinar de quantos em quantos registros quer exibir. Junto com o pagesize você irá utilizar o absolutepage.

 

Para o pagesize você diz a quantidade por página e no absolutepage você passa a página que quer exibir.

 

Para trabalhar com anterior e próximo, armazene em uma variável a página atual. Quando clicar em próximo some 1 nessa variável e passe esse valor para seu absolutepage.

 

Vou ficar aguardando a linha com erro.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alex, sua dúvida quanto a isso respondi em seu outro tópico, irei desmembrar esse post para não ficar repetido.

Cláudio, obrigado. Consegui resolver o problema. Criei uma função genérica que realiza estes trabalhos. Na verdade, são duas, uma de limpar o GRID e outra de preencher o GRID.

 

Abaixo:

 

'Constantes utilizadas como parâmetro para largura dos GRIDS[/color]

Public Const VERY_LARGE As Double = 13.25

Public Const LARGE As Double = 20

Public Const MIDDLE_LARGE As Double = 27.5

Public Const LITTLE_LARGE As Double = 70

 

'Constante que define o número de intervalos exibidos nos GRIDS

Public Const INTERVALO As Integer = 300

'Limpa o GRID indicado e tenta reconstituir o título

Public Function LIMPAR_GRID(OBJ_MSFLEXGRID As Object, OBJ_RECORDSET As Object)

On Error GoTo ERROS

'Verifica se os objetos enviados são dos tipos exigidos pela função

If Not TypeOf OBJ_MSFLEXGRID Is MSFlexGrid Then Exit Function

If Not TypeOf OBJ_RECORDSET Is ADODB.Recordset Then Exit Function

'Exclui as linhas do GRID, deixando somente uma linha

OBJ_MSFLEXGRID.Rows = 2

 

'Limpa todas as linhas do GRID

OBJ_MSFLEXGRID.Clear

 

'Define o contador

Dim Contador As Integer

Contador = 0

 

'Caso o número de colunas do Objeto Recordset seja maior que zero

If OBJ_RECORDSET.Fields.Count <> 0 Or OBJ_RECORDSET.State = 1 Then

'Define a quantidade de colunas do GRID

OBJ_MSFLEXGRID.Cols = OBJ_RECORDSET.Fields.Count

 

'Reconfigura o título do GRID

For Contador = 0 To OBJ_RECORDSET.Fields.Count - 1

OBJ_MSFLEXGRID.TextMatrix(0, Contador) = OBJ_RECORDSET.Fields(Contador).Name

OBJ_MSFLEXGRID.Col = Contador

OBJ_MSFLEXGRID.Row = 0

OBJ_MSFLEXGRID.CellFontBold = True

Next Contador

Else

'Define a quantidade de colunas = 1 caso não haja colunas na tabela

OBJ_MSFLEXGRID.Cols = 1

End If

 

Exit Function

ERROS:

End Function

'Preenche o GRID indicado de acordo com a página informada

Public Function PREENCHER_GRID(ByRef OBJ_MSFLEXGRID As Object, ByRef OBJ_RECORDSET As Object, Pagina As Integer) As Integer

ON ERROR GOTO ERROS

Dim QTD_REGISTROS As Integer 'Receberá a quantidade de registros em uma página

 

Dim COLUNA As Integer 'Será o índex de coluna do GRID

Dim Linha As Integer 'Será o índex de linha do GRID

'Verifica se os objetos enviados são dos tipos exigidos pela função

If Not TypeOf OBJ_MSFLEXGRID Is MSFlexGrid Then Exit Function

If Not TypeOf OBJ_RECORDSET Is ADODB.Recordset Then Exit Function

 

'Verifica se o objeto não está na posição final

If OBJ_RECORDSET.EOF Then

OBJ_RECORDSET.MoveFirst

End If

 

'Verifica se a página informada pelo usuário está no limite do RECORDSET informado

If Pagina >= OBJ_RECORDSET.PageCount Then

'Caso PAGINA seja maior que o limite suportado, o GRID é preenchido com a última página

OBJ_RECORDSET.AbsolutePage = OBJ_RECORDSET.PageCount

Pagina = OBJ_RECORDSET.PageCount

'Verifica se a página informada pelo usuário é anterior à primeira página do RECORDSET

ElseIf Pagina <= 1 Then

'Caso PAGINA seja menor do que 1 é exibida a primeira página ao usuário

OBJ_RECORDSET.AbsolutePage = 1

Pagina = 1

Else

'Caso PAGINA esteja dentro dos limites suportados pelo RECORDSET, o foco do mesmo é direcionado para a página solicitada pelo usuário

OBJ_RECORDSET.AbsolutePage = Pagina

End If

 

'Define a quantidade de colunas

OBJ_MSFLEXGRID.Cols = OBJ_RECORDSET.Fields.Count

 

'Configura a barra de títulos

For COLUNA = 0 To OBJ_RECORDSET.Fields.Count - 1

OBJ_MSFLEXGRID.TextMatrix(0, COLUNA) = OBJ_RECORDSET.Fields(COLUNA).Name

OBJ_MSFLEXGRID.Col = COLUNA

OBJ_MSFLEXGRID.Row = 0

OBJ_MSFLEXGRID.CellFontBold = True

'De acordo com o valor do campo, é definida uma largura para a coluna do grid

If OBJ_RECORDSET.Fields(COLUNA).Precision <= 100 Then

OBJ_MSFLEXGRID.ColWidth(COLUNA) = OBJ_RECORDSET.Fields(COLUNA).Precision * LITTLE_LARGE

ElseIf OBJ_RECORDSET.Fields(COLUNA).Precision >= 101 And OBJ_RECORDSET.Fields(COLUNA).Precision <= 300 Then

OBJ_MSFLEXGRID.ColWidth(COLUNA) = OBJ_RECORDSET.Fields(COLUNA).Precision * MIDDLE_LARGE

ElseIf OBJ_RECORDSET.Fields(COLUNA).Precision >= 301 And OBJ_RECORDSET.Fields(COLUNA).Precision <= 400 Then

OBJ_MSFLEXGRID.ColWidth(COLUNA) = OBJ_RECORDSET.Fields(COLUNA).Precision * LARGE

ElseIf OBJ_RECORDSET.Fields(COLUNA).Precision > 400 Then

OBJ_MSFLEXGRID.ColWidth(COLUNA) = OBJ_RECORDSET.Fields(COLUNA).Precision * VERY_LARGE

End If

Next COLUNA

 

'Define a posição de inserção logo abaixo do Título

Linha = 1

 

'Define a quantidade de registros a serem preenchidos

 

QTD_REGISTROS = OBJ_RECORDSET.PageSize

 

'Define a quantidade de linhas do GRID

OBJ_MSFLEXGRID.Rows = QTD_REGISTROS + 1

 

'Seleciona a primeira célula após o título

OBJ_MSFLEXGRID.Row = 1

OBJ_MSFLEXGRID.Col = 0

 

'Seleciona todas as colunas e células abaixo do título

OBJ_MSFLEXGRID.BackColorSel = &HF0F0F0 'Mantém a cor do plano de fundo ao selecionar às células da mesma cor que as linhas pares

OBJ_MSFLEXGRID.RowSel = OBJ_MSFLEXGRID.Rows - 1

OBJ_MSFLEXGRID.ColSel = OBJ_MSFLEXGRID.Cols - 1

OBJ_MSFLEXGRID.BackColorSel = &H8000000D 'Retorna à cor original a propriedade de cor de fundo de células selecionadas

 

'Insere os dados através do método GETSTRING e CLIP de RECORDSET e GRID

OBJ_MSFLEXGRID.Clip = OBJ_RECORDSET.GetString(adClipString, OBJ_RECORDSET.PageSize, Chr(9), Chr(13), "")

 

'Percorre todo o GRID

DoEvents

For Linha = 1 To OBJ_RECORDSET.PageSize 'Quantidade de linhas em uma página

DoEvents

For COLUNA = 0 To OBJ_RECORDSET.Fields.Count - 1 'Quantidade de colunas da página

'Altera o plano de fundo das células caso esta esteja em uma linha par

If Val(Right(Format((Linha / 2), "#####0.00000"), 5)) = 0 Then

OBJ_MSFLEXGRID.Row = Linha

OBJ_MSFLEXGRID.Col = COLUNA

OBJ_MSFLEXGRID.CellBackColor = &HF0F0F0

Else

OBJ_MSFLEXGRID.Row = Linha

OBJ_MSFLEXGRID.Col = COLUNA

OBJ_MSFLEXGRID.CellBackColor = &HFFFFFF

End If

Next COLUNA

Next Linha

 

'Retira o número excedentes de registros no GRID

If Pagina = OBJ_RECORDSET.PageCount Then

Dim REGISTROS_EXCEDENTES As Double

REGISTROS_EXCEDENTES = ((Pagina * INTERVALO) - OBJ_RECORDSET.RecordCount)

If REGISTROS_EXCEDENTES <> 0 Then OBJ_MSFLEXGRID.Rows = (INTERVALO + 1) - REGISTROS_EXCEDENTES

End If

 

'Seleciona a primeira linha após o título e a primeira coluna do GRID

OBJ_MSFLEXGRID.Col = 0

OBJ_MSFLEXGRID.Row = 1

PREENCHER_GRID = Pagina

Exit Function

ERROS:

End Function

 

Foi mal ter falado que o tópico foi eu quem criou, é q toda a vez que alguém o indicava e eu olhava não tinha resposta nenhuma....

 

Pois bém, esta função tem me atendido em todos os aspectos, somente no caso próximo à linha vermelha, em que se configura as larguras das colunas que há um problema.

 

Como esta é uma função genérica, eu não posso determinar um número exato de colunas. Tentei pegar o tamanho enviado pelo RECORDSET mas ele nem sempre é preciso.

 

A solução seria encontrar uma propriedade que me permitisse encontrar a maior largura, ou a largura de definição do campo no banco e exibir algo aproximado, o que não consegui ainda!!!!

 

Se alguém conseguir dá uma dica aê... no mais, quem quiser utilizar o código, é só criar um módulo e implementar as funções.

 

Qualquer dúvida avisem!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.