Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

NomeTipoDescrição
oFiltrosObjeto JsonObjeto json com os filtros e seus valores informados.
cTipoCaracterTipo do monitor. Os valores podem ser "info" (monitor tipo texto) e "chart" (monitor tipo gráfico).
cSubTipoCaracter

Tipo do gráfico. É informado quando o parâmetro cTipo é igual a "chart".

Os valores possíveis são: "pie", "donut", "column", "bar", "line", "gauge"


Retorno

TipoDescrição
CaracterString no formato json com conteúdo conforme o tipo do monitor e tipo do gráfico.

...

Bloco de código
languagecpp
firstline1
titleExemplo Tipo Gráfico Simples
linenumberstrue
collapsetrue
Method BuscaDados(oFiltros, cTipo, cSubTipo) Class PrevisaoEntregaOP
    Local aSaldos    := {}
    Local aPeriodos  := PCPMonitorUtils():RetornaListaPeriodosFuturo(oFiltros["04_TIPOPERIODO"],cValToChar(oFiltros["05_PERIODO"]))
    Local aChaves    := {}
    Local cAliasQry  := GetNextAlias()
    Local cJsonDados := ""
    Local cUnMed     := ""
    Local cQuery     := ""
    Local dDataAjust := Nil
    Local dDataIni   := dDatabase
    Local dDataFin   := dDatabase
    Local lPerdInf   := SuperGetMV("MV_PERDINF",.F.,.F.)
    Local nIndSerie  := 0
    Local nPosTag    := 0
    Local nOPsTotal  := 0
    Local nQtPTotal  := 0
    Local nX         := 0
    Local oJsonRet   := JsonObject():New()
    Local oPeriodos  := JsonObject():New()
    
    //Propriedades que devem ser retornadas para monitores do tipo gráfico 
	oJsonRet["corTitulo"]          := "black" //Cor do título do monitor. Se não for informada, assumirá o valor #2590aa
    oJsonRet["alturaMinimaWidget"] := "350px" //Altura mínima do monitor. Se não for informada, assumirá o valor 350px
    oJsonRet["alturaMaximaWidget"] := "500px" //Altura máxima do monitor. Se não for informada, assumirá o valor 350px
    oJsonRet["tags"]               := {}      //Array de objetos json com as tags que serão visualizadas no monitor
    oJsonRet["series"]             := {}      //Array de objetos json com as séries do gráfico
	oJsonRet["categorias"]         := {}      //Array de strings com as categorias do gráfico

    oFiltros["01_C2_FILIAL"] := PadR(oFiltros["01_C2_FILIAL"], FWSizeFilial())
    cUnMed := Posicione("SB1",1,xFilial("SB1",oFiltros["01_C2_FILIAL"])+oFiltros["02_C2_PRODUTO"],"B1_UM")
    dDataIni := aPeriodos[1][1]
    dDataFin := aPeriodos[Len(aPeriodos)][2]

    //Query com os filtros para buscar os valores das séries para as  categorias
	cQuery := " SELECT "
    cQuery +=        " SC2.C2_FILIAL, "
    cQuery +=        " SC2.C2_PRODUTO, "
    cQuery +=        " SC2.C2_DATPRF, "
    If oFiltros["03_TIPOQUANT"] == 'O'
        cQuery +=    " SUM(SC2.C2_QUANT)"
    Else
        cQuery +=    " SUM(SC2.C2_QUANT - SC2.C2_QUJE" 
        If !lPerdInf
            cQuery +=    " - SC2.C2_PERDA"
        EndIf
        cQuery +=    ")"
    EndIf
    cQuery +=        " AS QUANTIDADE_PRODUTO, "
    cQuery +=        " COUNT(*) AS NUMERO_OPS "
    cQuery +=   " FROM "+RetSqlName("SC2")+" SC2 "
    cQuery +=  " WHERE SC2.C2_FILIAL = '"+xFilial("SC2",oFiltros["01_C2_FILIAL"])+"' "
    cQuery +=    " AND SC2.C2_PRODUTO = '"+oFiltros["02_C2_PRODUTO"]+"' "
    cQuery +=    " AND SC2.C2_DATPRF BETWEEN '"+dToS(dDataIni)+"' AND '"+dToS(dDataFin)+"' "
    cQuery +=    " AND SC2.C2_DATRF = ' '"
    cQuery +=    " AND SC2.D_E_L_E_T_ = ' ' "
    cQuery +=  " GROUP BY SC2.C2_FILIAL, SC2.C2_PRODUTO, SC2.C2_DATPRF "
    cQuery +=  " ORDER BY SC2.C2_FILIAL, SC2.C2_PRODUTO, SC2.C2_DATPRF "
    dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),cAliasQry,.F.,.F.)
 
    While (cAliasQry)->(!Eof())
        dDataAjust := dToC(PCPMonitorUtils():RetornaPeriodoInicial(oFiltros["04_TIPOPERIODO"],sToD((cAliasQry)->C2_DATPRF)))
        nOPsTotal   += (cAliasQry)->NUMERO_OPS
        nQtPTotal   += (cAliasQry)->QUANTIDADE_PRODUTO
        If oPeriodos:HasProperty(dDataAjust) 
            oPeriodos[dDataAjust] += (cAliasQry)->QUANTIDADE_PRODUTO
        Else
            oPeriodos[dDataAjust] := (cAliasQry)->QUANTIDADE_PRODUTO
        EndIf
        (cAliasQry)->(DBSKIP())
    End
    (cAliasQry)->(dbCloseArea())

    aChaves := oPeriodos:GetNames()
    oJsonRet["categorias"] := aChaves
    For nX := 1 To Len(aChaves)
        aAdd(aSaldos, oPeriodos[aChaves[nX]])
    Next nX

    //Adiciona série no gráfico
	PCPMonitorUtils():AdicionaSerieGraficoMonitor(oJsonoJsonRet["series"],@nIndSerie,"rgb(0,0,165)",aSaldos,cUnMed)
    //Adiciona tags ao monitor
    PCPMonitorUtils():AdicionaTagMonitor(oJsonRet["tags"],@nPosTag,"po-icon-calendar",dToC(dDataIni) + " - " + dToC(dDataFin))
    PCPMonitorUtils():AdicionaTagMonitor(oJsonRet["tags"],@nPosTag,"po-icon-calculator",PCPMonitorUtils():RetornaDescricaoTipoPeriodo(oFiltros["04_TIPOPERIODO"]))
    PCPMonitorUtils():AdicionaTagMonitor(oJsonRet["tags"],@nPosTag,"po-icon-bar-code",oFiltros["02_C2_PRODUTO"])
    PCPMonitorUtils():AdicionaTagMonitor(oJsonRet["tags"],@nPosTag,"po-icon-star-filled",cValToChar(nOPsTotal) + IIF(nOPsTotal > 1," Ordens"," Ordem") )
    PCPMonitorUtils():AdicionaTagMonitor(oJsonRet["tags"],@nPosTag,"po-icon-star-filled",cValToChar(nQtPTotal) + " " + cUnMed )
    PCPMonitorUtils():AdicionaTagMonitor(oJsonRet["tags"],@nPosTag,"po-icon-calculator",IIF(oFiltros["03_TIPOQUANT"] == "O","Quantidade Original","Saldo a Produzir"))

    cJsonDados :=  oJsonRet:toJson()

    FwFreeArray(aChaves)
    FwFreeArray(aPeriodos)
    FwFreeArray(aSaldos)
    FreeObj(oPeriodos)
    FreeObj(oJsonRet)
