:: Visual Foxpro, Foxpro for DOS
Re: 20 декабря 2024 года -> {20.12.2024}
Равиль
Автор

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
akvvohinc
Равиль
Вопрос для меня был решен уже в третьем сообщении.
"Компактность" решения во многом зависит от требований к исходной "строке-дате".
Во всех приведенных примерах между компонентами даты имеются разделители.
Но я бы добавил в перечень допустимых и такие, достаточно часто встречающиеся, варианты:
12дек2024
12дек 24
12 декабря1998

Да, и вариант Равиля будет здесь валиться, если в исходных данных количество слов окажется меньше 2 (2-й элемент останется = .F.):
If Isdigit(laWords[2])

Доброе утро !

Спасибо Сергей (akvvohinc) - допилил - разлепил такие строки.
PS также добавил обработку числового параметра с учетом замечаний Сергея (ssa)



------------------
Тяжело согнать курсором муху с монитора ...




Исправлено 2 раз(а). Последнее : Равиль, 21.12.24 07:39
Ratings: 0 negative/1 positive
Re: 20 декабря 2024 года -> {20.12.2024}
chunihin-df

Сообщений: 88
Откуда: Тюмень
Дата регистрации: 18.11.2013
Ошибка из соседней темы
?? Str2date("56E1234234")

Наверное, сначала надо отделить числа от не чисел, и только после этого начинать перебор форматов даты

Вот этот фрагмент в начало функции перенести
lnLen = Len(m.tcDate)
llDigital = Isdigit(m.tcDate)
lcTmpDate = Left(m.tcDate,1)
For ln = 2 To m.lnLen
lc = Substr(m.tcDate, m.ln, 1)
If !Empty(m.lc) And Isdigit(m.lc) # m.llDigital
llDigital = Isdigit(m.lc)
lc = [ ] + lc && вставляем пробел
Endif
lcTmpDate = m.lcTmpDate + m.lc
Next
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
chunihin-df

Сообщений: 88
Откуда: Тюмень
Дата регистрации: 18.11.2013
?? Str2Date("макароны от 20 масло за 200") -> 20.05.2000
?? Str2Date("20 июля какого-то года") -> 20.07.2000
?? Str2Date("20 - мармелад / 24 - шоколад") -> 20.03.2024
?? Str2Date(" от 20 дек2024г.") -> . .




Исправлено 3 раз(а). Последнее : chunihin-df, 21.12.24 09:53
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
Равиль
Автор

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
chunihin-df
Ошибка из соседней темы
?? Str2date("56E1234234")

Наверное, сначала надо отделить числа от не чисел, и только после этого начинать перебор форматов даты

Вот этот фрагмент в начало функции перенести
lnLen = Len(m.tcDate)
llDigital = Isdigit(m.tcDate)
lcTmpDate = Left(m.tcDate,1)
For ln = 2 To m.lnLen
lc = Substr(m.tcDate, m.ln, 1)
If !Empty(m.lc) And Isdigit(m.lc) # m.llDigital
llDigital = Isdigit(m.lc)
lc = [ ] + lc && вставляем пробел
Endif
lcTmpDate = m.lcTmpDate + m.lc
Next

chunihin-df
?? Str2Date("макароны от 20 масло за 200") -> 20.05.2000
?? Str2Date("20 июля какого-то года") -> 20.07.2000
?? Str2Date("20 - мармелад / 24 - шоколад") -> 20.03.2024
?? Str2Date(" от 20 дек2024г.") -> . .

Спасибо за тест ! Поправлю


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
ssa

