|
|
|
| Пожалуйста помогите! Как в запросе в текстовом поле ( в котором есть номера дел с буквами но есть и цифрами) отобрать цифровые данные по порядку. Например с 2001 по 3002 | |
|
| |
|
|
|
| [quickanswer]
replaceнуть все не цифры в отдельное поле запроса и *1 и отсортировать уже по числовому полю
а другие информационные поля есть в запросе?
дата договора, например, id записи(транзакции, договора)...? | |
|
| |
|
12 Кб. |
|
| вот =>
запрос1 | |
|
| |
|
|
|
| есть функция IsNumeric
кроме того - в кодах есть ведущие нули - нужен стринг а не лонг ИМХО (на приведенных тестовых данных, естественно) | |
|
| |
|
|
|
| ну - это у меня нули (начальство тебует трехзначный номер) а по сути нумерация идет в лонг
автор пример не прислал - пришлось у себя выдергивать (что похожее было то и взял) | |
|
| |
|
|
|
| исправил с условием
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
|
| |
|
| |
|
|
|
|
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
|
| |
|
| |
|
|
|
| не обработает символы
не обработает ЗероЛен
а вообще -
=============
ЧИТЕР!!! | |
|
| |
|
|
|
| смотри лудддче ;)
обработает
?rgxpnum("12r-=345=-__#@++Жопа6!!!!fuck7d8d9ЁЁЁ0")
1234567890 | |
|
| |
|
|
|
| ты форум читил - я видел !!! | |
|
| |
|
|
|
| то я по копаному ходил | |
|
| |
|
|
|
| йа так и понял :)
ИгнорКейс не нужен | |
|
| |
|
|
|
| не зли меня!!! | |
|
| |
|
|
|
|
| [бъёцца в истерике]
буть проклят тот день когда я сел за баранку этого пылесоса (с) Каффказцская пленница | |
|
| |
|
|
|
|
| как в старые добрые времена! | |
|
| |
|
|
|
| Тестируем:
Исходная строка: 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 | |
|
| |
|
|
|
| я ждал тебя | |
|
| |
|
|
|
| Я был занят, тестировал. | |
|
| |
|
|
|
|
з.ы. получаецца, шо регексп - фуфло :) хоть и компактно выглядит
| |
|
| |
|
|
|
| На соседнем форуме были более серьезные исследования.
В каких-то ситуациях он (по-моему) выигрывал. Зависело от длины строки, вроде.
Но точно не помню. | |
|
| |
|
|
|
| Хорошо порезвились. Лукасу респект
NumFromString - откуда? | |
|
| |
|
|
|
| Забыл, вот:
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
|
| |
|
| |
|
|
|
| тока он у меня чета
?NumFromString("12r-=345=-__#@++Жопа6!!!!fuck7d8d9ЁЁЁ0")
12
| |
|
| |
|
|
|
| Все правильно, там-же Val пользуется, то есть берет первое попавшееся число. | |
|
| |
|
|
|
|
| НЕ лень было проверить. Че-т резалты расходятся с Лукасом
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 медленнее
| |
|
| |
|
|
|
| Silipin SS - то чЁ выбрал? | |
|
| |
|
|
|
| Спасибо за реакцию, не ожидал на ткую! Но видимо я неправильно поставил вопрос. полей в базе много. есть и ID. Проблема в том, что когда я отбираюю Betweenом, например с 2000 по 300- то он выдает в отборе и200 и 20 и 30 и 300. Как этого избежать?????? | |
|
| |
|
|
|
|
кинуть сюда текст запроса :) | |
|
| |
|
|
|
| Это потому, что строки. С лонгами не будет такого | |
|
| |
|
|
|
| ИМХО тут не надро мудрствовать особо
запрос:
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
|
| |
|
| |
|
|
|
|
ИМХО тут не надро мудрствовать особо
|
Это смотря сколько записей в запросе.
Так будет аккурат вдвое быстрее, чем 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
|
| |
|
| |
|
|
|
|
Это смотря сколько записей в запросе
|
это само собой | |
|
| |
|
|
|
| СилЫч, я вспомнил:
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
|
| |
|
| |
|
|
|
| [восхищён] | |
|
| |
|
|
|
| +1 Лукас жжот
и што любопытно - у ТС'а совсем другая задача.
но это ведь совершенно не важно! правда? | |
|
| |
|
|
|
|
но это ведь совершенно не важно! правда?
|
как не та?!
я понял задачу как - решить проблему выборки договоров по числовому коду, зашитому в текстовом номере договора. стало быть надо выделить число и в запросе потом фильтровать. или я не так понял? | |
|
| |
|
|
|
|
ты все правильно понял - это ТС не правильно понял ;: | |
|
| |
|
|
|
| ТС-у, наверное, важно.
Мне? Хм...
| |
|
| |
|
|
|
| что делать с Null значениями? выбрасывать сразу в запросе? | |
|
| |
|
|
|
|
|
| А вообще-то лучше форму представления данных поменять.
Например, не "Договор2001" а "Договор№2001" и применить split(s,"№"). Если, конечно, нет необходимости писать
"Догво2вор001длятакого-тозаказчикаедренакорень№4" | |
|
| |