Nesse vídeo demonstraremos a utilização da classe MsNewGetDados, que serve para criar grids clássicas (com aHeader e aCols).
Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:
//Bibliotecas
#Include "TOTVS.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} User Function zExe363
Cria uma grid usando a classe antiga
@type Function
@author Atilio
@since 27/03/2023
@see https://tdn.totvs.com/display/public/framework/MsNewGetDados
@obs
Essa classe foi depreciada, este aqui é só um exemplo, caso precisem algum dia dar manutenção
em códigos antigos. Para novos códigos, tentem utilizar a FWBrowse.
**** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao ****
/*/
User Function zExe363()
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
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
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
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
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Uma solicitação que vários usuários já me pediram , foi colorir a cor de uma determinada coluna, porém nenhuma classe de grid foi possível. Na documentação da TOTVS sobre CSS, tem a classe Tccolum que pode utilizar o QT correspondente, porém dá erro se utilizar o método setCss para essa classe. Você que tem uma vasta experiência, já conseguiu fazer esse tipo de implementação?
Bom dia Dayvid, tudo joia?
Acha, vasta experiência é bondade sua, é que são muitos anos praticando gambiarras mesmo rsrs…
No caso de pintar a coluna, nunca me solicitaram, mas vou pesquisar para ver se encontro algo ai lhe aviso.
Agora de pintar a linha, ou congelar uma coluna isso sim já fiz com a FWBrowse.
Se você encontrar algo também, nos avise.
Um grande abraço.
Bom dia Dayvid, tudo joia?
Encontrei uma forma usando a FWBrowse com a herança da TGrid. Logo após o Activate da FWBrowse, você consegue usar o método SetColumnColor, conforme exemplo abaixo:
—
[…]
oFWBrowse:SetOwner(oPanGrid)
oFWBrowse:Activate()
//Define as cores de uma coluna (herança com a TGrid – https://tdn.totvs.com/display/tec/TGrid)
oFWBrowse:oBrowse:SetColumnColor(;
1,; //Número da Coluna
RGB(0, 255, 0),; //Cor de Fundo
RGB(100, 100, 100); //Cor do Texto
)
[…]
—
Um grande abraço.