Access inicio | | | | | |
Olá,
Seja Bem Vindo ao Blog.

Conecte-se ou registre-se e utilize gratuitamente este equipamento, temos exemplos referente a criação de banco de dados e desenvolvimento de softwares e programas utilizando o Microsoft Access.


Administração do Blog AccessDoProgramador.

Numeração personalizada de BPA usando Loop while MS Access

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

05092015

Mensagem 

Numeração personalizada de BPA usando Loop while MS Access






Olá pessoal. Estou com um problema e creio que posso resolver com Loop. No entanto não consigo resolve-lo. Ficararei muito feliz se alguém que ler este meu comentário puder me ajudar.

Vamos lá:

Eu tenho uma tabela onde tenho três determinados campos: cns_medico, f_fbpa e procedimentos. Nos campos cns_medico e procedimentos os valores podem repetir e quando isso acontece o campo f_bpa recebe um número, que, também repete, na mesma quantidade dos primeiros citados.

Só que, eu preciso alterar os números do campo f_bpa de acordo com uma sequencia que eu criar. Tipo assim: se lá tem um número 087, gostaria de trocar por 001,002...

Não sei se consegui explicar direito. Para "ajudar" Essa tabela é proveniente do txt que é usado por programas de faturamento (BPA INDIVIDUALIZADO).

Me ajudem! Estou precisando muito dessa solução.
Obs: tudo esta como texto na tabela.

SOLUÇÃO: Dilson escreveu:

Bastará criar um campo chamado "Ordem" na sua tabela do BPA. Crie um botão e use:

Dim rs As DAO.Recordset
Dim old_BPA As String
Dim nConta As Long
Dim nTotal As Long
Dim quantCar As Integer
old_BPA = ""
nConta = 0
nTotal = 0
quantCar = 0
Set rs = CurrentDb.OpenRecordset("SELECT * FROM SuaTabelaBPA ORDER BY f_bpa")
rs.MoveLast
rs.MoveFirst
 Do While Not rs.EOF
   If rs("f_bpa") = old_BPA Then
        nTotal = nConta
        quantCar = Len(Left(nTotal, 3))
        If quantCar = 1 Then
             rs.Edit
                rs("Ordem") = "00" & nTotal
             rs.Update
        ElseIf quantCar = 2 Then
                 rs.Edit
                    rs("Ordem") = "0" & nTotal
                 rs.Update
        ElseIf quantCar = 3 Then
                 rs.Edit
                    rs("Ordem") = nTotal
                 rs.Update
        End If
        old_BPA = rs("f_bpa")
   Else
        old_BPA = rs("f_bpa")
        nConta = nConta + 1
        rs.Edit
           rs("Ordem") = "00" & nConta
        rs.Update
   End If
   rs.MoveNext
 Loop
MsgBox "OK concluido. Abra a tabela ordene f_bpa para A-Z e veja o resultado no campo [Ordem]"
rs.Close
'Criado por Dilson para efgomes em 09/09/2015 - AccessDoProgramador.forumeiros.com
'Objetivo: 'Ordenar como: 001, 001, 001, 002, 002, 003, 004, 004, 005 ...



Em outro botão, se desejar ordenar como 001,002, 003, 001, 002, 003, 004, 004 .. coloque:

Dim rs As DAO.Recordset
Dim old_BPA As String
Dim nConta As Long
Dim nTotal As Long
Dim quantCar As Integer
old_BPA = ""
nConta = 0
nTotal = 0
quantCar = 0
Set rs = CurrentDb.OpenRecordset("SELECT * FROM SuaTabelaBPA ORDER BY f_bpa")
rs.MoveLast
rs.MoveFirst
 Do While Not rs.EOF
   If rs("f_bpa") = old_BPA Then
        nTotal = nConta + 1
        quantCar = Len(Left(nTotal, 3))
        If quantCar = 1 Then
             rs.Edit
                rs("Ordem") = "00" & nTotal
             rs.Update
        ElseIf quantCar = 2 Then
                 rs.Edit
                    rs("Ordem") = "0" & nTotal
                 rs.Update
        ElseIf quantCar = 3 Then
                 rs.Edit
                    rs("Ordem") = nTotal
                 rs.Update
        End If
        nConta = nConta + 1
        old_BPA = rs("f_bpa")
   Else
        old_BPA = rs("f_bpa")
        rs.Edit
           rs("Ordem") = "001"
        rs.Update
        nConta = 1
   End If
   rs.MoveNext
 Loop
MsgBox "OK concluido. Abra a tabela ordene f_bpa para A-Z e veja o resultado no campo [Ordem]"
rs.Close
'Criado por Dilson para efgomes em 09/09/2015 - AccessDoProgramador.forumeiros.com
'Objetivo: 'Ordenar como: 001, 002, 003, 001, 001, 002, 003, 004 ...


efgomes

Brasil


Voltar ao Topo Ir em baixo

Compartilhar este artigo em: BookmarksDiggRedditDel.icio.usGoogleLiveSlashdotNetscapeTechnoratiStumbleUponNewsvineFurlYahoo!Smarking

Numeração personalizada de BPA usando Loop while MS Access :: Comentários

avatar

Mensagem em Ter 8 Set 2015 - 16:01 por Dilson

efgomes complementou por email: escreveu:Tenho uma tabela com um campo (campo2) onde, de acordo com alguns critérios, exibe uma sequencia de numeração que não é "lógica". Esses números repetem. Eu preciso alterar esses números por uma sequencia lógica (campo3), porém, não estou conseguindo.

Exemplo:

campo1 campo2 campo3 (o que pretendo)
020203 312 001
020203 312 001
020203 312 001
020201 087 002
020204 401 003
020205 112 004
020205 112 004
020205 112 004

Será possível usar o loop para fazer isso, sem referenciar diretamente os dados (substituir 312 por 001), haja vista que não saberia qual numero viria a seguir...

Olá efgomes, boa tarde!

Achei esse caso parecido com um problema de plano de contas e acho que poderemos variar empregar o mesmo método para uma solução para seu problema, veja:   
Plano de Contas Contábil

Anexa aqui o link para baixar esse txt (anexa no dropbox.com ou outro de sua preferencia). logo mais tarde irei analisar e sugerir uma saída.

Aguardamos.

Voltar ao Topo Ir em baixo

Mensagem em Ter 8 Set 2015 - 20:41 por efgomes

Olá Dilson!

Segue o link. Está no OneDrive.

https://onedrive.live.com/?id=2569950A02D13804%21105&cid=2569950A02D13804&group=0

O campo em questão é o "f_bpa". Gostaria de criar um outro campo (ou pode ser atualizado nele mesmo) com a sequencia; 001, 002, 003...

Voltar ao Topo Ir em baixo

avatar

Mensagem em Qua 9 Set 2015 - 8:29 por Dilson

Olá,

Fiz a importação do txt ao microsoft access e ordenei a coluna f_bpa. Percebi as sequencias:
018
018
018
019
019
019
020
021
021
021

Agora deseja que em uma coluna a parte seja numerado assim:
018 - 1
018 - 2
018 - 3
019 - 1
019 - 2
019 - 3
020 - 1
021 - 1
021 - 2
021 - 3

É assim que deseja ?

Voltar ao Topo Ir em baixo

Mensagem em Qua 9 Set 2015 - 13:56 por efgomes

é isso mesmo, porém, se for possivel, eu queria ter a liberdade para começar em 001, 201, 501, etc...

Voltar ao Topo Ir em baixo

avatar

Mensagem em Qua 9 Set 2015 - 14:38 por Dilson

Se usarmos um campo do tipo texto será possível sim ficar com zero a esquerda.

Eu reparei depois na informação que me passou pelo email e o modelo de numeração difere desse que sugeri. Veja:
020203 312 001
020203 312 001
020203 312 001
020201 087 002
020204 401 003
020205 112 004
020205 112 004
020205 112 004

Repare que nesse raciocínio você não deixa a numeração começar de novo do 1.

Analise e me diga qual modo será melhor pra você.

Aguardamos.

Voltar ao Topo Ir em baixo

Mensagem em Qua 9 Set 2015 - 22:53 por efgomes

Grande Dilson!

É verdade, esse segundo raciocínio é que esta correto. A numeração não pode começar com o 1 de novo.  Os campos são todos do tipo texto também.

Voltar ao Topo Ir em baixo

avatar

Mensagem em Qui 10 Set 2015 - 9:12 por Dilson

Criei o código para o seu caso e como a variação foi minima criei também para o outro caso que havia sugerido.

Bastará criar um campo chamado "Ordem" na sua tabela do BPA.

Em seguida coloque a partir de um botão o seguinte para ordenar como 001, 001, 001, 002, 002, 003, 003 ... :

Dim rs As DAO.Recordset
Dim old_BPA As String
Dim nConta As Long
Dim nTotal As Long
Dim quantCar As Integer
old_BPA = ""
nConta = 0
nTotal = 0
quantCar = 0
Set rs = CurrentDb.OpenRecordset("SELECT * FROM SuaTabelaBPA ORDER BY f_bpa")
rs.MoveLast
rs.MoveFirst
 Do While Not rs.EOF
   If rs("f_bpa") = old_BPA Then
        nTotal = nConta
        quantCar = Len(Left(nTotal, 3))
        If quantCar = 1 Then
             rs.Edit
                rs("Ordem") = "00" & nTotal
             rs.Update
        ElseIf quantCar = 2 Then
                 rs.Edit
                    rs("Ordem") = "0" & nTotal
                 rs.Update
        ElseIf quantCar = 3 Then
                 rs.Edit
                    rs("Ordem") = nTotal
                 rs.Update
        End If
        old_BPA = rs("f_bpa")
   Else
        old_BPA = rs("f_bpa")
        nConta = nConta + 1
        rs.Edit
           rs("Ordem") = "00" & nConta
        rs.Update
   End If
   rs.MoveNext
 Loop
MsgBox "OK concluido. Abra a tabela ordene f_bpa para A-Z e veja o resultado no campo [Ordem]"
rs.Close
'Criado por Dilson para efgomes em 09/09/2015 - AccessDoProgramador.forumeiros.com
'Objetivo: 'Ordenar como: 001, 001, 001, 002, 002, 003, 004, 004, 005 ...



Em outro botão, se desejar ordenar como 001,002, 003, 001, 002, 003, 004, 004 .. coloque:

Dim rs As DAO.Recordset
Dim old_BPA As String
Dim nConta As Long
Dim nTotal As Long
Dim quantCar As Integer
old_BPA = ""
nConta = 0
nTotal = 0
quantCar = 0
Set rs = CurrentDb.OpenRecordset("SELECT * FROM SuaTabelaBPA ORDER BY f_bpa")
rs.MoveLast
rs.MoveFirst
 Do While Not rs.EOF
   If rs("f_bpa") = old_BPA Then
        nTotal = nConta + 1
        quantCar = Len(Left(nTotal, 3))
        If quantCar = 1 Then
             rs.Edit
                rs("Ordem") = "00" & nTotal
             rs.Update
        ElseIf quantCar = 2 Then
                 rs.Edit
                    rs("Ordem") = "0" & nTotal
                 rs.Update
        ElseIf quantCar = 3 Then
                 rs.Edit
                    rs("Ordem") = nTotal
                 rs.Update
        End If
        nConta = nConta + 1
        old_BPA = rs("f_bpa")
   Else
        old_BPA = rs("f_bpa")
        rs.Edit
           rs("Ordem") = "001"
        rs.Update
        nConta = 1
   End If
   rs.MoveNext
 Loop
MsgBox "OK concluido. Abra a tabela ordene f_bpa para A-Z e veja o resultado no campo [Ordem]"
rs.Close
'Criado por Dilson para efgomes em 09/09/2015 - AccessDoProgramador.forumeiros.com
'Objetivo: 'Ordenar como: 001, 002, 003, 001, 001, 002, 003, 004 ...



Veja se resulta.

