Pular para o conteúdo principal

Postagem em destaque

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️ Olá pessoal, Espero que este post encontre todos vocês bem! É com grande entusiasmo que compartilho que estou expandindo meus serviços como Desenvolvedor AdvPL para novos desafios e colaborações. Com mais de duas décadas de experiência sólida, minha jornada profissional tem sido enriquecedora, com a oportunidade de participar de projetos empolgantes ao longo dos anos. Agora, estou ansioso para trazer minha experiência e habilidades para novas equipes e projetos, trabalhando de forma remota. Minha expertise abrange não apenas AdvPL, mas também outras tecnologias-chave, incluindo JS, SQL, Infraestrutura e Otimização de Processos. Acredito que essa combinação de conhecimentos me permite oferecer soluções abrangentes e eficazes para uma variedade de necessidades de desenvolvimento. Acredito que a tecnologia tem o poder de transformar negócios e impulsionar o sucesso, e estou comprometido em ajudar meus clientes a alcançar seu

BlackTDN :: TSS, PostGreSQL e dbAccess Error -35

Davi Cunha, de Recife, enviou-nos a seguinte mensagem:

“…segue uma breve explicação do estado em que estamos com o erro do TSS. O servidor  está configurado e até enviando NF-e, porém, em determinado momento, o mesmo apresenta no modo console um erro (Erro -35) intermitente de comunicação com o Banco de Dados TSS. Percebi que isso começou a acontecer logo após a configuração dos certificados digitais de mais de uma empresa. Este erro faz com que o envio em determinadas notas, se prolongue mais que o esperado. Segue o link abaixo com um pequeno vídeo que salvei do momento inicial ao qual subo o serviço do TSS. …”

O Erro –35, segundo o TDN (Lista dos códigos de erros do TOTVS DBAccess), corresponde a:

-35

TCF_NoDBConnection

O database não pode ser acessado.

E esse erro nem sempre está relacionado ao Protheus, ao TSS ou ao dbAccess mas sim ao DBMS/SGBD. No Caso em questão ao PostGreSQL que não estava permitindo, ao dbAccess efetuar novas conexões.

Solicitamos que verificasse a “diretiva” max_connections no arquivo postgresql.conf (que no caso estava definida como 100) pois ali estava a,  provável, causa do Error –35. As conexões deveriam ter atingido o máximo permitido/configurado. Solicitamos que efetuasse o monitoramento das conexões ao PostGreSQL para identificar isso e, considerando que o DBMS estava instalado no Linux, recomendamos seguir as instruções do Link: Definindo a quantidade de conexões simultâneas no PostgreSQL e, consequentemente, aumentar o número máximo de conexões definidos em max_connections de acordo com a demanda.

Recomendamos a leitura de:

Para identificar as implicações na alteração da “diretiva” max_connections em relação às demais diretivas, como por exemplo: SHMMAX e shared_buffers.

Abaixo disponibilizamos um código em ADVPL para testar o limite de Conexões permitidas pelo DBMS/SGBD:

Interessado no original, clique aqui ou aqui.

Obs.: Atente-se às seguintes “Definições”:

#IFDEF __NALDO_PC
    #DEFINE TC_DBMS        "MSSQL/RNP"
    #DEFINE TC_PORT        7890
    #DEFINE TC_SERVER  "127.0.0.1"
#ELSE
    #DEFINE TC_DBMS        "POSTGRES/TSS"
    #DEFINE TC_PORT        7890
    #DEFINE TC_SERVER  "192.168.1.5"
#ENDIF

#DEFINE TC_MAXCONNECTION 10000

São a partir delas que os testes são efetuados. Altere-as conforme a necessidade.

