|
|
|
VFP+MS SQL+DATETIME
|
|||
|---|---|---|---|
|
#18+
в проекте на 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. Что я делаю не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2006, 16:54 |
|
||
|
VFP+MS SQL+DATETIME
|
|||
|---|---|---|---|
|
#18+
lcSQLCommand="SELECT * FROM MyTable WHERE datadoc= ? d)" lnExec=SQLExec(m.lnCH,lcSQLCommand,"MyCursor") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2006, 18:31 |
|
||
|
VFP+MS SQL+DATETIME
|
|||
|---|---|---|---|
|
#18+
lcSQLCommand="SELECT * FROM MyTable WHERE datadoc= ? d" lnExec=SQLExec(m.lnCH,lcSQLCommand,"MyCursor") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2006, 18:32 |
|
||
|
VFP+MS SQL+DATETIME
|
|||
|---|---|---|---|
|
#18+
2 Touareg Пиши так: lcSQLfiltr = " where datadoc=" + STRTRAN(dtoc(d),'/','-') lcSQLCommand="SELECT * FROM MyTable "+ lcSQLfiltr ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2006, 18:55 |
|
||
|
VFP+MS SQL+DATETIME
|
|||
|---|---|---|---|
|
#18+
Недоходящий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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 08:39 |
|
||
|
VFP+MS SQL+DATETIME
|
|||
|---|---|---|---|
|
#18+
Aleksey-KА зачем STRTRAN??? Я всегда делаю так: lcSQLCommand=[SELECT * FROM MyTable WHERE datadoc=']+ DTOC(m.d) + ['] С уважением, Алексей. На самом деле если не пользоваться знаком вопроса, то для преобразования Фокс-данных надо писать свою ф-ию, простой пример Код: plaintext 1. тоже вернёт null ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 09:12 |
|
||
|
VFP+MS SQL+DATETIME
|
|||
|---|---|---|---|
|
#18+
PaulWist На самом деле если не пользоваться знаком вопроса, то для преобразования Фокс-данных надо писать свою ф-ию, простой пример Код: plaintext 1. тоже вернёт null Именно так :). Обязательно функция (аналог NULLIF из T-SQL) и не только для дат. Вот и она (пользуюсь более 3-х лет): Код: plaintext 1. 2. 3. 4. 5. lcSQLCommand=[SELECT * FROM MyTable WHERE datadoc=]+ NULLIF(m.d) С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 09:43 |
|
||
|
VFP+MS SQL+DATETIME
|
|||
|---|---|---|---|
|
#18+
Сейчас мы её расколем :)) Код: plaintext 1. 2. 3. 4. 5. 6. 7. Есть ещё где дырки подлатать - шутка :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 10:01 |
|
||
|
VFP+MS SQL+DATETIME
|
|||
|---|---|---|---|
|
#18+
Я наверное чего-то не понял!? На пустую дату выдает 'NULL' (стринг) - так и задумано! А на NULL ругается, так-как в локальном курсоре у меня НЕ МОЖЕТ быть null. Я их заменяю при чтение с сервера на 0, '', {} (в зависимости от типа данных). Иначе и не потребовалось бы использовать эту функцию! С уважением, Алексей P.S. Хотя, пожалуй на .NULL. стоит и проверить Включить еще и проверку VARTYPE(m.LnSRC1) = "X" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 10:15 |
|
||
|
VFP+MS SQL+DATETIME
|
|||
|---|---|---|---|
|
#18+
Для VFP 9.0 лучше так: Код: plaintext 1. 2. 3. 4. 5. 6. С уважением, Алексей P.S. Отдельное спасибо PaulWist :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 10:23 |
|
||
|
VFP+MS SQL+DATETIME
|
|||
|---|---|---|---|
|
#18+
Aleksey-KС уважением, Алексей P.S. Отдельное спасибо PaulWist :) Ещё рано, сейчас мы её доточим до совершенства Код: plaintext 1. 2. 3. 4. 5. Хотя это может быть и перебор - Алексей не обращайте внимания, какое-то настроение "шашкой помахать" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 10:30 |
|
||
|
VFP+MS SQL+DATETIME
|
|||
|---|---|---|---|
|
#18+
Не.. в самый раз Обработка параметра m.LnSRC1 = .t. не имеет смысла? У сервера нет логического типа данных. Каждый разработчик сам для себя решает, чему на SQL Server соответствует true, а чему false. Вывод: такой тип данных не должен передаваться в эту функцию. И ошибка, которую вернет функция при m.LnSRC1 = .t. должна разработчика об этом предупредить, а не передавать на сервер NULL С уважением, Алексей P.S. Для вас специально (ради совершенства) :) Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 10:42 |
|
||
|
VFP+MS SQL+DATETIME
|
|||
|---|---|---|---|
|
#18+
Aleksey-KОбработка параметра m.LnSRC1 = .t. не имеет смысла? У сервера нет логического типа данных. Каждый разработчик сам для себя решает, чему на SQL Server соответствует true, а чему false Ну вообщем случае да, правда есть тип данных очень похожий Код: plaintext и ODBC его возвращает как логический. Поскольку, ф-ия используется для передачи значенний на сервер и должна производить implicit conversion по подобию ODBC Код: plaintext 1. 2. 3. те ?Test.Lfield вменяемо конвертируется в нолик или единицу. PS так мысли вслух :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 11:17 |
|
||
|
VFP+MS SQL+DATETIME
|
|||
|---|---|---|---|
|
#18+
Это все правильно, но я говорил о другом. Разработчик базы данных может для хранения логического типа данных использовать не 0 и 1 (tinyint, int и пр.) , а другой типа данных СЕРВЕРА. Кому-то нравится CHAR(1), а кому-то BIT и т.п. И вообще, как мне кажется, для логичекого типа данных значение NULL нельзя допускать. А следовательно, функция NULLIF просто не нужна. С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 11:24 |
|
||
|
VFP+MS SQL+DATETIME
|
|||
|---|---|---|---|
|
#18+
Aleksey-KИ вообще, как мне кажется, для логичекого типа данных значение NULL нельзя допускать. Согласен на все 103%!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 11:30 |
|
||
|
VFP+MS SQL+DATETIME
|
|||
|---|---|---|---|
|
#18+
Hi Aleksey! А собственно почему не использовать простой как грабли способ с ?Param зачем пихать что-то в одну строку - причём из-за этого бороться с проблемами разного "понимания" форматов даты... А если запрос исполняется не 1 раз а много, при этом параметры меняются лишь по своим значениям (а их состав неизменен) - то ещё и терять на повторной компиляции запроса... Или просто в классе доступа к данным зашита гибкая схема генерации произвольных условий, и реально никаких одиночных переменных-параметров не существует? Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2006, 02:33 |
|
||
|
VFP+MS SQL+DATETIME
|
|||
|---|---|---|---|
|
#18+
Я не испоьзую ?Param по 3-м причинам: 1. Область видимости Param в функции - обертки команды SQLEXEC. Если Param не поле курсора, то LOCAL переменные не годятся. 2. Вы видели как выглядит команда с VFP, посылаемая на SQL сервер с использованием ?Param в SQL Profiler ? Думаю, что да. Не очень читаемый вид. Не так ли?! 3. Логика приложения. Пример с ID и датой показателен (все ID = 0 и пустые даты заменяю на текст 'NULL'). С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2006, 07:18 |
|
||
|
VFP+MS SQL+DATETIME
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2006, 02:21 |
|
||
|
VFP+MS SQL+DATETIME
|
|||
|---|---|---|---|
|
#18+
Igor Korolyov Hi Aleksey! > 1. Область видимости Param в функции - обертки команды SQLEXEC. Private в основной программе (точке вызова обёртки) - не думаю что это очень существенно - вот при использовании своих классов доступа, или при реальном использовании "динамически" создаваемых условий это уже будет существенно. Согласен. Не существенно. Скорее привычка, стиль программирования. Igor Korolyov ...да и потребности как-то в ТАКОМ уровне отслеживания не возникало - т.е. просто проверить что за команда идёт и как - это да, а вот чтобы все значения переменных контролировать... А у меня постоянно возникает. Например.. для нахождения ID объекта, с которой работает в данный момент клиент, я и пр. Igor Korolyov Не очень понимаю "показательности"... По мне так 0 это 0 а не NULL - вполне себе допустимое и нормальное значение. Для вас да, а для базы данных?!!! Ссылку на необязательное значение справочника в талице фактов должна быть имеен NULL, а не 0 (ноль) !!! Я при чтении с сервера ВСЕ NULL меняю на соответствующие пустые значения. Соответственно, при отсылки на сервер надо менять на NULL. Иначе сработает Constraint сервера. С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2006, 08:41 |
|
||
|
VFP+MS SQL+DATETIME
|
|||
|---|---|---|---|
|
#18+
Aleksey-KЯ при чтении с сервера ВСЕ NULL меняю на соответствующие пустые значения. Соответственно, при отсылки на сервер надо менять на NULL. Иначе сработает Constraint сервера. Алексей. Вот с этого места по подробнее. Что даёт замена на клиенте NULL-сервера в пустые значения, для какой цели? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2006, 09:56 |
|
||
|
VFP+MS SQL+DATETIME
|
|||
|---|---|---|---|
|
#18+
Мне значительно комфортнее работать на клиенте с пустыми полями (0, '', {}), а не с NULL значениями (особенно это касается дат). Поэтому, во всех View на сервере у меня поля с NULL заменяются на ISNULL(StrField, '') AS StrFiled или ISNULL(NumField, 0) AS NumField. Поля типа DATETIME не преобразуются на сервере, а только на клиенте при копировании из временного курсора, полученного с сервера, в "постоянный", созданного в событии LOAD формы: NVL(TTOD(OT_DDok), {}). При формировании строки вызова хранимой процедуры сервера для SQLEXEC я заменяю НЕОБХОДИМЫЕ пустые поля значениями своей функции NULLIF. С уважением, Алексей P.S. Повторяю, это просто мой стиль программирования. Мне так удобнее. Если кто-то работает с NULL полями на клиенте и ему удобнее так, то это тоже верно. Главное, чтобы результат получался правильный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2006, 11:47 |
|
||
|
VFP+MS SQL+DATETIME
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2006, 04:40 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33535998&tid=1592318]: |
0ms |
get settings: |
9ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
172ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
74ms |
get tp. blocked users: |
2ms |
| others: | 211ms |
| total: | 510ms |

| 0 / 0 |
