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

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 e retornar este objeto para a função que chama.

 

Uma outra solução para o problema seria utilizar uma array que pudesse armazenar vários tipos de dados(como um array de structs, mas isto eu faria em C). O que creio que não será possível.

 

Outra dúvida que tive no final de semana, seria como trabalhar com ponteiros em VB, o que me facilitaria e muito no trabalho com estes objetos.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você criou o tópico, mas olhe a resposta que deixei.

 

Expliquei como faz o que você pediu nesse tópico, por isso ele indicou.

 

Se tiver dúvidas, poste ai.

 

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:

[color="#2E8B57"]'Constantes utilizadas como parâmetro para largura dos GRIDS[/color][/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

[color="#2E8B57"]'Constante que define o número de intervalos exibidos nos GRIDS[/color]
Public Const INTERVALO As Integer = 300
[color="#2E8B57"]'Limpa o GRID indicado e tenta reconstituir o título[/color]
Public Function LIMPAR_GRID(OBJ_MSFLEXGRID As Object, OBJ_RECORDSET As Object)
On Error GoTo ERROS
[color="#2E8B57"]	'Verifica se os objetos enviados são dos tipos exigidos pela função[/color]
	If Not TypeOf OBJ_MSFLEXGRID Is MSFlexGrid Then Exit Function
	If Not TypeOf OBJ_RECORDSET Is ADODB.Recordset Then Exit Function
	[color="#2E8B57"]
	'Exclui as linhas do GRID, deixando somente uma linha[/color]
	OBJ_MSFLEXGRID.Rows = 2
	
[color="#2E8B57"]	'Limpa todas as linhas do GRID[/color]
	OBJ_MSFLEXGRID.Clear
	
[color="#2E8B57"]	'Define o contador[/color]
	Dim Contador As Integer
	Contador = 0
	
[color="#2E8B57"]	'Caso o número de colunas do Objeto Recordset seja maior que zero[/color]
	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
	
[color="#2E8B57"]	'Reconfigura o título do GRID[/color]
		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
[color="#2E8B57"]		'Define a quantidade de colunas = 1 caso não haja colunas na tabela[/color]
		OBJ_MSFLEXGRID.Cols = 1
	End If
	
	Exit Function
ERROS:
End Function
[color="#2E8B57"]
'Preenche o GRID indicado de acordo com a página informada[/color]
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
[color="#2E8B57"]	
	'Verifica se os objetos enviados são dos tipos exigidos pela função[/color]
	If Not TypeOf OBJ_MSFLEXGRID Is MSFlexGrid Then Exit Function
	If Not TypeOf OBJ_RECORDSET Is ADODB.Recordset Then Exit Function
	
[color="#2E8B57"]	'Verifica se o objeto não está na posição final[/color]
	If OBJ_RECORDSET.EOF Then
		OBJ_RECORDSET.MoveFirst
	End If
	
[color="#2E8B57"]	'Verifica se a página informada pelo usuário está no limite do RECORDSET informado[/color]
	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
[color="#2E8B57"]	'Verifica se a página informada pelo usuário é anterior à primeira página do RECORDSET[/color]
	ElseIf Pagina <= 1 Then
[color="#2E8B57"]		'Caso PAGINA seja menor do que 1 é exibida a primeira página ao usuário[/color]
		OBJ_RECORDSET.AbsolutePage = 1
		Pagina = 1
	Else[color="#2E8B57"]
		'Caso PAGINA esteja dentro dos limites suportados pelo RECORDSET, o foco do mesmo é direcionado para a página solicitada pelo usuário[/color]
		OBJ_RECORDSET.AbsolutePage = Pagina
	End If
	
[color="#2E8B57"]	'Define a quantidade de colunas[/color]
	OBJ_MSFLEXGRID.Cols = OBJ_RECORDSET.Fields.Count
	
[color="#2E8B57"]	'Configura a barra de títulos[/color]
	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
[color="#FF0000"]		'De acordo com o valor do campo, é definida uma largura para a coluna do grid[/color]
		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
	
[color="#2E8B57"]	'Define a posição de inserção logo abaixo do Título[/color]
	Linha = 1

[color="#2E8B57"]	'Define a quantidade de registros a serem preenchidos[/color]
	
	QTD_REGISTROS = OBJ_RECORDSET.PageSize

[color="#2E8B57"]	'Define a quantidade de linhas do GRID[/color]
	OBJ_MSFLEXGRID.Rows = QTD_REGISTROS + 1
	
[color="#2E8B57"]	'Seleciona a primeira célula após o título[/color]
	OBJ_MSFLEXGRID.Row = 1
	OBJ_MSFLEXGRID.Col = 0
	