Eis o código:

   1: #IFDEF __NALDO_PC
   2:     #DEFINE TC_DBMS        "MSSQL/RNP"
   3:     #DEFINE TC_PORT        7890
   4:     #DEFINE TC_SERVER      "127.0.0.1"
   5: #ELSE
   6:     #DEFINE TC_DBMS        "POSTGRES/TSS"
   7:     #DEFINE TC_PORT        7890
   8:     #DEFINE TC_SERVER      "192.168.1.5"
   9: #ENDIF
  10:  
  11: #DEFINE TC_MAXCONNECTION 10000
  12:  
  13: /*
  14:     Programa    :    TCError35()
  15:     Autor       :    Marinaldo de Jesus [http://www.blacktdn.com.br]
  16:     Data        :    15/06/2011
  17:     Uso         :    Testar Limite de Conexoes ao DBMS
  18: */
  19: User Function TCError35()  
  20:  
  21:     Local aTCConnection     := Array(0)
  22:  
  23:     Local bError            := { |e| oError := e , BREAK(e) }
  24:     Local bErrorBlock       := ErrorBlock( bError )
  25:     
  26:     Local cDescription
  27:  
  28:     Local nTCConnection     := 0
  29:     Local nMaxConnection    := 0
  30:  
  31:     Local oError
  32:  
  33:     BEGIN SEQUENCE
  34:  
  35:         While ( ++nMaxConnection <= TC_MAXCONNECTION )
  36:             IF ( KillApp() )
  37:                 UserException( "[PROCNAME]["+ProcName()+"][MESSAGE RECEIVED][KILAPP]")
  38:             EndIF
  39:             nTCConnection    := TCLink( TC_DBMS , TC_SERVER , TC_PORT )
  40:             IF ( nTCConnection == -34 ) //TCF_TooManyUsers
  41:                 ConOut( "" )
  42:                 ConOut( "===============================================================" )
  43:                 ConOut( "" , "[TCLINK][TCF_TooManyUsers]["+LTrim(Str(nTCConnection))+"][RECONNECTING...]" , "" )
  44:                 ConOut( "===============================================================" )
  45:                 ConOut( "" )
  46:                 nTCConnection    := TCLink( "@!!@" + TC_DBMS , TC_SERVER , TC_PORT )
  47:             EndIF
  48:             IF ( nTCConnection == -35 ) //TCF_NoDBConnection
  49:                 UserException( "-35 TCF_NoDBConnection" )
  50:             EndIF
  51:             IF ( nTCConnection >= 0 )
  52:                 aAdd( aTCConnection , nTCConnection )
  53:                 ConOut( "" )
  54:                 ConOut( "===============================================================" )
  55:                 ConOut( "" , "[TCLINK]["+LTrim(Str(nTCConnection))+"]" , "" )
  56:                 ConOut( "===============================================================" )
  57:                 ConOut( "" )
  58:             EndIF
  59:         End While
  60:  
  61:         nTCConnection    := Len( aTCConnection )
  62:  
  63:         ConOut( "" )
  64:         ConOut( "===============================================================" )
  65:         ConOut( " [TC_MAXCONNECTION]["+LTrim(Str(TC_MAXCONNECTION))+"]" )
  66:         ConOut( " [TENTATIVAS DE CONEXAO]["+LTrim(Str(nMaxConnection))+"]" )
  67:         ConOut( " [CONEXOES ATIVAS]["+LTrim(Str(nTCConnection))+"]" )
  68:         ConOut( "===============================================================" )
  69:         ConOut( "" )
  70:  
  71:         aEval( aTCConnection , { |nTCLink| TCUnLink( nTCLink ) } )
  72:         aSize( aTCConnection , 0 )
  73:  
  74:     RECOVER
  75:  
  76:         IF ( ValType( oError ) == "O" )
  77:  
  78:             cDescription     := oError:Description
  79:             nTCConnection    := Len( aTCConnection )
  80:  
  81:             ConOut( "" )
  82:             ConOut( "===============================================================" )
  83:             IF ( "-35" $ cDescription )
  84:                 ConOut( " [ATENCAO][Excedeu o Numero de Conexoes ao DBMS]" )
  85:             EndIF
  86:             ConOut( " [TCWARNING]["+cDescription+"]" )
  87:             ConOut( " [TC_MAXCONNECTION]["+LTrim(Str(TC_MAXCONNECTION))+"]" )
  88:             ConOut( " [TENTATIVAS DE CONEXAO]["+LTrim(Str(nMaxConnection))+"]" )
  89:             ConOut( " [CONEXOES ATIVAS]["+LTrim(Str(nTCConnection))+"]" )
  90:             ConOut( "===============================================================" )
  91:             ConOut( "" )
  92:  
  93:         EndIF
  94:  
  95:         aEval( aTCConnection , { |nTCLink| TCUnLink( nTCLink ) } )
  96:         aSize( aTCConnection , 0 )
  97:  
  98:     END SEQUENCE
  99:     ErrorBlock( bErrorBlock )
 100:  
 101: Return( NIL )

