Название: Класс-интерфейс для работы с DBF Отправлено: Astrologer от Октябрь 12, 2010, 18:58 Всем привет. Нет ли у кого нить интерфейса для DBF - чтобы записывать параметры файла (количество полей, тип полей и данные)?
Название: Re: Класс-интерфейс для работы с DBF Отправлено: Zmeishe от Октябрь 12, 2010, 19:24 Куда записывать? И какого dbf?
Есть описание формата файла dbf(простой таблицы dbf без индексов и MEMO полей). Есть алгоритм чтения/записи простого dbf. Этого мало или достаточно? Название: Re: Класс-интерфейс для работы с DBF Отправлено: Astrologer от Октябрь 12, 2010, 19:32 Вообще нужно сделать запись таблицы QSqlModel или QTableView в DBF файл. Видимо придется все самому писать. Обычный DBF,без memo и всяких прибамбасов.
Название: Re: Класс-интерфейс для работы с DBF Отправлено: Zmeishe от Октябрь 12, 2010, 19:39 Утром скину.
Если не втерпёж - в Инете полно описаний структуры dbf. Название: Re: Класс-интерфейс для работы с DBF Отправлено: Astrologer от Октябрь 12, 2010, 19:43 Да, спасибо. Мне не к спеху. Описания видел. Если что то не получится, буду сам писать.
Название: Re: Класс-интерфейс для работы с DBF Отправлено: Zmeishe от Октябрь 13, 2010, 08:05 Эти структуры взяты мной из Инета. Я даже не стал менять комментарии на кириллицу.
Код: typedef struct Эту функцию привожу свою - без переделок. Класс QSocketModel наследник от QAbstractTableModel : public QAbstractItemModel. Поэтому есть мои функции, которые тебе надо будет выкинуть. Например, isActive(). В общем, разбирайся и спрашивай если что. Код: void QSocketModel::saveToDBF(const QString & fileName, QTextCodec *codec) Название: Re: Класс-интерфейс для работы с DBF Отправлено: Astrologer от Октябрь 13, 2010, 11:17 Спасибо большое, разбираюсь.
Код: p_fld->fieldLen[0] = Fields->Fields[i]->sqlSize(); Код: unsigned int recordCountDbfPortion = 100; Название: Re: Класс-интерфейс для работы с DBF Отправлено: Zmeishe от Октябрь 13, 2010, 11:36 Код: p_fld->fieldLen[0] = Fields->Fields[i]->sqlSize(); Fields[ i ] - список QList столбцов в модели. sqlSize() - длина поля. у меня эта модель заточена под InterBase/FireBird. Для строковых полей это максимальная длина. VARCHAR(10), т.е. sqlSize = 10 Код: unsigned int recordCountDbfPortion = 100; Для экономии памяти. Хотя в век дешёвых гигабайтов... ;D Название: Re: Класс-интерфейс для работы с DBF Отправлено: Astrologer от Октябрь 13, 2010, 11:53 Код: for(i = 0, p_fld = fld, hdr->recordSize = 1; i < dbfFieldCount; ++i, ++p_fld) То есть как то так? То есть можно не сокращать для 10 символов? Что такое next(), first(), while( !isEof() ) ? Название: Re: Класс-интерфейс для работы с DBF Отправлено: Zmeishe от Октябрь 13, 2010, 12:05 Ну, ты, блин даёшь.
Круто вырезал кусок кода. У меня было Код: str = Fields->Fields[i]->fieldName().left(10); В InterBase могут быть 67, в FireBird 31(32) Поэтому для dbf делаем обрезание до 10. Код: p_fld->fieldLen[0] Т.е. p_fld->fieldName - не больше десяти p_fld->fieldLen[0] - для строковых полей столько, сколько надо (как в БД объявлено так и ставь) Название: Re: Класс-интерфейс для работы с DBF Отправлено: Zmeishe от Октябрь 13, 2010, 12:11 Цитата: Astrologer Что такое next(), first(), while( !isEof() ) ? Функции моей моделиfirst() - делает первую строку текущей next() - делает следующую строку текущей isEof() - сигналит достигнута последняя строка или ещё нет. Код: first(); // Встаём на начало Название: Re: Класс-интерфейс для работы с DBF Отправлено: Astrologer от Октябрь 13, 2010, 12:11 У меня объявлено "text" (база Sqlite). ???
Название: Re: Класс-интерфейс для работы с DBF Отправлено: Zmeishe от Октябрь 13, 2010, 12:18 Я не знаю sqllite.
Если text для sqllite - это MEMO для DBF, замени text на строку. Во втором посте ты написал. Цитата: Astrologer Обычный DBF,без memo и всяких прибамбасов. Название: Re: Класс-интерфейс для работы с DBF Отправлено: Astrologer от Октябрь 13, 2010, 12:55 А все, вроде понял. Извиняюсь. Просто сначала я считываю dbfы в базу, потом добавляю к ним еще поля и теперь мне таблицу нужно снова засунуть в dbf.
Название: Re: Класс-интерфейс для работы с DBF Отправлено: mkv от Октябрь 13, 2010, 13:39 я вот тоже свою реализацию писал... а потом увидел https://code.google.com/p/qdbf/
и там, как и у меня, есть реализация модели для dbf (QAbstractTableModel) Название: Re: Класс-интерфейс для работы с DBF Отправлено: Astrologer от Октябрь 13, 2010, 13:44 Реализация есть. Чтением dbf я оттуда и пользуюсь Только после добавления столбцов в таблицу (я создаю таблицу из всех полей dbf + некие дополнительные параметры в виде дополнительных столбцов -> все это в базе). Ты уже ее не сохранишь правильно, не меняя кода. Точнее сказать мне не понравилось как у него организовано, поэтому проще сделать заново :)
Название: Re: Класс-интерфейс для работы с DBF Отправлено: Astrologer от Октябрь 14, 2010, 09:40 Никак не пойму. Вот смотри. Если запись типа "С" и не пустая, то
Код: case 'C': Название: Re: Класс-интерфейс для работы с DBF Отправлено: Astrologer от Октябрь 14, 2010, 10:05 Я сделал так:
Код
Название: Re: Класс-интерфейс для работы с DBF Отправлено: Astrologer от Октябрь 14, 2010, 10:58 Вроде все сохраняется. Спасибо тебе огромное. Очень выручил :)
Вопросик навскидку - мне надо сохранять выходной файл в кодировке IBM 866. Если указываю на входе в твоей функции - Код . То при открытии в программе DBFCommander не определяется кодировка, а мне надо чтобы было "866 Russian MS-DOS". Есть какие нибудь мысли? Название: Re: Класс-интерфейс для работы с DBF Отправлено: Zmeishe от Октябрь 14, 2010, 11:20 1. Строки записываются как строки. Если строка короче длины поля, она дополняется пробелами справа.
2. Числа следует конвертировать в строку и дополнить пробелами слева. И то и другое у меня есть. Если строка пустая, она вся забивается пробелами. Что и сделано Код: if(myString.isNull()) str = QString(k, QString::fromUtf8(" ").at(0)); Про IBM 866 ничего не знаю За кодировку файла отвечают эти строки. Код: if(codec == QTextCodec::codecForName("CP1251")) hdr->codePage = (unsigned char) 0x57; Вызывай Код: saveToDBF(fileName, QTextCodec::codecForName("CP866")); Название: Re: Класс-интерфейс для работы с DBF Отправлено: Zmeishe от Октябрь 14, 2010, 11:23 Если тебе нужны ещё кодировки кроме 1251 и 866,
выясни какой байт для них надо прописать в hdr->codePage = (unsigned char) XxXX ? Название: Re: Класс-интерфейс для работы с DBF Отправлено: Zmeishe от Октябрь 14, 2010, 11:28 В твоём коде ошибка.
Неправильно мой код под себя переделал Код: case 'C': str = myString; Вот так надо Код: case 'C': Название: Re: Класс-интерфейс для работы с DBF Отправлено: Astrologer от Октябрь 14, 2010, 11:32 То есть если case 'c' - то просто пусто?
Название: Re: Класс-интерфейс для работы с DBF Отправлено: Zmeishe от Октябрь 14, 2010, 11:43 То есть если case 'c' - то просто пусто? Вообще это стандарт Си для оператора switch. case 'C': case 'L': ... break; Означает что и для 'C' и для 'L' следует выполнить один и тот же кусок кода. Учи мат - часть пригодится! Название: Re: Класс-интерфейс для работы с DBF Отправлено: Astrologer от Октябрь 14, 2010, 11:47 Аа... все)) никогда не любил switch. По мне if... else if ближе.
Название: Re: Класс-интерфейс для работы с DBF Отправлено: Astrologer от Октябрь 14, 2010, 12:15 Спасибо еще раз. Все работает.
Название: Re: Класс-интерфейс для работы с DBF Отправлено: MoPDoBoPoT от Октябрь 14, 2010, 20:17 Аа... все)) никогда не любил switch. По мне if... else if ближе. [offtop]"с програмерского форума: наткнулись на багу VS2005 — после 128-го вложенного if-else-if условия просто напросто игнорируются. Пришлось переделать в switch-case" (c) bash.org.ru [/offtop] :) Название: Re: Класс-интерфейс для работы с DBF Отправлено: Zmeishe от Октябрь 15, 2010, 07:18 128 вложенных if-else-if условий - охренеть.
Они их руками писали или в VS2005 это мышетыканьем делается? Название: Re: Класс-интерфейс для работы с DBF Отправлено: Sahab от Октябрь 15, 2010, 08:49 это запросто реализуется boost.preprocessor`ом
|