Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: обор в текстовом поле цифры попорядку
 
 автор: Silipin SS   (02.09.2010 в 09:59)   личное сообщение
 
 

Пожалуйста помогите! Как в запросе в текстовом поле ( в котором есть номера дел с буквами но есть и цифрами) отобрать цифровые данные по порядку. Например с 2001 по 3002

  Ответить  
 
 автор: Силblч   (02.09.2010 в 10:20)   личное сообщение
 
 

[quickanswer]
replaceнуть все не цифры в отдельное поле запроса и *1 и отсортировать уже по числовому полю

а другие информационные поля есть в запросе?
дата договора, например, id записи(транзакции, договора)...?

  Ответить  
 
 автор: snipe   (02.09.2010 в 10:35)   личное сообщение
12 Кб.
 
 

вот =>
запрос1

  Ответить  
 
 автор: Explorer   (02.09.2010 в 10:48)   личное сообщение
 
 

есть функция IsNumeric
кроме того - в кодах есть ведущие нули - нужен стринг а не лонг ИМХО (на приведенных тестовых данных, естественно)

  Ответить  
 
 автор: snipe   (02.09.2010 в 11:11)   личное сообщение
 
 

ну - это у меня нули (начальство тебует трехзначный номер) а по сути нумерация идет в лонг
автор пример не прислал - пришлось у себя выдергивать (что похожее было то и взял)

  Ответить  
 
 автор: Дядя Федор   (02.09.2010 в 11:02)   личное сообщение
 
 

исправил с условием
SELECT Таблица1.Номер, str_to_num([Номер]) AS Выражение2
FROM Таблица1
WHERE (((str_to_num([Номер]))>=2001 And (str_to_num([Номер]))<=3002))
ORDER BY str_to_num([Номер]);


где в модуле описана ф-я

Public Function str_to_num(s As String) As Long ' или as string если 0-важен
Dim sn As String
Dim i As Integer
Const v = "0123456789"
sn = ""
For i = 1 To Len(s)
 sn = sn & IIf(InStr(v, Mid(s, i, 1)) > 0, Mid(s, i, 1), "")
Next
str_to_num = CInt(sn) ' или str_to_num = sn, если 0-важен
End Function

или по Explorer'у

Public Function str_to_num(s As String) As Long ' или as string если 0-важен
Dim sn As String
Dim i As Integer
sn = ""
For i = 1 To Len(s)
 sn = sn & IIf(IsNumeric(Mid(s, i, 1)), Mid(s, i, 1), "")
Next
str_to_num = CInt(sn) 'или str_to_num = sn, если 0-важен
End Function

  Ответить  
 
 автор: Силblч   (02.09.2010 в 11:33)   личное сообщение
 
 


Function rgxpnum(LookIn$)
Dim RegX As Object, rs$
Set RegX = CreateObject("VBScript.RegExp")
With RegX
    .Pattern = "[^0-9]"
    .Global = True
    .IgnoreCase = Not MatchCase
    rgxpnum = .Replace(LookIn, "")
End With
End Function


  Ответить  
 
 автор: Explorer   (02.09.2010 в 11:41)   личное сообщение
 
 

не обработает символы
не обработает ЗероЛен

а вообще -

=============

ЧИТЕР!!!

  Ответить  
 
 автор: Силblч   (02.09.2010 в 11:42)   личное сообщение
 
 

смотри лудддче ;)
обработает
?rgxpnum("12r-=345=-__#@++Жопа6!!!!fuck7d8d9ЁЁЁ0")
1234567890

  Ответить  
 
 автор: Explorer   (02.09.2010 в 11:43)   личное сообщение
 
 

ты форум читил - я видел !!!

  Ответить  
 
 автор: Силblч   (02.09.2010 в 11:47)   личное сообщение
 
 

то я по копаному ходил

  Ответить  
 
 автор: Explorer   (02.09.2010 в 11:51)   личное сообщение
 
 

йа так и понял :)

ИгнорКейс не нужен

  Ответить  
 
 автор: Силblч   (02.09.2010 в 11:52)   личное сообщение
 
 

не зли меня!!!

  Ответить  
 
 автор: Explorer   (02.09.2010 в 11:58)   личное сообщение
 
 

не отработает пробелы

  Ответить  
 
 автор: Силblч   (02.09.2010 в 12:06)   личное сообщение
 
 

