Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++]DBF файлы, Как объединитъ 2 файла? 
:(
    Опции темы
jsrent
Дата 21.8.2007, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 20.8.2007

Репутация: нет
Всего: нет



У мена возникла проблема при соединении двух DBF файлов. 
Моей задачей было улучшить уже готовый код С++ программы, который содержал следующие функции для обработки базы данных : открытие файла, закрытие файла, чтение из файла, запись в файл, функцию, которая возвращает количество строк в конкретном DBF-файле (TupelCnt()) или изменяет количество строк базы данных (TupelCnt(unsigned int a)), функцию, которая заполняет ячейку DBF-файла пробелами (перед внесением в неё новых данных), функцию, которая позволает перемещатса по базе данных, и многие дригие (не относщиеся к моему вопросу). Мне нужно было написать функцию, которая соединает два DBF-файла.

Для тестирования функции я создал диалоговое окно, используя MFC функции. При нажатии кнопки СОЕДИНИТь происходит соединение двух файлов. Однако при вторичном нажатии кнопки СОЕДИНИТь ничего не происходит, т.к. количество строк, выдоваемое функцией TupelCnt() остается неизменным, несмотря на то, что объединение двух файлов было успешно завершено. 

C открытием и закрытием файлов не возникает никаких проблем

В чём причина этого?


Глобальные переменные: 
Код

DBFile *dbf;
DBFile *dbf_2;
DBFile* dbf_3;


Переменные класса, создающего диалоговое окно:
Код

public:
    CString m_heap_3; //служат для хранения имени DBF-файла
    CString m_heap_2;
    CString m_heap_1;


прилагаю функции:

Код

//функция, которая заполняет ячейку DBF-файла пробелами
//переменная 'Buffer' имеет тип 'char*' и служит для времменого хранения информации
//функция TupelSize() возвращает длину конкретной ячейки в байтах
int DBFile::DBBlank(void) {
    memset(Buffer,' ',TupelSize());
    return 1;
}

//функция, которая позволает перемещатса по базе данных
//CurrentTupel тякущая ячейка БД
int DBFile::GotoTupel(unsigned long RecNumber) {
    long aOffSet;
    if(RecNumber > TupelCnt()) return 0;
    if(RecNumber==0) RecNumber = CurrentTupel;
    aOffSet = HeaderSize() + (RecNumber-1) * TupelSize();
    CurrentTupel=RecNumber;
    dbStatus.fail = 1;
    if(dbStatus.open==0) return 0;
    dbStatus.fail=0;
    dbStatus.eof=0;
    if(TupelCnt()<RecNumber) {
        dbStatus.eof=1;
        dbStatus.fail=1;
        return 0;
        }
    aStream.seekg(aOffSet,ios::beg);
    aStream.seekp(aOffSet,ios::beg);
    if(aStream.fail()) {
        dbStatus.fail=1;
        return 0;
        }
    if(aStream.eof()) {
        dbStatus.eof=1;
        dbStatus.fail=1;
        return 0;
        }
    return 1;
}

//функция, которая добавляет базе данных пустые строки для их далнейшего заполнения данными
unsigned int DBFile::DBConnect(int Anz)//DBFile* von)
{
    DBBlank();
    DBUpdate(TupelCnt(TupelCnt()+1));
    
    return 1;
}

int DBFile::GotoNext(void) {
    if(CurrentTupel < TupelCnt()) return GotoTupel(CurrentTupel + 1);
    else return 0;
}

//запись в файл
int DBFile::DBWrite(unsigned long RecordNumber) {

    int islast = 0;
    if(RecordNumber==0) RecordNumber = CurrentTupel;
                // если достигнуто максималное количество строк, создаётса новая строка
    if(!GotoTupel(RecordNumber)) {  
        islast = 1;
        TupelCnt(TupelCnt()+1);
        RecordNumber =TupelCnt();
        CurrentTupel = RecordNumber;
        if(!GotoTupel(RecordNumber)) return 0;
        }
    SystemDate();
    aStream.write(Buffer,TupelSize());
    if(islast) aStream.write(&EndDat,1);
    GotoNext(); 
    return 1;
}

//вызываетса для записи в файл, т.к. DBWrite() - private функция
int DBFile::DBUpdate(unsigned long RecNumber) {
    return DBWrite(RecNumber);
}

//возвращает количество столбцов в базе данных
int DBFieldCnt(void) { return FieldsCounter; };

//функцию, которая возвращает количество строк в конкретном DBF-файле   
unsigned long TupelCnt(void)    { return aRecordCnt; };

//функцию, которая изменяет количество строк базы данных 
unsigned long TupelCnt(unsigned long l)    { return aRecordCnt = l; };

//открывает базу данных. Если не может открыть, выдаёт сообщение об ошибке
int oeffnedatenbank(DBFile *oeffne, CString name) {

    CString ss;
    HWND hwnd = 0;
    oeffne->DBOpen(name);
    if(!oeffne->DBIsOpen())
    {
        ss.Format("Не могу открыть файл %s.", oeffne->DBName());
        MessageBox(hwnd, ss, "Ошибка", MB_OK | MB_ICONWARNING);
        return -1;
    }
    return 0;
}

//пока функция, которая добавляет базе данных пустые строки для их далнейшего заполнения 
//данными
int heap_anhaengen(DBFile* von, DBFile* in)
{
    int AttrAnz_Von = von->DBFieldCnt(); //количество столбцов в БД
    int TupelAnz_Von = von->TupelCnt(); //количество строк в БД 

    int AttrAnz_In = in->DBFieldCnt(); //количество столбцов в БД, 
                                                                      //в которую вставляем данные из другого файла
    int TupelAnz_In = in->TupelCnt();  //количество строк в БД 

    for(int i = 1; i <= TupelAnz_Von; i++)
    {
        in->DBConnect();
    }

    /*код для копирования данных*/

    return 0;
}

//кнопка 'соединить'
void CHeapCopyDlg::OnAppendnd() 
{    
    dbf        = new DBFile;
    m_heap_1    = "D:\\MFC Project\\heap_1.dbf"; 

    if((oeffnedatenbank(dbf, m_heap_1)) < 0)
    {
        
        OnOK();
        return;
    }
    
                dbf_2 = new DBFile;
    m_heap_2 = "D:\\MFC Project\\heap_2.dbf";

    if((oeffnedatenbank(dbf_2, m_heap_2)) < 0 )
    {
        
        OnOK();
        return;
    }
    
    int check = heap_anhaengen(dbf_2, dbf, m_CDB_2);
        
    if(check == 1)
        MessageBox("Ошибка","Ошибка",MB_OK|MB_ICONERROR);

    else 
        MessageBox("Успех",
                                                     "Info",MB_OK|MB_ICONINFORMATION);

    dbf->DBClose();
    dbf_2->DBClose();
}


Дополнително прилагаю код программы
Заранее благодарен.


Это сообщение отредактировал(а) Guedda - 22.8.2007, 09:26

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  Dok1.doc 35,00 Kb
PM MAIL   Вверх
Earnest
Дата 22.8.2007, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 2
Всего: 183



Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 


--------------------
...
PM   Вверх
Guedda
Дата 22.8.2007, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 6
Всего: 78




M
Guedda
Модератор: Пользуйтесь кнопкой "Код!"



--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0430 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.