Сообщений: 13085
Откуда: Москва
Дата регистрации: 23.03.2005
Я тут слегонца тестов добавил и причесал в своём стиле
Ну там совершенно лишние телодвижения поубирал и так, по мелочи...
Clear
?? Str2Date("20 декабря 2024 года")
?? Str2Date("20 декабря 94 года")
?? Str2Date("20/12.2024г.")
?? Str2Date("20 дек 2024г.")
?? Str2Date("20 мая 2024г.")
?? Str2Date("20 мар 2024г.")
?? Str2Date("20 декабря")
?? Str2Date("20-12 2024 года")
?? Str2Date("20.12.24 г.")
?? Str2Date("31 февраля 2024г")
?? Str2Date("12дек2024")
?? Str2Date("12дек 24")
?? Str2Date("12 декабря1998")
?? Str2Date("Счет № 12345-67 от 20 дек2024г.")
?? Str2Date(Date()-Date(1900,1,1) + 1) && ssa - передается число
?? Str2Date(45600) && ssa
?? Str2Date("45600") && ssa
?? Str2Date("макароны от 20 масло за 200")&& -> 20.05.2000
?? Str2Date("20 июля какого-то года")&& -> 20.07.2000
?? Str2Date("20 - мармелад / 24 - шоколад")&& -> 20.03.2024
?? Str2Date(" от 20 дек2024г.")&& -> . .
******************
Function Str2Date
Lparameters tcDate
? m.tcDate, Chr(9)
If Empty(m.tcDate)
Return {}
Endif
Local ld1900
ld1900 = Date(1900,1,1)
If Type([m.tcDate]) = [N] ;
And Between(m.tcDate, Gomonth(Date(),-60)-m.ld1900, Gomonth(Date(),12)-m.ld1900)
*!* передается число в диапазоне (-5 лет +1 год)
Return m.ld1900 + m.tcDate - 1
Endif
If Type([m.tcDate]) = [C] ;
And Transform(Val(m.tcDate))== m.tcDate And Between(Val(m.tcDate), Gomonth(Date(),-60)-m.ld1900, Gomonth(Date(),12)-m.ld1900)
*!* передается число в виде строки в диапазоне (-5 лет +1 год)
Return m.ld1900 + Val(m.tcDate) - 1
Endif
tcDate = Upper(Alltrim(Transform(m.tcDate)))
If [ ОТ ] $ ' '+m.tcDate
tcDate = Alltrim(Strextract(' '+m.tcDate, [ ОТ ]))
Endif
tcDate = Alltrim(Chrtran(m.tcDate, ["./-], [ ])) && заменяю разделители на пробелы
If !Isdigit(m.tcDate) && если первый символ не числовой, то выходим
Return {}
Endif
*!* Разлепим буквы и цифры при необходимости && 21.12.2024 08:08
Local llDigital, lnLen, ln, lc, lcTmpDate
lnLen = Len(m.tcDate)
llDigital = Isdigit(m.tcDate)
lcTmpDate = Left(m.tcDate,1)
For ln = 2 To m.lnLen
lc = Substr(m.tcDate, m.ln, 1)
If !Empty(m.lc) And Isdigit(m.lc) # m.llDigital
llDigital = Isdigit(m.lc)
lc = [ ] + lc && вставляем пробел
Endif
lcTmpDate = m.lcTmpDate + m.lc
Next
tcDate = Alltrim(m.lcTmpDate)
*!* -------------------------
Local lnWords, lnDay, lnMonth, lnYear, ldDate
Local Array laWords[3]
ldDate = {}
Store 0 To lnDay, lnMonth, lnYear
lnWords = Min(3, Getwordcount(m.tcDate)) && беру максимум 3 слова
If lnWords >= 2 && 21.12.2024 08:21
For ln = 1 To m.lnWords
laWords[m.ln] = Getwordnum(m.tcDate, m.ln)
Next
If Empty(laWords[3])
lnYear = Year(Date())
Else
lnYear = Val(laWords[3])
lnYear = m.lnYear%100 + 2000 - Iif(Between(m.lnYear%100, 50, 99), 100, 0)
Endif
If Isdigit(laWords[2])
lnMonth = Val(laWords[2])
Else
Dimension laMonth[12]
laMonth[1] = "ЯНВ"
laMonth[2] = "ФЕВ"
laMonth[3] = "МАР"
laMonth[4] = "АПР"
laMonth[5] = "МАЯ"
laMonth[6] = "ИЮН"
laMonth[7] = "ИЮЛ"
laMonth[8] = "АВГ"
laMonth[9] = "СЕН"
laMonth[10] = "ОКТ"
laMonth[11] = "НОЯ"
laMonth[12] = "ДЕК"
lnMonth = Ascan(laMonth, Left(laWords[2], 3))
Endif
lnDay = Val(laWords[1])
Try &&
ldDate = Date(m.lnYear, m.lnMonth, m.lnDay)
Catch
Endtry
Endif
Return m.ldDate


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/1 positive
Re: 20 декабря 2024 года -> {20.12.2024}
Равиль
Автор

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
ssa
Я тут слегонца тестов добавил и причесал в своём стиле Ну там совершенно лишние телодвижения поубирал и так, по мелочи...

Да, увидел - аккуратно получилось, спасибо Сергей !

правда с массивом ожидаемо провалился Май ..

?? Str2Date("20 май2024г.") && Добавил исключение для "МАЙ"

Clear
?? Str2Date("20 декабря 2024 года")
?? Str2Date("20 декабря 94 года")
?? Str2Date("20/12.2024г.")
?? Str2Date("20 дек 2024г.")
?? Str2Date("20 мая 2024г.")
?? Str2Date("20 мар 2024г.")
?? Str2Date("20 декабря")
?? Str2Date("20-12 2024 года")
?? Str2Date("20.12.24 г.")
?? Str2Date("31 февраля 2024г")
?? Str2Date("12дек2024")
?? Str2Date("12дек 24")
?? Str2Date("12 декабря1998")
?? Str2Date("Счет № 12345-67 от 20 дек2024г.")
?? Str2Date(Date()-Date(1900,1,1) + 1) && ssa - передается число
?? Str2Date(45600) && ssa
?? Str2Date("45600") && ssa
?? Str2Date("макароны от 20 масло за 200") && -> 20.05.2000
?? Str2Date("20 июля какого-то года") && -> 20.07.2000
?? Str2Date("20 - мармелад / 24 - шоколад") && -> 20.03.2024
?? Str2Date(" от 20 дек2024г.") && OK
?? Str2Date("20 май2024г.") && Добавил исключение для "МАЙ"
?? Str2Date(Date()) && дата - OK
******************
Function Str2Date
Lparameters tcDate
? m.tcDate, Chr(9)
If Empty(m.tcDate)
Return {}
Endif
If Type([m.tcDate]) = [D]
Return m.tcDate
Endif
Local ld1900
ld1900 = Date(1900,1,1)
If Type([m.tcDate]) = [N] ;
And Between(m.tcDate, Gomonth(Date(),-60)-m.ld1900, Gomonth(Date(),12)-m.ld1900)
*!* передается число в диапазоне (-5 лет +1 год)
Return m.ld1900 + m.tcDate - 1
Endif
If Type([m.tcDate]) = [C] ;
And Transform(Val(m.tcDate))== m.tcDate And Between(Val(m.tcDate), Gomonth(Date(),-60)-m.ld1900, Gomonth(Date(),12)-m.ld1900)
*!* передается число в виде строки в диапазоне (-5 лет +1 год)
Return m.ld1900 + Val(m.tcDate) - 1
Endif
tcDate = Upper(Alltrim(Transform(m.tcDate)))
If [ ОТ ] $ ' '+m.tcDate
tcDate = Alltrim(Strextract(' '+m.tcDate, [ ОТ ]))
Endif
tcDate = Alltrim(Chrtran(m.tcDate, ["./-], [ ])) && заменяю разделители на пробелы
If !Isdigit(m.tcDate) && если первый символ не числовой, то выходим
Return {}
Endif
*!* Разлепим буквы и цифры при необходимости && 21.12.2024 08:08
Local llDigital, lnLen, ln, lc, lcTmpDate
lnLen = Len(m.tcDate)
llDigital = Isdigit(m.tcDate)
lcTmpDate = Left(m.tcDate,1)
For ln = 2 To m.lnLen
lc = Substr(m.tcDate, m.ln, 1)
If !Empty(m.lc) And Isdigit(m.lc) # m.llDigital
llDigital = Isdigit(m.lc)
lc = [ ] + lc && вставляем пробел
Endif
lcTmpDate = m.lcTmpDate + m.lc
Next
tcDate = Alltrim(m.lcTmpDate)
*!* -------------------------
Local lnWords, lnDay, lnMonth, lnYear, ldDate
Local Array laWords[3]
ldDate = {}
Store 0 To lnDay, lnMonth, lnYear
lnWords = Min(3, Getwordcount(m.tcDate)) && беру максимум 3 слова
If lnWords >= 2 && 21.12.2024 08:21
For ln = 1 To m.lnWords
laWords[m.ln] = Getwordnum(m.tcDate, m.ln)
Next
If Empty(laWords[3])
lnYear = Year(Date())
Else
lnYear = Val(laWords[3])
lnYear = m.lnYear%100 + 2000 - Iif(Between(m.lnYear%100, 50, 99), 100, 0)
Endif
If Isdigit(laWords[2])
lnMonth = Val(laWords[2])
Else
*!* Исключение для "МАЙ"
If laWords[2] = "МАЙ" && 21.12.2024 18:18
lnMonth = 5
Else
Dimension laMonth[12]
laMonth[1] = "ЯНВ"
laMonth[2] = "ФЕВ"
laMonth[3] = "МАР"
laMonth[4] = "АПР"
laMonth[5] = "МАЯ"
laMonth[6] = "ИЮН"
laMonth[7] = "ИЮЛ"
laMonth[8] = "АВГ"
laMonth[9] = "СЕН"
laMonth[10] = "ОКТ"
laMonth[11] = "НОЯ"
laMonth[12] = "ДЕК"
lnMonth = Ascan(laMonth, Left(laWords[2], 3))
Endif
*!*
Endif
lnDay = Val(laWords[1])
Try &&
ldDate = Date(m.lnYear, m.lnMonth, m.lnDay)
Catch
Endtry
Endif
Return m.ldDate


------------------
Тяжело согнать курсором муху с монитора ...




Исправлено 3 раз(а). Последнее : Равиль, 21.12.24 16:54
Ratings: 0 negative/1 positive
Re: 20 декабря 2024 года -> {20.12.2024}
chunihin-df

Сообщений: 88
Откуда: Тюмень
Дата регистрации: 18.11.2013
Что-то начинаю переживать за mistral ai, попросил сгенерировать все необходимые тесты для функции превращения строки в дату, а горшочек все никак не хочет прекращать варить

Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
akvvohinc

Сообщений: 4560
Откуда: Москва
Дата регистрации: 11.11.2008
Немного мелочовки:
- заменить TYPE на VARTYPE (почти в 2 раза быстрее)
- заменить UPPER(ALLTRIM(TRANSFORM(...))) на TRANSFORM(), которая сама умеет делать и ALLTRIM(), и UPPER():
TRAN('  йцуКЕнг  ','@!T')

Что ещё?
Все разделители не предусмотришь (я бы добавил бэкслэш, запятую и апостроф) - можно добавить строку разделителей как опциональный параметр.
Допустимый диапазон наверняка тоже не всегда будет [-5..+1].
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
Равиль
Автор

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
chunihin-df
Что-то начинаю переживать за mistral ai, попросил сгенерировать все необходимые тесты для функции превращения строки в дату, а горшочек все никак не хочет прекращать варить

это типа ИИ ?


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
chunihin-df

Сообщений: 88
Откуда: Тюмень
Дата регистрации: 18.11.2013
Ну да, ИИ из топора какое-то, полдня пытаюсь заставить его написать что-то похожее на функцию разбора строки в дату, память как у рыбки по 10 раз одни и те же ошибки исправляем
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
chunihin-df

Сообщений: 88
Откуда: Тюмень
Дата регистрации: 18.11.2013
Ну и со скобками там совсем беда

Оно в принципе не может нормально написать вот это IF LEN(laParts[1]) = 4 OR (LEN(laParts[1]) = 2 AND LEN(laParts[3]) = 2) AND lcSeparator = "-")
Уже все варианты перепробовало, но упорно не может поставить AND lcSeparator = "-" внутрь скобок
Если прямо указать как надо, то оно забывает на следующих итерациях как надо написать и снова выносит AND lcSeparator = "-" за скобки



Исправлено 1 раз(а). Последнее : chunihin-df, 21.12.24 18:24
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
Равиль
Автор

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
akvvohinc
Немного мелочовки:
- заменить TYPE на VARTYPE (почти в 2 раза быстрее)
- заменить UPPER(ALLTRIM(TRANSFORM(...))) на TRANSFORM(), которая сама умеет делать и ALLTRIM(), и UPPER():
TRAN('  йцуКЕнг  ','@!T')

Что ещё?
Все разделители не предусмотришь (я бы добавил бэкслэш, запятую и апостроф) - можно добавить строку разделителей как опциональный параметр.
Допустимый диапазон наверняка тоже не всегда будет [-5..+1].

Спасибо за подсказку по Transform() и разделителям

А диапазон буду уменьшать... в моей задаче должны загружаться свежие документы.
Полезно вернуть пустую дату, чтобы обратили внимание.


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
chunihin-df

Сообщений: 88
Откуда: Тюмень
Дата регистрации: 18.11.2013
?? Str2Date("01.01.101") возвращает DATE(2001, 1, 1) почему-то
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
Равиль
Автор

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
chunihin-df
?? Str2Date("01.01.101") возвращает DATE(2001, 1, 1) почему-то

Ага, поправил
lnYear = IIF(m.lnYear<100, m.lnYear%100 + 2000 - Iif(Between(m.lnYear%100, 50, 99), 100, 0), m.lnYear)



------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
of63

Сообщений: 26001
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Я VALTOTIP везде рекламировал, никакой реакции, все решают сами и снова. И это правильно! )
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
chunihin-df

Сообщений: 88
Откуда: Тюмень
Дата регистрации: 18.11.2013
of63
Я VALTOTIP везде рекламировал, никакой реакции, все решают сами и снова. И это правильно! )

Хорошая функция, в фоксе как раз не хватает функции обратной к TRANSFORM, этакой UNTRANSFORM
VALTOTIP могла бы ей быть, но есть несколько вопросов

1) Не работает из коробки
Чтобы заставить работать, надо как минимум вот это добавить
#DEFINE nbsp CHR(160)
#DEFINE ТЧК "."

2) Не хватает примеров использования

3) Не хватает форматов DD MON YY, DD MON YYY

