Выгрузка из Clarion в Excel
Добавлено: 05 Май 2015, 17:05
Место общения программистов, форум разработчиков БД на Clarion
https://forum.clarionlife.net/
Первая форма допуска устроит?Ал писал(а):Родина, которая ...на, всегда помнит своих героев, и визу лет XX - ни-ни?Губин Игорь писал(а):Да плюнь ты на секретность, договорись с кем-нибудь и всё тебе будет.для начала в хелпе по языку CLARION про MEMO поля посмотри..., ну и если всё сам - придется ручками и писать-писать, лучше сразу в какой-ниб из сред CW6-CW10, только про галочку OEM в словаре не забыватьiBorman писал(а): ... *.mem. Кто подскажет, как вытащить информацию из него?
Там коммерческая, как я понял, а это куда страшнее
Огромное Вам спасибо! Специально регистрировался ради этого. Я очень долго искал как можно вытащить данные из клариона и Ваше сообщение очень сильно помогло.kreator писал(а): ↑05 Май 2015, 16:58 Вам бы только посмеяться. У людей горе...
Ещё вариант для не боящихся работы.
Качаешь бесплатный SQL сервак Firebird с сайта http://firebirdsql.org/ (думаю, любую версию). Находишь средство для работы с ним IBExpert (есть бесплатные, для пользователей СССР). Создаёшь в IBExpert'е новую БД без таблиц. И там есть импорт из DAT (проверил memo подхватывает, во всяком случае IBExpert 2011), и есть экспорт во что хочешь, в том числе сразу в Excel. Дерзай!
В данном топике ситуация другая. Программиста нет, а данные перетащить надо. Какой csv? Если программист есть, то вариантов куча. И в этом случае csv не самый лучший вариант.
Код: Выделить всё
DECLARE @ClarionDate INT = 47563
DECLARE @SqlDateTime DATETIME
-- Convert the clarion DATE into and SQL DateTime
SET @SqlDateTime = DateAdd(day, @ClarionDate - 4, '1801-01-01')
SELECT @SqlDateTime AS 'SQL Date Time'
-- Now convert it back from and SQL DateTime to a Clarion Date
SET @ClarionDate = DateDiff(day, DateAdd(day, -4, '1801-01-01'), @SqlDateTime)
SELECT @ClarionDate AS 'Clarion Date'
/*
A Clarion standard date is the number of days that have elapsed since
December 28, 1800. The range of accessible dates is from January 1, 1801
(standard date 4) to December 31, 9999 (standard date 2,994,626). Date
procedures will not return correct values outside the limits of this range.
The standard date calendar also adjusts for each leap year within the range of
accessible dates. Dividing a standard date by modulo 7 gives you the day of the
week: zero = Sunday, one = Monday, etc.
The LONG data type with a date format (@D) display picture is normally used for
a standard date. Data entry into any date format picture with a two-digit year
defaults to the century of next 20 or previous 80 years. For example, entering
01/01/01 results in 01/01/2001 if the current year (per the system clock) is
greater than 1980, and 01/01/1901 if the current year is 1980 or earlier.
The DATE data type is a data format used in the Btrieve Record Manager and some
other file systems. A DATE field is internally converted to LONG containing the
Clarion standard date before any mathematical or date procedure operation is
performed. Therefore, DATE should be used for external file compatibility, and
LONG is normally used for other dates.
*/
Код: Выделить всё
import json
import datetime
def parser_for_clarion_date(clarion_value):
# если вместо значения попадается Null, то выводим его.
if clarion_value == None:
return 'null'
else:
# Значение = кол-во дней прошедших с даты отсчета - 4 дня
value = clarion_value - 4
# Дата с которой идет отсчет в кларионе 01-01-1801, к ней будем добавлять кол-во дней (значение)
time = datetime.date(1801, 1, 1)
# получаем дату. Количество дней + дата отсчета клариона
new_value = time + datetime.timedelta(days=value)
# переводим формат даты из Год.месяц.день в День.месяц.год
return new_value.strftime("%d.%m.%Y")
# К имени файла добавляем маску "_исправленный". Буду использовать для сохранения в новый файл.
def rename_file(file, mask='_исправленный'):
splitter = file.split('.')
return splitter[0] + mask + '.' + splitter[1]
def clarion_json_parser(file):
file = file.replace('"','')
with open(file, 'r', encoding='utf-8') as json_file:
data = json.load(json_file)
data2 = {}
data2['VLAD_CENTR'] = []
for element in data["RecordSet"]:
data2['VLAD_CENTR'].append({
'N_REC_VL': element['N_REC_VL'],
'F': element['F'],
'I': element['I'],
'O': element['O'],
# для полей с датами применяем функцию преобразования значения клариона в ДАТУ
'DATA_RV': parser_for_clarion_date(element['DATA_RV']),
'DATA_CH': parser_for_clarion_date(element['DATA_CH'])
})
with open(rename_file(file), 'w', encoding='utf-8') as outfile:
# при записи в файл слетала кодировка у кириллицы, помогло добвавление ensure_ascii=False
json.dump(data2, outfile, indent=4, ensure_ascii=False)
# вместо file указываем путь к JSON файлу, рядом будет создан новый файл с исправленными датами
clarion_json_parser(file)