powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / функции date() и cmonth()
6 сообщений из 31, страница 2 из 2
функции date() и cmonth()
    #37236296
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего, проблема заключается в технологии выполнения запросов в FoxPro. Дело в том, что сначала, еще ДО собственно выполнения запроса происходит формирование структуры выходного курсора. Того, куда будет записан результат выборки.

Чтобы это сделать, FoxPro берет "первые попавшиеся" записи из таблиц-источников, поля которых указаны в списке полей и выражений опции SELECT. На основании этих данных выполняется определение типов и размерностей полей. И вот здесь есть несколько "засад".

1. Функция Date() выдаст указанную ошибку, если один из параметров равен нулю

Код: plaintext
?Date( 2011 ,  0 ,  1 )

Откуда 0? Ну, вероятно, у Вас все-таки есть в таблице запись, в которой поле zhis.monthfor не заполнено. Пустое. Вот и получили сообщение об ошибке.

2. Размерность символьных полей определяется также по первому вычисленному значению. Это значит, что если первый попавшийся месяц - это, скажем, "Март", то будет сформировано поле размерностью в 4 символа. И название всех остальных месяцев будет "обрезано" до первых 4 символов.

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

Далее соображения "общего" плана.

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

Результат работы функции CMONTH() напрямую зависит от того, какая библиотека локализации vfpXrenu.dll или vfpXrrus.dll использована. Если использована русская библиотека, то имена месяцев будут по русски, если английская - по английски. При этом, следует иметь в виду, что вероятность глюков и ошибок в локализованных библиотеках значительно выше, чем в англоязычной.

Поэтому, для подобных функций проще писать замену. Т.е. свои собственные функции, которые возвращают то, что требуется но всегда на нужном языке вне зависимости от используемой библиотеки. В данном случае, можно сделать такую функцию

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
Function monthName(numMonth)

Local lcMonthName
do case
case  1 
	lcMonthName = "январь"
case  2 
	lcMonthName = "февраль"
case  3 
	lcMonthName = "март"
case  4 
	lcMonthName = "апрель"
case  5 
	lcMonthName = "май"
case  6 
	lcMonthName = "июнь"
case  7 
	lcMonthName = "июль"
case  8 
	lcMonthName = "август"
case  9 
	lcMonthName = "сентябрь"
case  10 
	lcMonthName = "октябрь"
case  11 
	lcMonthName = "ноябрь"
case  12 
	lcMonthName = "декабрь"
* Обязательно предусмотреть не учтенное (не корректное) значение
otherwise
	lcMonthName = ""
endcase

* Максимальная длина названия месяца  8  символов
* Поэтому возвращаемое значение надо дополнить до  8  символов концевыми пробелами
return padr(m.lcMonthName,  8 )
endfunc

Соответственно в запросе можно просто вызвать эту функцию

Код: plaintext
select monthName(zhis.monthfor) from ...
...
Рейтинг: 0 / 0
функции date() и cmonth()
    #37236305
alyssa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ
Код: plaintext
cmonth(date( 2011 ,evl(zhis.monthfor,  1 ), 1 )) as monthfor


вот с этим работает!

но я так и написала свою ф-ю замены, пока ждала, когда мне не этом форуме ответят)))
...
Рейтинг: 0 / 0
функции date() и cmonth()
    #37236312
alyssa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
значит надо проводить "ремонт" и "коррекцию" БД, раз где-то занулились параметры начислений, это не шутки... Благодарю за помощь!
...
Рейтинг: 0 / 0
функции date() и cmonth()
    #37236367
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не обязательно ошибка данных. Это действительно особенность "нулевого" прогона Select-SQL. Просто, при определенных условиях (каких - не известно), в этом самом "нулевом" прогоне может использоваться фиктиная запись, значение всех полей у которой BLANK. Т.е. не заполнено.

Если интересно, то обсуждение этой особенности для VFP9 было здесь

http://forum.foxclub.ru/read.php?29,239391,page=1

Алексей Цингауз - это один из разработчиков VFP9. "Лечение" в том и заключается, что всегда предполагать возможность существования подобной записи. Функция EVL() собственно и заменяет пустое значение на указанное во втором параметре.
...
Рейтинг: 0 / 0
функции date() и cmonth()
    #37236959
alyssaВладимирМ
Код: plaintext
cmonth(date( 2011 ,evl(zhis.monthfor,  1 ), 1 )) as monthfor


вот с этим работает!

но я так и написала свою ф-ю замены, пока ждала, когда мне не этом форуме ответят)))А на вопрос "Строк ровно 12?" так и не ответили. Трудно было сразу сообщить о наличии пустых значений?
...
Рейтинг: 0 / 0
функции date() и cmonth()
    #37237148
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий.alyssaпропущено...


вот с этим работает!

но я так и написала свою ф-ю замены, пока ждала, когда мне не этом форуме ответят)))А на вопрос "Строк ровно 12?" так и не ответили. Трудно было сразу сообщить о наличии пустых значений?
Строк 12 как я понял из этого
alyssaSergey Sizovalyssa,
что выдает запрос
Код: plaintext
SELECT distinct monthfor FROM ZHIS

вывел строки с 1 столбцом, заполненным числами от 1 до 12
похоже действительно происходит "нулевой" прогон как ВладимирМ выше писал. Там по ссылке тоже глюки с функцией DATE()
...
Рейтинг: 0 / 0
6 сообщений из 31, страница 2 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / функции date() и cmonth()
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]