4) Ошибки опять же исправить
Например
? VALTOTIP('10.10.101', 'DD.MM.YYYY') -> 10.10.01
? VALTOTIP('10.01.101', 'DD.MM.YY') -> 10.01.10

5) Поддержка cFormatCodes функции TRANSFORM
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
TAS

Сообщений: 860
Откуда: Москва
Дата регистрации: 28.09.2000
Еще вариант:

? REP_DATAPROP(CTOD('01.01.2000'))

*############################################################################################
*############################################################################################
*############################################################################################
FUNCTION REP_DATAPROP	&& выводит дату прописью - {01.01.2000} в виде "01 января 2000 г."
PARAMETERS tmpdata
RETURN CHRTRAN(STR(DAY(m.tmpdata),2)," ","0")+" "+REP_GET_MES(MONTH(m.tmpdata),1)+" "+STR(YEAR(m.tmpdata),4)+" г."
*############################################################################################
*############################################################################################
*############################################################################################
FUNCTION REP_PERNAME	&& описание периода, заданного в виде строки '200501'
PARAMETERS period_now,period_cfg
* period_now - строка в виде "200901" (год+месяц) или "20091" (год+номер квартала или полугодия)
* period_cfg - доп настройка
*	Q - квартал
*	H - полугодие
*-ПРИМЕР ЗАПУСКА ----------------------------------------------------------------------------
* ? REP_PERNAME("200903")
*--------------------------------------------------------------------------------------------
	IF VARTYPE(m.period_cfg)#"C"
		period_cfg=''
	ENDIF
	IF INLIST(VARTYPE(m.period_now),"D","T")
		period_now=LEFT(DTOS(m.period_now),6)
	ENDIF
	LOCAL ret_pername
	IF EMPTY(m.period_now)
		period_now=LEFT(DTOS(DATE()),6)
	ELSE
		period_now=LEFT(m.period_now,6)
	ENDIF
	DO CASE
	CASE "H"$m.period_cfg
		ret_pername=IIF(LEN(m.period_now)=5,RIGHT(m.period_now,1),STR(CEILING(VAL(RIGHT(m.period_now,2))/6),1))+' полугодие '+LEFT(m.period_now,4)+" г."
	CASE "Q"$m.period_cfg
		ret_pername=IIF(LEN(m.period_now)=5,RIGHT(m.period_now,1),STR(CEILING(VAL(RIGHT(m.period_now,2))/3),1))+' квартал '+LEFT(m.period_now,4)+" г."
	CASE "P"$m.period_cfg	&& падеж - январь > января
		ret_pername=REP_GET_MES(VAL(RIGHT(m.period_now,2)),1)+' '+LEFT(m.period_now,4)+" г."
	OTHERWISE
		ret_pername=REP_GET_MES(VAL(RIGHT(m.period_now,2)))+' '+LEFT(m.period_now,4)+" г."
	ENDCASE
