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

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

Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

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

Mensagem por Itamar M. Lins Jr. »

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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem por JoséQuintas »

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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem por JoséQuintas »

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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem por JoséQuintas »

libcurl1.png
libcurl2.png
janeiro/2016, significa MAIS DE CINCO ANOS.

Sem mais comentários.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

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

Mensagem por NiltonGM »

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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem por JoséQuintas »

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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem por JoséQuintas »

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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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/
Fernando queiroz
Usuário Nível 4
Usuário Nível 4
Mensagens: 779
Registrado em: 13 Nov 2014 00:41
Localização: Porto Alegre/RS

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

Mensagem por Fernando queiroz »

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:

Código: Selecionar todos

************************************************************************************************************************************************************************************************************************
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

Código: Selecionar todos

************************************************************************************************************************************************************************************************************************
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

Código: Selecionar todos

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
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem por JoséQuintas »

É só comentário:

Se criar uma classe por herança, contendo outras coisas, elimina toda essa repetição.
Apenas exemplo:

Código: Selecionar todos

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:

Código: Selecionar todos

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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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/
Responder