|
|
|
преобразование SQL-Datetime в VFP-Date
|
|||
|---|---|---|---|
|
#18+
На SQL2000 есть таблица в ней поле типа datetime. Нужно чтобы у пользователя в VFP (работаю с 8) значения этих полей показывались как: '12.02.2004' а не '12.02.2004 09:14:27.357' При попытке sqlexec(gnConnHadle,'exec saved_procedure') select * from sqlresult into cursor cursor_1 alter table cursor_1 alter column date_birthday D(8) говорит, что имя поля задано корректно, т.е. имеется ввиду, наверное, что длина поля более 10 символов, хотя в курсор поле считывается с таким же именем, что и на SQL-сервере, т.е. date_birthday Хорошо, делаем так alter table cursor_1 add column date_birth D(8) с тем, чтобы считать данные в новое поле из старого 'некорректного' date_birthday говорит Invalid operation for the cursor - Недопустимая операция над курсором. Что делать, непонятно? Тем более, что ошибку в последнем случае дает не всегда. Получается, что с некоторыми таблицами той же БД все проходит гладко, а с другими шершаво. Прошу извинить, если очень длинно. или если уже было где-то (будь добры в этом случае указать точную ссылку) Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2005, 16:06:34 |
|
||
|
преобразование SQL-Datetime в VFP-Date
|
|||
|---|---|---|---|
|
#18+
так не чего не измениться? select * from sqlresult into cursor cursor_1 readwrite ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2005, 16:13:56 |
|
||
|
преобразование SQL-Datetime в VFP-Date
|
|||
|---|---|---|---|
|
#18+
прошу прощения конечно же в программе стоит select * from sqlresult into cursor cursor_1 readwrite как правило везде я ставлю 'readwrite' проверил свой текст в остальном все в порядке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2005, 16:17:57 |
|
||
|
преобразование SQL-Datetime в VFP-Date
|
|||
|---|---|---|---|
|
#18+
Реши все через RemoteView, там и типы полей настроишь со стороны Фокса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2005, 17:30:48 |
|
||
|
преобразование SQL-Datetime в VFP-Date
|
|||
|---|---|---|---|
|
#18+
Попробуй такую вещь: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. В данном случае, количество символов в имени поля может быть до 127 символов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2005, 17:48:06 |
|
||
|
преобразование SQL-Datetime в VFP-Date
|
|||
|---|---|---|---|
|
#18+
Вариант с RemoteView к сожалению не подходит. Но все равно спасибо. 2 ВладимирМ Ваше решение сейчас пробую. А вообще интересно, как обычно выходят из ситуации другие. Ведь задача в принципе часто возникающая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2005, 19:42:43 |
|
||
|
преобразование SQL-Datetime в VFP-Date
|
|||
|---|---|---|---|
|
#18+
Я НИКОГДА не использую курсор, который вернул SQLEXEC в клиенте, а переписываю его в другой, постоянный, который,например, создается в событии LOAD формы (CREATE CURSOR ...). Вы , кстати, делаете также, но постоянный курсор создаете через SELECT .. INTO CURSOR А вот в постоянном курсоре у меня вместо поля DATETIME (T в VFP), тип D Ну а затем элементарно: SQLEXEC(lhSQL, MyCommand, "temp_cursor") ... ZAP IN MyWorkCursor INSERT INTO MyWorkCursor (...MyDataField....) ; SELECT ... NVL(TTOD(DateTimeField), {}) , ... FROM temp_cursor USE IN temp_cursor Это, кстати, решает проблему и с "привязкой" к объекту GRID (постоянный курсор всегда открыт) и с сохранением сортировок по нему при перечитывание данных с сервера (по той же причине). Возни, конечно, больше, но результат того стоит. С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2005, 07:49:19 |
|
||
|
преобразование SQL-Datetime в VFP-Date
|
|||
|---|---|---|---|
|
#18+
2 ВладимирМ Ваше способ хорошо пошел. Под свои нужды я его немного переделал в: sqlexec(gnConnHandle,'exec saved_procedure') LOCAL laFields DECLARE laFields (900) &&например, в этом случае количество полей равно 900\18=50 =AFIELDS(laFields,'sqlresult') LOCAL lnElements ArrayRowCount = INT(ALEN(laFields)/18) FOR i=1 TO ArrayRowCount lnElements = ASCAN(laFields,UPPER("T")) IF lnElements > 0 laFields[m.lnElements]="D" ENDIF ENDFOR CREATE CURSOR cursor_1 FROM ARRAY laFields APPEND FROM (DBF("sqlresult")) т.е. код практически Ваш, но в этой редакции он заменяет все поля типа 'VFP-Time' в поля типа 'VFP-D' без нужды указывать имя поля, т.е. можно не указывать конкретные поля (можно даже не знать их - относительная незавасимость кода от смены структуры таблиц на SQL-сервере). Да и код становится покороче. По ходу возникло пара вопросов. 1. Вопрос Без такой проверки IF lnElements > 0 laFields[m.lnElements]="D" ENDIF выдает ошибку 'Выход за пределы массива (обращение к несуществующему элементу массива)' Насколько такая проверка рационально решает проблему? 2. Вопрос В самом первом вопросе я говорил, что вариант alter table table_name alter column field_name DataType(fieldLen) срабатывает не всегда. Как мне кажется, ошибка возникает из-за настроек SQL-сервера (owner, тип доступа или ролей ). До конца пока не выяснил. В особенности для меня важен ответ на 2-ой вопрос. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2005, 13:37:52 |
|
||
|
преобразование SQL-Datetime в VFP-Date
|
|||
|---|---|---|---|
|
#18+
2 Aleksey-K '-' Честно говоря, мне бы хотелось максимально снизить зависимость кода от смены структуры таблиц на SQL сервере и тем более от простого переименования поля. На это Вы можете возразить, что сначала нужно разработать четкую структуру БД - что бы не нужна была реструктуризация. С точки зрения практики, в частности, моей, такая ситуация, увы, далеко не редкость, а практически правило. '+' Сохранение индексов и прочих настроек это безусловно большой плюс. '-+?' Правда я вообще не пользую индексы в VFP по причине их частого падения, да и малопредсказуемости. Вместо этого я пользую 'Select fieldList from Table into cursor cursorname order by field1,..., fieldN' даже если нужно сделать совсем незначительную выборку и перестроить алис(курсор, таблица и пр.) в соответсвии с изменениями. Попробуйте меня переубедить, желательно аргументированно. Со своей стороны, я прочту Ваш ответ с большим вниманием и если в нем будут кусочки кода или идеи алгоритмов, в том контексте, который мы с Вами обсуждаем, буду пробовать на практике. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2005, 13:50:32 |
|
||
|
преобразование SQL-Datetime в VFP-Date
|
|||
|---|---|---|---|
|
#18+
Вообще-то, если бы Вы прочитали HELP по команде AFIELDS(), то и сами могли бы значительно упростить свой код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Смысл в следующем: Функция AFIELDS() автоматически изменит размерность указанного массива, если он существовал ранее. Следовательно, нет смысла точно указывать размерность будущего массива. LOCAL здесь для того, чтобы уточнить его область видимости, а не размерность. Функция AFIELDS() возвращает количество строк в сформированном массиве. Поэтому дополнительно вычислять это значение не нужно. Массив, который возвращает функция AFIELDS() имеет строго фиксированную структуру. Тип поля указан во втором столбце этого массива. Поэтому нет смысла в сканировании. Тем более, что чисто теоретически, возможно имя поля из одной буквы "T" Далее. Команда SQLExec() формирует курсор (временную таблицу) на стороне клиента. Поэтому все манипуляции с этим результирующим курсором никакого отношения к серверу не имеют. Вообще-то, модификация структуры курсора через ALTER TABLE не имеет смысла. Хотя в HELP к этой команде явно не говориться о том, что модифицировать структуру курсоров нельзя, но дешевле просто пересоздать курсор с нужными типами полей. Например: Код: plaintext Насчет индексов в FoxPro - не надо повторять чужие слова и собственные ошибки. "Нестабильность" индексов в FoxPro - это следствие ненадежного железа или кривизны программы. Хотя в данной задаче они могут играть только второстепенную роль, поскольку невозможно сделать постоянные индексы на временные таблицы. Их придется создавать заново после каждого запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2005, 13:11:52 |
|
||
|
преобразование SQL-Datetime в VFP-Date
|
|||
|---|---|---|---|
|
#18+
Hi urmas! В VFP8 для этого IMHO очень хорошо подходит CursorAdapter. "голый" SPT увы никак не позволяет контролировать тип полей, получаемых с сервера, RV довольно "жёсток" - CAD как раз позволяет совмещать гибкость одного и продвинутые фишки другого. Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2005, 16:58:06 |
|
||
|
преобразование SQL-Datetime в VFP-Date
|
|||
|---|---|---|---|
|
#18+
Igor Korolyov Hi urmas! В VFP8 для этого IMHO очень хорошо подходит CursorAdapter. "голый" SPT увы никак не позволяет контролировать тип полей, получаемых с сервера, RV довольно "жёсток" - CAD как раз позволяет совмещать гибкость одного и продвинутые фишки другого. Posted via ActualForum NNTP Server 1.1 Что значит "...не позволяет контролировать тип полей..." !? А что позволяет ? А так полагаю, что тип полей определяется структурой базы данных сервера и вы, при написании клиентской части, как минимум, знаете эту структуру. Или вы разрабатываете "универсальную" клиентскую часть под любую серверную базу данных? Так это не получиться. Все равно, клиентские формы будут сильно "зависимы" от серверной базы данных. С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2005, 21:28:34 |
|
||
|
преобразование SQL-Datetime в VFP-Date
|
|||
|---|---|---|---|
|
#18+
urmas Честно говоря, мне бы хотелось максимально снизить зависимость кода от смены структуры таблиц на SQL сервере и тем более от простого переименования поля.. Это самообман.. Не получится.. Все равно, при построении высокоэффективного клиентского приложения придется "привязываться" к структуре серверной базы данных. urmas На это Вы можете возразить, что сначала нужно разработать четкую структуру БД - Именно так.. urmas Правда я вообще не пользую индексы в VFP по причине их частого падения, да и малопредсказуемости. Это не совсем правда (а точнее - не правда), а если индексы построены над локальными курсорами - это вообще не причина для отказа от возможности иметь на "клиенте" сортировку и быстрый поиск без "дергания" для этого сервера. urmas Попробуйте меня переубедить, желательно аргументировано. Гляньте тут http://www.caws.atnet.ru/vfox/sql.html - может материалы моего сайта вас в этом убедят. С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2005, 21:37:01 |
|
||
|
преобразование SQL-Datetime в VFP-Date
|
|||
|---|---|---|---|
|
#18+
2 ВладимирМ Огромное спасибо за детальный ответ. Возможно, Вас несколько задел мой тон. Не хотел, правда, каюсь 2 Akeksey-K Премного благодарен за ссылку на доки по построению CS-приложений. Там еще много полезного лично для меня. С некоторыми местами в Вашем ответе я не согласен, но сейчас лучше почитаю доки. В принципе тему можно считать закрытой. Я получил ответы практические на все мои вопросы. Всем еще раз большое спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2005, 16:10:24 |
|
||
|
преобразование SQL-Datetime в VFP-Date
|
|||
|---|---|---|---|
|
#18+
2 ВладимирМ Огромное спасибо за детальный ответ. Возможно, Вас несколько задел мой тон. Не хотел, правда, каюсь 2 Akeksey-K Премного благодарен за ссылку на доки по построению CS-приложений. Там еще много полезного лично для меня. С некоторыми местами в Вашем ответе я не согласен, но сейчас лучше почитаю доки. В принципе тему можно считать закрытой. Я получил ответы практические на все мои вопросы. Всем еще раз большое спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2005, 16:11:25 |
|
||
|
преобразование SQL-Datetime в VFP-Date
|
|||
|---|---|---|---|
|
#18+
Igor Korolyov Hi urmas! В VFP8 для этого IMHO очень хорошо подходит CursorAdapter. "голый" SPT увы никак не позволяет контролировать тип полей, получаемых с сервера, RV довольно "жёсток" - CAD как раз позволяет совмещать гибкость одного и продвинутые фишки другого. Posted via ActualForum NNTP Server 1.1 Для серьезных CS разработок на использовании cursoradapter можно смело поставить крест. Ибо для работы с ХП он не предназначен, и не может возвращать их параметры на клиент. А ХП - фундамент серьезной CS-системы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2005, 16:17:09 |
|
||
|
преобразование SQL-Datetime в VFP-Date
|
|||
|---|---|---|---|
|
#18+
Hi Aleksey-K! > Что значит "...не позволяет контролировать тип полей..." !? Это значит, что то что ODBC драйвер нам выставил в качестве типа поля, то мы и имеем, с тем и мучаемся... Например тот-же DateTime когда нам нужен лишь Date, char(50) когда нам нужно varchar - т.е. memo, numeric(18,0) как ставит кривой MS драйвер для Oracle там где на самом деле в чистом виде Double (в т.ч. и дробная часть)... > тип полей определяется структурой базы данных сервера Да, но типы полей MS SQL или того-же Oracle и типы полей VFP - это 2 большие разницы. И их "перевод" не всегда получается корректным. Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 00:48:54 |
|
||
|
преобразование SQL-Datetime в VFP-Date
|
|||
|---|---|---|---|
|
#18+
Hi Диченко! Если честно, то просто нету времени поэкспериментировать (я так думаю что способ есть :)) хочется лишь сказать, что МОЖНО писать и CS (не говоря уж о многозвенках) БЕЗ "ХП как фундамента". И тем паче можно написать такие ХП, которые будут совместимы с фоксовым движком. P.S. Или ты считаешь что скажем MySQL вообще НЕ сервер :) Или ты кроме как с MS SQL 2000 и выше ни с чем не работал... Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2005, 01:33:09 |
|
||
|
преобразование SQL-Datetime в VFP-Date
|
|||
|---|---|---|---|
|
#18+
Igor Korolyov Hi Aleksey-K! > Что значит "...не позволяет контролировать тип полей..." !? Это значит, что то что ODBC драйвер нам выставил в качестве типа поля, то мы и имеем, с тем и мучаемся... Например тот-же DateTime когда нам нужен лишь Date, char(50) когда нам нужно varchar - т.е. memo, numeric(18,0) как ставит кривой MS драйвер для Oracle там где на самом деле в чистом виде Double (в т.ч. и дробная часть)... > тип полей определяется структурой базы данных сервера Да, но типы полей MS SQL или того-же Oracle и типы полей VFP - это 2 большие разницы. И их "перевод" не всегда получается корректным. Это все верно, но я имел в виду имеено "контролировать тип полей..." . Если ODBC драйвер выполняет преобразование типов полей всегда одинаково (а имеено так он и делает), то мы всегда знаем, какое поле мы получим с сервера в локальном курсоре, а уже в коде VFP я всегда могу преобразовать эти поля в необходимые мне (как, например с DateTIme в Date). С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2005, 12:30:30 |
|
||
|
преобразование SQL-Datetime в VFP-Date
|
|||
|---|---|---|---|
|
#18+
Hi Aleksey-K! > Если ODBC драйвер выполняет преобразование типов полей всегда одинаково Не факт! Если бы коенчно можно было на всех компах работать с одним и тем-же ODBC драйвером (и производитель, и версия), с всегда единообразно настроенной базой (а часть настроек СУБД очень так "хорошо" влияют на получаемый результат) - то да, но увы мы не в идеальном мире живём :( > а уже в коде VFP я всегда могу преобразовать эти поля в необходимые мне (как, например с DateTIme в Date). Тем самым убив в зародыше такую прекрасную идею как автообновление :( у не прикалывает меня "вручную" сканировать "чисто фоксовые" курсоры на предмет поиска изменений, их анализа и конструирования SQL команд обновления. Муторное и неприятное это занятие... Ладно ещё CAD сам на 90% это делает (тем не менее оставляя и программисту кучу возможностей по "тонкой" настройке), но на базе "просто курсора", не, не наш это метод. P.S. Естественно я изначально имел в виду курсоры которые не есть ReadOnly, возможно плохо это выразил :( Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2005, 03:04:36 |
|
||
|
|

start [/forum/topic.php?fid=41&gotonew=1&tid=1594262]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
147ms |
get topic data: |
7ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 429ms |

| 0 / 0 |
