Satus do SEFAZ CUPO/NFE

Fórum sobre desenvolvimento de software para atender as exigências da legislação fiscal e tributária (NFe, NFCe, NFSe, SPEED, Projeto ACBr, TEF, ECD, EFD, etc.)

Moderador: Moderadores

cpaiva
Usuário Nível 1
Usuário Nível 1
Mensagens: 20
Registrado em: 18 Nov 2025 10:22
Curtiram: 1 vez

Satus do SEFAZ CUPO/NFE

Mensagem por cpaiva »

BOM dia
alguem fez uma funcao que verifica se o sefas esta Verde/amarelo/vermelho ?

pode disponibilizar ?

cpaivasistemas@gmail.com
34 99971-2578

Paiva
Editado pela última vez por Itamar M. Lins Jr. em 06 Fev 2026 11:42, em um total de 1 vez.
Razão: Tópico Movido da Seção Dicas e Tutoriais.
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1322
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Satus do SEFAZ CUPO/NFE

Mensagem por ANDRIL »

Será que compensa o trabalho Paiva? 90% das vezes que ocorre problemas na emissão, voce vai consultar a disponibilidade e estão todas verdes, MAS, o problema é lá! Esse serviço não é confiável no meu ponto de vista.
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20453
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Re: Satus do SEFAZ CUPO/NFE

Mensagem por JoséQuintas »

E não é mesmo.
Apesar de tudo, lá internamente é atendido por mais de um servidor.
A recepção pode estar sempre funcionando, mas outro servidor estar com problema pra responder.
O status vai ser ok, porque a parte de receber estará normal.
Seria como testar se o computador está ligado.
Mas ligado não significa que está fazendo o que deveria.

De qualquer forma, não deixa de ser um teste a mais, que já vai filtrar parte dos problemas.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1322
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Satus do SEFAZ CUPO/NFE

Mensagem por ANDRIL »

Esses portais de disponibilidade são enganação pura, NFe, CPTM (esse geralmente tudo ok, no jornal chovendo de reclamações dos usuários).
Se é para ter o serviço, que seja um serviço verdadeiro e confiável!
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7145
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Curtiram: 1 vez
Contato:

Re: Satus do SEFAZ CUPO/NFE

Mensagem por sygecom »

Tenho que concordar esses status estão sempre muito atrasados referente a realidade.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4670
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Curtiu: 3 vezes
Contato:

Re: Satus do SEFAZ CUPO/NFE

Mensagem por rochinha »

Amiguinhos,

O controle de contingencia deve ser usado quando o SEFAZ se torna instável, sem acesso ou a empresa está sem internet.

Durante uma urgência, a emissão da nota deve ser feita neste modelo contingenciada e no primeiro minuto do problema ter sido sanado transmitida para o portal.

Podemos fazer uso da função de checagem de status do sefaz mas muitos abusam e verificam muitas vezes por minuto o que acarreta consumo indevido.

O primeiro passo para se emitir notas em contingencia é verificar se tem internet ativa, caso não, emita.

Caso a internet esteja ativa, deve-se consultar o estado do portal e caso esteja fora do ar, caso esteja fora do ar, emita.

Para diminuir o uso da função de status e como o usuário está muito atarefado para abrir o browser, entrar no portal e verificar a situação dos servidores então pode-se programar para isto um monitor rústico.

Segue exemplo, usando Fivewin e conversação HTTP básica, leitura RAW da resposta, capturas de substrings, etc:

Código: Selecionar todos

