Re: 20 декабря 2024 года -> {20.12.2024} | |
---|---|
Равиль Автор Сообщений: 6692 Откуда: Уфа Дата регистрации: 01.08.2003 |
Доброе утро ! Спасибо Сергей (akvvohinc) - допилил - разлепил такие строки. PS также добавил обработку числового параметра с учетом замечаний Сергея (ssa) ------------------ Тяжело согнать курсором муху с монитора ... Исправлено 2 раз(а). Последнее : Равиль, 21.12.24 07:39 ![]() |
Re: 20 декабря 2024 года -> {20.12.2024} | |
---|---|
chunihin-df Сообщений: 88 Откуда: Тюмень Дата регистрации: 18.11.2013 |
Ошибка из соседней темы
?? Str2date("56E1234234") Наверное, сначала надо отделить числа от не чисел, и только после этого начинать перебор форматов даты Вот этот фрагмент в начало функции перенести
![]() |
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 ![]() |
Re: 20 декабря 2024 года -> {20.12.2024} | |
---|---|
Равиль Автор Сообщений: 6692 Откуда: Уфа Дата регистрации: 01.08.2003 |
Спасибо за тест ! Поправлю ![]() ------------------ Тяжело согнать курсором муху с монитора ... ![]() |
Re: 20 декабря 2024 года -> {20.12.2024} | |
---|---|
ssa Сообщений: 13085 Откуда: Москва Дата регистрации: 23.03.2005 |
Я тут слегонца тестов добавил и причесал в своём стиле
![]() Ну там совершенно лишние телодвижения поубирал и так, по мелочи... ![]()
------------------ Лень - это неосознанная мудрость. ![]() |
Re: 20 декабря 2024 года -> {20.12.2024} | |
---|---|
Равиль Автор Сообщений: 6692 Откуда: Уфа Дата регистрации: 01.08.2003 |
Да, увидел - аккуратно получилось, спасибо Сергей ! ![]() правда с массивом ожидаемо провалился Май .. ?? Str2Date("20 май2024г.") && Добавил исключение для "МАЙ"
------------------ Тяжело согнать курсором муху с монитора ... Исправлено 3 раз(а). Последнее : Равиль, 21.12.24 16:54 ![]() |
Re: 20 декабря 2024 года -> {20.12.2024} | |
---|---|
chunihin-df Сообщений: 88 Откуда: Тюмень Дата регистрации: 18.11.2013 |
|
Re: 20 декабря 2024 года -> {20.12.2024} | |
---|---|
akvvohinc Сообщений: 4560 Откуда: Москва Дата регистрации: 11.11.2008 |
Немного мелочовки:
- заменить TYPE на VARTYPE (почти в 2 раза быстрее) - заменить UPPER(ALLTRIM(TRANSFORM(...))) на TRANSFORM(), которая сама умеет делать и ALLTRIM(), и UPPER(): TRAN(' йцуКЕнг ','@!T') Что ещё? Все разделители не предусмотришь (я бы добавил бэкслэш, запятую и апостроф) - можно добавить строку разделителей как опциональный параметр. Допустимый диапазон наверняка тоже не всегда будет [-5..+1]. ![]() |
Re: 20 декабря 2024 года -> {20.12.2024} | |
---|---|
Равиль Автор Сообщений: 6692 Откуда: Уфа Дата регистрации: 01.08.2003 |
|
Re: 20 декабря 2024 года -> {20.12.2024} | |
---|---|
chunihin-df Сообщений: 88 Откуда: Тюмень Дата регистрации: 18.11.2013 |
Ну да, ИИ из топора какое-то, полдня пытаюсь заставить его написать что-то похожее на функцию разбора строки в дату, память как у рыбки по 10 раз одни и те же ошибки исправляем
![]() |
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 ![]() |
Re: 20 декабря 2024 года -> {20.12.2024} | |
---|---|
Равиль Автор Сообщений: 6692 Откуда: Уфа Дата регистрации: 01.08.2003 |
Спасибо за подсказку по Transform() и разделителям ![]() А диапазон буду уменьшать... в моей задаче должны загружаться свежие документы. Полезно вернуть пустую дату, чтобы обратили внимание. ------------------ Тяжело согнать курсором муху с монитора ... ![]() |
Re: 20 декабря 2024 года -> {20.12.2024} | |
---|---|
chunihin-df Сообщений: 88 Откуда: Тюмень Дата регистрации: 18.11.2013 |
?? Str2Date("01.01.101") возвращает DATE(2001, 1, 1) почему-то
![]() |
Re: 20 декабря 2024 года -> {20.12.2024} | |
---|---|
Равиль Автор Сообщений: 6692 Откуда: Уфа Дата регистрации: 01.08.2003 |
|
Re: 20 декабря 2024 года -> {20.12.2024} | |
---|---|
of63 Сообщений: 26001 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Я VALTOTIP везде рекламировал, никакой реакции, все решают сами и снова. И это правильно! )
![]() |
Re: 20 декабря 2024 года -> {20.12.2024} | |
---|---|
chunihin-df Сообщений: 88 Откуда: Тюмень Дата регистрации: 18.11.2013 |
Хорошая функция, в фоксе как раз не хватает функции обратной к 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 ![]() |
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 ![]() |
Re: 20 декабря 2024 года -> {20.12.2024} | |
---|---|
akvvohinc Сообщений: 4560 Откуда: Москва Дата регистрации: 11.11.2008 |
Непонятно, чего именно это ещё один вариант. Ведь задача этой темы - "дату в виде строки" превратить в "дату", а не наоборот. PS А с какой целью последняя функция для пары месяцев возвращает пробел в конце названия? Не в нужном, а лишь в одном из двух (трёх) ![]() Исправлено 1 раз(а). Последнее : akvvohinc, 23.12.24 16:56 ![]() |
Re: 20 декабря 2024 года -> {20.12.2024} | |
---|---|
lemenev Сообщений: 229 Дата регистрации: 23.06.2022 |
Хорошая функция безотносительно к теме обсуждения. Но при следующих параметрах она выдаёт неверные данные.
Т.е. нужен контроль входных параметров. Кроме того, по правилам русского языка название месяца следует писать с маленькой буквы. Названия месяцев пишутся с большой буквы, только если речь идет о праздниках (8 Марта, 1 Мая). ![]() |
Re: 20 декабря 2024 года -> {20.12.2024} | |
---|---|
of63 Сообщений: 26001 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
> Олег, ты уже не первый раз выкладываешь эту функцию, и каждый раз тебе говорят, что она сама по себе не работает, так как в ней используются внешние переменные. Вряд ли кто-то станет изучать совсем не маленький код, прежде чем попробует, насколько она подходит для его нужд.
Но вот попробовать-то как раз и нельзя. Так вы сейчас и занимаетесть рукоприкладными процедурами друг другу ) И все они, при нетривиальных случаях будут усложняться. Я довел эти превращения до каксвоего предела. Изучайте (че там изучать-то!), куча CASE тип+входной тип_выходной, и внутри CASE преобразование типа в другой тип. Внешних переменных там нет, есть очевидные #DEFINE. Вы даже не спросили, каких "внешних переменных" не хватило... ![]() |
© 2000-2025 Fox Club  |