BUSCA DINAMICA 02

IRENKO 03/12/2009 11:37:53
#329052
Bom, consegui uma alternativa, vai ficar bem grande mas preciso de ajuda. O codigo abaixo me retorna o seguinte:

Se digito no TextBusca 0679023481 vai formatar para 0679-02-348-1 e buscar corretamente. Agora lá no banco pode estra assim como exemplo:

0178-2-82-1 ou 01782821

eu teria que contar sempre a quant de caracteres e formatar colocando o (-). Precisaria de uma função que faça isso.

pode extir um texto com 11 caracteres = 0178-2-82-1, neste caso não precisaria formatação
se fosse com 08 caracteres 01782821, ai formataria para 0178-2-82-1

se fosse com 13 caracteres 0679-02-580-1, neste caso não precisaria formatação.
se fosse com 10 caracteres 0679025811, ai formataria para 0679-02-580-1.




Dim PrimeiraPart As String
Dim SegundaPart As String
Dim Data As String
Dim Result As String
Dim strSQL As String
Data = TxtBusca.text
If Len(TxtBusca.text) = 10 Then
PrimeiraPart = Mid$(Data, 1, 4)
SegundaPart = Mid$(Data, 5, 2)
TerceiraPart = Mid$(Data, 7, 3)
QuartaPart = Mid$(Data, 10, 1)
End If
Result = PrimeiraPart & [Ô]-[Ô] & SegundaPart & [Ô]-[Ô] & TerceiraPart & [Ô]-[Ô] & QuartaPart
.Source = [Ô]SELECT Desenho,LM_2 AS Lista FROM DadosCab WHERE Desenho like [ô]%[Ô] & Result & [Ô]%[ô] ORDER BY LM_2[Ô]
LEANDRO 03/12/2009 12:24:13
#329065
o que você precisa ?
HUGOSSOUZA 03/12/2009 14:29:26
#329078
pq vc não da um replace e remove toda a pontuação para comparar?
IRENKO 03/12/2009 15:37:18
#329087
Hugo, se vc observar tem um outro tópico já encerrado com o mesmo nome que explica o porque não uso o replace. Já tentei varias alternativas citadas pelos colegas do forum nesse tópico usando o replace, porem o mesmo não funciona devido versão do banco access, creio eu. Acredito que uma função possa resolver meu caso, as linhas de codigo abaixo esta + ou - funcionado, consegui fazer a formatação para dois tipos de entrada no TextBusca, ou seja, 0679023481 e 01782821 com 10 e 8 caracteres formatando para:
0679-02-348-1 e 0178-2-82-1.

Dim PrimeiraPart As String
Dim SegundaPart As String
Dim Data As String
Dim Result As String
Dim strSQL As String
Data = TxtBusca.text
If Len(TxtBusca.text) = 10 Then
PrimeiraPart = Mid$(Data, 1, 4)
SegundaPart = Mid$(Data, 5, 2)
TerceiraPart = Mid$(Data, 7, 3)
QuartaPart = Mid$(Data, 10, 1)
End If
Result = PrimeiraPart & [Ô]-[Ô] & SegundaPart & [Ô]-[Ô] & TerceiraPart & [Ô]-[Ô] & QuartaPart
.Source = [Ô]SELECT Desenho,LM_2 AS Lista FROM DadosCab WHERE Desenho like [ô]%[Ô] & Result & [Ô]%[ô] ORDER BY LM_2[Ô]
RCMRO 03/12/2009 16:16:20
#329090
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
Data = format(Dado, [Ô]0000\-00\-000\-0[Ô])
End If
DadoSemFormato = replace(Dado, [Ô]-[Ô], [Ô][Ô])
if Len(Dado) = 11 or Len(Dado) = 13
Source = [Ô]SELECT Desenho,LM_2 AS Lista FROM DadosCab WHERE Desenho = [ô][Ô] & Dado & [Ô][ô] OR Desenho = [ô][Ô] & DadoSemFormato & [Ô][ô] ORDER BY LM_2[Ô]
End If
IRENKO 03/12/2009 16:57:01
#329094
Matou a pau RCMRO!!! Era isso mesmo que eu pretendia. Com isso acho que resolve praticamente tudo.

Valeu mesmo! Obrigado.
IRENKO 03/12/2009 17:51:40
#329101
Só uma dúvida para encerrar nessa linha do seu codigo:

elseif Len(Dado) = 10 then
Data = format(Dado, [Ô]0000\-00\-000\-0[Ô])
End If

vai buscar no banco = 0679-02-348-1 blz

agora se tiver assim:

0476-1-251-2A com o mesmo 10 caracteres de contagem só que mudando a ordem no final para dois digitos e no meio para um.
pode acontecer esse caso, é raro mas......
RCMRO 04/12/2009 14:03:37
#329168
Resposta escolhida
Uma vez que pode conter letras, troque os [Ô]0[Ô] (ZEROS) por @ (arroba) e acrecente mais uma variável...

Dim Dado1 As String
Dim Dado2 As String
Dim DadoSemFormato As String
Dim strSQL As String

Dado1 = trim(TxtBusca.text)
Dado2= [Ô][Ô]
If Len(Dado1) = 8 Then
Dado = format(Dado, [Ô]@@@@\-@\-@@\-@[Ô])
elseif Len(Dado1) = 10 then
Dado2 = format(Dado, [Ô]@@@@\-@\-@@@\-@@[Ô])
Dado1 = format(Dado, [Ô]@@@@\-@@\-@@@\-@[Ô])
End If
DadoSemFormato = replace(Dado, [Ô]-[Ô], [Ô][Ô])
if Len(Dado) = 11 or Len(Dado) = 13
Source = [Ô]SELECT Desenho,LM_2 AS Lista FROM DadosCab WHERE Desenho = [ô][Ô] & Dado & [Ô][ô] OR Desenho = [ô][Ô] & DadoSemFormato
If Dado2 <> [Ô][Ô] Then
Source = Source & [Ô][ô] OR Desenho = [ô][Ô] & Dado2
End If
Source = Source & [Ô][ô] ORDER BY LM_2[Ô]
End If
IRENKO 04/12/2009 14:11:13
#329170
RCMRO, sei que já estou incomodando, mas como minha lógica de programação não é das melhores, vai mais uma:

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

Dado = Trim(TxtBusca.text)
If Len(Dado) = 8 Then
Dado = Format(Dado, [Ô]0000\-0\-00\-0[Ô])
ElseIf Len(Dado) = 10 Then
Dim i As Integer
If Dado <> [Ô][Ô] Then
For i = 0 To UBound(x) - 1
If Mid(x, 1) = [Ô].[Ô] Then
Dado = Format(Dado, x(i))
End If
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

Como pode ver acima na formatação, pode existir duas formas, com (-) e (.). Tentei asuar um array mas so carrega com (-), já quebrei a cabeça para fazer a comparação e carregar corretamente, ou seja:

se no campo esta como 0679-02-348-1 vai usar x(0) = [Ô]0000\-00\-000\-0[Ô]
se no campo esta como 0679.02.348.1 vai usar x(0) = [Ô]0000\.00\.000\.0[Ô]

tem alguma ideia?
RCMRO 04/12/2009 15:33:48
#329174
Pronto...
Daqui para a frente vai ter que queimar uns neurônios para evoluir mas, acho que ficou genérica. Não testei mas dá para entender e corrigir alguma coisa pontual.
Lembro, contudo, que por questões de performance, você NECESSÀRIAMENTE precisará criar um indice no campo [Ô]Desenho[Ô], caso a tabela tenda a ser volumosa.

Dim Dado As String
Dim Formato10(4) As String
Dim Formato8(4) 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(Dado1) = 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
Source = [Ô]SELECT Desenho,LM_2 AS Lista FROM DadosCab WHERE Desenho = [ô][Ô] & DadoSemFormato & [Ô][ô][Ô]
For i = 0 to UBound(DadoFormatado) - 1
If DadoFormatado(i) <> [Ô][Ô] Then
Source = Source & [Ô] OR Desenho = [ô][Ô] & DadoFormatado(i) & [Ô][ô][Ô]
End If
Next
Source = Source & [Ô] ORDER BY LM_2[Ô]
End If
IRENKO 05/12/2009 10:25:56
#329210
RCMRO, lamento fiz os testes e não esta dando, veja bem.

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.

Acho que vou deixar isso pra lá.

Página 1 de 3 [24 registro(s)]
Tópico encerrado , respostas não são mais permitidas