RETURN m.ret_pername
*############################################################################################
*############################################################################################
*############################################################################################
FUNCTION REP_GET_MES	&& возвращает наименование месяца в нужном падеже
PARAMETERS mes_nom,kak	&& ret_mes - номер месяца, kak =0/1, 1 - в виде января и т.д.
*-ПРИМЕР ЗАПУСКА ----------------------------------------------------------------------------
* ? REP_GET_MES(1)
*--------------------------------------------------------------------------------------------
	IF VARTYPE(m.kak)#'N'
		kak=0
	ENDIF
	LOCAL ret_mes
	ret_mes=''
	DIMENSION naim_mes(12)
	naim_mes(1)="Январь"
	naim_mes(2)="Февраль"
	naim_mes(3)="Март "
	naim_mes(4)="Апрель"
	naim_mes(5)="Май"
	naim_mes(6)="Июнь"
	naim_mes(7)="Июль"
	naim_mes(8)="Август "
	naim_mes(9)="Сентябрь"
	naim_mes(10)="Октябрь"
	naim_mes(11)="Ноябрь"
	naim_mes(12)="Декабрь"
	ret_mes=naim_mes(m.mes_nom)
	IF m.kak=1 
		IF INLIST(m.mes_nom,3,8)
			ret_mes=LEFT(m.ret_mes,LEN(m.ret_mes)-1)+"а"
		ELSE
			ret_mes=LEFT(m.ret_mes,LEN(m.ret_mes)-1)+"я"
		ENDIF
	ENDIF
