SPED Fiscal TXT

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

JUDIVAN CONTABIL
Usuário Nível 2
Usuário Nível 2
Mensagens: 55
Registrado em: 20 Mai 2011 07:42
Localização: IMACULADA-PB

SPED Fiscal TXT

Mensagem por JUDIVAN CONTABIL »

OLÁ COLEGAS

Gostaria de ajuda;
Quando mando gerar o arquivo txt do sped fiscal, os blocos C100, C170 e C190, gera da seguinte forma:

|C100|0|1|35587112000175|55|00|001|000124995|25140435587112000175550010001249951060292571|25042014|01052014|172,77|2|||172,77|9|||||||||||||
|C100|0|1|41080722000504|55|00|001|000055343|25140441080722000504550010000553431000553434|28042014|01052014|13145,50|2|||13145,50|9|||||||||||||
|C100|0|1|02437279000109|55|00|001|000019676|25140502437279000109550010000196761082620074|05052014|05052014|7050,00|2|||7050,00|9|||||||||||||
|C170|1|12||2,00000|CX|26,00||0|010|1403|||||||||||||||||||||||||||
|C170|2|6||2,00000|CX|20,00||0|010|1403|||||||||||||||||||||||||||
|C170|3|7||2,00000|CX|24,00||0|010|1403|||||||||||||||||||||||||||
|C190|010|1403||26,00|0,00|0,00|0,00|0,00|26,00|0,00||
|C190|010|1403||20,00|0,00|0,00|0,00|0,00|20,00|0,00||
|C190|010|1403||24,00|0,00|0,00|0,00|0,00|24,00|0,00||

como eu faço para gerar de acordo com txt do sped fiscal
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

SPED FISCAL TXT

Mensagem por fladimir »

Judivan, não entendi muito bem sua dúvida, poderia fornecer mais detalhes do problema?

[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
JUDIVAN CONTABIL
Usuário Nível 2
Usuário Nível 2
Mensagens: 55
Registrado em: 20 Mai 2011 07:42
Localização: IMACULADA-PB

SPED FISCAL TXT

Mensagem por JUDIVAN CONTABIL »

É porque no SPED FISCAL o formato do txt é o seguinte:

C100|0|1|35587112000175|55|00|001|000124995|25140435587112000175550010001249951060292571|25042014|01052014|172,77|2|||172,77|9|||||||||||||
|C170|1|12||2,00000|CX|26,00||0|010|1403|||||||||||||||||||||||||||
|C190|010|1403||26,00|0,00|0,00|0,00|0,00|26,00|0,00||
|C100|0|1|41080722000504|55|00|001|000055343|25140441080722000504550010000553431000553434|28042014|01052014|13145,50|2|||13145,50|9|||||||||||||
|C170|1|12||2,00000|CX|26,00||0|010|1403|||||||||||||||||||||||||||
|C190|010|1403||26,00|0,00|0,00|0,00|0,00|26,00|0,00||
|C100|0|1|02437279000109|55|00|001|000019676|25140502437279000109550010000196761082620074|05052014|05052014|7050,00|2|||7050,00|9|||||||||||||
|C190|010|1403||26,00|0,00|0,00|0,00|0,00|26,00|0,00||

e quando eu gero o txt, fica diferente ou seja fica assim:
|C100|0|1|35587112000175|55|00|001|000124995|25140435587112000175550010001249951060292571|25042014|01052014|172,77|2|||172,77|9|||||||||||||
|C100|0|1|41080722000504|55|00|001|000055343|25140441080722000504550010000553431000553434|28042014|01052014|13145,50|2|||13145,50|9|||||||||||||
|C100|0|1|02437279000109|55|00|001|000019676|25140502437279000109550010000196761082620074|05052014|05052014|7050,00|2|||7050,00|9|||||||||||||
|C170|1|12||2,00000|CX|26,00||0|010|1403|||||||||||||||||||||||||||
|C170|2|6||2,00000|CX|20,00||0|010|1403|||||||||||||||||||||||||||
|C170|3|7||2,00000|CX|24,00||0|010|1403|||||||||||||||||||||||||||
|C190|010|1403||26,00|0,00|0,00|0,00|0,00|26,00|0,00||
|C190|010|1403||20,00|0,00|0,00|0,00|0,00|20,00|0,00||
|C190|010|1403||24,00|0,00|0,00|0,00|0,00|24,00|0,00||
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

SPED FISCAL TXT

Mensagem por fladimir »

Ah entendi...

é q vc esta gerando primeiro os C100 cabeçalhos depois os C170 e depois os C190, ... o q vc tem q fazer é o seguinte, não sei como vc armazena os dados ai, suponhamos q vc grave suas notas fiscais em 2 tabelas, 01 para o cabeçalho e outra para os itens..., se for, vc tem q posicionar no primeiro registro do cabeçalho q satisfaça a condição do periodo q vc vai gerar o SPED e a partir dele gerar os itens e o agrupamento CSTXCFOPXICMS (C190), Exemplo (a grosso modo):

Nota 123 Total R$ 36,00
Itens da nota 123
ITEM A CFOP 1102 Valor 11,00 CST 000
ITEM B CFOP 1102 Valor 12,00 CST 000
ITEM C CFOP 1403 Valor 13,00 CST 060

Ai vc para no registro da nota 123 e gera o C100 dela, AI ANTES DE IR PARA A PROXIMA NOTA VC GERA OS C170 E OS C190, VEJA::

C170 ITEM A
C170 ITEM B
C170 ITEM C

C190 23,00 Referente CFOP1102 com CST 000
C190 13,00 Referente CFOP 1403 com CST 060

DEPOIS VC VAI PARA A PROXIMA NOTA E FAZ A MESMA LÓGICA ACIMA.

Agora se vc armazena de forma única as notas, então terá q tratar a situação exposta acima conforme sua realidade, exemplo

Estou Nota 123 (ai na mesma tabela tenho os itens)
nRegAtual := Tabela->(recno())
Ai vc pode criar um indice temporario filtrando a Nota 123 do periodo X do fornecedor Z
Ai gera os C170 e os C190

Depois reposiciona no nRegAtual.

Não sei se conseguiu entender, da uma analisada ai e qualquer coisa retorna aqui pra entendermos melhor tua realidade e ver o q conseguimos ajudar.

[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
JUDIVAN CONTABIL
Usuário Nível 2
Usuário Nível 2
Mensagens: 55
Registrado em: 20 Mai 2011 07:42
Localização: IMACULADA-PB

SPED FISCAL TXT

Mensagem por JUDIVAN CONTABIL »

É dessa forma que eu uso, a onde está o erro:

Código: Selecionar todos

**********************************************************
Function GeraBlocoC()
Local x ,nOk := 0
Local cPesq, _cPesq
Cen_tra('Selecionando Notas......')
        
SELECT ENTRADA

 *SET ORDER TO 1
 *     ENTRADA->(DBGOTOP())

Index on PERIODO+DATA to ENTRADA1
GO TOP
SEEK M->vMes
DO WHILE (PERIODO=M->vMes)

SELECT NOTA
*Index on PERIODO+DATA TO (M->CAMINHO+"\"+M->CODIGO+"\NOTA1")
Index on PERIODO+DATA TO NOTA1
DBSETORDER(1)            
  
Sele C100
Append Blank
Repla C100->Reg         With 'C100'
Repla C100->IndOper     With ALLTRIM(entrada->CONTA) //indicador do tipo de opercao->0-entrada e 1-saida
Repla C100->IndEmit     With ENTRADA->IND_EMIT          // Ver
Repla C100->CodPart     With ALLTRIM(STRZERO(Val(LimpaStr(ENTRADA->CNPJ_CPF)),14))
Repla C100->CodSit      With '00'
Repla C100->CodMod      With entrada->COD_MOD
Repla C100->Ser         With entrada->serie
Repla C100->NumDoc      With StrZero(val(entrada->nota),9)
Repla C100->chvnfe      With entrada->CHV_NFE
Repla C100->dtdoc       With entrada->d_doc
Repla C100->Dtes        With entrada->(LimpaStr(DATA))
Repla C100->vldoc       With entrada->VL_CONTABI
Repla C100->indpagto    With entrada->IND_PGTO
*Repla C100->vldesc     With entrada->vlr_Desco              //
*Repla C100->vlabatnt   With entrada->
Repla C100->vlmerc      With entrada->VL_CONTABI
Repla C100->indfrt      With entrada->IND_FRT              //
*Repla C100->vlfrt      With entrada->              //
*Repla C100->vlSeg      With entrada->
*Repla C100->vloutda    With entrada->ValorOutro
Repla C100->vlbcicms    With entrada->B_CALCULO
Repla C100->vlicms      With entrada->VL_ICMS
Repla C100->vlbcicmsst  With entrada->VLSUBT
Repla C100->vlicmsst    With entrada->IMPSUBT
Repla C100->vlipi       With entrada->IPI
*Repla C100->vlpis      With entrada->
*Repla C100->vlcofins   With entrada->
*Repla C100->vlpisst    With entrada->
*Repla C100->vlconfisst With entrada->
Sele entrada
cTpoRegUF := entrada->UF+Iif(C100->IndEmit=='0','E',"S")
//--- JAFFILTRO
cPesq := C100->CodPart+C100->NumDoc+C100->Ser
Skip+1
*CLOSE ENTRADA
Enddo
*******************************
SELECT NOTA
NOTA->(DBGOTOP())
*Index on PERIODO+DATA TO (M->CAMINHO+"\"+M->CODIGO+"\NOTA1")
Index on PERIODO+DATA TO NOTA1
*GO TOP
SEEK M->vMes
DO WHILE (PERIODO=M->vMes)
 IF TIPO_ES="E"
Sele C170
Append Blank
Repla C170->Reg          With 'C170'
Repla C170->numitem      With Alltrim(str(nota->nr_item))
Repla C170->Coditem      With Alltrim(str((nota->codigo)))
Repla C170->descricao    With Alltrim(nota->desc_compl)
Repla C170->qtd          With nota->quant_unid
Repla C170->unid         With Alltrim(nota->unid_med)
Repla C170->vlitem       With nota->vlr_item                         //
Repla C170->vldesc       With nota->vlr_desc
Repla C170->indmov       With nota->ind_movi
Repla C170->csticms      With nota->cstr_icms
Repla C170->cfop         With LimpaStr(nota->operacao)                         //
Repla C170->codnat       With ""
Repla C170->vlbcicms     With nota->vlr_bc_icm
Repla C170->Aliqicms     With nota->aliq_icmnf
Repla C170->vlicms       With nota->vlr_icms
Repla C170->vlbcicmsst   With nota->vlrbcicmst                         //
Repla C170->aliqst       With nota->aliq_stnf
Repla C170->vlicmsst     With nota->vlr_icm_st 
Repla C170->indapur      With nota->ind_apura                         //
Repla C170->cstipi       With nota->cst_ipinf                         //
Repla C170->codenq       With nota->cod_enqnf                       //
Repla C170->vlbcipi      With nota->vlr_bc_ipi                         //
Repla C170->aliqipi      With nota->aliq_ipinf
Repla C170->vlipi        With nota->vlr_ipi                         //
Repla C170->cstpis       With nota->cst_pisnf                         //
Repla C170->vlbcpis      With nota->vlr_bc_pis                         //
Repla C170->aliqpis      With nota->aliq_pisnf                         //
Repla C170->quantbcpis   With nota->q_bc_pis                         //
Repla C170->aliqpis      With nota->aliqpisr
Repla C170->vlpis        With nota->vlr_pis                         //
Repla C170->cstcofins    With nota->cst_cofinf                         //
Repla C170->vlbcconfis   With nota->vlr_bc_cof                         //
Repla C170->aliqconfis   With nota->aliq_cofin                         //
Repla C170->qtdbcconfi   With nota->quan_bc_co                         //
Repla C170->aliqconfis   With nota->aliqcofins
Repla C170->vlcofins     With nota->vlr_cofins                         //
Repla C170->codcta       With nota->cod_ctanf
Repla C170->JAFFiltro    With nota->_cPesq
Select NOTA
ENDIF
*Skip
*Enddo
NOTA->(DBSKIP())
ENDDO
**********************************************************
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

SPED FISCAL TXT

Mensagem por fladimir »

O erro esta nas linha 57 e 59, observe q vc vai para proxima nota (SKIP) no mesmo laço 59 (ENDDO), ou seja vc esta fazendo todos os C100 pra depois ir para o C170

Vc tem q antes de fazer o skip na nota fazer os c170 dessa nota e os c190 pra depois pular pra próxima...

Veja abaixo o teu código q eu dei uma reformulada pra vc entender a lógica, mas perceba q não esta concluído, vc como conhecedor das tabelas, estrutura de campos etc vai conseguir basear agora e fazer a alteração necessária.

Código: Selecionar todos

**********************************************************
Function GeraBlocoC()
   Local x ,nOk := 0
   Local cPesq, _cPesq
   Cen_tra('Selecionando Notas......')
    
   SELECT ENTRADA
   Index on PERIODO+DATA to ENTRADA1
   GO TOP
   SEEK M->vMes
   DO WHILE (PERIODO=M->vMes)

      SELECT NOTA
      *Index on PERIODO+DATA TO (M->CAMINHO+"\"+M->CODIGO+"\NOTA1")
      Index on PERIODO+DATA TO NOTA1
      DBSETORDER(1)
 
      Sele C100
      Append Blank
      Repla C100->Reg        With 'C100'
      Repla C100->IndOper    With ALLTRIM(entrada->CONTA) //indicador do tipo de opercao->0-entrada e 1-saida
      Repla C100->IndEmit    With ENTRADA->IND_EMIT     // Ver
      Repla C100->CodPart    With ALLTRIM(STRZERO(Val(LimpaStr(ENTRADA->CNPJ_CPF)),14))
      Repla C100->CodSit     With '00'
      Repla C100->CodMod     With entrada->COD_MOD
      Repla C100->Ser        With entrada->serie
      Repla C100->NumDoc     With StrZero(val(entrada->nota),9)
      Repla C100->chvnfe     With entrada->CHV_NFE
      Repla C100->dtdoc      With entrada->d_doc
      Repla C100->Dtes       With entrada->(LimpaStr(DATA))
      Repla C100->vldoc      With entrada->VL_CONTABI
      Repla C100->indpagto   With entrada->IND_PGTO
      Repla C100->vlmerc     With entrada->VL_CONTABI
      Repla C100->indfrt     With entrada->IND_FRT       //
      Repla C100->vlbcicms   With entrada->B_CALCULO
      Repla C100->vlicms     With entrada->VL_ICMS
      Repla C100->vlbcicmsst With entrada->VLSUBT
      Repla C100->vlicmsst   With entrada->IMPSUBT
      Repla C100->vlipi      With entrada->IPI
      Sele entrada
      cTpoRegUF := entrada->UF+Iif(C100->IndEmit=='0','E',"S")
      //--- JAFFILTRO
      cPesq := C100->CodPart+C100->NumDoc+C100->Ser
      
      //--> Aki vc tem q fazer os itens desta nota q vc incluiu no C100
      
      //--> Tipo eu peguei o código q estava ap¢s o ENDDO e coloquei aki pra vc ter uma ideia, 
		//--> como não sei exatamente como estao as informações na tabela apenas coloquei pra vc perceber
	   
		SELECT NOTA
	   NOTA->(DBGOTOP())

		//--> aki vc tem q filtrar a nota acima ENTRADA->Nota pra jogar os itens (C170) dela
	   
	   DO WHILE //--> FA€A ENQUANTO FOR OS ITENS DA NOTA ACIMA DO C100
	      IF TIPO_ES="E"
	         Sele C170
	         Append Blank
	         Repla C170->Reg        With 'C170'
	         Repla C170->numitem    With Alltrim(str(nota->nr_item))
	         Repla C170->Coditem    With Alltrim(str((nota->codigo)))
	         Repla C170->descricao  With Alltrim(nota->desc_compl)
	         Repla C170->qtd        With nota->quant_unid
	         Repla C170->unid       With Alltrim(nota->unid_med)
	         Repla C170->vlitem     With nota->vlr_item            //
	         Repla C170->vldesc     With nota->vlr_desc
	         Repla C170->indmov     With nota->ind_movi
	         Repla C170->csticms    With nota->cstr_icms
	         Repla C170->cfop       With LimpaStr(nota->operacao)            //
	         Repla C170->codnat     With ""
	         Repla C170->vlbcicms   With nota->vlr_bc_icm
	         Repla C170->Aliqicms   With nota->aliq_icmnf
	         Repla C170->vlicms     With nota->vlr_icms
	         Repla C170->vlbcicmsst With nota->vlrbcicmst            //
	         Repla C170->aliqst     With nota->aliq_stnf
	         Repla C170->vlicmsst   With nota->vlr_icm_st
	         Repla C170->indapur    With nota->ind_apura            //
	         Repla C170->cstipi     With nota->cst_ipinf            //
	         Repla C170->codenq     With nota->cod_enqnf           //
	         Repla C170->vlbcipi    With nota->vlr_bc_ipi            //
	         Repla C170->aliqipi    With nota->aliq_ipinf
	         Repla C170->vlipi      With nota->vlr_ipi            //
	         Repla C170->cstpis     With nota->cst_pisnf            //
	         Repla C170->vlbcpis    With nota->vlr_bc_pis            //
	         Repla C170->aliqpis    With nota->aliq_pisnf            //
	         Repla C170->quantbcpis With nota->q_bc_pis            //
	         Repla C170->aliqpis    With nota->aliqpisr
	         Repla C170->vlpis      With nota->vlr_pis            //
	         Repla C170->cstcofins  With nota->cst_cofinf            //
	         Repla C170->vlbcconfis With nota->vlr_bc_cof            //
	         Repla C170->aliqconfis With nota->aliq_cofin            //
	         Repla C170->qtdbcconfi With nota->quan_bc_co            //
	         Repla C170->aliqconfis With nota->aliqcofins
	         Repla C170->vlcofins   With nota->vlr_cofins            //
	         Repla C170->codcta     With nota->cod_ctanf
	         Repla C170->JAFFiltro  With nota->_cPesq
	         Select NOTA
	      ENDIF
		   NOTA->(DBSKIP())
	   ENDDO
		
		//--> AI SIM APOS TER TERMINADO OS ITENS DA NOTA VC VAI PRA PROXIMA NOTA NA TABELA ENTRADA
		Skip
   Enddo
RETURN NIL
**********************************************************
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
JUDIVAN CONTABIL
Usuário Nível 2
Usuário Nível 2
Mensagens: 55
Registrado em: 20 Mai 2011 07:42
Localização: IMACULADA-PB

SPED FISCAL TXT

Mensagem por JUDIVAN CONTABIL »

não deu certo, não foi possível colocar o txt na orden certa.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

SPED FISCAL TXT

Mensagem por fladimir »

Algum outro colega poderia revisar o código pra ver o q estaria errado, pois até onde vi seria o q mencionei.
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

SPED FISCAL TXT

Mensagem por rubens »

Acredito que a logica tá correta Fladimir... o colega Josivam poderia compactar o código pra ficar mais fácil analisar... mas como você disse para ele primeiro pega os dados de uma c100, depois filtra os c170 dessa c100 e depois os c190.. só depois disso que volta no c100 e pula o registro...

Tipo assim...

Código: Selecionar todos

Sele c100
append blank 
Repla C100->Reg        With 'C100'
Repla C100->IndOper    With ALLTRIM(entrada->CONTA) 
Repla C100->Numero With cNumero

Sele c170
Set Filter to itensdoc170 = cNumero do C100
append blank 
Repla c170->Reg With 'C170'

Sele c190
Set Filter to itensdoc190 = cNumero do C100
append blank 
Repla c190->Reg With 'C170'

Sele c100
dbskip()

"Eu e minha casa servimos ao Senhor e você ???"
Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

SPED FISCAL TXT

Mensagem por Mário Isa »

No caso em pauta o colega está fazendo somente das notas de entrada ?

Ou as de saída também ?

E os cupons fiscais ? também tem que incluir ?

Mário
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

SPED Fiscal TXT

Mensagem por JoséQuintas »

Pra facilitar essas coisas, eu faço assim, supondo que fossem NFs, contendo pedidos, que contém produtos:

Código: Selecionar todos

SELECT NOTAS
DO WHILE .NOT. Eof()
   ? "NF - 100"
   GeraPedidos() // 170
   SKIP
ENDDO
RETURN

FUNCTION GeraPedidos() // 170
   LOCAL nSelect := Select()
   SELECT PEDIDOS
   SEEK nota->NF
   DO WHILE pedido->NF == nota->nf .AND. .NOT. Eof()
     ? "pedido -= 170"
      GeraProdutoPedido() // 190
      SKIP
   ENDDO
   SELECT (nSelect)
   RETURN NIL

FUNCTION GeraPedidoProduto() // 190
   LOCAL nSelect := Select()
   SELECT produtopedido
   SEEK pedidos->Pedido
   DO WHILE produtopedido->Pedido == pedidos->pedido .and. .not. eof()
        ? "Produto pedido - 190"
        SKIP
   ENDDO
   SELECT (nSelect)
   RETURN NIL

Ao invés de encher de DO WHILE, cada rotina faz sua parte.
O primeiro processa as notas, os registros 100.
geraPedido() mostra os pedidos daquela nota, os registros 170
GeraProdutoPedido() mostra os produtos daquele pedido, os registros 190.

Comparando com sua rotina, é como se voce colocasse todas as notas, depois todos os pedidos, e depois todos os produtos.
Acaba ficando tudo misturado, sem saber o que percente a cada coisa.

Como dizia uma regra antiga de programação:
Se você tem um problema grande, divida em pequenos problemas, e resolva um pequeno problema por vez.

Nota: usei esses arquivos só pra exemplificar, não é isso que vai no sped...
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