|
|
|
| Всем привет, например есть строка str="Задвижки с фланцами до 10.06.2008г.". Вопрос, можно ли из строки вытянуть дату?
Пробовала через Val(str), не получается, возвращает 0 :-( | |
|
| |
|
|
|
| положение даты всегда в конце строки? | |
|
| |
|
|
|
| нет, может быть в любом месте | |
|
| |
|
|
|
| могут ли быть другие числа кроме даты?
типа
"Задвижки 15' с фланцами до 10.06.2008г." | |
|
| |
|
|
|
| да, например, "1500шт - 30.06.2008 3000шт - 31.07.2008 3000шт - 31.08.2008"
или больше 1 даты "Задвижки - 12.06.08; фланцы - 12.07.08; привод - 12.09.08", тогда надо одну, но максимальную | |
|
| |
|
|
|
| ну тогда посимвольно разбирать строку
Mid, left, instr | |
|
| |
|
|
|
| Этим и занималась, вот что получилось (сравнения на max нет)
все даты из строки в массив
dat = rs.Fields("НазвПоля)
dl = Len(dat)
pos = 0
Do While dl > 0
ReDim Preserve arr_date(pos + 1)
arr_date(pos) = Mid(dat, InStr(dat, "200") - 6, 10)
dat1 = Right(dat, Len(dat) - (InStr(dat, "200") + 3))
dl = Len(dat1)
dat = dat1
pos = pos + 1
Loop
первое попадание :
dat = Mid(rs.Fields("НазвПоля"), InStr(rs.Fields("НазвПоля"), "200") - 6, 10) | |
|
| |
|
|
|
| вижу примерно так
Function getdatere(s$)
Dim re As New RegExp
Dim sDatePattern$
Dim s1$, i1&
sDatePattern = "[0-9][0-9].[0-9][0-9].[0-9][0-9][0-9][0-9]"
re.Pattern = sDatePattern
If re.Test(s) = True Then
s1 = Trim(re.Replace(s, "|здесь"))
i1 = InStr(1, s1, "|здесь")
If i1 <> 0 Then
getdatere = Mid(s, i1, 10)
Else
getdatere = ""
End If
Else
getdatere = ""
End If
End Function
|
rtfm http://regexp.by.ru/
?getdatere("Задвижки 15' с фланцами до 10.06.2008г.")
10.06.2008
писал на скорую руку... в идеале хотелось бы шаблон написать такой, чтобы удалил все из строки, что не соответсвует шаблону даты....
но на поиски нема часу | |
|
| |
|
|
|
|
Function FindMaxDateInString(strText As String) As Date
Dim RegEx As Object, Matches As Object, i As Integer
Set RegEx = CreateObject("VBScript.RegExp")
RegEx.Pattern = "\d\d\.\d\d\.\d\d+"
' regEx.IgnoreCase = True
RegEx.Global = True 'True - все вхождения
Set Matches = RegEx.Execute(strText)
For i = 0 To Matches.Count - 1
If CDate(Matches(i).Value) > FindMaxDateInString Then
FindMaxDateInString = CDate(Matches(i).Value)
End If
Next
End Function
|
?FindMaxDateInString("1500шт - 30.06.2008 3000шт - 31.07.2008 3000шт - 31.08.08")
31.08.08
Это специально для вас. | |
|
| |
|
|
|
| во! я ж говорил, что где то уже есть! :) | |
|
| |
|
|
|
|
| функция работает классно, но возникла др. проблема:
Dim tmp As String
tmp = FindMaxDateInString(rs.Fields("НазвПоля"))
If tmp <> "" Then
CurrentDb.Execute ("update импорт set ЛенаПланФ=#" + format(tmp, "yyyy\-mm\-dd") + "# where Код=" + CStr(rs.Fields("НазвПоля")))
End If
выдает ошибку "object doesn't support this prorerty or method"
А без форматирования даты update не проходит (((
др. вариант:
tmp = FindMaxDateInString(rs.Fields("ЛенаПлан"))
temp = Replace(tmp, ".", "/")
If temp <> "" Then
CurrentDb.Execute ("update импорт set ЛенаПланФ=#" + temp + "# where Код=" + CStr(rs.Fields("Код")))
End If
здесь update проходит, но часть данных в правильном формате dd.mm.yyyy, а часть в mm.dd.yyyy. ((( | |
|
| |
|
|
|
| Для SQL дата должна выглядеть так: #MM/DD/YYYY#
Нужно так:
"#" & Format(date, "MM\/DD\/YYYY") & "#"
или (короче и понятнее):
Format(date, "\#MM\/DD\/YYYY\#")
Вы очень неосторожно используете "+" для конкатенации строк. Если один из элементов будет Null, то и результат будет Null, а ели типа число или дата - вылетит ошибка.
Используйте "&", тогда и CStr не понадобится.
Вместо:
Dim tmp As String
tmp = FindMaxDateInString(rs.Fields("НазвПоля"))
If tmp <> "" Then
Я бы сделал так (нет лишних преобразований дата-текст-дата):
Dim tmp As Date
tmp = FindMaxDateInString(rs.Fields("НазвПоля"))
If tmp <> 0 Then
Успехов! | |
|
| |
|
|
|
| все равно на format ... ругается "object doesn't support this prorerty or method" | |
|
| |
|
|
|
| Выведите в окно отладки сформированные строки обоих вариантов и сравните. Не разберетесь - покажите их здесь.
>здесь update проходит, но часть данных в правильном формате dd.mm.yyyy, а часть в mm.dd.yyyy. (((
Во 2-м варианте у вас число и месяц поменяны местами. Когда Jet получает дату 01.05.08 - получается 5 яваря, а когда 16.05.08 (16-й месяц не существует), то "догадывается" и вносит 16 мая. | |
|
| |
|
11 Кб. |
|
| все к концу недели голова совсем отказывается работать... ничего не получается ((( остановилась на двух проблемах, а без их решения никуда (((
в файле кусок базы, помогите избавится от ошибки, пожалуйста! | |
|
| |
|
|
|
| У вас кнопка называется "format", как и функция. В этом и ошибка.
А еще уберите лишние решетки ЛенаПланФ=#" + format(tmp, "\#MM\/DD\/YYYY\#") + "#
А еще у вас во всех полях "КодДМТО" Null, и в примере работать не будет. В оригинале БД там числа? | |
|
| |
|
|
|
| Упс ..
Спасибо огромное, все заработало. В БД числа, поэтому все работает хорошо!!!!! | |
|
| |