[бъёцца в истерике]
буть проклят тот день когда я сел за баранку этого пылесоса (с) Каффказцская пленница

  Ответить  
 
 автор: Дядя Федор   (02.09.2010 в 11:50)   личное сообщение
 
 

O%eнно!

  Ответить  
 
 автор: Силblч   (02.09.2010 в 11:52)   личное сообщение
 
 

как в старые добрые времена!

  Ответить  
 
 автор: Lukas   (02.09.2010 в 12:02)   личное сообщение
 
 

Тестируем:
Исходная строка: Const ProductName As String = "qwerty123.456qwerty"
100'000 вычислений
Результаты:
Функция___Время, мс_____ответ функции

proverca       2781          123 
NumFromString  406           123,456 
str_to_num1    5656          123456 
str_to_num2    3672          123456 
rgxpnum        88656         123456 

Пришлось править в функциях от Дяди Федора: CInt на CLng
От СилЫча: .IgnoreCase = True 'Not MatchCase

  Ответить  
 
 автор: Силblч   (02.09.2010 в 12:05)   личное сообщение
 
 

я ждал тебя

  Ответить  
 
 автор: Lukas   (02.09.2010 в 12:06)   личное сообщение
 
 

Я был занят, тестировал.

  Ответить  
 
 автор: Силblч   (02.09.2010 в 12:08)   личное сообщение
 
 



з.ы. получаецца, шо регексп - фуфло :) хоть и компактно выглядит

  Ответить  
 
 автор: Lukas   (02.09.2010 в 12:18)   личное сообщение
 
 

На соседнем форуме были более серьезные исследования.
В каких-то ситуациях он (по-моему) выигрывал. Зависело от длины строки, вроде.
Но точно не помню.

  Ответить  
 
 автор: Дядя Федор   (02.09.2010 в 12:10)   личное сообщение
 
 

Хорошо порезвились. Лукасу респект
NumFromString - откуда?

  Ответить  
 
 автор: Lukas   (02.09.2010 в 12:15)   личное сообщение
 
 

Забыл, вот:

Public Function NumFromString(s As String) As Double
    Dim Arr() As Byte
    Dim i As Integer
    
    Arr = s
    For i = 0 To UBound(Arr) Step LenB("A")
        If Arr(i) > 47 Then
            If Arr(i) < 58 Then
                NumFromString = Val(Mid$(s, i / LenB("A") + 1))
                Exit Function
            End If
        End If
    Next i
End Function

  Ответить  
 
 автор: Силblч   (02.09.2010 в 12:20)   личное сообщение
 
 

тока он у меня чета
?NumFromString("12r-=345=-__#@++Жопа6!!!!fuck7d8d9ЁЁЁ0")
12

  Ответить  
 
 автор: Lukas   (02.09.2010 в 12:23)   личное сообщение
 
 

Все правильно, там-же Val пользуется, то есть берет первое попавшееся число.

  Ответить  
 
 автор: Силblч   (02.09.2010 в 12:24)   личное сообщение
 
 

ага :) дочитал :)

  Ответить  
 
 автор: Дядя Федор   (02.09.2010 в 13:25)   личное сообщение
 
 

НЕ лень было проверить. Че-т резалты расходятся с Лукасом


str_to_num3 0,684 сек. 123456
NumFromString . 0,202 сек. 123,456
proverca 1,188 сек. 123
rgxpnum . 30,408 сек. 123456


где str_to_num3 без iif

Public Function str_to_num3(s As String) As Long
Dim sn As String, snn As String
Dim i As Integer
sn = ""
For i = 1 To Len(s)
  snn = Mid(s, i, 1)
  If IsNumeric(snn) Then sn = sn & snn
Next
str_to_num3 = CLng(sn)
End Function

proverca медленнее

  Ответить  
 
 автор: Дядя Федор   (02.09.2010 в 12:53)   личное сообщение
 
 

Silipin SS - то чЁ выбрал?

  Ответить  
 
 автор: Silipin SS   (02.09.2010 в 13:34)   личное сообщение
 
 

Спасибо за реакцию, не ожидал на ткую! Но видимо я неправильно поставил вопрос. полей в базе много. есть и ID. Проблема в том, что когда я отбираюю Betweenом, например с 2000 по 300- то он выдает в отборе и200 и 20 и 30 и 300. Как этого избежать??????

  Ответить  
 
 автор: Explorer   (02.09.2010 в 13:39)   личное сообщение
 
 


Как этого избежать?



