MSFLEXGRIID - LINHAS

JOERBETH 03/08/2012 17:25:59
#407164
Bo tarde

Pessoal , a duvida parce simples, mais me dando dorzinha de cabeça..rsss, assim, eu carrego o banco de dados no meu msflexgrid, mais eu defino manualmente o .ROWS(numero de linhas), e isso tá me dando um pouco de dor de cabeça, a pergunta é, como eu faço para ele carregar somente o tanto de registros gravados no banco dados???

valeu

Joerbeth
KERPLUNK 03/08/2012 17:29:38
#407166
Para cada registro que tiver no recordset, adicione uma linha e trabalhe com ela:
grid.Rows = grid.Rows + 1
grid.TextMatrix(coluna, grid.Rows) = rs!Campo
CASTELO 03/08/2012 17:39:12
#407167
bom

já usei msHflexgrid pela propriedade DATASOURCE (onde haverá preenchimento automático tanto de linhas quando de colunas)

mas tô usando atualmente o recordcout do recordset para definir a quantidade de linhas no meu caso.
FILMAN 04/08/2012 14:40:35
#407199
msFlex.Rows = RecordSet.RecordCount + 1


O termo +1 é para não contar o cabeçalho

Eu faço assim

rst.Open [Ô]SELECT * FROM tbContas ORDER BY con_descricao[Ô], Conn, adOpenStatic, adLockReadOnly

If rst.RecordCount > 0 Then
With Grid
.Clear
.Cols = 3
.SelectionMode = flexSelectionByRow
.ColWidth(0) = 800
.ColWidth(1) = 0
.TextMatrix(0, 1) = [Ô]Cod[Ô]
.ColWidth(2) = 5000
.TextMatrix(0, 2) = [Ô]Descrição da Conta[Ô]
[txt-color=#e80000].Rows = rst.RecordCount + 1[/txt-color]
rst.MoveFirst
For i = 1 To rst.RecordCount
.TextMatrix(i, 1) = IIf(IsNull(rst!con_id), [Ô][Ô], rst!con_id)
.TextMatrix(i, 2) = IIf(IsNull(rst!con_descricao), [Ô][Ô], rst!con_descricao)
rst.MoveNext
Next i
End With
End If



Espero ter ajudado
LLAIA 06/08/2012 09:13:21
#407235
Resposta escolhida
é bem mais rápido assim:

Suponha que seu grid tenha apenas o cabeçalho, e ele tem 3 colunas: Nome, Cidade, Idade

Antes de iniciar a adição de linhas atribua False para a propriedade Redraw, inisira as linhas e mude Redraw para True após.

SeuGrid.Redraw = False

While Not suaTabela.EOF
SeuGrid.AddItem suaTabela([Ô]nome[Ô]) & vbTab & suaTabela([Ô]cidade[Ô]) & vbTab & suaTabela([Ô]idade[Ô])
suaTabela.MoveNext
Wend

SeuGrid.Redraw = True
JOERBETH 06/08/2012 15:52:04
#407296
Bom assim, eu fiz uma função:
Public Function PreencheFlexGrid1(FlexGrid As Object, RS As Object) As Boolean
On Error GoTo ErrorHandler
If Not TypeOf FlexGrid Is MSFlexGrid Then Exit Function
If Not TypeOf RS Is ADODB.Recordset Then Exit Function
Dim i As Integer
Dim J As Integer
Dim v_Passa
Dim v_Passa2 As Boolean
Dim v_Passa3 As Boolean
v_Passa2 = True
v_Passa3 = True
FlexGrid.FixedRows = 1
FlexGrid.FixedCols = 0
If Not RS.EOF Then
FlexGrid.Rows = RS.RecordCount + 1
FlexGrid.Cols = RS.Fields.Count
For i = 0 To RS.Fields.Count - 1
FlexGrid.TextMatrix(0, i) = RS.Fields(i).Name [ô] define o cabeçalho do grid
Next
i = 1
Do While Not RS.EOF
For J = 0 To RS.Fields.Count - 1
If Not IsNull(RS.Fields(J).Value) Then
If v_Passa3 = True Then
If RS.Fields(J).Name = [Ô]CODIGO[Ô] And v_Passa2 = True Then
v_Passa2 = False
v_Passa = RS([Ô]CODIGO[Ô])
FlexGrid.TextMatrix(i, J) = RS.Fields(J).Value
ElseIf RS.Fields(J).Name = [Ô]VALORGERAL[Ô] Then
FlexGrid.TextMatrix(i, J) = Format(RS.Fields(J).Value, [Ô]#,##0.00;($#,##0.00)[Ô])
Else
FlexGrid.TextMatrix(i, J) = RS.Fields(J).Value
End If
Else
FlexGrid.TextMatrix(i, J) = [Ô][Ô]
End If
End If
Next
i = i + 1
RS.MoveNext
If Int(RS([Ô]CODIGO[Ô])) = Int(v_Passa) Then
v_Passa3 = False
Else
v_Passa3 = True
v_Passa2 = True
End If
Loop
End If
PreencheFlexGrid1 = True
ErrorHandler:
Exit Function

End Function

****************************** isso preenche o meu flexgrid sem registros [Ô]repetidos[Ô] ou seja:

campos:

CODIGO|DATA|CLIENTE |VALOR|
----------|-------|--------------------
1 06/08 JOERBETH 1500
1 06/08 JOERBETH 1500
2 06/08 ROBERTO 200
3 06/08 VERA 300
3 06/08 VERA 300

no grid e com essa função, ele escreve um item somente de cada, porque no meu banco de dados, tem que ser assim, mais tive pensando, acho que colo eu tô declarando o numeor de ROWS=200 por exemplo, quando tiver muitos regsitros, vai ficar lento, então como eu faria isso? deve ser dentro do proprio SELECT né? com JOIN sei lá..rsss

Eu gostei dessa aqui;

SeuGrid.Cols = 3
SeuGrid.ColWidth(2) = 2000 [ô]prop

SeuGrid.TextMatrix(0, 0) = [Ô]cODIGO[Ô]
SeuGrid.TextMatrix(0, 1) = [Ô]Data[Ô]
SeuGrid.TextMatrix(0, 2) = [Ô]Proprietario[Ô]


SeuGrid.Redraw = False

If RS_VENDAS.State = adStateOpen Then RS_VENDAS.Close
RS_VENDAS.Open [Ô]SELECT * FROM VENDAS[Ô], BD, adOpenKeyset, adLockOptimistic

While Not RS_VENDAS.EOF
SeuGrid.AddItem RS_VENDAS([Ô]codigo[Ô]) & vbTab & RS_VENDAS([Ô]data[Ô]) & vbTab & RS_VENDAS([Ô]proprietario[Ô])
RS_VENDAS.MoveNext
Wend

SeuGrid.Redraw = True


VALEU

JOERBETH 06/08/2012 16:02:19
#407298
ACHO QUE é ISSO AQUI Né?

RS_VENDAS.Open [Ô]SELECT DISTINCT CODIGO,DATA,PROPRIETARIO FROM VENDAS[Ô], BD, adOpenKeyset, adLockOptimistic

AQUI PARECE QUE DEU CERTO..RSSS

VALEU
FILMAN 06/08/2012 16:12:41
#407299
Sim. o DISTINCT serve para carregar RS sem valores duplicados caso exista dois ou mais iguais retorna apenas um!

Mais seria interessante fazer uma busca no banco antes de gravar os dados caso tenha algum ja cadastrado não deixe gravar assim
vc evita que o banco fique dados que não deveriam estar lá e tbm fica mais leve!


Tópico encerrado , respostas não são mais permitidas