Clipper On Line • Ver Tópico - SeFaz Class e ACBrLib não foram feitas para Servidores Linux

SeFaz Class e ACBrLib não foram feitas para Servidores Linux

Discussão sobre desenvolvimento de software para atender as exigências da legislação fiscal e tributária (ECF, TEF, SINTEGRA, NF-e, ECD, EFD, etc.)

Moderador: Moderadores

 

SeFaz Class e ACBrLib não foram feitas para Servidores Linux

Mensagempor Itamar M. Lins Jr. » 29 Jun 2021 20:30

Olá!
Não entendi merd. nenhuma....

Ele está usando um servidor remoto e não tem como usar uma GUI.
Como se fosse somente DOS. 6.22 por exemplo. Só tem o TERMINAL(nCurses ou Slang) só caractere.
Ele loga em um terminal e fica restrito no ambiente, provavelmente via SSH. tipo o PUTTY que vc usa.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6960
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 313 vezes
Mens.Curtidas: 508 vezes

SeFaz Class e ACBrLib não foram feitas para Servidores Linux

Mensagempor JoséQuintas » 30 Jun 2021 13:29

Melhor expandir:

Não entendi aonde entra Harbour nessa história.
Não entendi aonde entra VPS nessa história.
Não entendi aonde entra Linux nessa história.
Quem disse que precisa disso?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18161
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

SeFaz Class e ACBrLib não foram feitas para Servidores Linux

Mensagempor JoséQuintas » 03 Jul 2021 13:39

tecnologia muda constantemente, a maneira de trabalhar com redes e servidores mudou também, constantemente bato nessa tecla no forum do ACBrLib, (sou assinante), infelizmente eles não cortaram o cordão umbilical com Delphi que os prendem a servidores em redes locais. Isso não é só com eles, nós também em Harbour, ficamos presos no mundo Windows e sua maravilhosa GUI, mas o mundo CLOUD é Linux CentOS Server, Ubuntu Server... Minha maior dificuldade é conseguir uma biblioteca (paga ou Open Source) que rode em Linux sem GUI em servidores Cloud (VPS). Antes que alguém diga: "Ah, ACBrLib tem suas DLL's para Linux", tem sim, mas são para Desktop com interface gráfica (GUI), ninguém conseguiu fazer ACBrLib rodar 100% em servidores Linux sem GUI porque suas dependências dependem da GUI, como o report Fort.


Até aqui, tá esquisito, porque isso já existe.

Por isso, faço um convite (ou seria um desafio?) ao nosso amigo Zeh (José Quintas) e/ou qualquer um com conhecimentos necessários a desenvolver a SeFaz Class em Linux (Ubuntu Server que é o mais comum e fácil), uma SeFaz Class que não dependesse das DLL's da Microsoft para se conectar com a Sefaz. Se a Sefaz class rodasse em Linux eu faria um aplicativo monitor que rodasse como um serviço no Linux, monitoraria uns diretórios e qualquer XML ou JSON colocado lá com algumas instruções em arquivos JSON, o hb-monitor faria a emissão do DFe (bem semelhante ao ACBrMonitor). Qualquer aplicação para web em qualquer linguagem poderia usar o hb-monitor para emissão de DFe.


Aqui, tá esquisito: não é que precisa, apenas não quer Windows.
E nem sabe mexer com Linux, o que deixa tudo mais esquisito ainda.
Tá procurando uma LIB para o que NÃO SABE mexer, e não para o que sabe mexer.

O mais idiota isso.... é pensar em fazer um aplicativo WEB monitorando pastas/diretórios
Parece que não entende nem de Linux, e nem de nota eletrônica.

Dificuldade: É quase impossível fazer uma aplicação em Harbour rodar como um serviço em um servidor Linux, estou apanhando muito, os colaboradores do Harbour até tentaram uma solução para me ajudar, mas muito complexa para fazer essa mágica acontecer, de modo que para um usuário DEV comum que só quer fazer uma aplicação iniciar como um serviço, torna-se demasiadamente complexa em um serviço em Harbour. https://github.com/harbour/core/issues/248
Talvez alguém aqui tenha conhecimentos suficientes para tornar isso possível e mais fácil.


Aqui... não sabe rodar como serviço no Linux, mas.... porque merd. rodar como serviço?

Falando de Web:
PHP tem uma boa classe para NFe, PHP não é minha praia e a comunidade de PHP não é muito de compartilhar, quem lapidou essa classe guardou para si e a maioria são programadores de empresas que ganham $ com APIs.
Python, tem algumas classes, a maioria inacabada porque não há ninguém usando em produção e em larga escala, tentei usar, é preciso mexer em tudo, praticamente teria que começar do zero porque dar manutenção onde você não domina bem a linguagem não é fácil.


Aqui, tem classe pra nota eletrônica e tudo mais em PHP.
Além de estar tudo disponível e atualizado, ainda fala que os programadores são egoístas.

Para resolver meu problema rapidamente é só eu usar um servidor Windows em uma VPS em nuvens, eu resolveria o meu problema, mas não o da maioria, porque a diferença de preço é gritante, veja:
VPS VM VALOR/MÊS RAM SSD vCPU
Linux VPS 4 R$ 90,00 4 GB 80 GB 2
Windows VPS 4 R$ 213,00 4 GB 110 GB 2 ** IDEAL A VPS 8 R$ 347,00/MÊS


Aonde entra VPS nessa história?
Porque uma máquina rodando na WEB?

Juntando tudo, parece que está querendo fornecer o serviço pra outras pessoas.

Bom... das duas uma: ou está trabalhando pra ganhar menos de 347 por mês, ou tá querendo economizar até pra desenvolver, de preferência alguém que pense e faça por ele.

Como eu já disse por aqui:
Liberei os fontes da Sefazclass porque estava de lado, os clientes preferiam o programa do governo.
Na época, SEM GASTAR UM TOSTÃO, e SEM COBRAR NADA DE NINGUÉM, autorizava tudo via WEB.

Nada de ficar monitorando pasta, nada de usar disco, nada de servidor particular.

Então.... sei lá...

Parece que está com a faca e o queijo na mão, mais geléia, presunto... mas a empregada não veio hoje pra fazer o café...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18161
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

SeFaz Class e ACBrLib não foram feitas para Servidores Linux

Mensagempor JoséQuintas » 07 Jul 2021 22:05

libcurl1.png


libcurl2.png


janeiro/2016, significa MAIS DE CINCO ANOS.

Sem mais comentários.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18161
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

SeFaz Class e ACBrLib não foram feitas para Servidores Linux

Mensagempor NiltonGM » 16 Jul 2021 14:09

JoséQuintas escreveu:De forma direta e objetiva:

Não entendi merd. nenhuma....

Nem sequer entendi se o Harbour entra no meio dessa história toda.


Tem razão José Quintas, você não entendeu merd@ nenhuma! São tantas as coisas que você não entendeu que nem vale a pena explicar, demandaria muita energia. Esquece isso tudo e vamos deixar para lá, até mesmo porque já resolvi com uma turminha dev de Golang e começamos a ganhar dinheiro juntos com essa API e não é R$ 300,00, são R$ 160,00 por desenvolvedor que estão utilizando para seus ERP's, em alguns dias um pouco mais de 100 dev's, logo nível Brasil. Ainda bem que me tratou de forma desrespeitosa, é bom saber o que está no coração da pessoa antes de propormos negócios, e eu te chamando de "ilustre".
Abraços e te desejo sucesso com sua classe.
Nilton Medeiros
nilton@sistrom.com.br
Avatar de usuário

NiltonGM
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 393
Data de registro: 05 Jun 2014 23:47
Cidade/Estado: Caieiras/SP
Curtiu: 249 vezes
Mens.Curtidas: 25 vezes

SeFaz Class e ACBrLib não foram feitas para Servidores Linux

Mensagempor JoséQuintas » 16 Jul 2021 17:09

Nilton GM escreveu:Por isso, faço um convite (ou seria um desafio?) ao nosso amigo Zeh (José Quintas) e/ou qualquer um com conhecimentos necessários

nilton GM escreveu: é bom saber o que está no coração da pessoa antes de propormos negócios


Isso era uma proposta de negócios?

Nilton GM escreveu:já resolvi com uma turminha dev de Golang e começamos a ganhar dinheiro juntos com essa API e não é R$ 300,00, são R$ 160,00 por desenvolvedor que estão utilizando para seus ERP's, em alguns dias um pouco mais de 100 dev's. Ainda bem que me tratou de forma desrespeitosa


Acabou seguindo tudo que eu falei, de gastar dinheiro, de não precisar ficar monitorando disco, etc.

100 desenvolvedores a 160 reais, 16.000 reais.

A meu ver, não fui desrespeitoso, pelo contrário, acelerei o processo de você enxergar as coisas.
A sua intenção era economizar 150 reais, acho que agora os 150 reais nem fazem diferença.
Fico contente de saber que ajudei nisso, indiretamente.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18161
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

SeFaz Class e ACBrLib não foram feitas para Servidores Linux

Mensagempor JoséQuintas » 17 Jul 2021 11:57

NiltonGM escreveu:Ainda bem que me tratou de forma desrespeitosa,

NiltonGM escreveu:começamos a ganhar dinheiro juntos com essa API e não é R$ 300,00, são R$ 160,00 por desenvolvedor


Faltou esta.....

Pedir um recurso que a LIB já mostra como fazer....

Do começo ao fim, só falou de ACBR.
Não está nem aí pra Sefazclass, queria apenas um substituto pro ACBR sem nem olhar o que a Sefazclass tem.
Isso sim, é muito desrespeitoso.

TEM ROTINA PRA LINUX na Sefazclass há quase DEZ ANOS.
Só falta o detalhe da assinatura.
Usuário Linux deve saber sobre isso.

Quem quiser fazer a mesma coisa, faça o seguinte:
Contrate uma hospedagem MySQL, que qualquer hospedagem de site já tem, por 50 reais.
E coloque qualquer máquina Windows acessando o MySQL e autorizando notas, usando SefazClass, totalmente grátis.
Quando eu dizia que não entendia.... era por isso... não precisa nada do que aparece no post.


E quem quiser ajuda pra usar Sefazclass no Harbour.... é só pedir.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18161
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

SeFaz Class e ACBrLib não foram feitas para Servidores Linux

Mensagempor Fernando queiroz » 17 Jul 2021 13:47

E quem quiser ajuda pra usar Sefazclass no Harbour.... é só pedir.


Tamo junto, ja uso a bastante tempo, o Quintas deu as dicas de uso e hoje ajudo em algumas alterações

muito fácil a utilização, e não precisa daquelas parafernálias da ACBr

Com o uso do MariaDB ja trago os dados no formato que vou gerar o XML e fica facil de montar tudo ex:

************************************************************************************************************************************************************************************************************************
METHOD EMITENTE( oQuery3 ) CLASS DANFECLASS
************************************************************************************************************************************************************************************************************************
LOCAL  cXml;

   IF ! oQuery3:Eof()
      cXml := '<emit>'
      cXml += XmlTag( 'CNPJ', ALLTRIM(oQuery3:Fields( "n_CNPJ" ):Value) )
      cXml += XmlTag( 'xNome', rtrim(TIRACENTO(oQuery3:Fields( "n_xNome" ):Value)) )      
      cXml += XmlTag( 'xFant', RTRIM(TIRACENTO(oQuery3:Fields( "n_xFant" ):Value)) )      
      cXml += '<enderEmit>'
      cXml += XmlTag( 'xLgr', rtrim(TIRACENTO(oQuery3:Fields( "n_xLgr" ):Value)) )
      cXml += XmlTag( 'nro', rtrim(oQuery3:Fields( "n_nro" ):Value) )      
      IF ! EMPTY(oQuery3:Fields( "n_xCpl" ):Value)
         cXml += XmlTag( 'xCpl', rtrim(oQuery3:Fields( "n_xCpl" ):Value) )   
      ENDIF      
      cXml += XmlTag( 'xBairro', rtrim(oQuery3:Fields( "n_xBairro" ):Value) )
      cXml += XmlTag( 'cMun', oQuery3:Fields( "n_cMun" ):Value )      
      cXml += XmlTag( 'xMun', rtrim(oQuery3:Fields( "n_xMun" ):Value) )   
      cXml += XmlTag( 'UF', oQuery3:Fields( "n_xUF" ):Value )
      cXml += XmlTag( 'CEP', oQuery3:Fields( "n_CEP" ):Value )
      cXml += XmlTag( 'cPais', oQuery3:Fields( "n_cPais" ):Value )
      cXml += XmlTag( 'xPais', rtrim(oQuery3:Fields( "n_xPais" ):Value) )
      cXml += XmlTag( 'fone', rtrim(oQuery3:Fields( "n_fone" ):Value) )
      cXml += '</enderEmit>'
      cXml += XmlTag( 'IE', rtrim(oQuery3:Fields( "n_IE" ):Value) )
      cXml += XmlTag( 'CRT', oQuery3:Fields( "n_CRT" ):Value )
      cXml += '</emit>'      
   else
      RETURN "ERRO"
   ENDIF

RETURN    cXml


************************************************************************************************************************************************************************************************************************
METHOD DESTINATARIO( oQuery1 ) CLASS DANFECLASS
************************************************************************************************************************************************************************************************************************
LOCAL  cXml;

   IF ! oQuery1:Eof()
      cXml := '<dest>'
      
      IF LEN(ALLTRIM(oQuery1:Fields( "e_cnpj" ):Value)) > 11
         cXml += XmlTag( 'CNPJ', ALLTRIM(oQuery1:Fields( "e_cnpj" ):Value) )
      ELSE
         cXml += XmlTag( 'CPF', ALLTRIM(oQuery1:Fields( "e_cnpj" ):Value) )
      ENDIF
   
      cXml += XmlTag( 'xNome', rtrim(TIRACENTO(oQuery1:Fields( "e_xnome" ):Value)) )
      cXml += '<enderDest>'
      cXml += XmlTag( 'xLgr', rtrim(TIRACENTO(oQuery1:Fields( "e_xlgr" ):Value)) )
      cXml += XmlTag( 'nro', rtrim(oQuery1:Fields( "e_nro" ):Value) )
      IF ! EMPTY(oQuery1:Fields( "e_xcpl" ):Value)
         cXml += XmlTag( 'xCpl', rtrim(oQuery1:Fields( "e_xcpl" ):Value) )
      ENDIF
      cXml += XmlTag( 'xBairro', rtrim(oQuery1:Fields( "e_xbairr" ):Value) )
      cXml += XmlTag( 'cMun', rtrim(oQuery1:Fields( "e_cmun" ):Value) )
      cXml += XmlTag( 'xMun', rtrim(oQuery1:Fields( "e_xmun" ):Value) )
      cXml += XmlTag( 'UF', oQuery1:Fields( "e_UF" ):Value )
      IF ! EMPTY(SoNumeros( oQuery1:Fields( "e_CEP" ):Value ))
         cXml += XmlTag( 'CEP', SoNumeros( oQuery1:Fields( "e_CEP" ):Value ) )
      ENDIF
      cXml += XmlTag( 'cPais', oQuery1:Fields( "e_cpais" ):Value )            
      cXml += XmlTag( 'xPais', rtrim(oQuery1:Fields( "e_xpais" ):Value) )
      if ! EMPTY(oQuery1:Fields( "e_fone" ):Value)
         cXml += XmlTag( 'fone', rtrim(oQuery1:Fields( "e_fone" ):Value) )