кинуть сюда текст запроса :)

  Ответить  
 
 автор: Дядя Федор   (02.09.2010 в 13:50)   личное сообщение
 
 

Это потому, что строки. С лонгами не будет такого

  Ответить  
 
 автор: Explorer   (02.09.2010 в 13:35)   личное сообщение
 
 

ИМХО тут не надро мудрствовать особо

запрос:


SELECT ComposeIndexA([Номер]) AS ChooseNumbers, Номер
FROM Таблица1
WHERE ComposeIndexA([Номер]) Between 1101 And 2132 AND Номер Is Not Null



функция:


Function ComposeIndexA(somestring As String) As Long
For i = 1 To Len(somestring)
t = Mid(somestring, i, 1)
If IsNumeric(t) Then
s = s & t
End If
Next
ComposeIndexA = s
End Function

  Ответить  
 
 автор: Lukas   (02.09.2010 в 14:18)   личное сообщение
 
 


ИМХО тут не надро мудрствовать особо


Это смотря сколько записей в запросе.

Так будет аккурат вдвое быстрее, чем ComposeIndexA, при одинаковом результате:

Public Function ComposeIndexC(somestring As String) As Long
    Dim Arr() As Byte
    Dim i As Integer
    Dim s As String
    
    Arr = somestring
    For i = 0 To UBound(Arr) Step LenB("A")
        If Arr(i) > 47 Then
            If Arr(i) < 58 Then
                s = s & Mid$(somestring, i \ LenB("A") + 1, 1)
            End If
        End If
    Next i
    ComposeIndexC = s
End Function

  Ответить  
 
 автор: Explorer   (02.09.2010 в 15:35)   личное сообщение
 
 


Это смотря сколько записей в запросе



это само собой

  Ответить  
 
 автор: Lukas   (02.09.2010 в 17:42)   личное сообщение
 
 

СилЫч, я вспомнил:

Function rgxpnum2(LookIn$)
    With GetRegX()
        rgxpnum2 = .Replace(LookIn, "")
    End With
End Function

Private Function GetRegX() As Object
    Static RegX As Object
    If RegX Is Nothing Then
        Set RegX = CreateObject("VBScript.RegExp")
        With RegX
            .Pattern = "[^0-9]"
            .Global = True
        End With
    End If
    Set GetRegX = RegX
End Function

Рез-ты теста:

qwerty123.456qwerty          100000 
---------------------------
ComposeIndexC  1484          123456 
rgxpnum2       843           123456 

qwerty123.45qwerty qwerty123.45qwerty      100000 
---------------------------
ComposeIndexC  1765          1234512345 
rgxpnum2       1188          1234512345 

  Ответить  
 
 автор: Силblч   (02.09.2010 в 17:54)   личное сообщение
 
 

[восхищён]

  Ответить  
 
 автор: Explorer   (02.09.2010 в 18:22)   личное сообщение
 
 

+1 Лукас жжот

и што любопытно - у ТС'а совсем другая задача.

но это ведь совершенно не важно! правда?

  Ответить  
 
 автор: Силblч   (02.09.2010 в 18:27)   личное сообщение
 
 


но это ведь совершенно не важно! правда?

как не та?!

я понял задачу как - решить проблему выборки договоров по числовому коду, зашитому в текстовом номере договора. стало быть надо выделить число и в запросе потом фильтровать. или я не так понял?

  Ответить  
 
 автор: Explorer   (02.09.2010 в 18:37)   личное сообщение
 
 


я понял задачу как



ты все правильно понял - это ТС не правильно понял ;:

  Ответить  
 
 автор: Lukas   (02.09.2010 в 18:34)   личное сообщение
 
 

ТС-у, наверное, важно.
Мне? Хм...

  Ответить  
 
 автор: Explorer   (02.09.2010 в 18:38)   личное сообщение
 
 

что делать с Null значениями? выбрасывать сразу в запросе?

  Ответить  
 
 автор: Lukas   (02.09.2010 в 18:39)   личное сообщение
 
 

Не допускать в таблице?

  Ответить  
 
 автор: Explorer   (02.09.2010 в 18:41)   личное сообщение
 
 

  Ответить  
 
 автор: Дядя Федор   (03.09.2010 в 13:13)   личное сообщение
 
 

А вообще-то лучше форму представления данных поменять.
Например, не "Договор2001" а "Договор№2001" и применить split(s,"№"). Если, конечно, нет необходимости писать
"Догво2вор001длятакого-тозаказчикаедренакорень№4"

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList