POPULAR UM MSFLEXGRID

PAULOROMEIRO 13/02/2014 11:35:53
#434716
Bom dia
Gostaria de ajuda para entender como popular um MSFlexGrid com as colunas que busco no DB através da query que está no código abaixo.

A variável SQL será meu datasource para poder preencher o grid.
Assim que clicar no botão imprimir, o grid é preenchido.


  SQL = [Ô] ;WITH CTE AS (SELECT ROW_NUMBER() OVER (ORDER BY X.NF) as ID, X.* FROM [Ô] & _
[Ô] (SELECT P.Descricao AS Descricao, ESI.Id_Doc AS NF, ESI.Cod_Estoque AS Cod_Estoque, ESI.Cod_Produto AS Cod_Produto, ESI.Cod_Empresa AS Cod_Empresa, S.Dta_Entrada AS Data, ESI.Qtde AS Qtde, ESI.V_Unitario AS V_Unitario, ESI.V_Total AS V_Total [Ô] & _
[Ô] FROM dbo.Entrada_Itens AS ESI INNER JOIN dbo.Produtos AS P ON ESI.Cod_Empresa = P.Cod_Empresa AND ESI.Cod_Estoque = P.Cod_Estoque AND ESI.Cod_Produto = P.Cod_Produto INNER JOIN dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc [Ô] & _
[Ô] WHERE (ESI.Cod_Estoque = [ô][Ô] & dcEstoque.BoundText & [Ô][ô]) AND (ESI.Cod_Produto = [ô][Ô] & dtProdutos.BoundText & [Ô][ô]) AND (ESI.Cod_Empresa = [ô][Ô] & Sys.Empresa & [Ô][ô]) AND (S.Dta_Entrada Between [ô][Ô] & Format(DataInicio, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô] AND [ô][Ô] & Format(DataFinal, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô]) [Ô] & _
[Ô] UNION [Ô] & _
[Ô] SELECT P.Descricao AS Descricao, ESI.Id_Doc AS NF, ESI.Cod_Estoque AS Cod_Estoque, ESI.Cod_Produto AS Cod_Produto, ESI.Cod_Empresa AS Cod_Empresa, S.Dta_Entrada AS Data, -ESI.Qtde AS Qtde, ESI.V_Unitario AS V_Unitario, -ESI.V_Total AS V_Total [Ô] & _
[Ô] FROM dbo.Saida_Itens AS ESI INNER JOIN dbo.Produtos AS P ON ESI.Cod_Empresa = P.Cod_Empresa AND ESI.Cod_Estoque = P.Cod_Estoque AND ESI.Cod_Produto = P.Cod_Produto INNER JOIN dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc [Ô] & _
[Ô] WHERE (ESI.Cod_Estoque = [ô][Ô] & dcEstoque.BoundText & [Ô][ô]) AND (ESI.Cod_Produto = [ô][Ô] & dtProdutos.BoundText & [Ô][ô]) AND (ESI.Cod_Empresa = [ô][Ô] & Sys.Empresa & [Ô][ô]) AND (S.Dta_Entrada Between [ô][Ô] & Format(DataInicio, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô] AND [ô][Ô] & Format(DataFinal, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô]) [Ô] & _
[Ô] ) AS X ) [Ô] & _
[Ô] SELECT *, (SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc WHERE (ESI.Cod_Estoque = [ô][Ô] & dcEstoque.BoundText & [Ô][ô]) AND (ESI.Cod_Produto = [ô][Ô] & dtProdutos.BoundText & [Ô][ô]) AND (ESI.Cod_Empresa = [ô][Ô] & Sys.Empresa & [Ô][ô]) AND (S.Dta_Entrada Between [ô][Ô] & Format(DataInicio, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô] AND [ô][Ô] & Format(DataFinal, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô])) AS V_SE, [Ô] & _
[Ô] (SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc WHERE (ESI.Cod_Estoque = [ô][Ô] & dcEstoque.BoundText & [Ô][ô]) AND (ESI.Cod_Produto = [ô][Ô] & dtProdutos.BoundText & [Ô][ô]) AND (ESI.Cod_Empresa = [ô][Ô] & Sys.Empresa & [Ô][ô]) AND (S.Dta_Entrada Between [ô][Ô] & Format(DataInicio, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô] AND [ô][Ô] & Format(DataFinal, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô]))*(V_Unitario) AS V_SEV, [Ô] & _
[Ô] (SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc WHERE (ESI.Cod_Estoque = [ô][Ô] & dcEstoque.BoundText & [Ô][ô]) AND (ESI.Cod_Produto = [ô][Ô] & dtProdutos.BoundText & [Ô][ô]) AND (ESI.Cod_Empresa = [ô][Ô] & Sys.Empresa & [Ô][ô]) AND (S.Dta_Entrada Between [ô][Ô] & Format(DataInicio, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô] AND [ô][Ô] & Format(DataFinal, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô])) AS V_SS, [Ô] & _
[Ô] (SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc WHERE (ESI.Cod_Estoque = [ô][Ô] & dcEstoque.BoundText & [Ô][ô]) AND (ESI.Cod_Produto = [ô][Ô] & dtProdutos.BoundText & [Ô][ô]) AND (ESI.Cod_Empresa = [ô][Ô] & Sys.Empresa & [Ô][ô]) AND (S.Dta_Entrada Between [ô][Ô] & Format(DataInicio, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô] AND [ô][Ô] & Format(DataFinal, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô]))*(V_Unitario) AS V_SSV, [Ô] & _
[Ô] ((SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc WHERE (ESI.Cod_Estoque = [ô][Ô] & dcEstoque.BoundText & [Ô][ô]) AND (ESI.Cod_Produto = [ô][Ô] & dtProdutos.BoundText & [Ô][ô]) AND (ESI.Cod_Empresa = [ô][Ô] & Sys.Empresa & [Ô][ô])AND (S.Dta_Entrada < [ô][Ô] & Format(DataInicio, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô])) - (SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc WHERE (ESI.Cod_Estoque = [ô][Ô] & dcEstoque.BoundText & [Ô][ô]) AND (ESI.Cod_Produto = [ô][Ô] & dtProdutos.BoundText & [Ô][ô]) AND (ESI.Cod_Empresa = [ô][Ô] & Sys.Empresa & [Ô][ô]) AND (S.Dta_Entrada < [ô][Ô] & Format(DataInicio, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô]))) AS V_DQ, [Ô] & _
[Ô] ((SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc WHERE (ESI.Cod_Estoque = [ô][Ô] & dcEstoque.BoundText & [Ô][ô]) AND (ESI.Cod_Produto = [ô][Ô] & dtProdutos.BoundText & [Ô][ô]) AND (ESI.Cod_Empresa = [ô][Ô] & Sys.Empresa & [Ô][ô])AND (S.Dta_Entrada < [ô][Ô] & Format(DataInicio, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô])) - (SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc WHERE (ESI.Cod_Estoque = [ô][Ô] & dcEstoque.BoundText & [Ô][ô]) AND (ESI.Cod_Produto = [ô][Ô] & dtProdutos.BoundText & [Ô][ô]) AND (ESI.Cod_Empresa = [ô][Ô] & Sys.Empresa & [Ô][ô]) AND (S.Dta_Entrada < [ô][Ô] & Format(DataInicio, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô])))*(V_Unitario) AS V_DV, [Ô] & _
[Ô] Final_Qtde = (SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc WHERE (ESI.Cod_Estoque = [ô][Ô] & dcEstoque.BoundText & [Ô][ô]) AND (ESI.Cod_Produto = [ô][Ô] & dtProdutos.BoundText & [Ô][ô]) AND (ESI.Cod_Empresa = [ô][Ô] & Sys.Empresa & [Ô][ô])AND (S.Dta_Entrada Between [ô][Ô] & Format(DataInicio, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô] AND [ô][Ô] & Format(DataFinal, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô])) -(SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc WHERE (ESI.Cod_Estoque = [ô][Ô] & dcEstoque.BoundText & [Ô][ô]) AND(ESI.Cod_Produto = [ô][Ô] & dtProdutos.BoundText & [Ô][ô]) AND (ESI.Cod_Empresa = [ô][Ô] & Sys.Empresa & [Ô][ô]) AND(S.Dta_Entrada Between [ô][Ô] & Format(DataInicio, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô] AND [ô][Ô] & Format(DataFinal, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô])), [Ô] & _
[Ô] (SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc WHERE (ESI.Cod_Estoque = [ô][Ô] & dcEstoque.BoundText & [Ô][ô]) AND (ESI.Cod_Produto = [ô][Ô] & dtProdutos.BoundText & [Ô][ô]) AND (ESI.Cod_Empresa = [ô][Ô] & Sys.Empresa & [Ô][ô])AND (S.Dta_Entrada Between [ô][Ô] & Format(DataInicio, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô] AND [ô][Ô] & Format(DataFinal, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô]))-(SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc WHERE (ESI.Cod_Estoque = [ô][Ô] & dcEstoque.BoundText & [Ô][ô]) AND (ESI.Cod_Produto = [ô][Ô] & dtProdutos.BoundText & [Ô][ô]) AND (ESI.Cod_Empresa = [ô][Ô] & Sys.Empresa & [Ô][ô]) AND (S.Dta_Entrada Between [ô][Ô] & Format(DataInicio, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô] AND [ô][Ô] & Format(DataFinal, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô])) AS Estoque, [Ô] & _
[Ô] V_Acum = (SELECT SUM(V_Total) FROM CTE WHERE ID <= C.ID), [Ô] & _
[Ô] QtdeEntrada = (SELECT sum (dbo.Entrada_Itens.Qtde) AS Qtde_entrada FROM dbo.Produtos AS P INNER JOIN dbo.Entrada_Itens ON P.Cod_Empresa = dbo.Entrada_Itens.Cod_Empresa AND P.Cod_Estoque = dbo.Entrada_Itens.Cod_Estoque AND P.Cod_Produto = dbo.Entrada_Itens.Cod_Produto INNER JOIN dbo.Entrada ON dbo.Entrada_Itens.Cod_Empresa = dbo.Entrada.Cod_Empresa AND dbo.Entrada_Itens.Id_Doc = dbo.Entrada.Id_Doc WHERE (p.Cod_Empresa = [ô][Ô] & Sys.Empresa & [Ô][ô]) AND (P.Cod_Estoque = [ô][Ô] & dcEstoque.BoundText & [Ô][ô]) AND (P.Cod_Produto = [ô][Ô] & dtProdutos.BoundText & [Ô][ô]) AND (Entrada.Dta_Entrada Between [ô][Ô] & Format(DataInicio, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô] AND [ô][Ô] & Format(DataFinal, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô])), [Ô] & _
[Ô] ((SELECT sum (dbo.Entrada_Itens.Qtde) AS Qtde_entrada FROM dbo.Produtos AS P INNER JOIN dbo.Entrada_Itens ON P.Cod_Empresa = dbo.Entrada_Itens.Cod_Empresa AND P.Cod_Estoque = dbo.Entrada_Itens.Cod_Estoque AND P.Cod_Produto = dbo.Entrada_Itens.Cod_Produto INNER JOIN dbo.Entrada ON dbo.Entrada_Itens.Cod_Empresa = dbo.Entrada.Cod_Empresa AND dbo.Entrada_Itens.Id_Doc = dbo.Entrada.Id_Doc WHERE (p.Cod_Empresa = [ô][Ô] & Sys.Empresa & [Ô][ô]) AND (P.Cod_Estoque = [ô][Ô] & dcEstoque.BoundText & [Ô][ô]) AND (P.Cod_Produto = [ô][Ô] & dtProdutos.BoundText & [Ô][ô]) AND (Entrada.Dta_Entrada Between [ô][Ô] & Format(DataInicio, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô] AND [ô][Ô] & Format(DataFinal, [Ô]yyyy-mm-dd 00:00:00[Ô]) & [Ô][ô])) * (V_Unitario)) AS EntVal[Ô] & _
[Ô] FROM CTE AS C [Ô] & _
[Ô]ORDER BY NF [Ô]
PROFESSOR 15/02/2014 23:31:45
#434854
O MSFlexGrid não suporta databinding, assim eu usaria um MSHFlexgrid em seu lugar.

