BUSCA DINAMICA 02

DANIKULL 05/12/2009 10:59:23
#329211
IRENKO, boa tarde.

Vou dar uma dica pra você resolver seu problema. é uma solução pesada e demorada caso seu banco de Dados seja muioto grande, e se esta tabela contiver muito registros. Faça assim:

Faça uma consulta geral, na tabela, depois com com um Do Until EOF = True faça uma analise registro a registro, comparando o valor campo com LEN, tipo assim:

IF LEN(CAMPO)=13 THEN
tira so pontos e traços
faz a comparação
ELSEIF LEN(CAMPO)=10
compra direto
END IF

Entendeu???

Agora para você matar este assunto, e não ter mais problemas com isso faça um tratamento na inclusão dos dados retirando toda a formação existente e salvando no BD, e para mostrar os dados nos Forms você refaz a formatação, ok????

Na dúvida poste novamente.
IRENKO 05/12/2009 12:13:10
#329212
DANIKULL, não entendi. Veja o arquivo anexo:
RCMRO 05/12/2009 15:06:13
#329220
Reparou que eu mudei o VB inteiro. Inclusive, a variável DadoFormatado passou a ser um ARRAY...
Veja se está na (1) ou na (2) ou até na (3) as demais opções. Já mudei para ARRAY para poder conter TODAS as opções...
DANIKULL 05/12/2009 22:59:54
#329235
IRENKO, boa noite.

O que eu disse acima é mais ou menos assim:

Você trava o txtbuscar para que a entrada seja so números, sem formatação e faz a consulta abaixo. Mas foi como eu falei, se a tabela possuir poucos registros tudo bem, mais se houver muitos a pesquisa vai ser lenta e demorada. Mais tenta ai, ok????


Dim rsTemp As Recordset
Dim sCont As Integer [ô]Contador de caracter
Dim tCont As Integer [ô]Armazena o total de caracter na entrada
Dim sText As String [ô]Armazena o texto de entrada
Dim rText As String [ô]Armazena o resultado do split

Set rsTemp = New ADODB.Recordset
rsTemp.Open [Ô]SELECT * FROM DadosCab[Ô], ConexaoLM, adOpenKeyset, adLockPessimistic
sCont = 1
tCont = 0
With rsTemp
If .BOF = True And .EOF = True Then Exit Sub
Do Until .EOF = True
tCont = Len(!Desenho)
If tCont = 13 Then
Do Until sCont > tCont
rText = Mid$(!Desenho, sCont, 1)
If rText <> [Ô]-[Ô] Then
sText = sText & rText
End If
sCont = sCont + 1
Loop
End If
If TxtBusca.Text = sText Then
[ô]Rotina de Preencher o grid
Else
[ô]Menssagem de Erro
End If

.MoveNext
Loop
End With



Este código é so um exemplo para você saber do que estou falando ok???
DANIKULL 06/12/2009 11:37:24
#329238
Citação:

IRENKO escreveu:
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[Ô]



Respondendo esta pergunta sua segue:

 
Public Function Format_Nr_Desenho(sValor As String) As String
Dim sConta As Integer
Dim tTexto, rTexto As String

If Len(sValor) = 13 Then Format_Nr_Desenho = sValor: Exit Function

If Len(sValor) = 10 Then [ô]Verifica se foi informado 10 caracteres numericos
sConta = 1

Do Until sConta > Len(sValor)
tTexto = Mid$(sValor, sConta, 1)
If sConta = 5 Or sConta = 7 Or sConta = 10 Then
rTexto = rTexto & [Ô]-[Ô] & tTexto
Else
rTexto = rTexto & tTexto
End If
sConta = sConta + 1
Loop
ElseIf Len(sValor) = 8 Then [ô]Verifica se foi informado 8 caracteres numericos
sConta = 1

Do Until sConta > Len(sValor)
tTexto = Mid$(sValor, sConta, 1)
If sConta = 5 Or sConta = 6 Or sConta = 8 Then
rTexto = rTexto & [Ô]-[Ô] & tTexto
Else
rTexto = rTexto & tTexto
End If
sConta = sConta + 1
Loop
Else [ô]Se foi digitado caracter numérico que seja 8 ou 10 informa neste erro
MsgBox [Ô]O número informado não corresponde ao padrão do sistema.[Ô] & vbNewLine & _
[Ô]Você de deve informar 8 ou 10 números para a pesquisa seja[Ô] & vbNewLine & _
[Ô]executada corretamente.[Ô], vbCritical, [Ô]Erro na Formatação[Ô]

End If

Format_Nr_Desenho = rTexto

End Function
IRENKO 07/12/2009 07:51:54
#329262
RCMRO, lamento fiz os testes e não esta dando, veja bem.

Citação:

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á.



RCMRO, a sua sugestão é praticamente perfeita mas no laço for (For i = 0 To UBound(Formato10) - 1) para gravar na variavel (DadoFormatado) esta pegando sempre (Formato10(0) = [Ô]@@@@\-@\-@@@\-@@[Ô]), ou seja, não verefica os outros.

DANIKULL, vou testar sua sugestão tambem.
RCMRO 07/12/2009 08:37:37
#329264
Bem, abri o VB para arrumar a SINTAX... Essa dava para vc ter feito (rs)....

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(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) = 8 Or Len(Dado) = 10 Then
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 07/12/2009 09:44:46
#329267
RCMRO, cê me desculpe, acontece que muita coisa em VB ainda não sei acimilar e fico dependendo das dicas para poder aprender. Essa sua sugestão, vc testou no exemplo que postei? Aqui no meu não funciona de jeito nenhum. Realmente o problema pode ser eu, veja bem como exemplo: se tenho no campo gravado 0685-01-604-1 e digito no text 0685016041 o codigo deveria formatar (Formato10(1) = [Ô]@@@@\-@@\-@@@\-@[Ô]), fiz o debug.print e a variavel (DadoFormatado(i)) esta assim 0685-0-160-41, ou seja, assumindo somente o formato (Formato10(0) = [Ô]@@@@\-@\-@@@\-@@[Ô]).

RCMRO 08/12/2009 08:19:21
#329322
No final do programa, vc viu o conteúdo da variável SOURCE?
Manda aqui print dessa variável, logo depois de passar pela linha [Ô]Source = Source & [Ô] ORDER BY LM_2[Ô][Ô].

Aliás, deixa te perguntar: se está começando agora, porque já não aprende direto o VB.NET ou C# ao invez de VB6?
IRENKO 08/12/2009 12:40:47
#329336
RCMRO, problema do codigo resolvido. Veja como ficou:

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(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 = [ô][Ô] & Dado & [Ô][ô] OR Desenho = [ô][Ô] & DadoSemFormato & [Ô][ô][Ô]
Else
.Source = [Ô]SELECT Desenho, LM_2 AS Lista FROM DadosCab WHERE Desenho = [ô][Ô] & DadoFormatado(i) & [Ô][ô][Ô]
For i = 0 To UBound(DadoFormatado)
If DadoFormatado(i) <> [Ô][Ô] Then
.Source = .Source & [Ô] OR Desenho = [ô][Ô] & DadoFormatado(i) & [Ô][ô][Ô]
End If
Next
.Source = .Source & [Ô] ORDER BY LM_2[Ô]
End If

O select esta perfeito agora, só aconteceu um probleminha, o banco que te passei só tem um item que é o documento 6326 que aparece no Grid ao lado, no meu banco original quando faço a busca carrega no grid varios documentos e esse desenho informado para busca só existe no documento 6326, o que pode estar errado no select?

Quanto a sua pergunta, prefiro ficar no VB já estou velho demais para começar em outra linguagem, sendo que esta ainda tenho dificuldades, hehehe!!!
Página 2 de 3 [24 registro(s)]
Tópico encerrado , respostas não são mais permitidas