MSFLEXGRIID - LINHAS
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
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
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
grid.Rows = grid.Rows + 1
grid.TextMatrix(coluna, grid.Rows) = rs!Campo
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.
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.
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
é 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.
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
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
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
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
RS_VENDAS.Open [Ô]SELECT DISTINCT CODIGO,DATA,PROPRIETARIO FROM VENDAS[Ô], BD, adOpenKeyset, adLockOptimistic
AQUI PARECE QUE DEU CERTO..RSSS
VALEU
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!
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