Mas se de fato quer usar o MSFlexgrid, deverá preencher [Ô]manualmente[Ô] suas linhas e colunas.
Ainda bem que o MSFlexgrid possui o método Clip e que o Recordset possui o método GetString.
Com ambos, você pode preencher sua grade rapidamente, mais ou menos assim:


...
Private Sub Form_Load()
On Error GoTo hell:
Dim rs As New ADODB.Recordset
With rs
.ActiveConnection = [Ô]Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\Dados\db.mdb;[Ô]
.CursorLocation = adUseClient
.CursorType = adOpenDynamic
.LockType = adLockBatchOptimistic
.Source = [Ô]SELECT TOP 100 * FROM TABELA[Ô]
.Open
.MoveFirst
End With
[ô]
[ô]Com um Hierarchical FlexGrid...
[ô]
Set Me.MSHFlexGrid1.DataSource = rs
[ô]
[ô]Com um FlexGrid comum...
[ô]
With Me.MSFlexGrid1
.Visible = False
.Rows = rs.RecordCount + 1
.Cols = rs.Fields.Count - 1
.Row = 0
.Col = 0
.RowSel = .Rows - 1
.ColSel = .Cols - 1
.Clip = rs.GetString(adClipString, -1, Chr(9), Chr(13), vbNullString)
.Row = 1
.Visible = True
End With
rs.Close
Set rs = Nothing
GoTo sai:
hell:
MsgBox Err.Description
Err.Clear
sai:
End Sub
...


Só um detalhe: O método que eu demonstrei acima depende da area livre de memória para transferir os dados para o component MSFlexgrid. E caso a quantidade de registros seja grande, há um limite para a operação. Assim, caso sua seleção retorne muitos registros, o método Clip acaba por gerar um erro.

Há, como eu disse, o modo onde você preenche manualmente linhas e colunas, por meio de um loop do recordset, do início ao fim, e que funciona com ambos, MsFlexgrid e MsHFlexgrid.

Por enquanto, mas não se pode dar certeza de até quando, ainda há algum material remanescente do VB6 no MSDN, como este aqui, mas é como eu disse em outros tópicos, usar VB6 é [Ô]conta e risco[Ô] de quem quer. Pode ser que amanhã o MSDN não apresente mais esse material, até porquê é um espaço enorme e que pode ser utilizado mais adequadamente para produtos que ainda estão sendo suportados, ao invés de VB6 ou Windows XP.

Faça seu login para responder