powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Чудеса компилятора при работе с датой в dbf
6 сообщений из 6, страница 1 из 1
Чудеса компилятора при работе с датой в dbf
    #39425790
muse_9636
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Когда-то давно написал костыль, чтобы из базы MS SQL запросом SQLEXEC формировать табличку и выгружать ее в dbf. Костыль потому что написан был криво, но работал исправно. Сегодня обнаружил, что часть полей таблицы с типом DATE в файле выгрузки пустые. Выполнил скрипт - даты есть. Раскопал исходники костыля, запустил в FoxPro, все выгрузилось с датами. Скомпилировал exe-шник, запустил на выполнение, в некоторых полях, где должна была быть дата - пусто.

Сделал:
авторSQLEXEC (gnConnHandle, lcquery, 'lcCursor')
COPY TO c:\temp\1111\2.dbf

Открыл полученную 2.dbf, даты все на месте.

Сделал:
авторSELECT * FROM c:\temp\1111\2.dbf INTO CURSOR curstemp READWRITE
*!* SELECT * FROM lcCursor INTO CURSOR curstemp READWRITE
ALTER TABLE curstemp ALTER CODE N (20)
ALTER TABLE curstemp ALTER NAME C (250)
ALTER TABLE curstemp ALTER CNTR C (250)
ALTER TABLE curstemp ALTER FIRM C (250)
ALTER TABLE curstemp ALTER GDATE D
ALTER TABLE curstemp ALTER QNT N (10)
ALTER TABLE curstemp ALTER PRICE1 N (10,2)
COPY TO c:\temp\1111\3.dbf as 866

Открыл 3.dbf, часть дат потерялась. Причем, напомню, даты теряются, если запускать скомпилированный exe-шник. Если все это делать из Visual FoxPro, ничего не теряется. Куда дальше копать, не знаю...
...
Рейтинг: 0 / 0
Чудеса компилятора при работе с датой в dbf
    #39425849
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В настройки копай Команды SET

Дело в том, что, во-первых, настройки по умолчанию для среды разработки могут отличаться от настроек по умолчанию для режима Run-Time (выполнения в готовом EXE). А, во-вторых, могли быть специально сделаны особые настройки в среде разработки про которые "забыли" при создании приложения

Если я правильно понял, то в "костыле" происходит модификация типа существующих столбцов. Ну, там, DateTime заменить на Date, например. А это значит, что при этом должна выполняться какая-то конвертация содержимого из одного формат в другой. Вот настройки и определяют правила этих преобразований

Раз речь идет о датах, то, вероятно, надо смотреть настройки вроде

SET DATE
SET CENTURY

Кстати, не пробовал посмотреть, есть ли что-то общее у тех дат, которые "теряются" и срани с теми, которые преобразуются без потерь

И еще один момент. Может быть дело не в преобразовании, а в самой первичной выборке? Может в готовом EXE уже на команде SQLEXEC() получаем пустые даты? Т.е. надо бы еще проверить настройки реквизиты соединения в готовом EXE
...
Рейтинг: 0 / 0
Чудеса компилятора при работе с датой в dbf
    #39425882
muse_9636
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ,

Сразу спасибо за ответ, потому что как правило, когда я что-то искал по теме фокса раньше, то мои поиски или заканчивались Вашим советом кому-то или этот совет подсказывал направление, в какую сторону копать.

По теме:

Настройки сейчас покопаю.

По конвертации, в курсоре все данные в формате Character или Integer. А в dbf мне некоторые нужны в виде Numeric, Date. Для этого я и делаю ALTER.

Общее искать пробовал. Не нашел. Нормальные такие даты. Проблемные - 31.01.2019, 31.07.2018, 17.10.2019, 30.06.2019, 24.06.2018, нормально работающие - 01.02.2019, 01.12.2019, 01.05.2018, 01.09.2018, 01.11.2018,01.12.2025... Разве что если в исходном файле ручками удалить строки, в которых после ALTER даты не зануляются, а оставить проблемные, то после ALTER они все равно занулятся. Такое чувство, что чем-то именно эти даты отличаются, но я в упор не вижу, чем.

SQLEXEC в екзешнике отрабатывает нормально т.к. екзешник с кодом
Код: sql
1.
2.
SQLEXEC (gnConnHandle, lcquery, 'lcCursor')
COPY TO c:\temp\1111\2.dbf

выдает dbf-ку без пустых дат. Но как только я в коде добавляю кусок с конвертацией, итоговая dbf-ка уже будет с несколькими пустыми полями GDATE.
...
Рейтинг: 0 / 0
Чудеса компилятора при работе с датой в dbf
    #39425892
muse_9636Общее искать пробовал. Не нашел. Нормальные такие даты. Проблемные - 31.01.2019, 31.07.2018, 17.10.2019, 30.06.2019, 24.06.2018, нормально работающие - 01.02.2019, 01.12.2019, 01.05.2018, 01.09.2018, 01.11.2018,01.12.2025... А теперь поменяйте местами день и месяц в каждой дате и может тогда поймете разницу между работающими и проблемными датами. Нормальные они для вас, а вот при конвертации где-то происходит неправильная интерпретация этих дат. Ибо, похоже, даты то в строках лежат, не так ли?
...
Рейтинг: 0 / 0
Чудеса компилятора при работе с датой в dbf
    #39425909
muse_9636
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
правильный прохрдящий.,

Только сейчас обратил внимание, что среди более 7000 строк в "проблемной" таблице нет ни одной с числом больше или равном 13. Совпадение? Не думаю! (с)

Спасибо!
...
Рейтинг: 0 / 0
Чудеса компилятора при работе с датой в dbf
    #39425912
muse_9636
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ,

Добавил в код параметры
Код: sql
1.
2.
3.
Set Mark to '.'
Set Date GERMAN
Set Century on


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


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