Показать сообщение отдельно
Старый 15.12.2011, 16:56   #10  
someOne is offline
someOne
Участник
Аватар для someOne
 
173 / 423 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от alvares Посмотреть сообщение
Коллеги, а есть у кого рабочий пример для создания DBF c помощью "FastDbf"

Не могу понять как работать с заголовком DBF, подскажите в чем не прав - пример создает файл нулевой длины и не отпускает его пока открыта АХ.

Спасибо.
Вот вам рабочий пример.

При работе с NET не забывайте о таких особенностях:
1. Ядро аксапты не перехватывает CLR ошибки, поэтому их нужно перехватывать в коде самому, иначе остаются "висеть" инициализированные объекты (в вашем случае захваченные файлы). Со сборкой мусора при использовании CLR не все так просто...
Кроме того вы просто не сможете понять в чем причина ошибки...

2. В NET принято нумерация последовательности объектов (строк, стобцов...) с нуля а не с единицы как в аксапте.

X++:
static void DBFCreate(Args _args)
{
    SocialExplorer.IO.FastDBF.DbfFile       dbfFile = new SocialExplorer.IO.FastDBF.DbfFile();
    SocialExplorer.IO.FastDBF.DbfRecord     dbfRecord;
    SocialExplorer.IO.FastDBF.DbfHeader     dbfHeader;
    ;

    try
    {
        winApi::deleteFile("c:\\tt1.dbf");

        dbfFile.Create("c:\\tt1.dbf");

        dbfHeader = dbfFile.get_Header();

        dbfHeader.AddColumn("StrCol",  SocialExplorer.IO.FastDBF.DbfColumnType::Character, 20, 0);
        dbfHeader.AddColumn("NumCol1", SocialExplorer.IO.FastDBF.DbfColumnType::Number, 15, 3);
        dbfHeader.AddColumn("NumCol2", SocialExplorer.IO.FastDBF.DbfColumnType::Number, 3, 0);
        dbfHeader.AddColumn("DateCol", SocialExplorer.IO.FastDBF.DbfColumnType::Date);
        dbfHeader.AddColumn("BoolCol", SocialExplorer.IO.FastDBF.DbfColumnType::Boolean);

        dbfRecord = new SocialExplorer.IO.FastDBF.DbfRecord(dbfHeader, System.Text.Encoding::GetEncoding(1251));
        

        dbfRecord.set_Item(0, 'Test');
        dbfRecord.set_Item(1, "100");
        dbfRecord.set_Item(2, "10");
        dbfRecord.SetDateValue(3,str2datetime('31.12.2010', 123));
        dbfRecord.set_Item(4, 'f');

        dbfFile.Write(dbfRecord);
        dbfFile.WriteHeader();
        dbfFile.Close();
    }
    catch (Exception::CLRError)
    {
        dbfFile.Close();
        Error(AifUtil::getClrErrorMessage());
    }
}
За это сообщение автора поблагодарили: gl00mie (2), alvares (1).