//      else
//         cXml += XmlTag( 'fone', "" )
      ENDIF
      cXml += '</enderDest>'
      cXml += XmlTag( 'indIEDest', oQuery1:Fields( "e_indie" ):Value  )
      if ! EMPTY(oQuery1:Fields( "e_IE" ):Value)
         cXml += XmlTag( 'IE', rtrim(oQuery1:Fields( "e_IE" ):Value)  )
      ENDIF
      if ! EMPTY(oQuery1:Fields( "e_ISUF" ):Value)
         cXml += XmlTag( 'ISUF', rtrim(oQuery1:Fields( "e_ISUF" ):Value)  )      
      ENDIF
      if ! EMPTY(oQuery1:Fields( "e_IM" ):Value)
         cXml += XmlTag( 'IM', rtrim(oQuery1:Fields( "e_IM" ):Value)  )
      ENDIF   
      if ! EMPTY(oQuery1:Fields( "e_EMAIL" ):Value)            
         cXml += XmlTag( 'email', rtrim(oQuery1:Fields( "e_EMAIL" ):Value)  )   
      ENDIF      
      cXml += '</dest>'
   else
      RETURN "ERRO"
   ENDIF
      
RETURN cXml


criei um metodo para cada parte e depois se nao tiver nenhum ERRO junto os pedaços assino e envio e testo se o retorno foi ok ou nao