FUNCTION SefazStatus( _bar_, lFazTeste )
   /* rochinha - 10/08/2024 */
   // aTDCols := { "Autorizador", "Autorizacao", "Retorno", "Inutilizacao", "ConsStatus", "Status", "TempoMedio", "ConsCadastro", "RecepEventos" }
   // Function IEGetPage( URL, lFazTeste )
   default lFazTeste := .f.
   #translate _InternetExplorer()    => /* win_ole */ CreateObject( "InternetExplorer.Application" )
   #translate _MicrosoftXMLHTTP()    => /* win_ole */ CreateObject( "Microsoft.XMLHTTP" )
   #translate _MSXML2ServerXMLHTTP() => /* win_ole */ CreateObject( "MSXML2.ServerXMLHTTP" )
   #translate _XMLHttpRequest()      => /* win_ole */ CreateObject( "Microsoft.XMLHTTP" )
   #translate _WinHttpRequest()      => /* win_ole */ CreateObject( "WinHttp.WinHttpRequest.5.1" )   
   #translate _MicrosoftXMLDOM()     => /* win_ole */ CreateObject( "Microsoft.XMLDOM" )
   if VerifyINI( "SEFAZ", "VerificaStatus", "N", cPathDados+"\nfw.ini", .f. ) = "N"
      RETURN nil
   endif
   cEanApi	:= "https://www.nfe.fazenda.gov.br/portal/disponibilidade.aspx"
   //winexec( "taskkill /f /im iexplore.exe" ,0)
   SysWait(5)
   //oIE := _InternetExplorer()
   //cHTMLdoc := HTMLDocument
   cPathRaiz := cPathDados
   if lFazTeste
      cXMLSedex := []
      cXMLSedex := cXMLSedex + [<html>]
      cXMLSedex := cXMLSedex + [<table class="tabelaListagemDados" cellspacing="0" rules="all" border="1" id="ctl00_ContentPlaceHolder1_gdvDisponibilidade2">]
      cXMLSedex := cXMLSedex + [		<caption>]
      cXMLSedex := cXMLSedex + [			Visão Geral de Disponibilidade dos Serviços<br/><span class='fonte10'> - Última Verificação: 27/07/2024 18:29:28<br/><br/> - WebServices Versão 4.00</span>]
      cXMLSedex := cXMLSedex + [		</caption><tr>]
      cXMLSedex := cXMLSedex + [			<th scope="col">Autorizador</th><th scope="col">Autorização4</th><th scope="col">Retorno Autorização4</th><th scope="col">Inutilização4</th><th scope="col">Consulta Protocolo4</th><th scope="col">Status Serviço4</th><th scope="col">Tempo M&#233;dio</th><th scope="col">Consulta Cadastro4</th><th scope="col">Recepção Evento4</th>]
      cXMLSedex := cXMLSedex + [		</tr><tr class="linhaImparCentralizada">]
      cXMLSedex := cXMLSedex + [			<td>AM</td>    <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><span></span></td><td><img src="imagens/bola_verde_P.png" /></td>]
      cXMLSedex := cXMLSedex + [		</tr><tr class="linhaParCentralizada">]
      cXMLSedex := cXMLSedex + [			<td>BA</td>    <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td>]
      cXMLSedex := cXMLSedex + [		</tr><tr class="linhaImparCentralizada">]
      cXMLSedex := cXMLSedex + [			<td>GO</td>    <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td>]
      cXMLSedex := cXMLSedex + [		</tr><tr class="linhaParCentralizada">]
      cXMLSedex := cXMLSedex + [			<td>MG</td>    <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td>]
      cXMLSedex := cXMLSedex + [		</tr><tr class="linhaImparCentralizada">]
      cXMLSedex := cXMLSedex + [			<td>MS</td>    <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td>]
      cXMLSedex := cXMLSedex + [		</tr><tr class="linhaParCentralizada">]
      cXMLSedex := cXMLSedex + [			<td>MT</td>    <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td>]
      cXMLSedex := cXMLSedex + [		</tr><tr class="linhaImparCentralizada">]
      cXMLSedex := cXMLSedex + [			<td>PE</td>    <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td>]
      cXMLSedex := cXMLSedex + [		</tr><tr class="linhaParCentralizada">]
      cXMLSedex := cXMLSedex + [			<td>PR</td>    <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_amarela_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_vermelho_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td>]
      cXMLSedex := cXMLSedex + [		</tr><tr class="linhaImparCentralizada">]
      cXMLSedex := cXMLSedex + [			<td>RS</td>    <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td>]
      cXMLSedex := cXMLSedex + [		</tr><tr class="linhaParCentralizada">]
      cXMLSedex := cXMLSedex + [			<td>SP</td>    <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_amarela_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_vermelho_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td>]
      cXMLSedex := cXMLSedex + [		</tr><tr class="linhaImparCentralizada">]
      cXMLSedex := cXMLSedex + [			<td>SVAN</td>  <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><span></span></td><td><img src="imagens/bola_verde_P.png" /></td>]
      cXMLSedex := cXMLSedex + [		</tr><tr class="linhaParCentralizada">]
      cXMLSedex := cXMLSedex + [			<td>SVRS</td>  <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td>]
      cXMLSedex := cXMLSedex + [		</tr><tr class="linhaImparCentralizada">]
      cXMLSedex := cXMLSedex + [			<td>SVC-AN</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><span></span></td><td><img src="imagens/bola_verde_P.png" /></td>]
      cXMLSedex := cXMLSedex + [		</tr><tr class="linhaParCentralizada">]
      cXMLSedex := cXMLSedex + [			<td>SVC-RS</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><span></span></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><span></span></td><td><img src="imagens/bola_verde_P.png" /></td>]
      cXMLSedex := cXMLSedex + [		</tr>]
      cXMLSedex := cXMLSedex + [</table>]
      cXMLSedex := cXMLSedex + [</html>]
   else
      cXMLSedex := "" // Esvazia para pegar novo conteudo
      oPg := _XMLHttpRequest() // TOLEAuto():New("Microsoft.XMLHTTP")
      if oPg = nil
         return nil
      end
      oPg:Open( "GET", cEanApi, .F. )
      oPg:Send() 
      cXMLSedex := oPg:ResponseText // oPg:ResponseXML:xml
      
      rMemoWrit( cPathDados + "\SEFAZ-"+charRem(":-/",time())+".STS", cXMLSedex )

   endif

   // TOleAuto() no Harbour e CreateObject() no xHarbour
   if empty(cXMLSedex)
      lSuccess := .f.
   else
      oXMLDoc := _MicrosoftXMLDOM() // TOLEAUTO():New("Microsoft.XMLDOM") // /* win_ole */ CreateObject( "Microsoft.XMLDOM" )
      oTRDoc  := _MicrosoftXMLDOM() // TOLEAUTO():New("Microsoft.XMLDOM") // /* win_ole */ CreateObject( "Microsoft.XMLDOM" )
      oTDDoc  := _MicrosoftXMLDOM() // TOLEAUTO():New("Microsoft.XMLDOM") // /* win_ole */ CreateObject( "Microsoft.XMLDOM" )
      oXMLDoc:async := .f. 
      oTRDoc:async  := .f.   
      oTDDoc:async  := .f.
      cXMLSedex := XMLGetFull( "table", cXMLSedex, .f., [ class="tabelaListagemDados] )
      //lSuccess := oXMLDoc:load( cXMLSedex ) // Usado para carregar arquivo do disco
      lSuccess := oXMLDoc:loadXML( cXMLSedex ) // Usado para receber string de conteudo
   endif
 
   if !lSuccess // se NAO abriu com sucesso...
      VerifyINI( "Geral", "ForcaContingencia", "S", cPathDados+"\nfw.ini", .T. )
      VerifyINI( "SEFAZ", "Status", "OFF", cPathDados+"\nfw.ini", .T. )
      oWnd:oMsgBar:DelItem( oMsgItemCFaz )
      oMsgItemCFaz :=  TMsgItem():New(oWnd:oMsgBar,,24,,,,.t.,,"level2",, "Informa SEFAZ status" )
      oMsgItemCFaz:Refresh() 
   else
      // Cria objeto principal
      VerifyINI( "Geral", "ForcaContingencia", "N", cPathDados+"\nfw.ini", .T. )
      VerifyINI( "SEFAZ", "Status", "ON", cPathDados+"\nfw.ini", .T. )
      oTRTags := oXMLDoc:getElementsByTagName( "tr" )
      aTRTags := {}
      cTRTags := ""
      for iTRTags = 2 to oTRTags:length
          // Traz a linha TR
          cTRTag  := oTRTags:Item(iTRTags-1):xml
          oTRDoc:loadXML( cTRTag )
          oTDTags := oTRDoc:getElementsByTagName( "td" )
          aTDCols := { "Autorizador", "Autorizacao", "Retorno", "Inutilizacao", "ConsStatus", "Status", "TempoMedio", "ConsCadastro", "RecepEventos" }
          aTDTags := {}
          cTDTags := ""
          for iTDTags = 1 to oTDTags:length
              // Traz a coluna TD
              cTDTag := XMLGet( "td", oTDTags:Item(iTDTags-1):xml )
              cTDTag := strTran( cTDTag, [<img src="imagens/], "" )
              cTDTag := strTran( cTDTag, [.png"/>], "" )
              cTDTag := strTran( cTDTag, [<span></span>], "-" )
              cTDTag := strTran( cTDTag, [bola_], "" )
              cTDTag := strTran( cTDTag, [_P], "" )
              if iTDTags = 1
                 ciTDTag := cTDTag
              endif
              cTDTags := cTDTags + ["] + alltrim(aTDCols[iTDTags]) + [":"] + cTDTag + ["] + iif(iTDTags=9,[],[,] + CRLF )
              aadd( aTDTags, cTDTag )
          next
          cTRTags := cTRTags + [{] + CRLF + cTDTags + CRLF + [}] + iif(iTRTags=oTRTags:length,[],[, ] + CRLF )
          aadd( aTRTags, aTDTags )
      next
      // ---------- Padrao de Pesquisa
      cAutorizador  := VerifyINI( "SEFAZ", "autorizador" , "SP", cPathRaiz+"\DEVELOP.ini", .F. )
      cOperacao     := VerifyINI( "SEFAZ", "operacao"    , 6   , cPathRaiz+"\DEVELOP.ini", .F. )
      // ---------- 1-Autorizador, 2-Autorizacao, 3-Retorno, 4-Inutilizacao, 5-ConsStatus, 6-Status, 7-TempoMedio, 8-ConsCadastro, 9-RecepEventos

      nTPos := AScan( aTRTags, { | e | e[1] == cAutorizador } ) // Pega todos os status do autorizador configurado
      cAutorizacao  := VerifyINI( "SEFAZ", "Autorizacao" , aTRTags[nTPos,2], cPathRaiz+"\DEVELOP.ini", .F. )
      cRetorno      := VerifyINI( "SEFAZ", "Retorno"     , aTRTags[nTPos,3], cPathRaiz+"\DEVELOP.ini", .F. )
      cInutilizacao := VerifyINI( "SEFAZ", "Inutilizacao", aTRTags[nTPos,4], cPathRaiz+"\DEVELOP.ini", .F. )
      cConsStatus   := VerifyINI( "SEFAZ", "ConsStatus"  , aTRTags[nTPos,5], cPathRaiz+"\DEVELOP.ini", .F. )
      cStatus       := VerifyINI( "SEFAZ", "Status"      , aTRTags[nTPos,6], cPathRaiz+"\DEVELOP.ini", .F. )
      cTempoMedio   := VerifyINI( "SEFAZ", "TempoMedio"  , aTRTags[nTPos,7], cPathRaiz+"\DEVELOP.ini", .F. )
      cConsCadastro := VerifyINI( "SEFAZ", "ConsCadastro", aTRTags[nTPos,8], cPathRaiz+"\DEVELOP.ini", .F. )
      cRecepEvento  := VerifyINI( "SEFAZ", "RecepEvento" , aTRTags[nTPos,9], cPathRaiz+"\DEVELOP.ini", .F. )
      //
      oWnd:oMsgBar:DelItem( oMsgItemCFaz )
      oMsgItemCFaz :=  TMsgItem():New(oWnd:oMsgBar,,24,,,,.t.,,"level1",, "Informa SEFAZ status" )
      oMsgItemCFaz:Refresh() 
   endif
   SysRefresh()
   HB_GCALL( .T. ) // limpar o lixo na memoria .F. so se tiver lixo
   //MemoryFlush()
   RETURN nil

FUNCTION IsInternete()
   LOCAL cIp, cVret := .F.
   WsaStartUp()
   cIp := GETHOSTBYNAME( "microsoft.com" )
   cIp := GETHOSTBYNAME( "microsoft.com" )
   WsaCleanUp()
   // Seguranca caso o provedor da microsoft esteja fora do ar...
   IF ( cIp <= "0.0.0.0" )
      WsaStartUp()
      cIp := GetHostByName( "google.com" )
      cIp := GetHostByName( "google.com" )
      WsaCleanUp()
   ENDIF
   MsgRun( cIp )
   RETURN( cIp<>"0.0.0.0" )

FUNCTION IEGetSEFAZ( _uf_, _operacao_, _lista_ )
    LOCAL aList := { ;
       { "BA", "verde", "verde", "verde", "verde", "verde", "verde", "verde", "verde" } , ;
       { "RJ", "verde", "verde", "verde", "verde", "verde", "verde", "verde", "verde" } , ;
       { "SP", "verde", "verde", "verde", "verde", "verde", "verde", "verde", "verde" } , ;
       { "MG", "verde", "verde", "verde", "verde", "verde", "verde", "verde", "verde" } , ;
       { "PR", "verde", "verde", "verde", "verde", "verde", "vermelho", "verde", "verde" } }
    DEFAULT _lista_ := aList
    cResName := "verde"
    IF ( nPos := AScan( _lista_, { | e | e[1] == _uf_ } ) ) != 0
         _cBola_ := _lista_[ nPos, _operacao_ ]
         aCORList := { ;
                     { "verde"   , "LEVEL1" } , ;
                     { "vermelho", "LEVEL2" } , ;
                     { "amarela" , "LEVEL3" } }
       IF ( nCPos := AScan( aCORList, { | e | e[1] == _cBola_ } ) ) != 0
          cResName := strtran( cPathRaiz+"\imagens\" + aCORList[ nCPos, 2 ] + ".bmp", "\\", "\" )
          cResName := aCORList[ nCPos, 2 ]
       ENDIF
       IF !("verde" $ aCORList[ nCPos, 2 ]) // Forcando contingencia
          //VerifyINI( "Geral", "ForcaContingencia", "S", cPathRaiz+"\nfw.ini", .T. )
          VerifyINI( "SEFAZ", "Status", "OFF", cPathRaiz+"\nfw.ini", .T. )
       ELSE
          //VerifyINI( "Geral", "ForcaContingencia", "N", cPathRaiz+"\nfw.ini", .T. )
          VerifyINI( "SEFAZ", "Status", "ON", cPathRaiz+"\nfw.ini", .T. )
       ENDIF
    ENDIF
    RETURN { _cBola_, cResName, _lista_ } 

/* ********************************
    if file("DSPNBLDD.DBF")
    use DSPNBLDD shared
    do while .not. eof()
       if _uf_ $ DSPNBLDD->Autorizado // := aTRTags[i,1]
          if _operacao_ = 2 ; _cBola_ := alltrim( DSPNBLDD->Autorizaca ) ; exit ; endif // := aTRTags[i,2]
          if _operacao_ = 3 ; _cBola_ := alltrim( DSPNBLDD->Retorno    ) ; exit ; endif // := aTRTags[i,3]
          if _operacao_ = 4 ; _cBola_ := alltrim( DSPNBLDD->Inutilizac ) ; exit ; endif // := aTRTags[i,4]
          if _operacao_ = 5 ; _cBola_ := alltrim( DSPNBLDD->ConsStatus ) ; exit ; endif // := aTRTags[i,5]
          if _operacao_ = 6 ; _cBola_ := alltrim( DSPNBLDD->Status     ) ; exit ; endif // := aTRTags[i,6]
          if _operacao_ = 7 ; _cBola_ := alltrim( DSPNBLDD->TempoMedio ) ; exit ; endif // := aTRTags[i,7]
          if _operacao_ = 8 ; _cBola_ := alltrim( DSPNBLDD->ConsCadast ) ; exit ; endif // := aTRTags[i,8]
          if _operacao_ = 9 ; _cBola_ := alltrim( DSPNBLDD->RecepEvent ) ; exit ; endif // := aTRTags[i,9]
       endif
       dbSkip()
    enddo
    use // DSPNBLDD // verde-LEVEL1 vermelho-LEVEL2 amarela-LEVEL3
    else
       _bar_:SetText( "Nao encontrei DSPNBLDD.DBF" )
       _bar_:Refresh()
    endif
    RETURN "\sistemas\contrib\tsbrowse\bitmaps\" + iif(_cBola_="amarela","LEVEL3",iif(_cBola_="vermelho","LEVEL2",iif(_cBola_="verde","LEVEL1","LEVEL1"))) + ".bmp" 
    ******************************** */

Function XMLGet( XMLField, XMLFile )
   XMLField    := alltrim( XMLField )
   XMLFieldINI := At( "<"+XMLField+">", XMLFile ) + len( "<"+XMLField+">" ) 
   XMLFieldEND := At( "</"+XMLField+">", XMLFile ) - XMLFieldINI
   return substr( XMLFile, XMLFieldINI, XMLFieldEND )

Function XMLGetFull( XMLField, XMLFile, lXMLFull, XMLCompl )
   default lXMLFull := .f., XMLCompl := ""
   XMLField    := alltrim( XMLField )
   XMLFieldINI := At( [<]+XMLField+XMLCompl, XMLFile )
   XMLFieldEND := At( XMLField+[>], substr( XMLFile, XMLFieldINI, len( XMLFile ) - XMLFieldINI ) )
   return iif( !lXMLFull, "", "<"+XMLField+">" ) + substr( XMLFile, XMLFieldINI, XMLFieldEND + len(XMLField) ) + iif( !lXMLFull, "", "</" + XMLField + ">" )

function VerifyINI( _section_, _entry_, _var_, _inifile_, _grava_ )
   oIni := TIni():New( _inifile_ )
   if _grava_ = nil; _grava_ := .f.; endif
   if _grava_ = .t.
      oIni:Set( _section_, _entry_, _var_ )
   endif
   return oIni:Get( _section_, _entry_, _var_, _var_ )
Aqui se usa os bitmaps bola amarela, vermelha e verde contidas na pasta imagens do Fivewin.

Na configuração da barra de status do meu sistema acrescentei o semaforo de bitmaps e ativei um timer para verificar de tempos em tesmpos a situação.

Código: Selecionar todos

          SET MESSAGE OF oWnd TO NewCapFirst(alltrim(Cl_Nome)+" - "+alltrim(Cl_Endereco)+" - Telefone: "+alltrim(Cl_Telefone)) // 2007 // NOINSET KEYBOARD CLOCK DATE // CENTERED
          ...
          DEFINE MSGITEM oMsgItemCFaz OF oWnd:oMsgBar SIZE  24 BITMAPS "level2" TOOLTIP "Informa SEFAZ status"
          oWnd:oMsgBar:ClockOn()
          oWnd:SetFont( FntWindow ) 
          oWnd:SetMenu( oMenu2 )
          ...
          DEFINE TIMER oTmrItemCFaz OF oWnd INTERVAL 20000 ACTION ( SefazStatus(oMsgItemCFaz) ) // Checa status SEFAZ
          ACTIVATE TIMER oTmrItemCFaz

Faça uma análise e veja se compensa a implementação.

@braços à todos.
OPS! LINK QUEBRADO? Infelizmente links para www.pctoledo.COM.BR irão quebrar pois o Forum se foi, assim como nosso célebre Irmão de Bits Toledo. Ainda assim me ENVIE seu email com link do tópico encontrado na Web para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url] e tentarei lembrar do que se tratava. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder