powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / VFP+MS SQL+DATETIME
22 сообщений из 22, страница 1 из 1
VFP+MS SQL+DATETIME
    #33534964
Touareg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в проекте на VFP присваиваю переменной типа дата d какое-то значение
потом делаю выборку документов из SQL Server'а за эту дату:

lcSQLCommand="SELECT * FROM MyTable WHERE datadoc=d)"
lnExec=SQLExec(m.lnCH,lcSQLCommand,"MyCursor")

выдаёт ошибку "Invalid column name d"

преобразую d к типу datetime, следующим образом:

lcSQLCommand="SELECT * FROM MyTable WHERE datadoc=CONVERT(DATETIME,d)"

получаю следующее:

Syntax error converting datetime from character string.

Что я делаю не так?
...
Рейтинг: 0 / 0
VFP+MS SQL+DATETIME
    #33535298
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
lcSQLCommand="SELECT * FROM MyTable WHERE datadoc= ? d)"
lnExec=SQLExec(m.lnCH,lcSQLCommand,"MyCursor")
...
Рейтинг: 0 / 0
VFP+MS SQL+DATETIME
    #33535301
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
lcSQLCommand="SELECT * FROM MyTable WHERE datadoc= ? d"
lnExec=SQLExec(m.lnCH,lcSQLCommand,"MyCursor")
...
Рейтинг: 0 / 0
VFP+MS SQL+DATETIME
    #33535343
Недоходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Touareg
Пиши так:
lcSQLfiltr = " where datadoc=" + STRTRAN(dtoc(d),'/','-')
lcSQLCommand="SELECT * FROM MyTable "+ lcSQLfiltr
...
Рейтинг: 0 / 0
VFP+MS SQL+DATETIME
    #33535938
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Недоходящий2 Touareg
Пиши так:
lcSQLfiltr = " where datadoc=" + STRTRAN(dtoc(d),'/','-')
lcSQLCommand="SELECT * FROM MyTable "+ lcSQLfiltr
А зачем STRTRAN???
Я всегда делаю так:
lcSQLCommand=[SELECT * FROM MyTable WHERE datadoc=']+ DTOC(m.d) + [']
С уважением, Алексей.
P.S. При этом надо обеспечить, что бы клиент и сервер имел одинаковый формат дат. Я использую dd.mm.yyyy
На клиенте (VFP) - SET DATE TO GERMAN
На сервер после установления соединения посылается SET DATEFORMAT DMY
...
Рейтинг: 0 / 0
VFP+MS SQL+DATETIME
    #33535998
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-KА зачем STRTRAN???
Я всегда делаю так:
lcSQLCommand=[SELECT * FROM MyTable WHERE datadoc=']+ DTOC(m.d) + [']
С уважением, Алексей.


На самом деле если не пользоваться знаком вопроса, то для преобразования Фокс-данных надо писать свою ф-ию, простой пример

Код: plaintext
1.
m.d = null
?DTOC(m.d)

тоже вернёт null
...
Рейтинг: 0 / 0
VFP+MS SQL+DATETIME
    #33536073
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist
На самом деле если не пользоваться знаком вопроса, то для преобразования Фокс-данных надо писать свою ф-ию, простой пример

Код: plaintext
1.
m.d = null
?DTOC(m.d)

тоже вернёт null
Именно так :). Обязательно функция (аналог NULLIF из T-SQL) и не только для дат. Вот и она (пользуюсь более 3-х лет):
Код: plaintext
1.
2.
3.
4.
5.
FUNCTION NULLIF(LnSRC1)
	RETURN IIF(EMPTY(m.LnSRC1), 'NULL', IIF(VARTYPE(m.LnSRC1)=="C", ;
		['] + ALLTRIM(m.LnSRC1) + ['], IIF(VARTYPE(m.LnSRC1)== "D", ['] + DTOC(m.LnSRC1) + ['],  ;
		IIF(VARTYPE(m.LnSRC1)== "T", ['] + TTOC(m.LnSRC1) + ['], ;
		ALLTRIM(STR(m.LnSRC1))))))
ENDFUNC
Тогда получается:
lcSQLCommand=[SELECT * FROM MyTable WHERE datadoc=]+ NULLIF(m.d)
С уважением, Алексей.
...
Рейтинг: 0 / 0
VFP+MS SQL+DATETIME
    #33536131
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас мы её расколем :))

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
m.LnSRC1 = {..}
m.LnSRC1 = null
?TYPE('m.LnSRC1')

?IIF(EMPTY(m.LnSRC1), 'NULL', IIF(VARTYPE(m.LnSRC1)=="C", ;
		['] + ALLTRIM(m.LnSRC1) + ['], IIF(VARTYPE(m.LnSRC1)== "D", ['] + DTOC(m.LnSRC1) + ['],  ;
		IIF(VARTYPE(m.LnSRC1)== "T", ['] + TTOC(m.LnSRC1) + ['], ;
		ALLTRIM(STR(m.LnSRC1))))))

Есть ещё где дырки подлатать - шутка :)
...
Рейтинг: 0 / 0
VFP+MS SQL+DATETIME
    #33536195
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я наверное чего-то не понял!?
На пустую дату выдает 'NULL' (стринг) - так и задумано!
А на NULL ругается, так-как в локальном курсоре у меня НЕ МОЖЕТ быть null. Я их заменяю при чтение с сервера на 0, '', {} (в зависимости от типа данных). Иначе и не потребовалось бы использовать эту функцию!
С уважением, Алексей
P.S. Хотя, пожалуй на .NULL. стоит и проверить
Включить еще и проверку VARTYPE(m.LnSRC1) = "X"
...
Рейтинг: 0 / 0
VFP+MS SQL+DATETIME
    #33536222
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для VFP 9.0 лучше так:

Код: plaintext
1.
2.
3.
4.
5.
6.
FUNCTION NULLIF(LnSRC1)
	RETURN ICASE(VARTYPE(m.LnSRC1) ="X", 'NULL', EMPTY(m.LnSRC1), ;
		'NULL', VARTYPE(m.LnSRC1)=="C", ['] + ALLTRIM(m.LnSRC1) + ['], ;
		VARTYPE(m.LnSRC1)== "D", ['] + DTOC(m.LnSRC1) + ['], ;
		VARTYPE(m.LnSRC1)== "T", ['] + TTOC(m.LnSRC1) + ['], ;
		ALLTRIM(STR(m.LnSRC1)))
ENDFUNC

С уважением, Алексей
P.S. Отдельное спасибо PaulWist :)
...
Рейтинг: 0 / 0
VFP+MS SQL+DATETIME
    #33536250
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-KС уважением, Алексей
P.S. Отдельное спасибо PaulWist :)

Ещё рано, сейчас мы её доточим до совершенства

Код: plaintext
1.
2.
3.
4.
5.
m.LnSRC1 = .t.
?ICASE(VARTYPE(m.LnSRC1) ="X", 'NULL', EMPTY(m.LnSRC1), ;
		'NULL', VARTYPE(m.LnSRC1)=="C", ['] + ALLTRIM(m.LnSRC1) + ['], ;
		VARTYPE(m.LnSRC1)== "D", ['] + DTOC(m.LnSRC1) + ['], ;
		VARTYPE(m.LnSRC1)== "T", ['] + TTOC(m.LnSRC1) + ['], ;
		ALLTRIM(STR(m.LnSRC1)))

Хотя это может быть и перебор - Алексей не обращайте внимания, какое-то настроение "шашкой помахать"
...
Рейтинг: 0 / 0
VFP+MS SQL+DATETIME
    #33536300
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не.. в самый раз
Обработка параметра m.LnSRC1 = .t. не имеет смысла? У сервера нет логического типа данных. Каждый разработчик сам для себя решает, чему на SQL Server соответствует true, а чему false.
Вывод: такой тип данных не должен передаваться в эту функцию. И ошибка, которую вернет функция при m.LnSRC1 = .t. должна разработчика об этом предупредить, а не передавать на сервер NULL

С уважением, Алексей
P.S. Для вас специально (ради совершенства) :)
Код: plaintext
1.
2.
3.
4.
5.
FUNCTION NULLIF(LnSRC1)
	RETURN ICASE(VARTYPE(m.LnSRC1) ="X", 'NULL', EMPTY(m.LnSRC1), ;
		'NULL', VARTYPE(m.LnSRC1)=="C", ['] + ALLTRIM(m.LnSRC1) + ['], ;
		VARTYPE(m.LnSRC1)== "D", ['] + DTOC(m.LnSRC1) + ['], ;
		VARTYPE(m.LnSRC1)== "T", ['] + TTOC(m.LnSRC1) + ['], 'NULL')
ENDFUNC
...
Рейтинг: 0 / 0
VFP+MS SQL+DATETIME
    #33536447
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-KОбработка параметра m.LnSRC1 = .t. не имеет смысла? У сервера нет логического типа данных. Каждый разработчик сам для себя решает, чему на SQL Server соответствует true, а чему false

Ну вообщем случае да, правда есть тип данных очень похожий

Код: plaintext
?SQLEXEC(hndConnection, [set nocount on create table #tt (Lfield bit) insert into #tt (Lfield) values( 1 ) select * from #tt ])

и ODBC его возвращает как логический.

Поскольку, ф-ия используется для передачи значенний на сервер и должна производить implicit conversion по подобию ODBC

Код: plaintext
1.
2.
3.
CREATE CURSOR test (Lfield l DEFAULT .f. )
APPEND BLANK

?SQLEXEC(hndConnection, [set nocount on create table #t (Lfield bit) insert into #t (Lfield) values(?Test.Lfield) select * from #t ])

те ?Test.Lfield вменяемо конвертируется в нолик или единицу.

PS так мысли вслух :)
...
Рейтинг: 0 / 0
VFP+MS SQL+DATETIME
    #33536474
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это все правильно, но я говорил о другом. Разработчик базы данных может для хранения логического типа данных использовать не 0 и 1 (tinyint, int и пр.) , а другой типа данных СЕРВЕРА. Кому-то нравится CHAR(1), а кому-то BIT и т.п.
И вообще, как мне кажется, для логичекого типа данных значение NULL нельзя допускать. А следовательно, функция NULLIF просто не нужна.
С уважением, Алексей
...
Рейтинг: 0 / 0
VFP+MS SQL+DATETIME
    #33536489
Недоходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-KИ вообще, как мне кажется, для логичекого типа данных значение NULL нельзя допускать.

Согласен на все 103%!!!
...
Рейтинг: 0 / 0
VFP+MS SQL+DATETIME
    #33539248
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Aleksey!

А собственно почему не использовать простой как грабли способ с ?Param зачем
пихать что-то в одну строку - причём из-за этого бороться с проблемами
разного "понимания" форматов даты... А если запрос исполняется не 1 раз а
много, при этом параметры меняются лишь по своим значениям (а их состав
неизменен) - то ещё и терять на повторной компиляции запроса...
Или просто в классе доступа к данным зашита гибкая схема генерации
произвольных условий, и реально никаких одиночных переменных-параметров не
существует?

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
VFP+MS SQL+DATETIME
    #33539288
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не испоьзую ?Param по 3-м причинам:
1. Область видимости Param в функции - обертки команды SQLEXEC.
Если Param не поле курсора, то LOCAL переменные не годятся.
2. Вы видели как выглядит команда с VFP, посылаемая на SQL сервер с использованием ?Param в SQL Profiler ? Думаю, что да. Не очень читаемый вид. Не так ли?!
3. Логика приложения. Пример с ID и датой показателен (все ID = 0 и пустые даты заменяю на текст 'NULL').

С уважением, Алексей
...
Рейтинг: 0 / 0
VFP+MS SQL+DATETIME
    #33547856
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Aleksey!

> 1. Область видимости Param в функции - обертки команды SQLEXEC.

Private в основной программе (точке вызова обёртки) - не думаю что это очень
существенно - вот при использовании своих классов доступа, или при реальном
использовании "динамически" создаваемых условий это уже будет существенно.

> 2. Вы видели как выглядит команда с VFP, посылаемая на SQL сервер с
> использованием ?Param в SQL Profiler ? Думаю, что да. Не очень читаемый
> вид. Не так ли?!

Я больше с Oracle - там SQL Monitor показывает значения параметров на
входе - не могу сказать что это очень удобно, но в принципе вполне понятно
что к чему - да и потребности как-то в ТАКОМ уровне отслеживания не
возникало - т.е. просто проверить что за команда идёт и как - это да, а вот
чтобы все значения переменных контролировать...

> 3. Логика приложения. Пример с ID и датой показателен (все ID = 0 и пустые
> даты заменяю на текст 'NULL').

Не очень понимаю "показательности"... По мне так 0 это 0 а не NULL - вполне
себе допустимое и нормальное значение. А что касается даты - то лишь в
старых приложениях, когда и речи не шло про какой-то там SQL сервер я
ориентировался на "пустые" даты - сейчас я считаю что если нужно иметь
незаполненную дату, то надо ставить там "правильный" NULL а не фоксовое
чудо - "пустую дату". Впрочем параметр/строка не зависит от этого - если уж
очень надо - то и параметры передавай не напрямую а через UDF-конвертер...

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
VFP+MS SQL+DATETIME
    #33548001
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Korolyov
Hi Aleksey!

> 1. Область видимости Param в функции - обертки команды SQLEXEC.

Private в основной программе (точке вызова обёртки) - не думаю что это очень
существенно - вот при использовании своих классов доступа, или при реальном
использовании "динамически" создаваемых условий это уже будет существенно.

Согласен. Не существенно. Скорее привычка, стиль программирования.

Igor Korolyov
...да и потребности как-то в ТАКОМ уровне отслеживания не
возникало - т.е. просто проверить что за команда идёт и как - это да, а вот
чтобы все значения переменных контролировать...

А у меня постоянно возникает. Например.. для нахождения ID объекта, с которой работает в данный момент клиент, я и пр.

Igor Korolyov
Не очень понимаю "показательности"... По мне так 0 это 0 а не NULL - вполне
себе допустимое и нормальное значение.

Для вас да, а для базы данных?!!! Ссылку на необязательное значение справочника в талице фактов должна быть имеен NULL, а не 0 (ноль) !!!
Я при чтении с сервера ВСЕ NULL меняю на соответствующие пустые значения. Соответственно, при отсылки на сервер надо менять на NULL. Иначе сработает Constraint сервера.
С уважением, Алексей.
...
Рейтинг: 0 / 0
VFP+MS SQL+DATETIME
    #33548138
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-KЯ при чтении с сервера ВСЕ NULL меняю на соответствующие пустые значения. Соответственно, при отсылки на сервер надо менять на NULL. Иначе сработает Constraint сервера.

Алексей.

Вот с этого места по подробнее.

Что даёт замена на клиенте NULL-сервера в пустые значения, для какой цели?
...
Рейтинг: 0 / 0
VFP+MS SQL+DATETIME
    #33548526
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне значительно комфортнее работать на клиенте с пустыми полями (0, '', {}), а не с NULL значениями (особенно это касается дат). Поэтому, во всех View на сервере у меня поля с NULL заменяются на ISNULL(StrField, '') AS StrFiled или ISNULL(NumField, 0) AS NumField. Поля типа DATETIME не преобразуются на сервере, а только на клиенте при копировании из временного курсора, полученного с сервера, в "постоянный", созданного в событии LOAD формы: NVL(TTOD(OT_DDok), {}).
При формировании строки вызова хранимой процедуры сервера для SQLEXEC я заменяю НЕОБХОДИМЫЕ пустые поля значениями своей функции NULLIF.

С уважением, Алексей
P.S. Повторяю, это просто мой стиль программирования. Мне так удобнее. Если кто-то работает с NULL полями на клиенте и ему удобнее так, то это тоже верно. Главное, чтобы результат получался правильный.
...
Рейтинг: 0 / 0
VFP+MS SQL+DATETIME
    #33553671
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Aleksey!

> А у меня постоянно возникает. Например.. для нахождения ID объекта, с
> которой работает в данный момент клиент, я и пр.

Ну тогда ой - не знал что SQL-ный профайлер такой ограниченный... Может быть
хоть в SQL 2005 это довели до ума?

> Для вас да, а для базы данных?!!! Ссылку на необязательное значение
> справочника в талице фактов должна быть имеен NULL, а не 0 (ноль) !!!

Как говорят англичане It depend's!
Дело в том, что я не считаю очень уж правильным иметь 2 системы работы с
"необязательными значениями" - т.е. на клиенте это 0 или там пустая дата, а
на сервере Null - если уж на клиенте FK = 0 то надо в соответствующем
справочнике заводить запись с кодом 0 и значением типа "не введено" (или
той-же пустой строкой!) - чтобы можно было легко это значение выбрать да и
при отображении чтоб было красиво. Причём именно на сервере это и делать! А
множество конвертаций между клиентом и сервером - не, не красиво это. IMHO
излишне сложно - а значит потенциальное поле для ошибок возникает...
Кстати в Oracle пустая строка эквивалентна значению NULL :) Это порой весьма
и весьма неудобно, но что поделать...

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / VFP+MS SQL+DATETIME
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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