Ir para conteúdo
Fórum Script Brasil
  • 0

EFD - Ler arquivo


Romani

Pergunta

Preciso de uma luz para importar dados de EFD ( escrituração fiscal digital, Portaria SEF nº 166, de 21/10/2008 ) txt para um banco de dados no SQL Server.

A estrutura do arquivo é mais ou menos assim

C100 numero nota|valor nota (campo mãe) PK numeo da nota

C110 produto|valor produto(campo filho) FK é obtido pelo campo C100 imediatamnte superior

C100 1|1000

C110 A|500

C110 B|500

C100 2|1000

C110 A|1000

C100 3|1000

C110 A|500

C110 B|500

Ou seja preciso criar uma rotina que leia o arquivo txt linha a linha e distribua as informações em diversas tabelas de tal sorte que de acordo com a ordem dos dados no arquivo um contador gere as PK e FK.

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Bom dia Romani.

O mais viável é você importar as informações para os SQL igual elas aparecem no TXT (importação simples).

Grave os dados em uma tabela. Uma dica: na tabela que criou para receber os dados, crie uma coluna de controle identity, para realizar a numeração das linhas na ordem em que os dados foram lidos.

Assim fica mais fácil de você trabalhar com a separação dos dados, uma vez que os mesmos já se encontram na Base e ordenados.

Utilize a função SUBSTRING do sql para ir separando e gravando os caracteres que desejar. As PK´s e FK´s poderão ser criadas também da mesma forma.

Espero ter ajudado.

SELECT SUBSTRING('Teste', 1, 3)

Link para o comentário
Compartilhar em outros sites

  • 0

Fulvio,

Obrigado pela dica.

Realmente é bem melhor importar os dados do arquivo txt para o SQL ao invés de ler os dados do txt.

Vou fazer seguir a sua sujestão importar todo o txt em uma tabela com um campo identity para manter a ordenação e depois montar as minhas tabelas a partir desta.

Link para o comentário
Compartilhar em outros sites

  • 0

Fulvio,

Preciso de mais uma luz.

já montei uma tabela com as colunas

PK Tipo Info1 Info2

1 C100 1 1000

2 C110 A 500

3 C110 B 500

4 C100 2 1000

5 C110 A 1000

6 C100 3 1000

7 C110 A 500

8 C110 B 500

Quero montar outra tabela a partir desta assim

FK Tipo Info1 Info2

1 C110 A 500

1 C110 B 500

4 C110 A 1000

6 C110 A 500

6 C110 B 500

Como faço um laço (for i= 1 to n), tendo com parãmetro uma linha superior de uma tabela, ou seja

leia a linha 1 e coloque em uma variavel a PK da linha 1

leia a linha 2 se tipo_linha 2 <> C100 então FK da linha 2 = PK da linha 1 se não a variavel é =PK da linha 2

leia a linha 3 se tipo_linha 3 <> C100 então FK da linha 3 = PK da linha 1 se não a variavel é =PK da linha 3

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia Romani,

Rs... vamos lá.

Se quiser fazer outra tabela conforme postado, poderá fazer a separação utilizando a coluna Info1. você pode fazer um insert testando se ó valor contido não é numérico. Fica simples e rápido de fazer a nova tabela.

Mas voltando ao problema, postei logo abaixo um script que imprime as PK´s. Criei uma tabela com os dados, para simular a sua. Dei um print no resultado, para conferência. O script está comentado.

Dê uma olhada se é isto que precisa. Caso seja, aí é só fazer as adaptações. Espero que ajude!! :.)

-- Criação de tabela.
CREATE TABLE #Dados (Pk INT, Tipo VARCHAR(15), Info1 VARCHAR, info2 int)

-- Inserção dos dados
INSERT INTO #dados VALUES (1, 'C100', '1', 1000)
INSERT INTO #dados VALUES (2, 'C110', 'A', 500)
INSERT INTO #dados VALUES (3, 'C110', 'B', 500)
INSERT INTO #dados VALUES (4, 'C100', '2', 1000)
INSERT INTO #dados VALUES (5, 'C110', 'A', 1000)
INSERT INTO #dados VALUES (6, 'C100', '3', 1000)
INSERT INTO #dados VALUES (7, 'C110', 'A', 500)
INSERT INTO #dados VALUES (8, 'C110', 'B', 500)

-- Conferência
SELECT * FROM #Dados

-- Seleciona daqui pra baixo a manda executar tudo.
DECLARE @Contador INT
DECLARE @PK INT
DECLARE @UltimaPK INT
DECLARE @Tipo VARCHAR(15)

SET @Contador = 1

IF @Contador = 1
BEGIN
    SET @PK = (SELECT Pk FROM #Dados WHERE pk=@Contador)
    SET @UltimaPK = @PK
    PRINT 'PK=' + CAST (@PK AS VARCHAR(100))
    SET @Contador = @Contador + 1
END
    
WHILE @Contador <= (SELECT MAX(PK) FROM #Dados)
BEGIN
    SET @Tipo = (SELECT tipo FROM #Dados WHERE pk=@Contador)
    IF @Tipo <> 'C100'
    BEGIN
        SET @PK = @UltimaPK
    END
    ELSE
    BEGIN
        SET @PK = (SELECT Pk FROM #Dados WHERE pk=@Contador)
        SET @UltimaPK = @PK
    END
       
    PRINT 'PK=' + CAST (@PK AS VARCHAR(100))
    SET @Contador = @Contador + 1
END

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,9k
×
×
  • Criar Novo...