RETURN m.ret_mes
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
akvvohinc

Сообщений: 4560
Откуда: Москва
Дата регистрации: 11.11.2008
TAS
Еще вариант:
Непонятно, чего именно это ещё один вариант.
Ведь задача этой темы - "дату в виде строки" превратить в "дату", а не наоборот.

PS
А с какой целью последняя функция для пары месяцев возвращает пробел в конце названия?
TAS
возвращает наименование месяца в нужном падеже
Не в нужном, а лишь в одном из двух (трёх)



Исправлено 1 раз(а). Последнее : akvvohinc, 23.12.24 16:56
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
lemenev

Сообщений: 229
Дата регистрации: 23.06.2022
Хорошая функция безотносительно к теме обсуждения. Но при следующих параметрах она выдаёт неверные данные.

? REP_PERNAME("200913", 'Q') && 5 квартал 2009 г.
? REP_PERNAME("20093", 'H') && 3 полугодие 2009 г.
? REP_PERNAME("200913", 'H') && 3 полугодие 2009 г.

Т.е. нужен контроль входных параметров.

Кроме того, по правилам русского языка название месяца следует писать с маленькой буквы. Названия месяцев пишутся с большой буквы, только если речь идет о праздниках (8 Марта, 1 Мая).
Ratings: 0 negative/0 positive
Re: 20 декабря 2024 года -> {20.12.2024}
of63

Сообщений: 26001
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> Олег, ты уже не первый раз выкладываешь эту функцию, и каждый раз тебе говорят, что она сама по себе не работает, так как в ней используются внешние переменные. Вряд ли кто-то станет изучать совсем не маленький код, прежде чем попробует, насколько она подходит для его нужд.
Но вот попробовать-то как раз и нельзя.

Так вы сейчас и занимаетесть рукоприкладными процедурами друг другу ) И все они, при нетривиальных случаях будут усложняться. Я довел эти превращения до каксвоего предела. Изучайте (че там изучать-то!), куча CASE тип+входной тип_выходной, и внутри CASE преобразование типа в другой тип. Внешних переменных там нет, есть очевидные #DEFINE. Вы даже не спросили, каких "внешних переменных" не хватило...
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 21 (Гостей: 21)

© 2000-2025 Fox Club 
Яндекс.Метрика