cXmlDocumento    := ( cIDENTIFICACAO + cEMITENTE + cDESTINATARIO;
               + cITENS_TRIBUTACAO + cTRANSPORTE;
               + cPAGAMENTO + cINF_ADICIONAIS)

   oDlg:oProgressbar1:Set(,60)
   oDlg:oLabel25:SetText("Assinando NF-e                                           ")
   
   oSefaz              := SefazClass():New()
   oSefaz:cUF          := oQuery3:Fields( "n_xUF" ):Value
   oSefaz:cAmbiente    := oQuery3:Fields( "n_tpAmb" ):Value      
   oSefaz:cCertificado := cCertificado

   oDlg:oProgressbar1:Set(,80)
   oDlg:oLabel25:SetText("Aguardando Retorno                                                ")

   oSefaz:NFEloteenvia( cXmlDocumento )

   IF ! oSefaz:cStatus $ "100,101,150,301,302"
      oDlg:oLabel25:SetText(oSefaz:cMotivo)
      hwg_MsgInfo(oSefaz:cStatus + oSefaz:cMotivo)

      cQuery1:="SELECT arquivoxml.ARQUIVOXML_ID, arquivoxml.NOME, arquivoxml.FICHEIRO FROM arquivoxml WHERE arquivoxml.NOME = '" +  ::a_Id + ".xml'"
      oQuery2:= CONECCOESCLASS():ExecuteSQL(::oServer, cQuery1)
      IF oQuery2:Eof()
         cQuery1   :="INSERT INTO ARQUIVOXML ( "
         cQuery2   :=" VALUES ("
         cQuery1 += "arquivoxml.NOME, "
         cQuery2   += "'" + ::a_Id + ".XML', "      
         cQuery1 += "arquivoxml.FICHEIRO) "
         cQuery2   += "'" + oSefaz:cXmlDocumento + "') "            
         CONECCOESCLASS():ExecuteSQL(::oServer, cQuery1 + cQuery2 )
      else
         cQuery1:="UPDATE ARQUIVOXML SET "
         cQuery1+="arquivoxml.FICHEIRO = '" + oSefaz:cXmlDocumento +  "' "
         cQuery1+="WHERE arquivoxml.ARQUIVOXML_ID = '" + STRZERO(oQuery2:Fields( "ARQUIVOXML_ID" ):Value,11,0) +  "' "
         CONECCOESCLASS():ExecuteSQL(::oServer, cQuery1)            
      ENDIF
   ELSE
      oDlg:oLabel25:SetText(oSefaz:cStatus + oSefaz:cMotivo)

      cQuery1:="UPDATE DANFE SET "
      cQuery1+="danfe.B_DHEMI   = '" + XmlNode(oSefaz:cXmlAutorizado, "dhEmi") +  "', "
      cQuery1+="danfe.FL_SITUAC = '" + XmlNode(oSefaz:cXmlAutorizado, "cStat") +  "', "
      cQuery1+="danfe.FL_MOTIVO = '" + XmlNode(oSefaz:cXmlAutorizado, "xMotivo") +  "' "
      cQuery1+="WHERE danfe.PEDIDOS_ID = '" + STRZERO(NUMNOT,11,0) + "'"
      CONECCOESCLASS():ExecuteSQL(::oServer, cQuery1)

      cQuery1:="SELECT arquivoxml.ARQUIVOXML_ID, arquivoxml.NOME, arquivoxml.FICHEIRO FROM arquivoxml WHERE arquivoxml.NOME = '" +  ::a_Id + ".xml'"
      oQuery2:= CONECCOESCLASS():ExecuteSQL(::oServer, cQuery1)
      IF oQuery2:Eof()
         cQuery1   :="INSERT INTO ARQUIVOXML ( "
         cQuery2   :=" VALUES ("
         cQuery1 += "arquivoxml.NOME, "
         cQuery2   += "'" + ::a_Id + ".XML', "      
         cQuery1 += "arquivoxml.FICHEIRO) "
         cQuery2   += "'" + oSefaz:cXmlAutorizado + "') "            
         CONECCOESCLASS():ExecuteSQL(::oServer, cQuery1 + cQuery2 )
      else
         cQuery1:="UPDATE ARQUIVOXML SET "
         cQuery1+="arquivoxml.FICHEIRO = '" + oSefaz:cXmlAutorizado +  "' "
         cQuery1+="WHERE arquivoxml.ARQUIVOXML_ID = '" + STRZERO(oQuery2:Fields( "ARQUIVOXML_ID" ):Value,11,0) +  "' "
         CONECCOESCLASS():ExecuteSQL(::oServer, cQuery1)            
      ENDIF

      oDlg:oProgressbar1:Set(,90)
      oDlg:oLabel25:SetText("Gerando DANFE em PDF                                              ")   
      oSpedDa := hbNfeDaGeral():New()
      
      oSpedDa:ToPdf( oSefaz:cXmlAutorizado, "C:\TEMP\" + ::a_Id + ".PDF" )         

      oDlg:oProgressbar1:Set(,100)
      oDlg:oLabel25:SetText("NF-e Concluida com sucesso                                        ")

      IF .NOT. EMPTY(oQuery1:Fields( "e_eMAIL" ):Value)
         ::EMAIL_ENVIA( oQuery1, oQuery3, oSefaz)
      ENDIF

      WAPI_ShellExecute( NIL, "OPEN", "C:\TEMP\" + ::a_Id + ".PDF" ,"",NIL,5 )

   ENDIF


se der ou nao erro eu guardo o XML para verificar ele no site do validador para caso de erro
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
Fernando queiroz
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 737
Data de registro: 12 Nov 2014 23:41
Cidade/Estado: Porto Alegre/RS
Curtiu: 12 vezes
Mens.Curtidas: 58 vezes

SeFaz Class e ACBrLib não foram feitas para Servidores Linux

Mensagempor JoséQuintas » 17 Jul 2021 14:59

É só comentário:

Se criar uma classe por herança, contendo outras coisas, elimina toda essa repetição.
Apenas exemplo:
CREATE CLASS Outra INHERIT oQuery3
   METHOD String(cField, nLen )
   METHOD Number( nField, nDec )
ENDCLASS
METHOD String( cField, nLen ) CLASS oQuery3
   LOCAL cTxt
   hb_Default( @nLen, Len(::Fields(cField):Value) )
   cTxt := AllTrim( TiraAcento( ::Fields( cField ):Value ) )
   IF nLen != Nil
      cTxt := Pad( cTxt, nLen )
   ENDIF
   RETURN cTxt
METHOD Number( cField, nDec ) CLASS oQuery3
   hbDefault(@nDec,2)
   RETURN LTrim(Str(::Fields(cField):Value),16,nDec ))


Na hora de usar fica um fonte mais limpo:
Outra:String( "n_CNPJ" )
Outra:String( "n_xNome" )
Outra:String( "n_xFant" )
Outra:String( "n_xLgr" )
Outra:String( "n_UF", 2 )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18161
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Anterior



Retornar para Legislação Fiscal e Tributária

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 5 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro