Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Irenko

Buscar dados

Recommended Posts

Pessoal, em um campo da tabela eu tenho gravado u texto que pode estar assim:

 

0679-02-275-1

 

ou assim:

 

0679.02.275-1

 

ou ainda assim:

 

0679022751

 

A pergunta é, em um textbox eu digito qualquer uma dessas opções e o codigo de busca faz a comparação com o que esta gravado no campo, se o numero que digitei é igual ao do campo sem os outros caracteres ele me da o resultado. Como montar essa rotina para comparar os dados?

 

Tentei assim:

Source = "SELECT REPLACE(REPLACE(Desenho, '.',''),'-','') As NumDesenho ,LM_2 FROM DadosCab WHERE  NumDesenho = '" & txtNumero.Text & "' ORDER BY LM_2"

'e assim:

Source = "SELECT Desenho,LM_2 AS Lista FROM DadosCab WHERE REPLACE(REPLACE(Desenho, '.',''),'-','') = REPLACE(REPLACE(" & TxtBusca.text & ", '.',''),'-','')ORDER BY LM_2"
porem deu erro:(Função replace indefinida na expressão)

 

Essa consulta pelo tal de desenho é feita de vez em quando. Não posso mudar a formatação na gravação pois já existe uma monte de entradas que o usuario digitou esse desenho de varias formas ex:

 

0679-01-251-1

0679012511

0679.01-251-1

0679.01.251.1 e por ai vai......

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deixa eu entender.

Os gravados no banco estão todos sem formatação mas ele pode pesquisar com a formatação? É isso mesmo?

 

Se for, sua idéia do replace está correta. Ele só deu expressão errada porque da forma como está passando, o replace seria uma função do SQL, e não é o caso, o replace é uma função do VB.

 

Ficaria algo tipo assim:

Source = "SELECT Desenho As NumDesenho, LM_2 FROM DadosCab WHERE NumDesenho = '" & replace(replace(txtNumero.Text,".",""),"-","") & "' ORDER BY LM_2"

Se entendi errado diz aí.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Claudio, a ideia é essa mesma, tentei assim conforme sua sugestão:

.Source = "SELECT Desenho As NumDesenho, LM_2 As Lista FROM DadosCab WHERE NumDesenho = '" & Replace(Replace(TxtBusca.text, ".", ""), "-", "") & "' ORDER BY LM_2"

Deu esse erro agora:

 

(Nenhum valor foi fornecido para um ou mais parâmetros necessários)

 

Tentei 03 formas de digitação:

 

0679-02-348-1

0679.02.348.1

0679023481

 

Só para lembrar, o banco é access. O usuário pode digitar tanto com formatação ou não.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É comum esse erro acontecer quando você passa algum nome inválido de campo para ele.

 

No seu caso está ocorrendo, porque por mais que tenha dado um apelido para o campo Desenho, na hora de montar a cláusula (where) deve passar o nome original.

 

Sua query deve ficar assim:

.Source = "SELECT Desenho As NumDesenho, LM_2 As Lista FROM DadosCab WHERE Desenho = '" & Replace(Replace(TxtBusca.text, ".", ""), "-", "") & "' ORDER BY LM_2"

Veja se agora vai...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Claudio, sua sugestão da certo se por exemplo o campo esteja assim:

 

0649028481

 

se o usuario digitar no textbox:

 

0649-02-348-1

 

retorna corretamente.

 

Só que para funcionar de acordo com o pretendido por mim, o replace teria que ser feito diretamente no campo da tabela tirando todos os caracteres deixando somente os numeros. Pergunto é possivel fazer o replace diretamente no campo, no caso (Desenho)?

 

.Source = "SELECT Desenho, LM_2 As Lista FROM DadosCab WHERE Desenho = '" & Replace(Replace(TxtBusca.text, ".", ""), "-", "") & "' ORDER BY LM_2"

 

Tentei assim:

 

.Source = "SELECT Desenho, LM_2 As Lista FROM DadosCab WHERE Replace(Replace(Desenho, '.', ''), '-', '') = '" & Replace(Replace(TxtBusca.text, ".", ""), "-", "") & "' ORDER BY LM_2"

 

porem deu a msg de erro:

Função Replace indefinada na expressão

 

O banco access não aceita esse tipo de consulta?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, por isso tinha feito a pergunta anterior. Eu tinha entendido de que no banco não existia essa situação de ter o código com pontos.

 

Você sabe me dizer se o posicionamento dos pontos e traçoes será sempre no mesmo lugar?

Por exemplo:

 

0679-01-251-1

0649-02-348-1

 

Ou pode variar, sendo que o primeiro conjunto tenha 5 casas, o segundo 1, e por ai vai?

Se for sempre fixo, você pode usar mid.

Por exemplo:

.Source = "SELECT Desenho, LM_2 As Lista FROM DadosCab WHERE mid(Desenho,1,4) & mid(desenho,6,2) & mid(desenho,8,3) & mid(desenho,12,1) = '" & Replace(Replace(TxtBusca.text, ".", ""), "-", "") & "' ORDER BY LM_2"

Se forem sempre fixos, tente fazer isso. Senão tentamos arranjar outra solução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É Claudio essa tá dificil!!!!! Eis o código completo:

Private Sub CarregaLiberadosXX()
     Set Tabela_LM = New ADODB.Recordset
        If Tabela_LM.State = 1 Then Tabela_LM.Close
     
           With Tabela_LM
                .CursorType = adOpenStatic
                .CursorLocation = adUseClient
                .LockType = adLockPessimistic
                ElseIf Op_Desenho = True Then
                '.Source = "SELECT Desenho As NumDesenho, LM_2 As Lista FROM DadosCab WHERE Desenho = '" & Replace(Replace(TxtBusca.text, ".", ""), "-", "") & "' ORDER BY LM_2"
                '.Source = "SELECT Desenho,LM_2 AS Lista FROM DadosCab WHERE Desenho like '%" & TxtBusca.text & "%' ORDER BY LM_2"
                '.Source = "SELECT Desenho, LM_2 As Lista FROM DadosCab WHERE Desenho = '" & Replace(Replace(TxtBusca.text, ".", ""), "-", "") & "' ORDER BY LM_2"
                '.Source = "SELECT Desenho,LM_2 AS Lista FROM DadosCab WHERE REPLACE(REPLACE(Desenho, '.',''),'-','') = REPLACE(REPLACE(" & TxtBusca.text & ", '.',''),'-','')ORDER BY LM_2"
                '.Source = "SELECT REPLACE(REPLACE(Desenho, '.',''),'-','') As NumDesenho ,LM_2 AS Lista FROM DadosCab WHERE  NumDesenho = '" & TxtBusca.text & "' ORDER BY LM_2"
                'Dim Matriz(21) As String
                'Dim i As Integer
                'For i = 0 To 20
                'Matriz(0) = ".": Matriz(1) = ";": Matriz(2) = ",": Matriz(3) = "/": Matriz(4) = "\": Matriz(5) = "<": Matriz(6) = ">": Matriz(7) = "*": Matriz(8) = "%": Matriz(9) = "#": Matriz(10) = "&": Matriz(11) = "$": Matriz(12) = "@": Matriz(13) = "(": Matriz(14) = ")": Matriz(15) = "?": Matriz(16) = "[": Matriz(17) = "]": Matriz(18) = "^": Matriz(19) = "~": Matriz(20) = " "
                '.Source = "SELECT ReplaceR([Desenho], " - ", ""), LM_2 As Lista FROM DadosCab WHERE Desenho = '" & TxtBusca.text & "' ORDER BY LM_2"
                '.Source = "SELECT  Desenho,LM_2 As Lista From DadosCab WHERE '" & Replace(Desenho, "'-'", "''") & "' = '" & TxtBusca.text & "' ORDER BY LM_2"
'"SELECT " & Replace(Table1.Field1, "'--'", "''") & "FROM Table1"
.Source = "SELECT Desenho, LM_2 As Lista FROM DadosCab WHERE mid(Desenho,1,4) & mid(desenho,6,2) & mid(desenho,8,3) & mid(desenho,12,1) = '" & Replace(Replace(TxtBusca.text, ".", ""), "-", "") & "' ORDER BY LM_2"

                '.Source = "SELECT Desenho, LM_2 As Lista FROM DadosCab WHERE Replace(Replace([Desenho], '.', ''), '-', '') = '" & Replace(Replace(TxtBusca.text, ".", ""), "-", "") & "' ORDER BY LM_2"
                '.Source = "SELECT Desenho As NumDesenho, LM_2 As Lista FROM DadosCab WHERE NumDesenho = '" & Replace(ReplaceMultiplo(TxtBusca.text, Matriz(i), "|", "-"), " ", "") & "' ORDER BY LM_2"
                'Next i
                Else
                MsgBox "Selecione o tipo de pesquisa para concluir!!", vbInformation, "Pesquisa Lista de Materiais"
                Exit Sub
                End If
                .ActiveConnection = ConexaoLM
                .Open
                 PosicaoBusca = Tabela_LM.RecordCount
                 
              
              If .RecordCount = 0 Then
                MsgBox "Lista de Material não cadastrada ou já liberada!", vbCritical, "Erro de pesquisa"
                TxtBusca.text = ""
                TxtBusca.SetFocus
                Exit Sub
              End If
              Do While Not .EOF
                  Items "NR_Copia", Tabela_LM!Lista
                .MoveNext
                
                  If Err.Number <> 0 Then Exit Do
                
              Loop
              DoEvents
           End With
           FechaRecosdSet
