Gerar CSV com Cabeçalho+Detalhes em Arquivos de Trabalho Diferentes

Boa tarde, pessoal.

Estou com uma dúvida que creio ter uma solução simples, mas não consigo resolver.

Preciso gerar um CSV com informações de notas ficais, parecido com o exemplo abaixo:


Produto XYZ, 2 Movimentações
NF 001 do XYZ
NF 002 do XYZ
Produto ABC, 1 Movimentação
NF 001 do ABC

Pra gerar o arquivo, defini dois arquivos de trabalho: um para o cabeçalho com um contador e outro com os itens. Conforme os itens são lidos e validados, eu incremento o contador do arquivo de trabalho do cabeçalho.

Minha dúvida é de como "juntar" esses dois arquivos de trabalho assim como no exemplo acima.

Pensei em usar arrays auxiliares e também em abrir os dois arquivos de trabalho ao mesmo tempo. Entretanto, isso gera um loop dentro de um loop, já que para cada linha do cabeçalho eu teria de ler todos os itens (parecido com o exemplo abaixo). Isso é inviável, pois há casos em que preciso ler registros desde 2017:


dbSelectArea (cabecalho)
dbGoTop()

while !Eof()
   dbseek(cabecalho)
   escreveCabecalho
   dbSelectArea (itens)
   se (produtocabecalho = produtoitem)
      escreveItem
   dbskip()
   dbCloseArea

Se alguém tiver alguma estratégia ou algum exemplo de como solucionou um problema parecido, agradeço se postar.

Precisando de alguma informação extra, é só perguntar.

Boa tarde,

Primeiro você precisa definir o intervalo do seu cabeçalho, no seu exemplo você pegaria tudo.

Depois no seu while da tabela principal você iria fazer dbseek somente no itens e não no próprio cabeçalho.

Algo nesse sentido:


DbselectArea("SF1")
SF1->(dbSetOrder(1))
SF1->(DbGoTop())
//DBseek caso queira

while SF1->(!Eof())

    conout("CABEÇALHO DA NOTA")
    DbselectArea("SD1")
    Sd1->(dbSetOrder(1))
    SD1->(DbGoTop())
    SD1->(dbSeek("chave que vai buscar."))

    While SD1->(!EOF()) .AND. SD1->(D1_FILIAL+D1_PREFIX+D1_DOC+D1_FORNECE+D1_LOJA) == "chave que vai buscar."
        conout("ITENS DA NOTA")
        SD1->(DbSkip())
    EndDo
    SF1->(DbSkip())
enddo

Ou você pode fazer a mesma estrutura mas usando SQL.

Espero ter ajudado!

Boa tarde.

Era isso mesmo. Colocando o Alias antes das instruções e convertendo todos os tipos de dados comparáveis pra char fez com que o fonte funcionasse corretamente.

Muito obrigado.