MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração


Participe do fórum, é rápido e fácil

MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração

MaximoAccess

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access


4 participantes

    [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Uilson Brasil
    Uilson Brasil
    VIP
    VIP


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1039
    Registrado : 23/04/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Uilson Brasil 23/3/2016, 16:10

    Amigos,

    Alguém tem e/ou conhece alguma rotina para dividir um arquivo de texto (txt) por página?

    Desde já agradeço pela atenção.


    .................................................................................
    ::: Uilson Brasil
    ::: Design in Microsoft Access
    Alvaro Teixeira
    Alvaro Teixeira
    Moderador Global
    Moderador Global


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7914
    Registrado : 15/03/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Alvaro Teixeira 23/3/2016, 16:52

    Olá Uilson Oliveira,
    Vai ser em reporte, qual o critério da divisão?
    Pode postar txt de amostragem e explicar melhor o que pretende.
    Abraço
    Uilson Brasil
    Uilson Brasil
    VIP
    VIP


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1039
    Registrado : 23/04/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Uilson Brasil 1/4/2016, 14:32

    Alvaro,

    Desculpe-me pela morosidade.
    Não sei qual seria a melhor solução: Divisão do arquivo, leitura do arquivo integral com importação dos dados mapeados ou ainda uma espécia de conversão feita em qualquer linguagem para criar um registro a cada delimitação. O fato é que se optarmos por divisão, isso teria que ser realizada através de uma leitura de 'string' contida do texto.


    Se poder me ajudar nessa empreitada, desde já agradeço ...
    Anexos
    [Resolvido]Importar arquivo TXT com 30 linhas por registo AttachmentTeste.txt
    Você não tem permissão para fazer download dos arquivos anexados.
    (8 Kb) Baixado 36 vez(es)


    .................................................................................
    ::: Uilson Brasil
    ::: Design in Microsoft Access
    Alvaro Teixeira
    Alvaro Teixeira
    Moderador Global
    Moderador Global


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7914
    Registrado : 15/03/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Alvaro Teixeira 1/4/2016, 14:44

    Olá Ulisson,
    Assim já dá para compreender melhor.
    Dividir, acho que não seria o problema.
    Gostava era de entender qual o objectivo final.
    Se é pura e simplesmente imprimir um registo por pagina.
    Importar os dados.
    Etc.

    Explique melhor qual o objectivo final.
    Abraço
    Uilson Brasil
    Uilson Brasil
    VIP
    VIP


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1039
    Registrado : 23/04/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Uilson Brasil 1/4/2016, 14:56

    Alvaro,

    A intenção é importar os dados mapeados conforme a imagem enviada ...


    .................................................................................
    ::: Uilson Brasil
    ::: Design in Microsoft Access
    Alvaro Teixeira
    Alvaro Teixeira
    Moderador Global
    Moderador Global


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7914
    Registrado : 15/03/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Alvaro Teixeira 1/4/2016, 15:05

    Olá , Não é fácil, mas parece possível.
    Sabemos que as linhas por registo são 30, ou seja multiplas de 30.
    Portanto identificar os registos será fácil.
    1)Quanto aos campos , se possivel seria bom gerar um recibo de ordenado com o maximo de caracteres, para podermos ver os limites do txt, ficaria mais certo.
    2) Já tem a extrutura das tabelas que vão receber os dados?
    Abraço
    Uilson Brasil
    Uilson Brasil
    VIP
    VIP


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1039
    Registrado : 23/04/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Uilson Brasil 1/4/2016, 15:18

    Alvaro,

    Ainda não tenho a estrutura, mas isso é o mais fácil e rápido de criar. Quanto a questão do "recibo de ordenado", gostaria de ter mais detalhes pois não entendi do que se trata.

    Outra informação importante é a quantidade de documento (holerite) no mesmo arquivo de texto. Em um determinado arquivo de texto, poderemos ter 1, 30, 80, 500, etc ...



    .................................................................................
    ::: Uilson Brasil
    ::: Design in Microsoft Access
    Alvaro Teixeira
    Alvaro Teixeira
    Moderador Global
    Moderador Global


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7914
    Registrado : 15/03/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Alvaro Teixeira 1/4/2016, 15:54

    Olá, quanto ao "1, 30, 80, 500, etc .." na minha opinião, não é problema.
    Quanto ao "recibo de ordenando" pela minha leitura do ficheiro, parece um recibo de pagamento da remuneração no final do mês ao funcionário.
    Se e este caso, aqui em Portugal dizemos "Ordenado" ou "Vencimento".
     
    Voltando à questão:
    - Podemos fazer a leitura do txt linha a linha até ao final do txt
    - Sabemos que de 30 em 30 é um registo
    Veja aqui um tópico que já faz um pouco disso.
     
    A questão prende-se no tamanho (posição) da informação no txt.
     
    Exemplo, você na imagem que postou tem "Salario Mensalista" e antes tem "5"
    Entendo que é o código do movimento, esse código qual será o tamanho máximo, ou seja poder existir um código com 6 dígitos?
     
    É necessário saber o tamanho máximo dos campos a importar.
    Sou da opinião de ajustar a imagem que postou (campos com retângulo a vermelho) ":
    a) Nome do campo
    b) Tamanho máximo

    c)  Posição (Coluna em que inicia era o ideal) 

    veja exemplo
    [Resolvido]Importar arquivo TXT com 30 linhas por registo 120l8gn
    Abraço
    Uilson Brasil
    Uilson Brasil
    VIP
    VIP


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1039
    Registrado : 23/04/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Uilson Brasil 1/4/2016, 16:51

    Alvaro,

    Entendi o conceito. Vou preparar a estrutura e o mapeamento das string's, com tamanho de cada uma, posição inicial e posição final. Quando tiver pronto essa primeira parte eu avisarei.

    Por hora muito obrigado pelo pronto-atendimento.




    .................................................................................
    ::: Uilson Brasil
    ::: Design in Microsoft Access
    Alvaro Teixeira
    Alvaro Teixeira
    Moderador Global
    Moderador Global


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7914
    Registrado : 15/03/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Alvaro Teixeira 1/4/2016, 17:37

    Olá, será importante.
    Assim que tenha um tempinho, posto aqui exemplo básico da importação para depois ser trabalhado.
    Só uma pergunta pretende a importação:
    A) para uma tabela só, repetindo os campos do cabecalho.
    B) ou pretendia para duas tabelas tipo cabecalho e linhas movimento.

    Abraço
    Uilson Brasil
    Uilson Brasil
    VIP
    VIP


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1039
    Registrado : 23/04/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Uilson Brasil 1/4/2016, 19:15

    Alvaro,

    Imagino eu que em uma única tabela o processo seria facilitado. Caso eu esteja correto na estrutura vou criar 16 sequências de campos para essa finalidade (CODMOV1, DESCMOV1, QMOV1, VMOV1, DMOV1, ... 2 .. 3 ...16). Claro a quantidade de campos seria muito grande.

    Se possível dê seu parecer a respeito.



    .................................................................................
    ::: Uilson Brasil
    ::: Design in Microsoft Access
    Alvaro Teixeira
    Alvaro Teixeira
    Moderador Global
    Moderador Global


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7914
    Registrado : 15/03/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Alvaro Teixeira 2/4/2016, 12:20

    Olá,
    Podemos ter de duas formas, veja a figura:
    [Resolvido]Importar arquivo TXT com 30 linhas por registo 2lu483n

    Opção 1 - Só uma tabela
    Com base na fotografia ao importar ia gerar 6 registos (por causa dos movimentos)
    Ficando assim a tabela:
    |Empresa|CNPJ|Mes|CodigoFuncionario|... todos os campos contornados a vermelho + campos contornados a azul...|
    Ficaria como já referi com 6 linhas ao importar o campos a vermelho ficariam duplicados na tabela, só os azul é que ia ser diferente.
    Caso fosse uma importação com 12 registos ia ter 12 linhas.

    Opção 2 - Duas Tabelas Mas trabalhoso, mas na minha opinião o mais correcto
    Ficaria os campos a vermelho na tabela por exemplo tbl_recibos
    ao importar da imagem só tinha 1 registo (isto eu chamo cabeçalho de movimentos)

    Os campos a azul ficava na tabela tbl_recibosMovimentos
    ao importar da imagem, ficaria 6 registos

    Depois a tabela tbl_recibos era relacionada um para muitos da tabela tbl_recibosMovimentos

    Abraço
    Uilson Brasil
    Uilson Brasil
    VIP
    VIP


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1039
    Registrado : 23/04/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Uilson Brasil 3/4/2016, 18:17

    Alvaro,

    Com certeza a segunda opção seria realmente o conceito mais correto (Capa e Detalhe). Porém levando em conta que os dados serão guardados por um período relativamente pequeno, e ainda pela complexidade da segunda opção, vou criar a estrutura conforme indicado na primeira opção.



    .................................................................................
    ::: Uilson Brasil
    ::: Design in Microsoft Access
    Uilson Brasil
    Uilson Brasil
    VIP
    VIP


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1039
    Registrado : 23/04/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Uilson Brasil 4/4/2016, 05:32

    Alvaro,

    Segue arquivos. Avancei um pouco, mas ainda está muito distante do pretendido.
    Anexos
    [Resolvido]Importar arquivo TXT com 30 linhas por registo AttachmentTemp.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (372 Kb) Baixado 38 vez(es)


    .................................................................................
    ::: Uilson Brasil
    ::: Design in Microsoft Access
    Alvaro Teixeira
    Alvaro Teixeira
    Moderador Global
    Moderador Global


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7914
    Registrado : 15/03/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Alvaro Teixeira 4/4/2016, 08:23

    Olá Uilson, já aprendi mais uma.
    O que eu chamo de "Cabeçalho" aí no Brasil pelos vistos é "Capa".
    Estou no telemóvel e não posso ver o que fez.
    No entanto durante o fim de semana dediquei-me a esta questão.
    Já fiz a denominação dos campos e tabelas para receber informação e código está quase.
    Da forma que estou a fazer vai ser Capa+Detalhe, gosto de desafios.
    Abraço
    Uilson Brasil
    Uilson Brasil
    VIP
    VIP


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1039
    Registrado : 23/04/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Uilson Brasil 4/4/2016, 12:36

    Bom dia Alvaro,

    Aqui no Brasil "Cabeçalho" tem o mesmo significado. Porém muitos utilizam da denominação "Capa" neste tipo de associação.

    Legal ter avançado aí, e com o conceito - ao meu ver - correto. De qualquer forma o material que enviei poderá ser útil.


    Abraços e boa semana.


    .................................................................................
    ::: Uilson Brasil
    ::: Design in Microsoft Access
    Alvaro Teixeira
    Alvaro Teixeira
    Moderador Global
    Moderador Global


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7914
    Registrado : 15/03/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Alvaro Teixeira 4/4/2016, 12:40

    Olá, sim  muito importante apesar de já ter avançado.
    Já tinha estrutura criada, depois deverá efetuar ajustes no nome dos campo e posicionamento, apesar de os que testei estava a funcionar.
    Veja o código que já tenho para ir estudando:
    Código:
    Sub importarTxt()
    'ahteixeira 2016 - maximoaccess
    Dim strLinha As String
    Dim linha, nRegisto, vRegisto As Double

    Dim Empresa, CNPJ, ReferenteMes, CodigoEmp, NomeEmp, ADM, CTPS, PIS, CFP, Funcao, CI
    Dim CodMov, DescMov
    Dim NoDias As Double
    Dim Abono, Desconto, TotAbono, TotDesconto, ValorPago As Currency
    Dim ValoFinal1, ValoFinal2, ValoFinal3, ValoFinal4, ValoFinal5 As Currency

        'inicia contador de registos a importar
        nRegisto = 1
        
        'apaga tabelas que vao receber os dados
        DoCmd.RunSQL "DELETE * FROM tbl_Movimento"
        DoCmd.RunSQL "DELETE * FROM tbl_MovimentoDetalhe"
        
        'ficheiro a ler para importar
        Open Application.CurrentProject.Path & "\teste.txt" For Input As #1
        
        'inicio leitura do txt linha a linha
        Do Until EOF(1)
            linha = linha + 1
            Line Input #1, strLinha
            
            'processa campos que estao na linha 1
            If linha = 1 Then
                Empresa = Trim(strLinha)
            End If
            
            If linha = 3 Then
                CNPJ = Mid(strLinha, 14, 18)
                ReferenteMes = Right(strLinha, Len(strLinha) - (InStr(strLinha, "Referente ao mês de") + 19))
            End If
            
            If linha = 5 Then
                CodigoEmp = Trim(Left(strLinha, 10))
                NomeEmp = Trim(Mid(strLinha, 12, 40))
                ADM = Mid(strLinha, 57, 10)
                CTPS = Mid(strLinha, 73, 15)
                PIS = Mid(strLinha, 93, 11)
                CFP = Mid(strLinha, 109, 11)
            End If
            
            If linha = 6 Then
                Funcao = Trim(Mid(strLinha, 60, 42))
                CI = Trim(Mid(strLinha, 106, 10))
            End If
            
            If linha = 9 Then
                'Adiciona registo à tabela Movimento
                'para se poder lançar registos na tabela MovimentoDetalhe
                'é necessário, por causa das relações, no final é atualizado com o resto da informação
                DoCmd.RunSQL "INSERT INTO tbl_Movimento ( NoRegisto ) SELECT " & nRegisto & ";"
                '----
                
                CodMov = Trim(Mid(strLinha, 1, 9))
                DescMov = Trim(Mid(strLinha, 11, 50))
                NoDias = Trim(Mid(strLinha, 61, 9))
                Abono = Trim(Mid(strLinha, 80, 12))
                Desconto = Trim(Mid(strLinha, 104, 12))
                
                'adiciona ao MovimentoDetalhe
                DoCmd.RunSQL "INSERT INTO tbl_MovimentoDetalhe ( NoRegistoDetalhe, CodMov, DescMov, NoDias ) SELECT " & nRegisto & "," & CodMov & ",'" & DescMov & "'," & CDbl(NoDias) & ";"
                
                Debug.Print Desconto
            End If
            
            If linha = 30 Then
                nRegisto = nRegisto + 1
                linha = 0
                'Debug.Print nRegisto
            End If
        Loop


    'final vai fazer update dos cabeçalhos
     ' DoCmd.RunSQL "INSERT INTO tbl_Movimento ( Empresa , CNPJ ) SELECT '" & Empresa & "','" & CNPJ & "';"
        Close #1
    End Sub
    Abraço
    Uilson Brasil
    Uilson Brasil
    VIP
    VIP


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1039
    Registrado : 23/04/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Uilson Brasil 4/4/2016, 12:53

    Opa! Vejo que o avanço aí foi grande ...
    Não se preocupe com as denominações dos campos o que interessa é chegarmos ao resultado pretendido ...
    Outra Informação: Os campos com valores podem ser tratados também como strings , pois não haverá rotina de cálculos para eles...


    .................................................................................
    ::: Uilson Brasil
    ::: Design in Microsoft Access
    Alvaro Teixeira
    Alvaro Teixeira
    Moderador Global
    Moderador Global


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7914
    Registrado : 15/03/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Alvaro Teixeira 4/4/2016, 16:57

    Olá, em cima do joelho acho que está o que pretende.
    Veja código, utilizado:
    Código:
    Sub importarTxt()
    'ahteixeira 2016 - maximoaccess
    Dim strLinha As String
    Dim linha, nRegisto As Double

    Dim Empresa, CNPJ, ReferenteMes, CodigoEmp, NomeEmp, ADM, CTPS, PIS, CFP, Funcao, CI
    Dim CodMov, DescMov, NoDias, Abono, Desconto
    Dim TotAbono, TotDesconto, ValorPago, ValorFinal1, ValorFinal2, ValorFinal3, ValorFinal4, ValorFinal5

        'inicia contador de registos a importar
        nRegisto = 1
        ' se pretender fazer arquivo na linha acima atribua o último da tabela + 1
        ' e retire ou comente as duas linhas abaixo
        
        'apaga tabelas que vao receber os dados
        DoCmd.RunSQL "DELETE * FROM tbl_Movimento"
        DoCmd.RunSQL "DELETE * FROM tbl_MovimentoDetalhe"
        
        'ficheiro a ler para importar
        Open Application.CurrentProject.Path & "\teste.txt" For Input As #1
        
        'inicio leitura do txt linha a linha
        Do Until EOF(1)
            linha = linha + 1
            Line Input #1, strLinha
            
            'processa campos que estao na linha 1
            If linha = 1 Then
                Empresa = Trim(Mid(strLinha, 1, 5))
            End If
            
            If linha = 3 Then
                CNPJ = Mid(strLinha, 14, 18)
                ReferenteMes = Right(strLinha, Len(strLinha) - (InStr(strLinha, "Referente ao mês de") + 19))
            End If
            
            If linha = 5 Then
                CodigoEmp = Trim(Left(strLinha, 10))
                NomeEmp = Trim(Mid(strLinha, 12, 40))
                ADM = Mid(strLinha, 57, 10)
                CTPS = Mid(strLinha, 73, 15)
                PIS = Mid(strLinha, 93, 11)
                CFP = Mid(strLinha, 109, 11)
            End If

            
            If linha = 6 Then
                Funcao = Trim(Mid(strLinha, 60, 42))
                CI = Trim(Mid(strLinha, 106, 10))
            End If
            
            
            'processa da linha 9 até 23 - as 15 linhas do detalhe
            If linha > 8 And linha < 24 And Len(strLinha & "") <> 0 Then
            
                'Adiciona registo à tabela Movimento (apenas na linha 9)
                'para se poder lançar registos na tabela MovimentoDetalhe
                'é necessário, por causa das relações, no final é atualizado com o resto da informação
                If linha = 9 Then DoCmd.RunSQL "INSERT INTO tbl_Movimento ( NoRegisto ) SELECT " & nRegisto & ";"

                CodMov = Trim(Mid(strLinha, 1, 9))
                DescMov = Trim(Mid(strLinha, 11, 50))
                NoDias = Trim(Mid(strLinha, 61, 9))
                Abono = Trim(Mid(strLinha, 80, 12))
                Desconto = Trim(Mid(strLinha, 104, 12))
                
                'adiciona ao MovimentoDetalhe
                DoCmd.RunSQL "INSERT INTO tbl_MovimentoDetalhe ( NoRegistoDetalhe, CodMov, DescMov, NoDias, Abono, Desconto ) SELECT " & _
                                nRegisto & "," & CodMov & ",'" & DescMov & "','" & NoDias & "','" & Abono & "','" & Desconto & "';"
            End If
            
            
            If linha = 25 Then
                TotAbono = Trim(Mid(strLinha, 82, 10))
                TotDesconto = Trim(Mid(strLinha, 106, 10))
            End If
            
            
            If linha = 27 Then
                ValorPago = Trim(Mid(strLinha, 106, 10))
            End If
            
            
            If linha = 29 Then
                ValorFinal1 = Trim(Mid(strLinha, 11, 10))
                ValorFinal2 = Trim(Mid(strLinha, 28, 10))
                ValorFinal3 = Trim(Mid(strLinha, 52, 10))
                ValorFinal4 = Trim(Mid(strLinha, 69, 10))
                ValorFinal5 = Trim(Mid(strLinha, 95, 10))
            End If
            
            If linha = 30 Then
                'atualiza dados
                DoCmd.RunSQL "UPDATE (tbl_Movimento) SET Empresa = '" & Empresa & "'," & _
                             "CNPJ = '" & CNPJ & "'," & _
                             "ReferenteMes = '" & ReferenteMes & "'," & _
                             "CodigoEmp = '" & CodigoEmp & "'," & _
                             "NomeEmp = '" & NomeEmp & "'," & _
                             "ADM = '" & ADM & "'," & _
                             "CTPS = '" & CTPS & "'," & _
                             "PIS = '" & PIS & "'," & _
                             "CFP = '" & CFP & "'," & _
                             "Funcao = '" & Funcao & "'," & _
                             "CI = '" & CI & "'," & _
                             "TotAbono = '" & TotAbono & "'," & _
                             "TotDesconto = '" & TotDesconto & "'," & _
                             "ValorPago = '" & ValorPago & "'," & _
                             "ValorFinal1 = '" & ValorFinal1 & "'," & _
                             "ValorFinal2 = '" & ValorFinal2 & "'," & _
                             "ValorFinal3 = '" & ValorFinal3 & "'," & _
                             "ValorFinal4 = '" & ValorFinal4 & "'," & _
                             "ValorFinal5 = '" & ValorFinal5 & "'" & _
                             "WHERE tbl_Movimento.NoRegisto = " & nRegisto & ";"

                'actualiza contadores
                nRegisto = nRegisto + 1
                linha = 0
                
                'limpa campos
                Empresa = ""
                CNPJ = ""
                ReferenteMes = ""
                CodigoEmp = ""
                NomeEmp = ""
                ADM = ""
                CTPS = ""
                PIS = ""
                CFP = ""
                Funcao = ""
                CI = ""
                CodMov = ""
                DescMov = ""
                NoDias = ""
                Abono = ""
                Desconto = ""
                TotAbono = ""
                TotDesconto = ""
                ValorPago = ""
                ValorFinal1 = ""
                ValorFinal2 = ""
                ValorFinal3 = ""
                ValorFinal4 = ""
                ValorFinal5 = ""
            End If
        
        'fim eitura txt
        Loop

        'fechar ficheiro
        Close #1
        
        MsgBox "Feito, Verifique tabelas.", vbInformation, ""
    End Sub

    Segue o teste.
    Nota: Alterei titulo do tópico para ficar mais fácil nas pesquisa para os membros do fórum.
    Abraço
    Anexos
    [Resolvido]Importar arquivo TXT com 30 linhas por registo AttachmentImportarTXT_recibos_rev1.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (27 Kb) Baixado 69 vez(es)


    Última edição por ahteixeira em 5/4/2016, 09:34, editado 1 vez(es)
    FabioPaes
    FabioPaes
    Maximo VIP
    Maximo VIP


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3914
    Registrado : 14/08/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  FabioPaes 4/4/2016, 17:44

    cheers

    Rapaz, essa Galera só nao faz chover com o Access...


    Parabéns Ahteixeira Pelo Excelente exemplo... Muito Bom mesmo!
    Alvaro Teixeira
    Alvaro Teixeira
    Moderador Global
    Moderador Global


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7914
    Registrado : 15/03/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Alvaro Teixeira 5/4/2016, 09:39

    Olá Fábio, obrigado pelo retorno.
    Todos sabemos que com o MaximoAccess é sempre aprender.  Wink

    Fiz uma pequena alteração no código, funciona tal e qual, mas ficou menos linhas de código.
    Mensagem 19 atualizada.

    Ficamos aguardar retorno do colega Uilson.
    Abraço
    Uilson Brasil
    Uilson Brasil
    VIP
    VIP


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1039
    Registrado : 23/04/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Uilson Brasil 5/4/2016, 14:23

    Primeiramente gostaria de agradecer a paciência, dedicação e empenho do amigo Alvaro Teixeira na solução desta demanda. Entendo que o material aqui disponível, será um referência e de grande valia para quem necessitar de algo do gênero.

    Fiz algumas alterações na estrutura das tabelas e consequentemente no código, por isso estou anexando todo o material.

    No arquivo original de importação, notei que a posição dos dados do PIS e CPF, depende do número de caracteres gerados para a CTPS. A solução neste caso, foi retirar os dados encontrados entre duas strings. Para isso utilizei de um exemplo também do amigo Alvaro Teixeira encontrado aqui no fórum: https://www.maximoaccess.com/t20159p3-importando-nota-fiscal-eletronica-xml-para-access.

    Vejam:
    Código:
    Sub ImportTXT()
    'ahteixeira 2016 - maximoaccess
    Dim strLinha As String
    Dim linha, nRegistro As Double

    Dim EMPRESA, ENDERECO, CNPJ, REFMES, CODFUNC, NOMEFUNC, ADM, CTPS, PIS, CPF, FUNCAO, CI
    Dim CODMOV, DESCMOV, NDIAS, PROVENTOS, DESCONTOS
    Dim TOTPROV, TOTDESC, VLRSALDO, BASESAL, BASEINSS, BASEFGTS, VLRFGTS, VLRIRRF

        'inicia contador de registos a importar
        nRegistro = Nz(DMax("NREG", "tblMovimento"), 0) + 1
        
        'ficheiro a ler para importar
        Open txtArquivo For Input As #1
        
        'inicio leitura do txt linha a linha
        Do Until EOF(1)
            linha = linha + 1
            Line Input #1, strLinha
            
            'processa campos que estao na linha 1
            If linha = 1 Then
                EMPRESA = Trim(Mid(strLinha, 1, 60))
            End If
            
            If linha = 2 Then
                ENDERECO = Trim(Mid(strLinha, 1, 60))
            End If
            
            If linha = 3 Then
                CNPJ = Mid(strLinha, 14, 18)
                REFMES = right(strLinha, Len(strLinha) - (InStr(strLinha, "Referente ao mês de") + 19))
            End If
            
            If linha = 5 Then
                CODFUNC = Trim(left(strLinha, 10))
                NOMEFUNC = Trim(Mid(strLinha, 12, 40))
                ADM = Mid(strLinha, 57, 10)
                CTPS = Trim(SeparaEntreDuasStrings(strLinha, "CTPS:", "PIS:"))
                PIS = Trim(SeparaEntreDuasStrings(strLinha, "PIS:", "CPF:"))
                CPF = right(strLinha, Len(strLinha) - (InStr(strLinha, "CPF:") + 3))
            End If

            If linha = 6 Then
                FUNCAO = Trim(Mid(strLinha, 60, 42))
                CI = Trim(Mid(strLinha, 106, 10))
            End If
            
            If linha = 9 Then
                'Adiciona registo à tabela Movimento
                'para se poder lançar registos na tabela MovimentoDetalhe
                'é necessário, por causa das relações, no final é atualizado com o resto da informação
                DoCmd.RunSQL "INSERT INTO tblMovimento ( NREG ) SELECT " & nRegistro & ";"
                '----
                
                CODMOV = Trim(Mid(strLinha, 1, 9))
                DESCMOV = Trim(Mid(strLinha, 11, 50))
                NDIAS = Trim(Mid(strLinha, 61, 9))
                PROVENTOS = Trim(Mid(strLinha, 80, 12))
                DESCONTOS = Trim(Mid(strLinha, 104, 12))

                'adiciona ao MovimentoDetalhe
                DoCmd.RunSQL "INSERT INTO tblMovimentoDetalhe ( NREGD, CODMOV, DESCMOV, NDIAS, PROVENTOS, DESCONTOS ) SELECT " & _
                                nRegistro & "," & CODMOV & ",'" & DESCMOV & "','" & NDIAS & "','" & PROVENTOS & "','" & DESCONTOS & "';"
            End If
            
            'processa da linha 10 até 23 - as 15 linhas do detalhe
            If linha > 9 And linha < 24 And Len(strLinha & "") <> 0 Then
                CODMOV = Trim(Mid(strLinha, 1, 9))
                DESCMOV = Trim(Mid(strLinha, 11, 50))
                NDIAS = Trim(Mid(strLinha, 61, 9))
                PROVENTOS = Trim(Mid(strLinha, 80, 12))
                DESCONTOS = Trim(Mid(strLinha, 104, 12))
                
                'adiciona ao MovimentoDetalhe
                DoCmd.RunSQL "INSERT INTO tblMovimentoDetalhe ( NREGD, CODMOV, DESCMOV, NDIAS, PROVENTOS, DESCONTOS ) SELECT " & _
                                nRegistro & "," & CODMOV & ",'" & DESCMOV & "','" & NDIAS & "','" & PROVENTOS & "','" & DESCONTOS & "';"
            End If
            
            
            If linha = 25 Then
                TOTPROV = Trim(Mid(strLinha, 82, 10))
                TOTDESC = Trim(Mid(strLinha, 106, 10))
            End If
            
            
            If linha = 27 Then
                VLRSALDO = Trim(Mid(strLinha, 106, 10))
            End If
            
            
            If linha = 29 Then
                BASESAL = Trim(Mid(strLinha, 11, 10))
                BASEINSS = Trim(Mid(strLinha, 28, 10))
                BASEFGTS = Trim(Mid(strLinha, 52, 10))
                VLRFGTS = Trim(Mid(strLinha, 69, 10))
                VLRIRRF = Trim(Mid(strLinha, 95, 10))
            End If

            If linha = 30 Then
                'atualiza dados
                DoCmd.RunSQL "UPDATE (tblMovimento) SET Empresa = '" & EMPRESA & "'," & _
                             "ENDERECO = '" & ENDERECO & "'," & _
                             "CNPJ = '" & CNPJ & "'," & _
                             "REFMES = '" & REFMES & "'," & _
                             "CODFUNC = '" & CODFUNC & "'," & _
                             "NOMEFUNC = '" & NOMEFUNC & "'," & _
                             "ADM = '" & ADM & "'," & _
                             "CTPS = '" & CTPS & "'," & _
                             "PIS = '" & PIS & "'," & _
                             "CPF = '" & CPF & "'," & _
                             "Funcao = '" & FUNCAO & "'," & _
                             "CI = '" & CI & "'," & _
                             "TOTPROV = '" & TOTPROV & "'," & _
                             "TOTDESC = '" & TOTDESC & "'," & _
                             "VLRSALDO = '" & VLRSALDO & "'," & _
                             "BASESAL = '" & BASESAL & "'," & _
                             "BASEINSS = '" & BASEINSS & "'," & _
                             "BASEFGTS = '" & BASEFGTS & "'," & _
                             "VLRFGTS = '" & VLRFGTS & "'," & _
                             "VLRIRRF = '" & VLRIRRF & "'" & _
                             "WHERE tblMovimento.NREG = " & nRegistro & ";"
                
                'actualiza contadores
                nRegistro = nRegistro + 1
                linha = 0
                
                'limpa campos
                EMPRESA = ""
                ENDERECO = ""
                CNPJ = ""
                REFMES = ""
                CODFUNC = ""
                NOMEFUNC = ""
                ADM = ""
                CTPS = ""
                PIS = ""
                CPF = ""
                FUNCAO = ""
                CI = ""
                CODMOV = ""
                DESCMOV = ""
                NDIAS = ""
                PROVENTOS = ""
                DESCONTOS = ""
                TOTPROV = ""
                TOTDESC = ""
                VLRSALDO = ""
                BASESAL = ""
                BASEINSS = ""
                BASEFGTS = ""
                VLRFGTS = ""
                VLRIRRF = ""
            End If
        'fim eitura txt
        Loop
        
        'fechar ficheiro
        Close #1
        
        'Elimina arquivo
        If Sel1 = -1 Then
            Kill (txtArquivo)
        End If
        
        'Limpa o campo
        txtArquivo = ""
        
        'Ativa o botão sair
        btSair.Enabled = True
        
        'Exibe Mensagem
        MsgBox "Importação realizada com sucesso.", vbInformation, "Sistema"
    End Sub


    Retira dados entre duas strings
    Código:
    '2014 Alvaro Teixeira
    Function SeparaEntreDuasStrings(strTotal As String, strInicio As String, strFim As String)
    Dim i As Long, j As Long
        i = InStr(strTotal, strInicio)
        j = InStr(strTotal, strFim)
        SeparaEntreDuasStrings = Mid(strTotal, i + Len(strInicio), j - i - Len(strInicio))
    End Function

    'Botão btImportar
    Código:
    btFoco.SetFocus
    If Nz(Len(txtArquivo), 0) = 0 Then 'Verifica se o arquivo foi selecionado
        MsgBox "É necessário selecionar o arquivo.", vbCritical, "Sistema"
        Call btArquivo_Click
        Exit Sub
    ElseIf Nz(Len(Dir(txtArquivo)), 0) = 0 Then 'Verifica se o arquivo existe
        MsgBox "O arquivo selecionado não foi encontrado.", vbCritical, "Sistema"
        Exit Sub
    End If
    If MsgBox("Confirma a importação dos dados?", vbQuestion + vbYesNo, "Sistema") = vbYes Then
        btImportar.Enabled = False
        btSair.Enabled = False
        Call ImportTXT
    End If
    Anexos
    [Resolvido]Importar arquivo TXT com 30 linhas por registo AttachmentBigLite.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (216 Kb) Baixado 69 vez(es)


    Última edição por Uilson Brasil em 6/4/2016, 20:07, editado 2 vez(es)


    .................................................................................
    ::: Uilson Brasil
    ::: Design in Microsoft Access
    Alvaro Teixeira
    Alvaro Teixeira
    Moderador Global
    Moderador Global


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7914
    Registrado : 15/03/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Alvaro Teixeira 5/4/2016, 23:18

    Olá Uilson, como vocês dizam aí, ficou show de bola.
    Obrigado pelo retorno (e partilha).
    cheers
    Uilson Brasil
    Uilson Brasil
    VIP
    VIP


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1039
    Registrado : 23/04/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Uilson Brasil 6/4/2016, 20:09

    Fiz uma pequena edição na sub mensagem 22:

    dê:
    Código:
    'inicia contador de registos a importar
     nRegistro = Nz(DMax("IDCAPA", "tblMovimento"), 0) + 1

    para:
    Código:
    'inicia contador de registos a importar
    nRegistro = Nz(DMax("NREG", "tblMovimento"), 0) + 1


    .................................................................................
    ::: Uilson Brasil
    ::: Design in Microsoft Access
    Alvaro Teixeira
    Alvaro Teixeira
    Moderador Global
    Moderador Global


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7914
    Registrado : 15/03/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Alvaro Teixeira 7/4/2016, 10:15

    Olá Uilson, obrigado pelo retorno.
    Os utilizadores do fórum agradecem.
    Abraço
    avatar
    Mordomo
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 6
    Registrado : 09/06/2016

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Mordomo 28/12/2018, 02:09

    Olá Uilson,

    Primeiramente, parabéns pelo projeto.

    Gostaria de saber se há a possibilidade de criar um projeto basicamente igual ao postado por você, mas para importar arquivos DAF-607 (simples nacional) em uma tabela. A extensão dele não é .txt (é padrão da receita federal).

    Att,

    Mordomo.
    Uilson Brasil
    Uilson Brasil
    VIP
    VIP


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1039
    Registrado : 23/04/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Uilson Brasil 28/12/2018, 16:45

    Mordomo, boa tarde!

    Creio que sim. Me envie o arquivo para que eu possa verificar melhor.

    e-mail: uilsonbrasil@hotmail.com

    Aí falamos melhor posteriormente para verificar as necessidades ...




    .................................................................................
    ::: Uilson Brasil
    ::: Design in Microsoft Access
    Alvaro Teixeira
    Alvaro Teixeira
    Moderador Global
    Moderador Global


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7914
    Registrado : 15/03/2013

    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Alvaro Teixeira 28/12/2018, 17:00

    Olá a todos,

    A razão do fórum é a partilha do conhecimento e inter-ajuda.
    O envio de mensagem privada através de email, priva os restantes membros.

    Abraço a todos

    Conteúdo patrocinado


    [Resolvido]Importar arquivo TXT com 30 linhas por registo Empty Re: [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Conteúdo patrocinado


      Data/hora atual: 19/3/2024, 05:57