Voltar ao Topo Ir em baixo

Mensagem em Sex 11 Set 2015 - 20:35 por efgomes

Muito bom! Testei e funcionou perfeitamente. Obrigado!

Voltar ao Topo Ir em baixo

Mensagem em Sex 5 Maio 2017 - 11:44 por efgomes

Olá Dilson, me salve novamente! rs

Vc fez um código pra mim, que funcionou perfeitamente, até hoje. rsrsrs É que mudaram as "regras do jogo" e a coisa complicou.

Você fez dois códigos e com certeza vai se lembrar...todos os dois tem me servido, porém, no segundo código, é criada uma numeração no campo "Ordem" toda vez que existe um critério diferente, e cria-se uma numeração a partir do 001 até que o critério mude de novo.

O meu problema é o seguinte: quando essa numeração atingir o 051 ela deveria ser iniciada novamente, mesmo o critério ainda continuando o mesmo. Não sei se você entendeu, mas posso enviar mais explicações ou mesmo o arquivo.

Abraços e desde já agradeço a atenção.

Voltar ao Topo Ir em baixo

Mensagem em Sex 5 Maio 2017 - 12:18 por efgomes

Grande Dilson,

Segue o link do arquivo, em excel, pra vc dar uma olhada.

https://drive.google.com/open?id=0B_oVG0zMQGiHYmhyRUtpWWdSQkU

Observe que tem um campo "Prd_flh" que é o critério e um campo "Ordem", onde é salvo a numeração que é criada.

Até a Ordem criada de numero 003, está tudo bem, pois não foi atingido o máximo de 051. No entanto, a partir da Ordem 004 a tabela possui mais de 2000 registros, que foram "ordenados" com a posição 004.

O problema é que sempre que o contador atingir o número 051 a ordem deveria ser reiniciada. Tipo: 005 até atingir 051 vezes e assim por diante.

O código que estou usando é esse abaixo:

Dim rs As DAO.Recordset
Dim old_BPA As String
Dim nConta As Long
Dim nTotal As Long
Dim quantCar As Integer
old_BPA = ""
nConta = 0
nTotal = 0
quantCar = 0
Set rs = CurrentDb.OpenRecordset("SELECT * FROM individualizados ORDER BY Prd_flh")
rs.MoveLast
rs.MoveFirst
 Do While Not rs.EOF
   If rs("Prd_flh") = old_BPA Then
        nTotal = nConta
        quantCar = Len(Left(nTotal, 3))
        If quantCar = 1 Then
             rs.Edit
                rs("Ordem") = "00" & nTotal
             rs.Update
        ElseIf quantCar = 2 Then
                 rs.Edit
                    rs("Ordem") = "0" & nTotal
                 rs.Update
        ElseIf quantCar = 3 Then
                 rs.Edit
                    rs("Ordem") = nTotal
                 rs.Update
 
        End If
        old_BPA = rs("Prd_flh")
   Else
        old_BPA = rs("Prd_flh")
        nConta = nConta + 1
        rs.Edit
           rs("Ordem") = "00" & nConta
        rs.Update
   End If
   rs.MoveNext
 Loop
MsgBox "OK concluido. Abra a tabela ordene f_bpa para A-Z e veja o resultado no campo [Ordem]"
rs.Close
'Criado por Dilson para efgomes em 09/09/2015 - AccessDoProgramador.forumeiros.com

Voltar ao Topo Ir em baixo

avatar

Mensagem em Dom 7 Maio 2017 - 22:54 por Dilson

Faz um contador entre esse trecho:

Do While Not rs.EOF
   If rs("Prd_flh") = old_BPA Then


Se o contador atingir 51 você muda o valor da variavel old_BPA. Daí o código vai para o bloco Else criando nova numeração.

Voltar ao Topo Ir em baixo

Mensagem em Seg 8 Maio 2017 - 11:20 por efgomes

Grande Edilson,

Estou fazendo alguns testes, mas, ainda não obtive exito.

Voltar ao Topo Ir em baixo

Mensagem  por Conteúdo patrocinado

Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo


 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum