Форум программистов CodeGuru
21 Январь 2018, 06:29:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: DBF файлы  (Прочитано 15037 раз)
0 Пользователей и 1 Гость смотрят эту тему.
jsrent
Новичок
*
Офлайн Офлайн

Сообщений: 1


Просмотр профиля
« : 21 Август 2007, 13:35:13 »

У мена возникла проблема при соединении двух 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();
}

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

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Valid XHTML 1.0! Valid CSS!