MaximoAccess

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

Obrigado

Administração do MaximoAccess

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

    [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Compartilhe
    avatar
    Uilson Brasil
    VIP
    VIP

    Respeito às Regras 100%

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

    [Resolvido]Importar arquivo TXT com 30 linhas por registo

    Mensagem  Uilson Brasil em Qua 23 Mar 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
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

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

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

    Mensagem  ahteixeira em Qua 23 Mar 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
    avatar
    Uilson Brasil
    VIP
    VIP

    Respeito às Regras 100%

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

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

    Mensagem  Uilson Brasil em Sex 01 Abr 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.

    Veja a imagem com o mapeamento dos campos: [Você precisa estar registrado e conectado para ver este link.]


    Se poder me ajudar nessa empreitada, desde já agradeço ...
    Anexos
    Teste.txt
    Você não tem permissão para fazer download dos arquivos anexados.
    (8 Kb) Baixado 13 vez(es)


    .................................................................................
    ::: Uilson Brasil
    ::: Design in Microsoft Access
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

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

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

    Mensagem  ahteixeira em Sex 01 Abr 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
    avatar
    Uilson Brasil
    VIP
    VIP

    Respeito às Regras 100%

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

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

    Mensagem  Uilson Brasil em Sex 01 Abr 2016, 14:56

    Alvaro,

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


    .................................................................................
    ::: Uilson Brasil
    ::: Design in Microsoft Access
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

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

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

    Mensagem  ahteixeira em Sex 01 Abr 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
    avatar
    Uilson Brasil
    VIP
    VIP

    Respeito às Regras 100%

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

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

    Mensagem  Uilson Brasil em Sex 01 Abr 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
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

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

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

    Mensagem  ahteixeira em Sex 01 Abr 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 [Você precisa estar registrado e conectado para ver este link.][Você precisa estar registrado e conectado para ver este link.] 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
    [Você precisa estar registrado e conectado para ver esta imagem.]
    Abraço
    avatar
    Uilson Brasil
    VIP
    VIP

    Respeito às Regras 100%

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

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

    Mensagem  Uilson Brasil em Sex 01 Abr 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
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

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

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

    Mensagem  ahteixeira em Sex 01 Abr 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
    avatar
    Uilson Brasil
    VIP
    VIP

    Respeito às Regras 100%

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

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

    Mensagem  Uilson Brasil em Sex 01 Abr 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
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

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

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

    Mensagem  ahteixeira em Sab 02 Abr 2016, 12:20

    Olá,
    Podemos ter de duas formas, veja a figura:
    [Você precisa estar registrado e conectado para ver esta imagem.]

    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
    avatar
    Uilson Brasil
    VIP
    VIP

    Respeito às Regras 100%

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

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

    Mensagem  Uilson Brasil em Dom 03 Abr 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
    avatar
    Uilson Brasil
    VIP
    VIP

    Respeito às Regras 100%

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

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

    Mensagem  Uilson Brasil em Seg 04 Abr 2016, 05:32

    Alvaro,

    Segue arquivos. Avancei um pouco, mas ainda está muito distante do pretendido.
    Anexos
    Temp.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (372 Kb) Baixado 12 vez(es)


    .................................................................................
    ::: Uilson Brasil
    ::: Design in Microsoft Access
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

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

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

    Mensagem  ahteixeira em Seg 04 Abr 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
    avatar
    Uilson Brasil
    VIP
    VIP

    Respeito às Regras 100%

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

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

    Mensagem  Uilson Brasil em Seg 04 Abr 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
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

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

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

    Mensagem  ahteixeira em Seg 04 Abr 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
    avatar
    Uilson Brasil
    VIP
    VIP

    Respeito às Regras 100%

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

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

    Mensagem  Uilson Brasil em Seg 04 Abr 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
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

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

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

    Mensagem  ahteixeira em Seg 04 Abr 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
    ImportarTXT_recibos_rev1.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (27 Kb) Baixado 14 vez(es)


    Última edição por ahteixeira em Ter 05 Abr 2016, 09:34, editado 1 vez(es)
    avatar
    FabioPaes
    Moderador
    Moderador

    Respeito às Regras 100%

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

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

    Mensagem  FabioPaes em Seg 04 Abr 2016, 17:44

    cheers

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


    Parabéns Ahteixeira Pelo Excelente exemplo... Muito Bom mesmo!
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

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

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

    Mensagem  ahteixeira em Ter 05 Abr 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
    avatar
    Uilson Brasil
    VIP
    VIP

    Respeito às Regras 100%

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

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

    Mensagem  Uilson Brasil em Ter 05 Abr 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: [Você precisa estar registrado e conectado para ver este link.].

    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
    BigLite.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (216 Kb) Baixado 22 vez(es)


    Última edição por Uilson Brasil em Qua 06 Abr 2016, 20:07, editado 2 vez(es)


    .................................................................................
    ::: Uilson Brasil
    ::: Design in Microsoft Access
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

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

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

    Mensagem  ahteixeira em Ter 05 Abr 2016, 23:18

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

    Respeito às Regras 100%

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

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

    Mensagem  Uilson Brasil em Qua 06 Abr 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
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

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

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

    Mensagem  ahteixeira em Qui 07 Abr 2016, 10:15

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

      Data/hora atual: Dom 25 Jun 2017, 06:28