MsNewGetDados

Cria uma grid em uma dialog

Exemplo da Rotina:

oMsGetSBM := MsNewGetDados():New(	;
	029,;                //nTop      - Linha Inicial
	003,;                //nLeft     - Coluna Inicial
	(nJanAltu/2)-3,;     //nBottom   - Linha Final
	(nJanLarg/2)-3,;     //nRight    - Coluna Final
	,;                   //nStyle    - Estilos para edição da Grid (GD_INSERT = Inclusão de Linha; GD_UPDATE = Alteração de Linhas; GD_DELETE = Exclusão de Linhas)
	"AllwaysTrue()",;    //cLinhaOk  - Validação da linha
	,;                   //cTudoOk   - Validação de todas as linhas
	"",;                 //cIniCpos  - Função para inicialização de campos
	{},;                 //aAlter    - Colunas que podem ser alteradas
	,;                   //nFreeze   - Número da coluna que será congelada
	9999,;               //nMax      - Máximo de Linhas
	,;                   //cFieldOK  - Validação da coluna
	,;                   //cSuperDel - Validação ao apertar '+'
	,;                   //cDelOk    - Validação na exclusão da linha
	oDlgPvt,;            //oWnd      - Janela que é a dona da grid
	aHeadSBM,;           //aHeader   - Cabeçalho da Grid
	aColsSBM)            //aCols     - Dados da Grid

Exemplo de grid

Exemplo 1- Grid apenas com listagem das informações:

//Bibliotecas
#Include "Protheus.ch"
#Include "TopConn.ch"

/*/{Protheus.doc} zMsNew
Função para ver os grupos de produto
@author Atilio
@since 07/04/2019
@version 1.0
@type function
/*/