Return cJsonDados
Bloco de código
languagecpp
firstline1
titleExemplo TextoTipo Gráfico Com Categorias
linenumberstrue
collapsetrue
Method BuscaDados(oFiltros, cTipo, cSubTipo) Class StatusLotesAVencerStatusPlayStopPCP
    Local aPausa   aSemaforo  := StrTokArr(Replace(oFiltros["03_SEMAFORO"],",","."),";"){}
    Local aProd cAliasQry     := GetNextAlias(){}
    Local cCodProd aUsuarios  := oFiltros["02_B8_PRODUTO"]{}
    Local cJsonDadoscAlias  := ""
  := GetNextAlias()
 Local cQuery  Local cJsonDados  := ""
	Local   cTxtPrc Local cProdutos  := ""
    Local cTxtSeccUsuarios    := ""	
    Local cUnMedidacUsrAtual  := ""
    Local cQuery    dFilterDat := PCPMonitorUtils():RetornaPeriodoFinal(oFiltros["05_TIPOPERIODO"],ddatabase,cValtoChar(oFiltros["06_PERIODO"]))
    Local dDataIni nIndLinha  := 0dDatabase
    Local nQuant  dDataFin   := 0dDatabase
    Local lFilUsuar nValSemaf1 := Val(aSemaforo[1]).F.
    Local nIndice nValSemaf2   := Val(aSemaforo[2])	