É correto afirmar que o número de conexões apresentadas por esse exemplo corresponderão, única e tão somente, aos testes efetuados por ele. As conexões reais deverão ser obtidas via dbMonitor ou via gerenciador do DBMS/SGBD. O exemplo foi desenvolvido pressupondo a execução em modo “console” (Protheus) e de exclusividade (DBMS/SGBD).


TOTVS :: dbMonitor : Usuários Conectados


[]s
иαldσ dj

Comentários

  1. Naldo, você poderia me ajudar? Estou precisando colocar algumas url's no TSS para trabalhar com determinado webservice de uma prefeitura de cidade pequena que não é homologado pela Totvs. Você sabe onde configuro estes endereços?

    Att,

    Henrique

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

BlackTDN :: RLeg ~ Desvendando a Função ParamBox

Para quem precisar desenvolver uma interface de entrada de dados, coisa rápida, e não quer ter aquele trabalhão danado que todos já sabemos, o Protheus tem uma função que ajuda muito, é uma interface semelhante a função Pergunte, porém com muito mais opção de objeto de entrada de dados, alias até colocar o scrollbox desta interface com todos os objetos em outra MsDialog ou Wizard é simples. Vejam o exemplo abaixo, boa sorte! Rleg. //---------------------------------------------------------- // Função exemplo utilizando a função ParamBox() //---------------------------------------------------------- User Function xParamBox() Local aRet := {} Local aParamBox := {} Local aCombo := {"Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"} Local i := 0 Private cCadastro := "xParambox" // ---------------

Protheus :: Chamando Funções do Menu Diretamente e sem a Necessidade de Login

Ferne$ perguntou: "...é possível abrir alguma rotina do sistema sem solicitar login ao usuário, como por exemplo a rotina MATA010..." Sim Ferne$, é possível sim. Abaixo um Exemplo para a Chamada à função MATA010 sem a necessidade de Login no sistema. #INCLUDE "PROTHEUS.CH" #INCLUDE "TBICONN.CH" /*/ Funcao: MATA010Ex Data: 30/04/2011 Autor: Marinaldo de Jesus Descricao: Executar a Funcao MATA010 diretamente sem a necessidade de LOGIN no Protheus Sintaxe: 1 ) U_MATA010Ex ( Chamada diretamente na Tela de Entrada do Sistema ) ; ou 2 ) totvsclient.exe -q -p=u_MATA010Ex -a=01;01 -c=rnp_local -e=rnp -m -l ( Chamada Via Linha de Comando ) /*/ User Function MATA010Ex( cEmpFil ) Local aEmpFil Local bWindowInit := { || __Execute( "MATA010()" , "xxxxxxxxxxxxxxxxxxxx" , "MATA010" , "SIGAFAT" , "SIGAFAT", 1 , .T. ) } Local cEmp Local cFil Local cMod Local cModName := "SIGAFAT" DEFA

BlackTDN :: Customizando a interface de Login no Protheus e by You

A publicação “ BlackTDN :: By You e sua nova tela de login ”  de nosso amigo OBona deu o que falar e, em função disso, esse que a muito não vos escreve resolveu criar uma versão onde será possível personalizar, “por completo”, a tela de login no Protheus/by You. Considerando que OBona já havia “mapeado, identificado e customizado” as imagens peguei-as emprestadas para o exemplo que se segue: O primeiro passo para a customização “total” da interface de login do Protheus/by You será implementar o “Ponto de Entrada” ChgPrDir (Diretório de impressão) . Usaremos esse PE juntamente como programa U_FindMsObject.prg (apresentado pela primeira vez em: Protheus :: ADVPL : The Container : Presents Pandora's box ). Diferente do exemplo proposto por OBona, que substitui, durante o processo de compilação, as imagens padrões do sistema (excluindo-as) por imagens customizadas (com o mesmo nome) este novo exemplo mantém, no RPO, as imagens padrões adicionando novas imagens customizadas que serã