Eu precisei substituir o uso da WSNFESBRA por questões de perfomance e também pelo mesmo tipo de reclamação, abaixo o que fiz para recuperar direto das tabelas do TSS:
o primeiro passo é identificar se as tabelas do TSS estão na mesma base do Protheus, se estiverem uma base separada você precisará usar o tclink ( https://thiagocoimbra.com.br/2016/04/16/usando-tclink-para-conectar-a-outra-base-de-dados/ ) para conectar e realizar queries.
é preciso lembrar que as tabelas do TSS não constam do SX2, então só será possível lê-las via embedded query com o desafio adicional de que os cmpos xml_sig e xml_prot são campos memo, ou seja, campos blob no banco.
para ler esses campos via query você precisará de abordagens diferentes conforme o banco que você usa, agora estamos muito longe do pai dbaccess :-D
Como ler campo memo em Oracle: https://qastack.com.br/programming/828650/how-do-i-get-textual-contents-from-blob-in-oracle-sql
Como ler campo memo em Sql Server: https://dba.stackexchange.com/questions/240441/sql-server-convert-blob-data-to-string
Após conseguir fazer a query nos campos blob do TSS é só seguir a receita de bolo abaixo para recuperar o xml assinado e protocolodo pelo Sefaz:
Inicie a string com o cabeçalho padrâo:
_cxml := '<?xml version="1.0" encoding="UTF-8"?>'
Então localize a NF na tabela SPED050 usando como filtro no where SPED050.DOCCHV = SF2010.F2_CHVNFE, não se preocupe, não tem SIX mas a SPED050 tem índice criado por padrão para o campo DOCCHV e o mesmo é chave única.
Desse registro, adicione o string que recuperar do campo XML_SIG ao _cxml que começou a monta acima, cuidado com o tamanho do string recuperado, pode chegar fácil em 20 kbytes, então puxe em quantos campos string precisar para garantir que vai recuperar todo string do campo blob.
Então faça uma nova query na tabela SPED054 filtrando no where por SPED054.NFE_CHV = SF2010.F2_CHVNFE, mais uma vez não se preocupe, que o NFE_CHV é chave única e índice na SPED054.
Então adicione o conteúdo do XML_PROT à sua variável e finalize o cabeçalho que incluiu no começo:
_cxml += ''
Não esqueça de voltar a conexão do tclink para a conexão padrão e na variável _cxml você tem o xml como se tivesse recuperado na tela do monitor de nfe.
Verifique se o xml que você está exportando está contido a tag de protocolo que está na SPED054. Aqui eu fiz uma função que utiliza o xml da SPED050 + o protocolo da SPED054 para gerar um xml válido e protocolado.
— Lucas Fidélis 02 de Jun de 2021