0
    Local nLotes   nIndSerie  := 0
    Local nPos   nPosTag    := 0
    Local nSaldooDados     := 0
    Local oJsonRet   := JsonObject():New()
    Local oStylePrcoJsonRet   := JsonObject():New()

    Local oStyleSec  oJsonRet["alturaMinimaWidget"] := JsonObject():New()
	
	//Propriedades que devem ser retornadas para monitores do tipo texto
	oJsonRet["corTitulo"]     "350px"
    oJsonRet["alturaMaximaWidget"] := "500px"
    oJsonRet["categorias"] := {}
    oJsonRet["series"]     := "white" //Cor do título do monitor. Se não for informada, assumirá o valor #2590aa{}
    oJsonRet["tags"]       := {}

    oJsonRetoFiltros["alturaMinimaWidget01_HZA_FILIAL"] := "350px" //Altura mínima do monitor. Se não for informada, assumirá o valor 350pxPadR(oFiltros["01_HZA_FILIAL"], FWSizeFilial())
    dDataIni := PCPMonitorUtils():RetornaPeriodoInicial(oFiltros["06_TIPOPERIODO"],dDataFin,cValtoChar(oFiltros["07_PERIODO"]))
    oJsonRet["alturaMaximaWidget"] := "500px" //Altura máxima do monitor. Se não for informada, assumirá o valor 350px
    oJsonRet["linhas"]    cQuery +="  SELECT "
    cQuery += "     HZA.HZA_FILIAL,
    cQuery += "     HZA.HZA_OP,
    := {}	  //Array de objetos json com cada linha de informação do monitor
	oJsonRet["tags"]cQuery += "     HZA.HZA_OPERAD,
    cQuery += "     HZA.HZA_DTINI,
    cQuery += "    := {} HZA.HZA_HRINI,
    cQuery  //Array de objetos json com as tags que serão visualizadas no monitor

    oFiltros["01_B8_FILIAL"] := PadR(oFiltros["01_B8_FILIAL"], FWSizeFilial())+= "     HZA.HZA_DTFIM,
    cQuery += "     HZA.HZA_HRFIM,
    cQuery += "     HZA.HZA_TPTRNS
    cUnMedidacQuery  :+= Posicione("SB1",1,xFilial("SB1",oFiltros["01_B8_FILIAL"])+cCodProd,"B1_UM")

 FROM "+RetSqlName("HZA")+" HZA "
    cQuery += " LEFT JOIN "+RetSqlName("SC2")+" SC2 ON SC2.C2_FILIAL = '"+xFilial("SC2",oFiltros["01_HZA_FILIAL"])+"' AND SC2.C2_NUM+C2_ITEM+C2_SEQUEN+C2_ITEMGRD = HZA.HZA_OP AND SC2.D_E_L_E_T_ = ' ' "
    cQuery += " WHERE HZA.HZA_FILIAL = '" + xFilial("HZA",oFiltros["01_HZA_FILIAL"]) + "' "
    cQuery += "   AND HZA.HZA_DTINI BETWEEN '" + dToS(dDataIni) + "' AND '" + dToS(dDataFin) + "' "
    cQuery += "   AND HZA.HZA_STATUS = '"+IIF(oFiltros["04_HZA_STATUS"] == "A","1","2")+"' "
    If oFiltros:HasProperty("02_C2_PRODUTO") .And. ValType(oFiltros["02_C2_PRODUTO"]) == "A"
        For nIndice := 1 To Len(oFiltros["02_C2_PRODUTO"])
            If Empty(cProdutos)
                cProdutos := "'" + oFiltros["02_C2_PRODUTO"][nIndice] + "'"
            Else
                cProdutos +=  ",'" + oFiltros["02_C2_PRODUTO"][nIndice] + "'"
            EndIf
        Next nIndice
    EndIf
    If !Empty(cProdutos)
        cQuery += " AND SC2.C2_PRODUTO IN ("+cProdutos+") "
    EndIf
    If oFiltros:HasProperty("03_HZA_OPERAD") .And. ValType(oFiltros["03_HZA_OPERAD"]) == "A"
        For nIndice := 1 To Len(oFiltros["03_HZA_OPERAD"])
            If Empty(cUsuarios)
                cUsuarios := "'" + oFiltros["03_HZA_OPERAD"][nIndice] + "'"
            Else
                cUsuarios +=  ",'" + oFiltros["03_HZA_OPERAD"][nIndice] + "'"
            EndIf
        Next nIndice
    EndIf
    If !Empty(cUsuarios)
        lFilUsuar := .T.
        cQuery += " AND HZA.HZA_OPERAD IN ("+cUsuarios+") "
    EndIf
    cQuery += " AND HZA.D_E_L_E_T_ = ' ' "
    cQuery += " ORDER BY HZA.HZA_FILIAL, HZA.HZA_OPERAD "

	dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),cAlias,.F.,.F.)
	While (cAlias)->(!Eof())
        cUsrAtual := IIF(lFilUsuar,(cAlias)->HZA_OPERAD,"Todos")
        If !oDados:HasProperty(cUsrAtual)
            oDados[cUsrAtual] := JsonObject():New()
            oDados[cUsrAtual]["1"] := 0
            oDados[cUsrAtual]["2"] := 0
        EndIf
        If oFiltros["05_APONTAMENTOHORA"] == "H"
            If oFiltros["04_HZA_STATUS"] == "A"
                If (cAlias)->HZA_DTINI != dToS(dDatabase)
                    nDifDias := DateDiffDay(sToD((cAlias)->HZA_DTINI),dDatabase) - 1
                    nMinutos := nDifDias * 24 * 60
                    nMinutos += Hrs2Min(ElapTime(SubStr((cAlias)->HZA_HRINI,1,5)+":00","24:00:00"))
                    nMinutos += Hrs2Min(ElapTime("00:00:00",SubStr(Time(),1,5)+":00"))
                Else
                    nMinutos += Hrs2Min(ElapTime(SubStr((cAlias)->HZA_HRINI,1,5)+":00",SubStr(Time(),1,5)+":00"))
                EndIf                
            Else
                If (cAlias)->HZA_DTINI != (cAlias)->HZA_DTFIM
                    nDifDias := DateDiffDay(sToD((cAlias)->HZA_DTINI),sToD((cAlias)->HZA_DTFIM)) - 1
                    nMinutos := nDifDias * 24 * 60
                    nMinutos += Hrs2Min(ElapTime(SubStr((cAlias)->HZA_HRINI,1,5)+":00","24:00:00"))
                    nMinutos += Hrs2Min(ElapTime("00:00:00",SubStr((cAlias)->HZA_HRFIM,1,5)+":00"))
                Else
                    nMinutos := Hrs2Min(ElapTime(SubStr((cAlias)->HZA_HRINI,1,5)+":00",SubStr((cAlias)->HZA_HRFIM,1,5)+":00"))            
                EndIf
            EndIf
            oDados[cUsrAtual][(cAlias)->HZA_TPTRNS] += nMinutos
        Else
            oDados[cUsrAtual][(cAlias)->HZA_TPTRNS]++
        EndIf
		(cAlias)->(dbSkip())
	End
	(cAlias)->(dbCloseArea())

    aUsuarios :=  oDados:GetNames()
    For nIndice := 1 To Len(aUsuarios)
        aAdd(aProd,IIF(oFiltros["05_APONTAMENTOHORA"] == "H",NOROUND(((oDados[aUsuarios[nIndice]]["1"] / 0.6) / 100),2),oDados[aUsuarios[nIndice]]["1"]))
        aAdd(aPausa,IIF(oFiltros["05_APONTAMENTOHORA"] == "H",NOROUND(((oDados[aUsuarios[nIndice]]["2"] / 0.6) / 100),2),oDados[aUsuarios[nIndice]]["2"]))
        aUsuarios[nIndice] := IIF(lFilUsuar,UsrRetName(aUsuarios[nIndice]),aUsuarios[nIndice])
    Next nIndice

    PCPMonitorUtils():AdicionaSerieGraficoMonitor(oJsonRet["series"],@nIndSerie,COR_VERDE,aProd,"Produção")
    PCPMonitorUtils():AdicionaSerieGraficoMonitor(oJsonRet["series"],@nIndSerie,COR_VERMELHO,aPausa,"Pausa")
    PCPMonitorUtils():AdicionaCategoriasGraficoMonitor(oJsonRet["categorias"], aUsuarios)
    
    PCPMonitorUtils():AdicionaTagMonitor(oJsonRet["tags"],@nPosTag,"po-icon-calendar",dToC(dDataIni) + " - " + dToC(dDataFin))
    PCPMonitorUtils():AdicionaTagMonitor(oJsonRet["tags"],@nPosTag,"po-icon-parameters",IIF(oFiltros["04_HZA_STATUS"] == "A","Em Andamento","Concluído"))
    PCPMonitorUtils():AdicionaTagMonitor(oJsonRet["tags"],@nPosTag,"po-icon-parameters",IIF(oFiltros["05_APONTAMENTOHORA"] == "H","Horas","Apontamentos"))

    If oFiltros:HasProperty("02_C2_PRODUTO") .And. ValType(oFiltros["02_C2_PRODUTO"]) == "A"
        For nIndice := 1 To Len(oFiltros["02_C2_PRODUTO"])
            PCPMonitorUtils():AdicionaTagMonitor(oJsonRet["tags"],@nPosTag,"po-icon-bar-code",oFiltros["02_C2_PRODUTO"][nIndice])
        Next nIndice
    EndIf
    cJsonDados := oJsonRet:ToJson()

    FreeObj(oDados)
    FreeObj(oJsonRet)
    FwFreeArray(aPausa)
    FwFreeArray(aProd)
    FwFreeArray(aUsuarios)