User Function zMsNew()
	Local aArea := GetArea()
	//Objetos da Janela
	Private oDlgPvt
	Private oMsGetSBM
	Private aHeadSBM := {}
	Private aColsSBM := {}
	Private oBtnFech
	//Tamanho da Janela
	Private	nJanLarg	:= 700
	Private	nJanAltu	:= 500
	//Fontes
	Private	cFontUti   := "Tahoma"
	Private	oFontAno   := TFont():New(cFontUti,,-38)
	Private	oFontSub   := TFont():New(cFontUti,,-20)
	Private	oFontSubN  := TFont():New(cFontUti,,-20,,.T.)
	Private	oFontBtn   := TFont():New(cFontUti,,-14)
	
	//Criando o cabeçalho da Grid
	//              Título               Campo        Máscara                        Tamanho                   Decimal                   Valid               Usado  Tipo F3     Combo
	aAdd(aHeadSBM, {"Código",            "BM_GRUPO",  "",                            TamSX3("BM_GRUPO")[01],   0,                        ".T.",              ".T.", "C", "",    ""} )
	aAdd(aHeadSBM, {"Descrição",         "BM_DESC",   "",                            TamSX3("BM_DESC")[01],    0,                        "NaoVazio()",       ".T.", "C", "",    ""} )
	aAdd(aHeadSBM, {"Status Grupo",      "BM_STATUS", "",                            TamSX3("BM_STATUS")[01],  0,                        "PERTENCE('1234')", ".T.", "C", "",    "1=Novo;2=Remanufaturado;3=Reciclado;4=Usado"} )
	aAdd(aHeadSBM, {"Procedencia",       "BM_PROORI", "",                            TamSX3("BM_PROORI")[01],  0,                        "Pertence('01')",   ".T.", "C", "",    "1=Original;0=Nao Original"} )
	aAdd(aHeadSBM, {"Total de Produtos", "XX_TOTAL",  "@E 999,999,999,999,999,999",  018,                      0,                        ".T.",              ".T.", "N", "",    ""} )
	aAdd(aHeadSBM, {"SBM Recno",         "XX_RECNO",  "@E 999,999,999,999,999,999",  018,                      0,                        ".T.",              ".T.", "N", "",    ""} )

	Processa({|| fCarAcols()}, "Processando")

	//Criação da tela com os dados que serão informados
	DEFINE MSDIALOG oDlgPvt TITLE "Grupos de Produto" FROM 000, 000  TO nJanAltu, nJanLarg COLORS 0, 16777215 PIXEL
		//Labels gerais
		@ 004, 003 SAY "TST"                SIZE 200, 030 FONT oFontAno  OF oDlgPvt COLORS RGB(149,179,215) PIXEL
		@ 004, 050 SAY "Listagem de"        SIZE 200, 030 FONT oFontSub  OF oDlgPvt COLORS RGB(031,073,125) PIXEL
		@ 014, 050 SAY "Grupos de Produtos" SIZE 200, 030 FONT oFontSubN OF oDlgPvt COLORS RGB(031,073,125) PIXEL
		
		//Botões
		@ 006, (nJanLarg/2-001)-(0067*01) BUTTON oBtnFech  PROMPT "Fechar"        SIZE 065, 018 OF oDlgPvt ACTION (oDlgPvt:End())                               FONT oFontBtn PIXEL
		
		//Grid dos grupos
		oMsGetSBM := MsNewGetDados():New(	029,;                //nTop      - Linha Inicial
    										003,;                //nLeft     - Coluna Inicial
    										(nJanAltu/2)-3,;     //nBottom   - Linha Final
    										(nJanLarg/2)-3,;     //nRight    - Coluna Final
    										,;                   //nStyle    - Estilos para edição da Grid (GD_INSERT = Inclusão de Linha; GD_UPDATE = Alteração de Linhas; GD_DELETE = Exclusão de Linhas)
    										"AllwaysTrue()",;    //cLinhaOk  - Validação da linha
    										,;                   //cTudoOk   - Validação de todas as linhas
    										"",;                 //cIniCpos  - Função para inicialização de campos
    										{},;                 //aAlter    - Colunas que podem ser alteradas
    										,;                   //nFreeze   - Número da coluna que será congelada
    										9999,;               //nMax      - Máximo de Linhas
    										,;                   //cFieldOK  - Validação da coluna
    										,;                   //cSuperDel - Validação ao apertar '+'
    										,;                   //cDelOk    - Validação na exclusão da linha
    										oDlgPvt,;            //oWnd      - Janela que é a dona da grid
    										aHeadSBM,;           //aHeader   - Cabeçalho da Grid
    										aColsSBM)            //aCols     - Dados da Grid
											
		//Desativa as manipulações
    	oMsGetSBM:lActive := .F.
    	
	ACTIVATE MSDIALOG oDlgPvt CENTERED
	
	RestArea(aArea)
Return

/*------------------------------------------------*
 | Func.: fCarAcols                               |
 | Desc.: Função que carrega o aCols              |
 *------------------------------------------------*/

Static Function fCarAcols()
	Local aArea  := GetArea()
	Local cQry   := ""
	Local nAtual := 0
	Local nTotal := 0
	
	//Seleciona dados do documento de entrada
	cQry := " SELECT "                                                  + CRLF
	cQry += "     BM_GRUPO, "                                           + CRLF
	cQry += "     BM_DESC, "                                            + CRLF
	cQry += "     BM_STATUS, "                                          + CRLF
	cQry += "     BM_PROORI, "                                          + CRLF
	cQry += "     ( "                                                   + CRLF
	cQry += "         SELECT "                                          + CRLF
	cQry += "             COUNT(*) "                                    + CRLF
	cQry += "         FROM "                                            + CRLF
	cQry += "             " + RetSQLName('SB1') + " SB1 "               + CRLF
	cQry += "         WHERE "                                           + CRLF
	cQry += "             B1_FILIAL = '" + FWxFilial('SB1') + "' "      + CRLF
	cQry += "             AND B1_GRUPO = BM_GRUPO "                     + CRLF
	cQry += "             AND B1_MSBLQL != '1' "                        + CRLF
	cQry += "             AND SB1.D_E_L_E_T_ = ' ' "                    + CRLF
	cQry += "     ) AS TOT_PROD, "                                      + CRLF
	cQry += "     SBM.R_E_C_N_O_ AS SBMREC "                            + CRLF
	cQry += " FROM "                                                    + CRLF
	cQry += "     " + RetSQLName('SBM') + " SBM "                       + CRLF
	cQry += " WHERE "                                                   + CRLF
	cQry += "     BM_FILIAL = '" + FWxFilial('SBM') + "' "              + CRLF
	cQry += "     AND SBM.D_E_L_E_T_ = ' ' "                            + CRLF
	cQry += " ORDER BY "                                                + CRLF
	cQry += "     BM_GRUPO "                                            + CRLF
	TCQuery cQry New Alias "QRY_SBM"
	
	//Setando o tamanho da régua
	Count To nTotal
	ProcRegua(nTotal)
	
	//Enquanto houver dados
	QRY_SBM->(DbGoTop())
	While ! QRY_SBM->(EoF())
	
		//Atualizar régua de processamento
		nAtual++
		IncProc("Adicionando " + Alltrim(QRY_SBM->BM_GRUPO) + " (" + cValToChar(nAtual) + " de " + cValToChar(nTotal) + ")...")
		
		//Adiciona o item no aCols
		aAdd(aColsSBM, { ;
			QRY_SBM->BM_GRUPO,;
			QRY_SBM->BM_DESC,;
			QRY_SBM->BM_STATUS,;
			QRY_SBM->BM_PROORI,;
			QRY_SBM->TOT_PROD,;
			QRY_SBM->SBMREC,;
			.F.;
		})
		
		QRY_SBM->(DbSkip())
	EndDo
	QRY_SBM->(DbCloseArea())
	
	RestArea(aArea)
Return

Exemplo de grid com legenda

Exemplo 2- Grid apenas com listagem das informações e com legenda:

//Bibliotecas
#Include "Protheus.ch"
#Include "TopConn.ch"

//Legendas
Static oBmpVerde    := LoadBitmap( GetResources(), "BR_VERDE")
Static oBmpVermelho := LoadBitmap( GetResources(), "BR_VERMELHO")
Static oBmpPreto    := LoadBitmap( GetResources(), "BR_PRETO")

/*/{Protheus.doc} zMsNew
Função para ver os grupos de produto
@author Atilio
@since 07/04/2019
@version 1.0
@type function
/*/

User Function zMsNew()
	Local aArea := GetArea()
	//Objetos da Janela
	Private oDlgPvt
	Private oMsGetSBM
	Private aHeadSBM := {}
	Private aColsSBM := {}
	Private oBtnFech
	Private oBtnLege
	//Tamanho da Janela
	Private	nJanLarg	:= 700
	Private	nJanAltu	:= 500
	//Fontes
	Private	cFontUti   := "Tahoma"
	Private	oFontAno   := TFont():New(cFontUti,,-38)
	Private	oFontSub   := TFont():New(cFontUti,,-20)
	Private	oFontSubN  := TFont():New(cFontUti,,-20,,.T.)
	Private	oFontBtn   := TFont():New(cFontUti,,-14)
	
	//Criando o cabeçalho da Grid
	//              Título               Campo        Máscara                        Tamanho                   Decimal                   Valid               Usado  Tipo F3     Combo
	aAdd(aHeadSBM, {"",                  "XX_COR",    "@BMP",                        002,                      0,                        ".F.",              "   ", "C", "",    "V",     "",      "",        "", "V"})
	aAdd(aHeadSBM, {"Código",            "BM_GRUPO",  "",                            TamSX3("BM_GRUPO")[01],   0,                        ".T.",              ".T.", "C", "",    ""} )
	aAdd(aHeadSBM, {"Descrição",         "BM_DESC",   "",                            TamSX3("BM_DESC")[01],    0,                        "NaoVazio()",       ".T.", "C", "",    ""} )
	aAdd(aHeadSBM, {"Status Grupo",      "BM_STATUS", "",                            TamSX3("BM_STATUS")[01],  0,                        "PERTENCE('1234')", ".T.", "C", "",    "1=Novo;2=Remanufaturado;3=Reciclado;4=Usado"} )
	aAdd(aHeadSBM, {"Procedencia",       "BM_PROORI", "",                            TamSX3("BM_PROORI")[01],  0,                        "Pertence('01')",   ".T.", "C", "",    "1=Original;0=Nao Original"} )
	aAdd(aHeadSBM, {"Total de Produtos", "XX_TOTAL",  "@E 999,999,999,999,999,999",  018,                      0,                        ".T.",              ".T.", "N", "",    ""} )
	aAdd(aHeadSBM, {"SBM Recno",         "XX_RECNO",  "@E 999,999,999,999,999,999",  018,                      0,                        ".T.",              ".T.", "N", "",    ""} )

	Processa({|| fCarAcols()}, "Processando")

	//Criação da tela com os dados que serão informados
	DEFINE MSDIALOG oDlgPvt TITLE "Grupos de Produto" FROM 000, 000  TO nJanAltu, nJanLarg COLORS 0, 16777215 PIXEL
		//Labels gerais
		@ 004, 003 SAY "TST"                SIZE 200, 030 FONT oFontAno  OF oDlgPvt COLORS RGB(149,179,215) PIXEL
		@ 004, 050 SAY "Listagem de"        SIZE 200, 030 FONT oFontSub  OF oDlgPvt COLORS RGB(031,073,125) PIXEL
		@ 014, 050 SAY "Grupos de Produtos" SIZE 200, 030 FONT oFontSubN OF oDlgPvt COLORS RGB(031,073,125) PIXEL
		
		//Botões
		@ 006, (nJanLarg/2-001)-(0067*01) BUTTON oBtnFech  PROMPT "Fechar"        SIZE 065, 018 OF oDlgPvt ACTION (oDlgPvt:End())                               FONT oFontBtn PIXEL
		@ 006, (nJanLarg/2-001)-(0067*02) BUTTON oBtnLege  PROMPT "Legenda"       SIZE 065, 018 OF oDlgPvt ACTION (fLegenda())                                  FONT oFontBtn PIXEL
		
		//Grid dos grupos
		oMsGetSBM := MsNewGetDados():New(	029,;                //nTop      - Linha Inicial
    										003,;                //nLeft     - Coluna Inicial
    										(nJanAltu/2)-3,;     //nBottom   - Linha Final
    										(nJanLarg/2)-3,;     //nRight    - Coluna Final
    										,;                   //nStyle    - Estilos para edição da Grid (GD_INSERT = Inclusão de Linha; GD_UPDATE = Alteração de Linhas; GD_DELETE = Exclusão de Linhas)
    										"AllwaysTrue()",;    //cLinhaOk  - Validação da linha
    										,;                   //cTudoOk   - Validação de todas as linhas
    										"",;                 //cIniCpos  - Função para inicialização de campos
    										{},;                 //aAlter    - Colunas que podem ser alteradas
    										,;                   //nFreeze   - Número da coluna que será congelada
    										9999,;               //nMax      - Máximo de Linhas
    										,;                   //cFieldOK  - Validação da coluna
    										,;                   //cSuperDel - Validação ao apertar '+'
    										,;                   //cDelOk    - Validação na exclusão da linha
    										oDlgPvt,;            //oWnd      - Janela que é a dona da grid
    										aHeadSBM,;           //aHeader   - Cabeçalho da Grid
    										aColsSBM)            //aCols     - Dados da Grid
    	oMsGetSBM:lActive := .F.
    	
	ACTIVATE MSDIALOG oDlgPvt CENTERED
	
	RestArea(aArea)
Return

/*------------------------------------------------*
 | Func.: fCarAcols                               |
 | Desc.: Função que carrega o aCols              |
 *------------------------------------------------*/

Static Function fCarAcols()
	Local aArea  := GetArea()
	Local cQry   := ""
	Local nAtual := 0
	Local nTotal := 0
	Local oBmpAux
	
	//Seleciona dados do documento de entrada
	cQry := " SELECT "                                                  + CRLF
	cQry += "     BM_GRUPO, "                                           + CRLF
	cQry += "     BM_DESC, "                                            + CRLF
	cQry += "     BM_STATUS, "                                          + CRLF
	cQry += "     BM_PROORI, "                                          + CRLF
	cQry += "     ( "                                                   + CRLF
	cQry += "         SELECT "                                          + CRLF
	cQry += "             COUNT(*) "                                    + CRLF
	cQry += "         FROM "                                            + CRLF
	cQry += "             " + RetSQLName('SB1') + " SB1 "               + CRLF
	cQry += "         WHERE "                                           + CRLF
	cQry += "             B1_FILIAL = '" + FWxFilial('SB1') + "' "      + CRLF
	cQry += "             AND B1_GRUPO = BM_GRUPO "                     + CRLF
	cQry += "             AND B1_MSBLQL != '1' "                        + CRLF
	cQry += "             AND SB1.D_E_L_E_T_ = ' ' "                    + CRLF
	cQry += "     ) AS TOT_PROD, "                                      + CRLF
	cQry += "     SBM.R_E_C_N_O_ AS SBMREC "                            + CRLF
	cQry += " FROM "                                                    + CRLF
	cQry += "     " + RetSQLName('SBM') + " SBM "                       + CRLF
	cQry += " WHERE "                                                   + CRLF
	cQry += "     BM_FILIAL = '" + FWxFilial('SBM') + "' "              + CRLF
	cQry += "     AND SBM.D_E_L_E_T_ = ' ' "                            + CRLF
	cQry += " ORDER BY "                                                + CRLF
	cQry += "     BM_GRUPO "                                            + CRLF
	TCQuery cQry New Alias "QRY_SBM"
	
	//Setando o tamanho da régua
	Count To nTotal
	ProcRegua(nTotal)
	
	//Enquanto houver dados
	QRY_SBM->(DbGoTop())
	While ! QRY_SBM->(EoF())
	
		//Atualizar régua de processamento
		nAtual++
		IncProc("Adicionando " + Alltrim(QRY_SBM->BM_GRUPO) + " (" + cValToChar(nAtual) + " de " + cValToChar(nTotal) + ")...")
		
		//Definindo a legenda padrão como preto
		oBmpAux := oBmpPreto
		
		//Se for Original será verde
		If QRY_SBM->BM_PROORI == '1'
			oBmpAux := oBmpVerde
		
		//Senão, se for Não Original, será vermelho
		ElseIf QRY_SBM->BM_PROORI == '0'
			oBmpAux := oBmpVermelho
		EndIf
		
		//Adiciona o item no aCols
		aAdd(aColsSBM, { ;
			oBmpAux,;
			QRY_SBM->BM_GRUPO,;
			QRY_SBM->BM_DESC,;
			QRY_SBM->BM_STATUS,;
			QRY_SBM->BM_PROORI,;
			QRY_SBM->TOT_PROD,;
			QRY_SBM->SBMREC,;
			.F.;
		})
		
		QRY_SBM->(DbSkip())
	EndDo
	QRY_SBM->(DbCloseArea())
	
	RestArea(aArea)
Return

/*--------------------------------------------------------*
 | Func.: fLegenda                                        |
 | Desc.: Função que mostra uma descrição das legendas    |
 *--------------------------------------------------------*/

Static Function fLegenda()
	Local aLegenda := {}
	
	aAdd(aLegenda, {"BR_PRETO",    "Sem Classificação"})	
	aAdd(aLegenda, {"BR_VERDE",    "Original"})
	aAdd(aLegenda, {"BR_VERMELHO", "Não Original"})
	
	BrwLegenda("Grupo de Produtos", "Legenda", aLegenda)
Return

Exemplo de grid com manipulação de dados

Exemplo 3- Grid com alteração dos dados:

//Bibliotecas
#Include "Protheus.ch"
#Include "TopConn.ch"

//Legendas
Static oBmpVerde    := LoadBitmap( GetResources(), "BR_VERDE")
Static oBmpVermelho := LoadBitmap( GetResources(), "BR_VERMELHO")
Static oBmpPreto    := LoadBitmap( GetResources(), "BR_PRETO")

/*/{Protheus.doc} zMsNew
Função para ver os grupos de produto
@author Atilio
@since 07/04/2019
@version 1.0
@type function
/*/

User Function zMsNew()
	Local aArea := GetArea()
	//Objetos da Janela
	Private oDlgPvt
	Private oMsGetSBM
	Private aHeadSBM := {}
	Private aColsSBM := {}
	Private oBtnSalv
	Private oBtnFech
	Private oBtnLege
	//Tamanho da Janela
	Private	nJanLarg	:= 700
	Private	nJanAltu	:= 500
	//Fontes
	Private	cFontUti   := "Tahoma"
	Private	oFontAno   := TFont():New(cFontUti,,-38)
	Private	oFontSub   := TFont():New(cFontUti,,-20)
	Private	oFontSubN  := TFont():New(cFontUti,,-20,,.T.)
	Private	oFontBtn   := TFont():New(cFontUti,,-14)
	
	//Criando o cabeçalho da Grid
	//              Título               Campo        Máscara                        Tamanho                   Decimal                   Valid               Usado  Tipo F3     Combo
	aAdd(aHeadSBM, {"",                  "XX_COR",    "@BMP",                        002,                      0,                        ".F.",              "   ", "C", "",    "V",     "",      "",        "", "V"})
	aAdd(aHeadSBM, {"Código",            "BM_GRUPO",  "",                            TamSX3("BM_GRUPO")[01],   0,                        ".T.",              ".T.", "C", "",    ""} )
	aAdd(aHeadSBM, {"Descrição",         "BM_DESC",   "",                            TamSX3("BM_DESC")[01],    0,                        "NaoVazio()",       ".T.", "C", "",    ""} )
	aAdd(aHeadSBM, {"Status Grupo",      "BM_STATUS", "",                            TamSX3("BM_STATUS")[01],  0,                        "PERTENCE('1234')", ".T.", "C", "",    "1=Novo;2=Remanufaturado;3=Reciclado;4=Usado"} )
	aAdd(aHeadSBM, {"Procedencia",       "BM_PROORI", "",                            TamSX3("BM_PROORI")[01],  0,                        "Pertence('01')",   ".T.", "C", "",    "1=Original;0=Nao Original"} )
	aAdd(aHeadSBM, {"Total de Produtos", "XX_TOTAL",  "@E 999,999,999,999,999,999",  018,                      0,                        ".T.",              ".T.", "N", "",    ""} )
	aAdd(aHeadSBM, {"SBM Recno",         "XX_RECNO",  "@E 999,999,999,999,999,999",  018,                      0,                        ".T.",              ".T.", "N", "",    ""} )

	Processa({|| fCarAcols()}, "Processando")

	//Criação da tela com os dados que serão informados
	DEFINE MSDIALOG oDlgPvt TITLE "Grupos de Produto" FROM 000, 000  TO nJanAltu, nJanLarg COLORS 0, 16777215 PIXEL
		//Labels gerais
		@ 004, 003 SAY "TST"                SIZE 200, 030 FONT oFontAno  OF oDlgPvt COLORS RGB(149,179,215) PIXEL
		@ 004, 050 SAY "Listagem de"        SIZE 200, 030 FONT oFontSub  OF oDlgPvt COLORS RGB(031,073,125) PIXEL
		@ 014, 050 SAY "Grupos de Produtos" SIZE 200, 030 FONT oFontSubN OF oDlgPvt COLORS RGB(031,073,125) PIXEL
		
		//Botões
		@ 006, (nJanLarg/2-001)-(0052*01) BUTTON oBtnFech  PROMPT "Fechar"        SIZE 050, 018 OF oDlgPvt ACTION (oDlgPvt:End())                               FONT oFontBtn PIXEL
		@ 006, (nJanLarg/2-001)-(0052*02) BUTTON oBtnLege  PROMPT "Legenda"       SIZE 050, 018 OF oDlgPvt ACTION (fLegenda())                                  FONT oFontBtn PIXEL
		@ 006, (nJanLarg/2-001)-(0052*03) BUTTON oBtnSalv  PROMPT "Salvar"        SIZE 050, 018 OF oDlgPvt ACTION (fSalvar())                                   FONT oFontBtn PIXEL
		
		//Grid dos grupos
		oMsGetSBM := MsNewGetDados():New(	029,;                //nTop      - Linha Inicial
    										003,;                //nLeft     - Coluna Inicial
    										(nJanAltu/2)-3,;     //nBottom   - Linha Final
    										(nJanLarg/2)-3,;     //nRight    - Coluna Final
    										GD_INSERT + GD_UPDATE + GD_DELETE,;                   //nStyle    - Estilos para edição da Grid (GD_INSERT = Inclusão de Linha; GD_UPDATE = Alteração de Linhas; GD_DELETE = Exclusão de Linhas)
    										"AllwaysTrue()",;    //cLinhaOk  - Validação da linha
    										,;                   //cTudoOk   - Validação de todas as linhas
    										"",;                 //cIniCpos  - Função para inicialização de campos
    										,;                   //aAlter    - Colunas que podem ser alteradas
    										,;                   //nFreeze   - Número da coluna que será congelada
    										9999,;               //nMax      - Máximo de Linhas
    										,;                   //cFieldOK  - Validação da coluna
    										,;                   //cSuperDel - Validação ao apertar '+'
    										,;                   //cDelOk    - Validação na exclusão da linha
    										oDlgPvt,;            //oWnd      - Janela que é a dona da grid
    										aHeadSBM,;           //aHeader   - Cabeçalho da Grid
    										aColsSBM)            //aCols     - Dados da Grid
    	
	ACTIVATE MSDIALOG oDlgPvt CENTERED
	
	RestArea(aArea)
Return

/*------------------------------------------------*
 | Func.: fCarAcols                               |
 | Desc.: Função que carrega o aCols              |
 *------------------------------------------------*/

Static Function fCarAcols()
	Local aArea  := GetArea()
	Local cQry   := ""
	Local nAtual := 0
	Local nTotal := 0
	Local oBmpAux
	
	//Seleciona dados do documento de entrada
	cQry := " SELECT "                                                  + CRLF
	cQry += "     BM_GRUPO, "                                           + CRLF
	cQry += "     BM_DESC, "                                            + CRLF
	cQry += "     BM_STATUS, "                                          + CRLF
	cQry += "     BM_PROORI, "                                          + CRLF
	cQry += "     ( "                                                   + CRLF
	cQry += "         SELECT "                                          + CRLF
	cQry += "             COUNT(*) "                                    + CRLF
	cQry += "         FROM "                                            + CRLF
	cQry += "             " + RetSQLName('SB1') + " SB1 "               + CRLF
	cQry += "         WHERE "                                           + CRLF
	cQry += "             B1_FILIAL = '" + FWxFilial('SB1') + "' "      + CRLF
	cQry += "             AND B1_GRUPO = BM_GRUPO "                     + CRLF
	cQry += "             AND B1_MSBLQL != '1' "                        + CRLF
	cQry += "             AND SB1.D_E_L_E_T_ = ' ' "                    + CRLF
	cQry += "     ) AS TOT_PROD, "                                      + CRLF
	cQry += "     SBM.R_E_C_N_O_ AS SBMREC "                            + CRLF
	cQry += " FROM "                                                    + CRLF
	cQry += "     " + RetSQLName('SBM') + " SBM "                       + CRLF
	cQry += " WHERE "                                                   + CRLF
	cQry += "     BM_FILIAL = '" + FWxFilial('SBM') + "' "              + CRLF
	cQry += "     AND SBM.D_E_L_E_T_ = ' ' "                            + CRLF
	cQry += " ORDER BY "                                                + CRLF
	cQry += "     BM_GRUPO "                                            + CRLF
	TCQuery cQry New Alias "QRY_SBM"
	
	//Setando o tamanho da régua
	Count To nTotal
	ProcRegua(nTotal)
	
	//Enquanto houver dados
	QRY_SBM->(DbGoTop())
	While ! QRY_SBM->(EoF())
	
		//Atualizar régua de processamento
		nAtual++
		IncProc("Adicionando " + Alltrim(QRY_SBM->BM_GRUPO) + " (" + cValToChar(nAtual) + " de " + cValToChar(nTotal) + ")...")
		
		//Definindo a legenda padrão como preto
		oBmpAux := oBmpPreto
		
		//Se for Original será verde
		If QRY_SBM->BM_PROORI == '1'
			oBmpAux := oBmpVerde
		
		//Senão, se for Não Original, será vermelho
		ElseIf QRY_SBM->BM_PROORI == '0'
			oBmpAux := oBmpVermelho
		EndIf
		
		//Adiciona o item no aCols
		aAdd(aColsSBM, { ;
			oBmpAux,;
			QRY_SBM->BM_GRUPO,;
			QRY_SBM->BM_DESC,;
			QRY_SBM->BM_STATUS,;
			QRY_SBM->BM_PROORI,;
			QRY_SBM->TOT_PROD,;
			QRY_SBM->SBMREC,;
			.F.;
		})
		
		QRY_SBM->(DbSkip())
	EndDo
	QRY_SBM->(DbCloseArea())
	
	RestArea(aArea)
Return

/*--------------------------------------------------------*
 | Func.: fLegenda                                        |
 | Desc.: Função que mostra uma descrição das legendas    |
 *--------------------------------------------------------*/

Static Function fLegenda()
	Local aLegenda := {}
	
	aAdd(aLegenda, {"BR_PRETO",    "Sem Classificação"})	
	aAdd(aLegenda, {"BR_VERDE",    "Original"})
	aAdd(aLegenda, {"BR_VERMELHO", "Não Original"})
	
	BrwLegenda("Grupo de Produtos", "Legenda", aLegenda)
Return

/*--------------------------------------------------------*
 | Func.: fSalvar                                         |
 | Desc.: Função que percorre as linhas e faz a gravação  |
 *--------------------------------------------------------*/

Static Function fSalvar()
	Local aColsAux := oMsGetSBM:aCols
	Local nPosCod  := aScan(aHeadSBM, {|x| Alltrim(x[2]) == "BM_GRUPO"})
	Local nPosDes  := aScan(aHeadSBM, {|x| Alltrim(x[2]) == "BM_DESC"})
	Local nPosSta  := aScan(aHeadSBM, {|x| Alltrim(x[2]) == "BM_STATUS"})
	Local nPosPro  := aScan(aHeadSBM, {|x| Alltrim(x[2]) == "BM_PROORI"})
	Local nPosTot  := aScan(aHeadSBM, {|x| Alltrim(x[2]) == "XX_TOTAL"})
	Local nPosRec  := aScan(aHeadSBM, {|x| Alltrim(x[2]) == "XX_RECNO"})
	Local nPosDel  := Len(aHeadSBM) + 1
	Local nLinha   := 0
	
	DbSelectArea('SBM')
	
	//Percorrendo todas as linhas
	For nLinha := 1 To Len(aColsAux)
	
		//Posiciona no registro
		If aColsAux[nLinha][nPosRec] != 0
			SBM->(DbGoTo(aColsAux[nLinha][nPosRec]))
		EndIf
		
		//Se a linha estiver excluída
		If aColsAux[nLinha][nPosDel]
			
			//Se não for uma linha nova
			If aColsAux[nLinha][nPosRec] != 0
			
				//Se não tiver produtos, ai prossegue com exclusão
				If aColsAux[nLinha][nPosTot] == 0
					RecLock("SBM", .F.)
						DbDelete()
					SBM->(MsUnlock())
				EndIf
				
			EndIf
			
		//Se a linha for incluída
		ElseIf aColsAux[nLinha][nPosRec] == 0
			RecLock('SBM', .T.)
				SBM->BM_GRUPO  := aColsAux[nLinha][nPosCod]
				SBM->BM_DESC   := aColsAux[nLinha][nPosDes]
				SBM->BM_STATUS := aColsAux[nLinha][nPosSta]
				SBM->BM_PROORI := aColsAux[nLinha][nPosPro]
			SBM->(MsUnlock())
			
		//Senão, será alteração
		Else
			RecLock('SBM', .F.)
				SBM->BM_DESC   := aColsAux[nLinha][nPosDes]
				SBM->BM_STATUS := aColsAux[nLinha][nPosSta]
				SBM->BM_PROORI := aColsAux[nLinha][nPosPro]
			SBM->(MsUnlock())
		EndIf
		
	Next
	
	MsgInfo("Manipulações finalizadas!", "Atenção")
	oDlgPvt:End()
Return

Observações:

– Caso tenha dúvidas ou problemas com os exemplos, entre em contato;

– Se tiver sugestões de rotinas, pode entrar em contato;

Referências:

TDN