[color="#2E8B57"]	'Seleciona todas as colunas e células abaixo do título[/color]
	OBJ_MSFLEXGRID.BackColorSel = &HF0F0F0[color="#2E8B57"] 'Mantém a cor do plano de fundo ao selecionar às células da mesma cor que as linhas pares[/color]
	OBJ_MSFLEXGRID.RowSel = OBJ_MSFLEXGRID.Rows - 1
	OBJ_MSFLEXGRID.ColSel = OBJ_MSFLEXGRID.Cols - 1
	OBJ_MSFLEXGRID.BackColorSel = &H8000000D [color="#2E8B57"]'Retorna à cor original a propriedade de cor de fundo de células selecionadas[/color]
	
[color="#2E8B57"]	'Insere os dados através do método GETSTRING e CLIP de RECORDSET e GRID[/color]
	OBJ_MSFLEXGRID.Clip = OBJ_RECORDSET.GetString(adClipString, OBJ_RECORDSET.PageSize, Chr(9), Chr(13), "")
	
[color="#2E8B57"]	'Percorre todo o GRID[/color]
	DoEvents
	For Linha = 1 To OBJ_RECORDSET.PageSize [color="#2E8B57"]'Quantidade de linhas em uma página[/color]
		DoEvents
		For COLUNA = 0 To OBJ_RECORDSET.Fields.Count - 1 [color="#2E8B57"]'Quantidade de colunas da página[/color]
		   [color="#2E8B57"] 'Altera o plano de fundo das células caso esta esteja em uma linha par[/color]
			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
	
	[color="#2E8B57"]'Retira o número excedentes de registros no GRID[/color]
	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
	
	[color="#2E8B57"]'Seleciona a primeira linha após o título e a primeira coluna do GRID[/color]
	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

Desculpe, não entendi. Você está tendo difilcudades em definir a quantidade de colunas ou de achar um tamanho sufientemente grande para a largura de modo que todos os textos apareçam?

 

Se for a quantidade, pode utilizar rs.fields.count. Isso te retorna a quantidade de colunas do seu banco.

 

Se for a largura, você pode fazer o seguinte:

 

Ao invés de passar a largura do texto direto para a propriedade ColWidth(COLUNA), faça o seguinte.

Declare a variavel larg_coluna como uma matriz. Ai você passa a largura do texto para essa variável e depois faz uma comparação para ver se o valor passado é maior ou menor que o valor atual. Se for maior você substitui, senão não.

 

Vou postar um exemplinho:

 

Dim largura_coluna(), largura_campo As Single
Do Until rs_func.EOF
   For coluna = 0 To rs_func.Fields.Count - 1
	  MSFlexGrid2.TextMatrix(linha, coluna) = rs(coluna)
	  If largura_coluna(coluna) < TextWidth(rs(coluna)) Then largura_campo = TextWidth(rs(coluna))
   next
loop

For coluna = 0 To MSFlexGrid2.Cols - 1
   MSFlexGrid2.ColWidth(coluna) = largura_coluna(coluna) + 240
Next coluna

Espero que ajude. Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe, não entendi. Você está tendo difilcudades em definir a quantidade de colunas ou de achar um tamanho sufientemente grande para a largura de modo que todos os textos apareçam?

 

Se for a quantidade, pode utilizar rs.fields.count. Isso te retorna a quantidade de colunas do seu banco.

 

Se for a largura, você pode fazer o seguinte:

 

Ao invés de passar a largura do texto direto para a propriedade ColWidth(COLUNA), faça o seguinte.

Declare a variavel larg_coluna como uma matriz. Ai você passa a largura do texto para essa variável e depois faz uma comparação para ver se o valor passado é maior ou menor que o valor atual. Se for maior você substitui, senão não.

 

Vou postar um exemplinho:

 

Dim largura_coluna(), largura_campo As Single
Do Until rs_func.EOF
   For coluna = 0 To rs_func.Fields.Count - 1
	  MSFlexGrid2.TextMatrix(linha, coluna) = rs(coluna)
	  If largura_coluna(coluna) < TextWidth(rs(coluna)) Then largura_campo = TextWidth(rs(coluna))
   next
loop

For coluna = 0 To MSFlexGrid2.Cols - 1
   MSFlexGrid2.ColWidth(coluna) = largura_coluna(coluna) + 240
Next coluna

Espero que ajude. Abraços.

Cláudio, bom dia.

 

Só não entendi uma coisa, você compara o valor armazenado em LARGURA_COLUNA(COLUNA) com TEXTWIDTH(RS(COLUNA), e então armazena este valor em LARGURA_CAMPO, depois você define a coluna do GRID como LARGURA_COLUNA(COLUNA). Se não há referência de LARGURA_CAMPO com LARGURA_COLUNA(COLUNA), perde-se então o valor da largura não? Corrija-me se estiver errado.

 

Flw...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outra coisa Cláudio, eu estou utilizando a minha função em um módulo, então eu teria que enviar uma referência de meu formulário?

 

Obrigado

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.