Return cJsonDados
Bloco de código
languagecpp
firstline1
titleExemplo Tipo Gráfico Gauge (Velocímetro)
linenumberstrue
collapsetrue
Method BuscaDados(oFiltros, cTipo, cSubTipo) Class StatusLotesAVencer
    Local aSemaforo  := StrTokArr(Replace(oFiltros["03_SEMAFORO"],",","."),";")
    Local cAliasQry  := GetNextAlias()
    Local cCodProd   := oFiltros["02_B8_PRODUTO"]
    Local cLabel     := ""
    Local cJsonDados := ""
    Local cQuery     := ""
    Local cUnMedida  := ""
    Local cValorFim  := ""
    Local cValSemaf1 := aSemaforo[1]
    Local cValSemaf2 := aSemaforo[2]   
    Local dFilterDat := PCPMonitorUtils():RetornaPeriodoFinal(oFiltros["05_TIPOPERIODO"],ddatabase,cValtoChar(oFiltros["06_PERIODO"]))
    Local nLotes     := 0
    Local nPos       := 0
    Local nQuant     := 0
    Local nSaldo     := 0
    Local nValorFim  := 0
    Local nValSemaf1 := Val(cValSemaf1)
    Local nValSemaf2 := Val(cValSemaf2)
    Local oJsonRet   := JsonObject():New()
    Local oGauge     := PCPMonitorGauge():New()
     
    //Propriedades que devem ser retornadas para monitores do tipo gráfico      //Propriedades que devem ser retornadas para monitores do tipo gráfico
    oJsonRet["corTitulo"]          := "black" //Cor do título do monitor. Se não for informada, assumirá o valor #2590aa
    oJsonRet["alturaMinimaWidget"] := "350px" //Altura mínima do monitor. Se não for informada, assumirá o valor 350px
    oJsonRet["alturaMaximaWidget"] := "500px" //Altura máxima do monitor. Se não for informada, assumirá o valor 350px
    oJsonRet["tags"]               := {}      //Array de objetos json com as tags que serão visualizadas no monitor
    oJsonRet["series"]             := {}      //Array de objetos json com as séries do gráfico. Será apenas inicializado para o gráfico do tipo velocímetro.
    oJsonRet["categorias"]         := {}      //Array de strings com as categorias do gráfico. Será apenas inicializado para o gráfico do tipo velocímetro.
 
    oFiltros["01_B8_FILIAL"] := PadR(oFiltros["01_B8_FILIAL"], FWSizeFilial())
    cUnMedida  := Posicione("SB1",1,xFilial("SB1",oFiltros["01_B8_FILIAL"])+cCodProd,"B1_UM")
 
    //Query com os filtros para buscar as informações e apresentar no monitor
    cQuery += " SELECT "
    cQuery += "     SB8.B8_PRODUTO CODIGO_PRODUTO, "
    cQuery += "     SUM(SB8.B8_SALDO) SALDO, "
    cQuery += "     COUNT(SB8.R_E_C_N_O_) QUANTIDADE_LOTES "
    cQuery += " FROM "+RetSqlName("SB8")+" SB8 "
    cQuery += " WHERE SB8.B8_FILIAL = '" + xFilial("SB8",oFiltros["01_B8_FILIAL"]) + "' "
    cQuery += "   AND SB8.B8_PRODUTO = '" + cCodProd + "'//Query com os filtros para buscar as informações e apresentar no monitor
	cQuery += " SELECT "
    cQuery += "   AND  SB8.B8_PRODUTO CODIGO_PRODUTO,DTVALID BETWEEN '"+DTOS(ddatabase)+"' AND  '"+DTOS(dFilterDat)+"' "
    cQuery += "    AND SUM(SB8.B8_SALDO) > SALDO,0 "
    cQuery += "    AND COUNT(SB8.RD_E_CL_N_O_) QUANTIDADE_LOTES "
    cQuery += " FROM "+RetSqlName("SB8")+" SB8 "E_T_  = ' ' "
    cQuery += " WHEREGROUP BY SB8.B8_FILIAL,SB8.B8_PRODUTO = '"
 
 +   xFilialdbUseArea(.T.,"SB8",oFiltros["01_B8_FILIAL"]) + "' "TOPCONN",TcGenQry(,,cQuery),cAliasQry,.F.,.F.)
    cQueryIf += " (cAliasQry)->(!Eof())
   AND SB8.B8_PRODUTO = '" + cCodProd +  "' ":= AllTrim((cAliasQry)->CODIGO_PRODUTO)
    cQuery += "  nLotes AND SB8.B8_DTVALID BETWEEN '"+DTOS(ddatabase)+"' AND := '"+DTOS(dFilterDat)+"' "
cAliasQry)->QUANTIDADE_LOTES
        nSaldo cQuery += "   AND SB8.B8_SALDO > 0 ":= (cAliasQry)->SALDO
    End
    cQuery += "(cAliasQry)->(dbCloseArea())
 
    AND SB8.D_E_L_E_T_  = ' ' "
    cQuery += " GROUP BY SB8.B8_FILIAL,SB8.B8_PRODUTO  "

    dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),cAliasQry,.F.,.F.)
    If  (cAliasQry)->(!Eof())If oFiltros["04_TIPOSEMAFORO"] == "L"
        nQuant  := nLotes
        cLabel  := IIF(nLotes > 1, "Lotes", "Lote")
    Else
        cCodProd nQuant  := AllTrim((cAliasQry)->CODIGO_PRODUTO)nSaldo
        nLotes  cLabel   := (cAliasQry)->QUANTIDADE_LOTEScUnMedida
    EndIf
    nSaldoIf nQuant > nValSemaf2
   := (cAliasQry)->SALDO
    End
nValorFim := nQuant + (cAliasQry)->(dbCloseArea()nValSemaf2 - nValSemaf1)

    If oFiltros["04_TIPOSEMAFORO"] == "L"
Else
        nValorFim := nValSemaf2 nQuant+ (nValSemaf2 :=- nLotesnValSemaf1)
    EndIf
    cTxtPrccValorFim := cValToChar(nLotesnValorFim)
 
    //Especifica as propriedades do cTxtSecgráfico := cValToChar(nSaldo) + " " + cUnMedidatipo velocímetro
    oGauge:SetMaxValue(nValorFim)
    ElseoGauge:SetValue(nQuant)
    oGauge:SetValueStyle("color",IIF(nQuant < nValSemaf1,"rgb(38,186,65)",IIF(nQuant  nQuant  := nSaldo< nValSemaf2,"rgb(255,207,1)","rgb(245,0,49)")))
    oGauge:SetValueStyle("font-weight","bold")
     oGauge:SetLabel(cLabel)
   cTxtPrc oGauge:= cValToChar(nSaldoSetLabelStyle("font-weight","bold")
    oGauge:SetThreshold("0","rgb(38,186,65)")
    cTxtSec := cValToChar(nLotes) + IIF(nLotes > 1, " Lotes", " Lote")
    EndIf
	//Adiciona as linhas de informação no monitoroGauge:SetThreshold(cValSemaf1,"rgb(238,173,45)")
    oGauge:SetThreshold(cValSemaf2,"rgb(245,0,49)")
    If Val(cValSemaf1) > 0
    If  nLotes > oGauge:SetMarker("0
		oStyleSec["color"] := "white"
		oJSonRet["corFundo"] := IIF(nQuant < nValSemaf1,"rgb(38,186,65)",IIF(nQuant < nValSemaf2,"rgb(255,207,1)","rgb(245,0,49)"")
    Endif
    oGauge:SetMarker(cValSemaf1)
    oGauge:SetMarker(cValSemaf2)
    oGauge:SetMarker(cValorFim)
    //Atribui o objeto json  If oJSonRet["corFundo"] == "rgb(255,207,1)"
            oStyleSec["color"] := "black"
            oJsonRet["corTitulo"] := "black"
        EndIfdo velocímetro ao objeto json de retorno do método
    oJsonRet["gauge"]      := oGauge:GetJsonObject()
 
    //Adiciona tags ao monitor
    PCPMonitorUtils():AdicionaTagMonitor(oJsonRet["tags"],@nPos,"po-icon-calendar",cValToChar(ddatabase) + " - " + cValToChar(dFilterDat))
    PCPMonitorUtils():AdicionaTagMonitor(oJsonRet["tags"],@nPos,"po-icon-bar-code",cCodProd)
    If cTipo == "chart"
        oStylePrc["font-weightPCPMonitorUtils():AdicionaTagMonitor(oJsonRet["tags"],@nPos,"po-icon-star-filled",IIF(oFiltros["04_TIPOSEMAFORO"] :== "bold"
        oStylePrc["font-size"]   := "120px"
        oStylePrc["line-height"] := "130px"L",cValToChar(nSaldo) + " " + cUnMedida,cValToChar(nLotes) + IIF(nLotes > 1, " Lotes", " Lote")))
    EndIf
    oStylePrc["text-align"]  cJsonDados := "center"
    oJsonRet:toJson()
 
     oStylePrc["color"]FwFreeArray(aSemaforo)
    FreeObj(oGauge)
    FreeObj(oJsonRet)
Return cJsonDados
Bloco de código
languagecpp
firstline1
titleExemplo Tipo Texto
linenumberstrue
collapsetrue
Method BuscaDados(oFiltros, cTipo, cSubTipo) Class StatusLotesAVencer
    Local aSemaforo:= oStyleSec["color"]
        oStylePrc["cursor"]      := "pointer"
		PCPMonitorUtils():AdicionaLinhaInformacao(oJsonRet["linhasStrTokArr(Replace(oFiltros["03_SEMAFORO"],@nIndLinha",cTxtPrc","po-sm-12",oStylePrc:ToJson(),.T.."),";")
    Local cAliasQry  := PCPMonitorUtilsGetNextAlias():AdicionaLinhaInformacao(oJsonRet["linhas"],@nIndLinha,cTxtSec,"po-font-title po-text-center po-sm-12 po-pt-1 bold-text",oStyleSec:ToJson())
    Else
        oJsonRet["corFundo"] := "rgb(38,186,65)
    Local cCodProd   := oFiltros["02_B8_PRODUTO"]
    Local cJsonDados := ""
    Local cQuery     := ""
    Local cTxtPrc    PCPMonitorUtils():AdicionaLinhaInformacao(oJsonRet["linhas"],@nIndLinha,"Nenhum lote do produto vencerá no período selecionado.","po-font-text-large-bold po-text-center po-sm-12 po-pt-4",oStyleSec:ToJson())
    EndIf
    //Adiciona tags ao monitor
    PCPMonitorUtils():AdicionaTagMonitor(oJsonRet["tags"],@nPos,"po-icon-calendar",cValToChar(ddatabase) + " - " + cValToChar(dFilterDat))
    PCPMonitorUtils():AdicionaTagMonitor(oJsonRet["tags"],@nPos,"po-icon-bar-code",cCodProd)
    If oFiltros["04_TIPOSEMAFORO"] == "Q"
        PCPMonitorUtils():AdicionaTagMonitor(oJsonRet["tags"],@nPos,"po-icon-weight",""Un. Medida: "+ cUnMedida)
    EndIf
    cJsonDados :=  oJsonRet:toJson()

    FwFreeArray(aSemaforo)
    FreeObj(oJsonRet)
Return cJsonDados
Bloco de código
languagecpp
firstline1
titleExemplo Velocímetro
linenumberstrue
collapsetrue
Method BuscaDados(oFiltros, cTipo, cSubTipo) Class StatusLotesAVencer:= ""
    Local cTxtSec    := "" 
    Local cUnMedida  := ""
    Local dFilterDat := PCPMonitorUtils():RetornaPeriodoFinal(oFiltros["05_TIPOPERIODO"],ddatabase,cValtoChar(oFiltros["06_PERIODO"]))
    Local nIndLinha  := 0
    Local nQuant     := 0
    Local nValSemaf1 := Val(aSemaforo[1])
    Local nValSemaf2 := Val(aSemaforo[2])  
    Local nLotes     := 0
    Local nPos       := 0
    Local nSaldo     := 0
    Local oJsonRet   := JsonObject():New()
    Local oStylePrc  := JsonObject():New()
    Local aSemaforooStyleSec  := StrTokArrJsonObject(Replace(oFiltros["03_SEMAFORO"],",","."),";")):New()
     
    Local//Propriedades cAliasQryque devem := GetNextAlias()
    Local cCodProdser retornadas para monitores do tipo texto
   := oFiltrosoJsonRet["02_B8_PRODUTOcorTitulo"]
	Local cLabel          := "white"
 //Cor do título do Localmonitor. cJsonDadosSe := ""
    Local cQuerynão for informada, assumirá o valor #2590aa
    oJsonRet["alturaMinimaWidget"] := "350px"
 //Altura mínima do monitor. LocalSe cUnMedidanão  := ""
    Local cValorFim for informada, assumirá o valor 350px
    oJsonRet["alturaMaximaWidget"] := "500px"
 //Altura máxima do Localmonitor. cValSemaf1Se := aSemaforo[1]
    Local cValSemaf2 := aSemaforo[2]	
    Local dFilterDat := PCPMonitorUtils():RetornaPeriodoFinal(oFiltros["05_TIPOPERIODO"],ddatabase,cValtoChar(oFiltros["06_PERIODO"]))
    Local nLotesnão for informada, assumirá o valor 350px
    oJsonRet["linhas"]             := 0
{}      //Array Localde nPosobjetos json com cada linha de informação :=do 0monitor
	Local   nQuant oJsonRet["tags"]    := 0
    Local nSaldo     := 0
 {}      //Array Localde nValorFimobjetos json :=com 0
as tags que serão Localvisualizadas nValSemaf1no := Val(cValSemaf1)monitor
 
    Local nValSemaf2oFiltros["01_B8_FILIAL"] := Val(cValSemaf2)	PadR(oFiltros["01_B8_FILIAL"], FWSizeFilial())
    Local oJsonRetcUnMedida   := JsonObject():New()
	Local oGaugePosicione("SB1",1,xFilial("SB1",oFiltros["01_B8_FILIAL"])+cCodProd,"B1_UM")
 
    //Query := PCPMonitorGauge():New()
	
    //Propriedades que devem ser retornadas para monitores do tipo gráfico
	oJsonRet["alturaMinimaWidget"] := "350pxcom os filtros para buscar as informações e apresentar no monitor
    cQuery += " SELECT "
    oJsonRet["alturaMaximaWidget"] :cQuery += "500px"
    oJsonRet["categorias"]    SB8.B8_PRODUTO CODIGO_PRODUTO, "
    cQuery  := {}
    oJsonRet["series"]+= "     SUM(SB8.B8_SALDO) SALDO, "
    cQuery  :+= {}
	oJsonRet["tags"]     COUNT(SB8.R_E_C_N_O_) QUANTIDADE_LOTES "
    cQuery    :+= {}
"    oJsonRet["detalhes"]      FROM "+RetSqlName("SB8")+" SB8 "
    cQuery :+= {}	

"    oFiltros["01_WHERE SB8.B8_FILIAL"] := PadR(oFiltros["01_B8_FILIAL"], FWSizeFilial())
    cUnMedida  := Posicione("SB1",1,'" + xFilial("SB1SB8",oFiltros["01_B8_FILIAL"]) +cCodProd,"B1_UM")

	//Query com os filtros para buscar as informações e apresentar no monitor
    cQuery += " SELECT "' "
    cQuery += "   AND SB8.B8_PRODUTO = '" + cCodProd + "' "
    cQuery += "    AND SB8.B8_PRODUTO CODIGO_PRODUTO,DTVALID BETWEEN '"+DTOS(ddatabase)+"' AND  '"+DTOS(dFilterDat)+"' "
    cQuery += "    AND SUM(SB8.B8_SALDO) > SALDO,0 "
    cQuery += "    AND COUNT(SB8.RD_E_CL_N_O_) QUANTIDADE_LOTES "
    cQuery += " FROM "+RetSqlName("SB8")+" SB8E_T_  = ' ' "
    cQuery += " GROUP WHEREBY SB8.B8_FILIAL,SB8.B8_PRODUTO = '"
 + xFilial("SB8",oFiltros["01_B8_FILIAL"]) + "' "
    cQuery += "   AND SB8.B8_PRODUTO = '" + cCodProd + "' "
    cQuery += "   AND SB8.B8_DTVALID BETWEEN '"+DTOS(ddatabase)+"' AND  '"+DTOS(dFilterDat)+"' "
    cQuery += "   AND SB8.B8_SALDO > 0 "
    cQuery += "   AND SB8.D_E_L_E_T_  = ' ' "
    cQuery += " GROUP BY SB8.B8_FILIAL,SB8.B8_PRODUTO  "

    dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),cAliasQry,.F.,.F.)
    If  (cAliasQry)->(!Eof())
        cCodProd   := AllTrim((cAliasQry)->CODIGO_PRODUTO)
        nLotes     := (cAliasQry)->QUANTIDADE_LOTES
        nSaldo     := (cAliasQry)->SALDO
    End
    (cAliasQry)->(dbCloseArea())

    If oFiltros["04_TIPOSEMAFORO"] == "L
    dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),cAliasQry,.F.,.F.)
    If  (cAliasQry)->(!Eof())
        cCodProd   := AllTrim((cAliasQry)->CODIGO_PRODUTO)
        nLotes     := (cAliasQry)->QUANTIDADE_LOTES
        nSaldo     := (cAliasQry)->SALDO
    End
    (cAliasQry)->(dbCloseArea())
 
    If oFiltros["04_TIPOSEMAFORO"] == "L"
        nQuant  := nLotes
        cTxtPrc := cValToChar(nLotes)
        cTxtSec := cValToChar(nSaldo) + " " + cUnMedida
    Else
        nQuant  := nSaldo
        cTxtPrc := cValToChar(nSaldo)
        cTxtSec := cValToChar(nLotes) + IIF(nLotes > 1, " Lotes", " Lote")
    EndIf
    //Adiciona as linhas de informação no monitor
    If nLotes > 0
        oStyleSec["color"] := "white"
        nQuant  oJSonRet["corFundo"] := nLotes
IIF(nQuant        cLabel  := IIF(nLotes > 1, "Lotes", "Lote"< nValSemaf1,"rgb(38,186,65)",IIF(nQuant < nValSemaf2,"rgb(255,207,1)","rgb(245,0,49)"))
    Else
    If oJSonRet["corFundo"] ==  nQuant"rgb(255,207,1)"
   := nSaldo
        cLabel  oStyleSec["color"] := cUnMedida
"black"
       EndIf
    If nQuant > nValSemaf2 oJsonRet["corTitulo"] := "black"
        nValorFimEndIf
 := nQuant + (nValSemaf2 - nValSemaf1)
  oStylePrc["font-weight"] := Else"bold"
         nValorFimoStylePrc["font-size"]   := nValSemaf2 + (nValSemaf2 - nValSemaf1)"120px"
    EndIf
    cValorFimoStylePrc["line-height"] := cValToChar(nValorFim)

	//Especifica as propriedades do gráfico tipo velocímetro
    oGauge:SetMaxValue(nValorFim)"130px"
        oStylePrc["text-align"]  := "center"
    oGauge:SetValue(nQuant)
    oGauge:SetValueStyle(oStylePrc["color",IIF(nQuant] < nValSemaf1,"rgb(38,186,65)",IIF(nQuant < nValSemaf2,"rgb(255,207,1)","rgb(245,0,49)"))
    oGauge:SetValueStyle("font-weight","bold"):= oStyleSec["color"]
    oGauge:SetLabel(cLabel)
     oGauge:SetLabelStyle("font-weight","bold")
oStylePrc["cursor"]      oGauge:SetThreshold("0","rgb(38,186,65)")= "pointer"
    oGauge:SetThreshold(cValSemaf1,"rgb(238,173,45)")
    oGaugePCPMonitorUtils():SetThreshold(cValSemaf2,"rgb(245,0,49)")
    If Val(cValSemaf1) > 0AdicionaLinhaInformacao(oJsonRet["linhas"],@nIndLinha,cTxtPrc,"po-sm-12",oStylePrc:ToJson(),.T.)
        oGaugePCPMonitorUtils():SetMarkerAdicionaLinhaInformacao("0")
    EndifoJsonRet["linhas"],@nIndLinha,cTxtSec,"po-font-title po-text-center po-sm-12 po-pt-1 bold-text",oStyleSec:ToJson())
    oGauge:SetMarker(cValSemaf1)
Else
      oGauge:SetMarker(cValSemaf2)
  oJsonRet["corFundo"]  oGauge:SetMarker(cValorFim)
	//Atribui o objeto json do velocímetro ao objeto json de retorno do método
    oJsonRet["gauge"]      := oGauge:GetJsonObject()

	:= "rgb(38,186,65)"
        PCPMonitorUtils():AdicionaLinhaInformacao(oJsonRet["linhas"],@nIndLinha,"Nenhum lote do produto vencerá no período selecionado.","po-font-text-large-bold po-text-center po-sm-12 po-pt-4",oStyleSec:ToJson())
    EndIf
    //Adiciona tags ao monitor
    PCPMonitorUtils():AdicionaTagMonitor(oJsonRet["tags"],@nPos,"po-icon-calendar",cValToChar(ddatabase) + " - " + cValToChar(dFilterDat))
    PCPMonitorUtils():AdicionaTagMonitor(oJsonRet["tags"],@nPos,"po-icon-bar-code",cCodProd)
    If cTipooFiltros["04_TIPOSEMAFORO"] == "chartQ"
        PCPMonitorUtils():AdicionaTagMonitor(oJsonRet["tags"],@nPos,"po-icon-star-filledweight",IIF(oFiltros["04_TIPOSEMAFORO"] == "L",cValToChar(nSaldo) + " " + cUnMedida,cValToChar(nLotes) + IIF(nLotes > 1, " Lotes", " Lote"))"Un. Medida: "+ cUnMedida)
    EndIf
    cJsonDados :=  oJsonRet:toJson()
 
    FwFreeArray(aSemaforo)
	FreeObj(oGauge)
    FreeObj(oJsonRet)
Return cJsonDados