powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / преобразование SQL-Datetime в VFP-Date
20 сообщений из 20, страница 1 из 1
преобразование SQL-Datetime в VFP-Date
    #33053167
Фотография urmas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На 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 - Недопустимая операция над курсором.

Что делать, непонятно?
Тем более, что ошибку в последнем случае дает не всегда.
Получается, что с некоторыми таблицами той же БД все проходит гладко, а с другими шершаво.

Прошу извинить, если очень длинно.
или если уже было где-то (будь добры в этом случае указать точную ссылку)
Спасибо.
...
Рейтинг: 0 / 0
преобразование SQL-Datetime в VFP-Date
    #33053190
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так не чего не измениться?
select * from sqlresult into cursor cursor_1 readwrite
...
Рейтинг: 0 / 0
преобразование SQL-Datetime в VFP-Date
    #33053200
Фотография urmas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошу прощения
конечно же в программе стоит select * from sqlresult into cursor cursor_1 readwrite

как правило везде я ставлю 'readwrite'
проверил свой текст в остальном все в порядке
...
Рейтинг: 0 / 0
преобразование SQL-Datetime в VFP-Date
    #33053420
AleksMed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Реши все через RemoteView, там и типы полей настроишь со стороны Фокса
...
Рейтинг: 0 / 0
преобразование SQL-Datetime в VFP-Date
    #33053461
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй такую вещь:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
sqlexec(gnConnHadle,'exec saved_procedure')

LOCAL laFields
=AFIELDS(laFields)
LOCAL lnElements
lnElements = ASCAN(laFields,UPPER("date_birthday"))
laFields[m.lnElements+ 1 ]="D"
CREATE CURSOR cursor_1 FROM ARRAY laFields
APPEND FROM (DBF("sqlresult"))

* Смотрим, что получилось
BROWSE NOWAIT

В данном случае, количество символов в имени поля может быть до 127 символов.
...
Рейтинг: 0 / 0
преобразование SQL-Datetime в VFP-Date
    #33053631
Фотография urmas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант с RemoteView к сожалению не подходит. Но все равно спасибо.

2 ВладимирМ
Ваше решение сейчас пробую.

А вообще интересно, как обычно выходят из ситуации другие.
Ведь задача в принципе часто возникающая.
...
Рейтинг: 0 / 0
преобразование SQL-Datetime в VFP-Date
    #33053912
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я НИКОГДА не использую курсор, который вернул 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 (постоянный курсор всегда открыт) и с сохранением сортировок по нему при перечитывание данных с сервера (по той же причине).
Возни, конечно, больше, но результат того стоит.
С уважением, Алексей.
...
Рейтинг: 0 / 0
преобразование SQL-Datetime в VFP-Date
    #33054025
Фотография urmas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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-ой вопрос.

Спасибо.
...
Рейтинг: 0 / 0
преобразование SQL-Datetime в VFP-Date
    #33054034
Фотография urmas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Aleksey-K
'-'
Честно говоря, мне бы хотелось максимально снизить зависимость кода от смены структуры таблиц на SQL сервере и тем более от простого переименования поля.
На это Вы можете возразить, что сначала нужно разработать четкую структуру БД - что бы не нужна была реструктуризация. С точки зрения практики, в частности, моей, такая ситуация, увы, далеко не редкость, а практически правило.

'+'
Сохранение индексов и прочих настроек это безусловно большой плюс.

'-+?'
Правда я вообще не пользую индексы в VFP по причине их частого падения, да и малопредсказуемости.

Вместо этого я пользую 'Select fieldList from Table into cursor cursorname order by field1,..., fieldN' даже если нужно сделать совсем незначительную выборку и перестроить алис(курсор, таблица и пр.) в соответсвии с изменениями.
Попробуйте меня переубедить, желательно аргументированно.
Со своей стороны, я прочту Ваш ответ с большим вниманием и если в нем будут кусочки кода или идеи алгоритмов, в том контексте, который мы с Вами обсуждаем, буду пробовать на практике.

Спасибо.
...
Рейтинг: 0 / 0
преобразование SQL-Datetime в VFP-Date
    #33054593
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то, если бы Вы прочитали HELP по команде AFIELDS(), то и сами могли бы значительно упростить свой код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
sqlexec(gnConnHandle,'exec saved_procedure')

LOCAL laFields( 1 ), lnI
FOR m.lnI= 1  TO AFIELDS(laFields,'sqlresult')
	IF laFields[m.lnI, 2 ] = "T"
		laFields[m.lnI, 2 ] = "D"
	ENDIF
ENDFOR

CREATE CURSOR cursor_1 FROM ARRAY laFields
APPEND FROM (DBF("sqlresult"))

Смысл в следующем:

Функция AFIELDS() автоматически изменит размерность указанного массива, если он существовал ранее. Следовательно, нет смысла точно указывать размерность будущего массива. LOCAL здесь для того, чтобы уточнить его область видимости, а не размерность.


Функция AFIELDS() возвращает количество строк в сформированном массиве. Поэтому дополнительно вычислять это значение не нужно.


Массив, который возвращает функция AFIELDS() имеет строго фиксированную структуру. Тип поля указан во втором столбце этого массива. Поэтому нет смысла в сканировании. Тем более, что чисто теоретически, возможно имя поля из одной буквы "T"

Далее. Команда SQLExec() формирует курсор (временную таблицу) на стороне клиента. Поэтому все манипуляции с этим результирующим курсором никакого отношения к серверу не имеют.

Вообще-то, модификация структуры курсора через ALTER TABLE не имеет смысла. Хотя в HELP к этой команде явно не говориться о том, что модифицировать структуру курсоров нельзя, но дешевле просто пересоздать курсор с нужными типами полей. Например:

Код: plaintext
SELECT TTOD(date_birthday) as date_birthday FROM sqlresult INTO CURSOR cursor_1 NOFILTER

Насчет индексов в FoxPro - не надо повторять чужие слова и собственные ошибки. "Нестабильность" индексов в FoxPro - это следствие ненадежного железа или кривизны программы.

Хотя в данной задаче они могут играть только второстепенную роль, поскольку невозможно сделать постоянные индексы на временные таблицы. Их придется создавать заново после каждого запроса.
...
Рейтинг: 0 / 0
преобразование SQL-Datetime в VFP-Date
    #33054703
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi urmas!

В VFP8 для этого IMHO очень хорошо подходит CursorAdapter.
"голый" SPT увы никак не позволяет контролировать тип полей, получаемых с сервера, RV довольно "жёсток" - CAD как раз позволяет совмещать гибкость одного и продвинутые фишки другого.

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

В VFP8 для этого IMHO очень хорошо подходит CursorAdapter.
"голый" SPT увы никак не позволяет контролировать тип полей, получаемых с сервера, RV довольно "жёсток" - CAD как раз позволяет совмещать гибкость одного и продвинутые фишки другого.

Posted via ActualForum NNTP Server 1.1
Что значит "...не позволяет контролировать тип полей..." !?
А что позволяет ? А так полагаю, что тип полей определяется структурой базы данных сервера и вы, при написании клиентской части, как минимум, знаете эту структуру. Или вы разрабатываете "универсальную" клиентскую часть под любую серверную базу данных? Так это не получиться. Все равно, клиентские формы будут сильно "зависимы" от серверной базы данных.
С уважением, Алексей.
...
Рейтинг: 0 / 0
преобразование SQL-Datetime в VFP-Date
    #33054808
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
urmas
Честно говоря, мне бы хотелось максимально снизить зависимость кода от смены структуры таблиц на SQL сервере и тем более от простого переименования поля..
Это самообман.. Не получится.. Все равно, при построении высокоэффективного клиентского приложения придется "привязываться" к структуре серверной базы данных.
urmas
На это Вы можете возразить, что сначала нужно разработать четкую структуру БД -

Именно так..

urmas
Правда я вообще не пользую индексы в VFP по причине их частого падения, да и малопредсказуемости.

Это не совсем правда (а точнее - не правда), а если индексы построены над локальными курсорами - это вообще не причина для отказа от возможности иметь на "клиенте" сортировку и быстрый поиск без "дергания" для этого сервера.
urmas
Попробуйте меня переубедить, желательно аргументировано.

Гляньте тут http://www.caws.atnet.ru/vfox/sql.html - может материалы моего сайта вас в этом убедят.
С уважением, Алексей.
...
Рейтинг: 0 / 0
преобразование SQL-Datetime в VFP-Date
    #33055893
Фотография urmas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ВладимирМ

Огромное спасибо за детальный ответ.
Возможно, Вас несколько задел мой тон. Не хотел, правда, каюсь

2 Akeksey-K

Премного благодарен за ссылку на доки по построению CS-приложений.
Там еще много полезного лично для меня.
С некоторыми местами в Вашем ответе я не согласен, но сейчас лучше почитаю доки.

В принципе тему можно считать закрытой. Я получил ответы практические на все мои вопросы.

Всем еще раз большое спасибо.
...
Рейтинг: 0 / 0
преобразование SQL-Datetime в VFP-Date
    #33055896
Фотография urmas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ВладимирМ

Огромное спасибо за детальный ответ.
Возможно, Вас несколько задел мой тон. Не хотел, правда, каюсь

2 Akeksey-K

Премного благодарен за ссылку на доки по построению CS-приложений.
Там еще много полезного лично для меня.
С некоторыми местами в Вашем ответе я не согласен, но сейчас лучше почитаю доки.

В принципе тему можно считать закрытой. Я получил ответы практические на все мои вопросы.

Всем еще раз большое спасибо.
...
Рейтинг: 0 / 0
преобразование SQL-Datetime в VFP-Date
    #33055905
Фотография Диченка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Korolyov
Hi urmas!

В VFP8 для этого IMHO очень хорошо подходит CursorAdapter.
"голый" SPT увы никак не позволяет контролировать тип полей, получаемых с сервера, RV довольно "жёсток" - CAD как раз позволяет совмещать гибкость одного и продвинутые фишки другого.

Posted via ActualForum NNTP Server 1.1

Для серьезных CS разработок на использовании cursoradapter можно смело поставить крест. Ибо для работы с ХП он не предназначен, и не может возвращать их параметры на клиент. А ХП - фундамент серьезной CS-системы.
...
Рейтинг: 0 / 0
преобразование SQL-Datetime в VFP-Date
    #33056373
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
преобразование SQL-Datetime в VFP-Date
    #33056388
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Диченко!

Если честно, то просто нету времени поэкспериментировать (я так думаю что способ есть :)) хочется лишь сказать, что МОЖНО писать и CS (не говоря уж о многозвенках) БЕЗ "ХП как фундамента". И тем паче можно написать такие ХП, которые будут совместимы с фоксовым движком.

P.S. Или ты считаешь что скажем MySQL вообще НЕ сервер :) Или ты кроме как с MS SQL 2000 и выше ни с чем не работал...

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
преобразование SQL-Datetime в VFP-Date
    #33059524
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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).
С уважением, Алексей.
...
Рейтинг: 0 / 0
преобразование SQL-Datetime в VFP-Date
    #33061117
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Aleksey-K!

> Если ODBC драйвер выполняет преобразование типов полей всегда одинаково
Не факт! Если бы коенчно можно было на всех компах работать с одним и тем-же ODBC драйвером (и производитель, и версия), с всегда единообразно настроенной базой (а часть настроек СУБД очень так "хорошо" влияют на получаемый результат) - то да, но увы мы не в идеальном мире живём :(
> а уже в коде VFP я всегда могу преобразовать эти поля в необходимые мне (как, например с DateTIme в Date).
Тем самым убив в зародыше такую прекрасную идею как автообновление :(
у не прикалывает меня "вручную" сканировать "чисто фоксовые" курсоры на предмет поиска изменений, их анализа и конструирования SQL команд обновления. Муторное и неприятное это занятие... Ладно ещё CAD сам на 90% это делает (тем не менее оставляя и программисту кучу возможностей по "тонкой" настройке), но на базе "просто курсора", не, не наш это метод.
P.S. Естественно я изначально имел в виду курсоры которые не есть ReadOnly, возможно плохо это выразил :(

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


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