End Sub
Como pode ver já tentei um monte de alternativas que estão comentadas. Essa ultima passada por você caiu aqui:

 

MsgBox "Lista de Material não cadastrada ou já liberada!", vbCritical, "Erro de pesquisa"

 

o MID não reconheceu.

 

Tentei essa:

 

.Source = "SELECT Desenho,LM_2 As Lista From DadosCab WHERE '" & Replace(Desenho, "'-'", "''") & "' = '" & TxtBusca.text & "' ORDER BY LM_2"

 

tambem caiu na mesma MsgBox.

Compartilhar este post


Link para o post
Compartilhar em outros sites

o access tem o replace, nao tem?

 

"SELECT Desenho, LM_2 As Lista FROM DadosCab WHERE  Replace(Replace([Desenho], ".", ""), "-", "")  = '" & Replace(Replace(TxtBusca.text, ".", ""), "-", "") & "' ORDER BY LM_2"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom pessoal, agradeço a colaboração de você's para tentar resolver esse problema, eu estou desistindo pois acho que o problema esta no banco access. Tentei todas as alternativas possiveis e suas sugetões, porem em vão. Valeu mesmo!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como assim desistindo?? Você pode desistir? Não precisa fazer esse projeto???

 

Deve ser alguma formatação errada, pois repare que nos dois casos não deu erro, só o que aconteceu foi que não achou registros.

A que fiz não dará certo mesmo, essa pode descartar, parando para pensar agora, lembrei que você disse que terá no banco dados cadastrados sem pontos e sem hífens né. Nesse caso, o mid não funcionará direito.

 

Mas vamos tentar ver porque a com replace também não deu. Realmente o Access possui replace sim.

 

Essa foi a que você fez que chegou mais perto do resultado que você espera:

.Source = "SELECT Desenho, LM_2 As Lista FROM DadosCab WHERE Replace(Replace([Desenho], '.', ''), '-', '') = '" & Replace(Replace(TxtBusca.text, ".", ""), "-", "") & "' ORDER BY LM_2"
Essa deu algum erro? O que aconteceu?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outra coisa.

Execute isto:

 

MsgBox "SELECT Desenho, LM_2 As Lista FROM DadosCab WHERE Replace(Replace([Desenho], '.', ''), '-', '') = '" & Replace(Replace(TxtBusca.text, ".", ""), "-", "") & "' ORDER BY LM_2"

Coloca aqui o que aparecer na mensagem. Pode ser que esteja montando algo errado, dificil, mas pode ser.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, para entender melhor o problema somente com um exemplo. Criei um pequeno exemplo e se um dos dois puder ajudar eu mando via e-mail.

 

Meu MSN é:

 

idovaldo@hotmail.com.

 

 

Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Irenko, nunca vi isso, se executa a query direto no access funciona, mas no VB não...

 

Uma solução que você pode usar é colocar uma maskedbox no lugar da textbox que usa para digitar o código formatada de tal forma que sempre terá hífen ou ponto, tanto faz, mas tem que ter um ou outro.

 

Aí sua query você pode montar assim:

"SELECT Desenho, LM_2 As Lista FROM DadosCab WHERE Desenho = '" & TxtBusca.Text & "' or Desenho  = '" & Replace(TxtBusca,"-",".") & "' or Desenho = '" & Replace(TxtBusca,"-","") & "' ORDER BY LM_2"

Veja se resolve.

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

É Claudio, não falei pra você que tinha que desistir! Não funcionou! Se diretamente no access funcionou e no VB não, fazer o quê!! Vai entender né. Bom, mesmo assim obrigado pela força.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Irenko, nunca vi isso, se executa a query direto no access funciona, mas no VB não...

 

Uma solução que você pode usar é colocar uma maskedbox no lugar da textbox que usa para digitar o código formatada de tal forma que sempre terá hífen ou ponto, tanto faz, mas tem que ter um ou outro.

 

Aí sua query você pode montar assim:

"SELECT Desenho, LM_2 As Lista FROM DadosCab WHERE Desenho = '" & TxtBusca.Text & "' or Desenho  = '" & Replace(TxtBusca,"-",".") & "' or Desenho = '" & Replace(TxtBusca,"-","") & "' ORDER BY LM_2"

Veja se resolve.

Abraço

 

Já tive problemas com isso Claudio, mas eu usava ODBC. Acho que ele não tá usando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvi assim o problema com a ajuda de outros colaboradores:

 

Dim Dado As String
                Dim DadoSemFormato As String
                Dim strSQL As String

                Dado = Trim(TxtBusca.text)
                If Len(Dado) = 8 Then
                   Dado = Format(Dado, "0000\-0\-00\-0")
                ElseIf Len(Dado) = 10 Then
                   Dado = Format(Dado, "0000\-00\-000\-0")
                End If
                DadoSemFormato = Replace(Dado, "-", "")
                If Len(Dado) = 11 Or Len(Dado) = 13 Then
                   .Source = "SELECT Desenho,LM_2 AS Lista FROM DadosCab WHERE Desenho = '" & Dado & "' OR Desenho = '" & DadoSemFormato & "' ORDER BY LM_2"
                End If

Compartilhar este post


Link para o post
Compartilhar em outros sites

Claudio, dá uma forca ai nessa rotina. Como pode ver criei uma array com duas formatações (-) e (.), na consulta tem que comparar as duas e pegar a correta. No teste que fiz mudei os dados do campo para 0679.02.348.1 só que não esta pegando o x(1), onde posso estar errando?

 

Dim x(2) As String
                x(0) = "0000\-00\-000\-0"
                x(1) = "0000\.00\.000\.0"

                Dado = Trim(TxtBusca.text)
                
                If Len(Dado) = 10 Then
                   Dim i As Integer
                 If Dado <> "" Then
                   For i = 0 To UBound(x) - 1
                     Dado = Format(Dado, x(i))
                   Next
                 End If
                End If
                DadoSemFormato = Replace(Dado, "-", "")
                If Len(Dado) = 11 Or Len(Dado) = 13 Then
                   .Source = "SELECT Desenho,LM_2 AS Lista FROM DadosCab WHERE Desenho = '" & Dado & "' OR Desenho = '" & DadoSemFormato & "' ORDER BY LM_2"
                End If

Compartilhar este post


Link para o post
Compartilhar em outros sites

O UBound retorna a maior posição do array, não a quantidade de podições. Então não precisa do -1.

 

Exemplo:

 

Dim arr(3) as string

 

As posições são 0, 1, 2, 3

Se eu fizer u UBound(arr), vai me retornar 3.

Compartilhar este post


Link para o post
Compartilhar em outros sites

fiz assim:

Dim Dado As String
Dim Formato10(3) As String
Dim Formato8(2) As String
Dim DadoFormatado(4) As String
Dim DadoSemFormato As String
Dim Source As String
Dim i As Integer

Formato8(0) = "@@@@\-@\-@@\-@"
Formato8(1) = "@@@@\.@\.@@\.@"

Formato10(0) = "@@@@\-@\-@@@\-@@"
Formato10(1) = "@@@@\-@@\-@@@\-@"
Formato10(2) = "@@@@\.@\.@@@\.@@"
Formato10(3) = "@@@@\.@@\.@@@\.@"

Dado = Trim(TxtBusca.text)

If Len(Dado) = 8 Then
    For i = 0 To UBound(Formato10) - 1
        If Formato8(i) <> "" Then
            DadoFormatado(i) = Format(Dado, Formato8(i))
        End If
    Next
ElseIf Len(Dado) = 10 Then
    For i = 0 To UBound(Formato10) - 1
        If Formato10(i) <> "" Then
            DadoFormatado(i) = Format(Dado, Formato10(i))
        End If
    Next
End If

DadoSemFormato = Replace(Replace(Dado, "-", ""), ".", "")

If Len(Dado) = 11 Or Len(Dado) = 13 Then
    .Source = "SELECT Desenho,LM_2 AS Lista FROM DadosCab WHERE Desenho = '" & DadoSemFormato & "'"
    Else
    For i = 0 To UBound(DadoFormatado)
    
        If DadoFormatado(i) <> "" Then
            '.Source = .Source & " OR Desenho = '" & DadoFormatado(i) & "'"
         .Source = "SELECT Desenho,LM_2 AS Lista FROM DadosCab WHERE Desenho = '" & DadoFormatado(i) & "'"
        End If
    Next
    '.Source = .Source & " ORDER BY LM_2"
End If

No campo esta assim: 0679-02-348-1

 

se digito: 0679023481 cai aqui:

 

MsgBox "Lista de Material não cadastrada ou já liberada!", vbCritical, "Erro de pesquisa"

 

Fiz o Debug.Print e a formatação esta posicionando aqui: Formato10(0) = "@@@@\-@\-@@@\-@@"

 

A varialvel DadoFormatado esta assumindo a formatação, Formato10(0) = "@@@@\-@\-@@@\-@@" ou seja o Laço só esta pegando o primeiro.

 

que esta errado nesse laço for?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.