AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: База знаний и проекты
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.03.2006, 10:23   #41  
Yegor is offline
Yegor
Участник
 
40 / 37 (2) +++
Регистрация: 12.09.2003
Может сойдет за альтернативный вариант. Когда-то давно писал – не понадобилось, без наваротов и проверки целостности, но работает достаточно быстро.
Вложения
Тип файла: rar WinAPICreateDBF (1).rar (4.3 Кб, 408 просмотров)
За это сообщение автора поблагодарили: NeveB (1), jasper (1), zinius (1), aidsua (1), ivas (2), CHESER85 (1).
Старый 03.03.2006, 10:32   #42  
Yegor is offline
Yegor
Участник
 
40 / 37 (2) +++
Регистрация: 12.09.2003
А да немного поспешил, это выгрузка в DBF, а не загрузка, но можно написать аналогичную загрузку
За это сообщение автора поблагодарили:  (1).
Старый 03.03.2006, 11:19   #43  
lagr221374
Гость
 
n/a
Thanks
Старый 03.03.2006, 11:25   #44  
kvan is offline
kvan
Moderator
Аватар для kvan
Дети Юза
 
775 / 49 (3) +
Регистрация: 07.08.2002
Адрес: Donetsk
Цитата:
Сообщение от Yegor
Когда-то давно писал – не понадобилось
Отчего ж не понадобилось? Пользовались твоим классом
__________________
С уважением, kvan.
Старый 03.03.2006, 12:14   #45  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Выкладываю проект для чтения данных из dbf файлов.

Поддерживаются символьные, числовые, с типом дата и логические поля (мемо не поддерживается).

Скорость чтения - для 10 тыс строк порядка 15 сек
Вложения
Тип файла: xpo DBF.xpo (27.3 Кб, 674 просмотров)
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Recoilme (1), SHiSHok (2), f18 (1), Protey (1), Russland (4), Viknik (1), patron (1), decoder (1), CHESER85 (1).
Старый 15.07.2008, 19:26   #46  
aidsua is offline
aidsua
AX*****
Аватар для aidsua
 
106 / 40 (2) +++
Регистрация: 28.09.2005
Адрес: 2:463/Kyiv
Цитата:
Сообщение от Yegor Посмотреть сообщение
Может сойдет за альтернативный вариант. Когда-то давно писал – не понадобилось, без наваротов и проверки целостности, но работает достаточно быстро.
Спасибо автору.. но выявлены неточности, которые успешно исправлены:

1. Метод AddNomeric
X++:
void AddNomeric(str _fieldName, int _num, int _dec)
{
    this.RecordSize(AddFieldDbf_YNG::NomericDBF,_num); // было без параметра
    countFields++;
    fields = conins(fields, countFields, [_fieldName, "N", Offset, _num, _dec]);

    Offset+=_num; // было "28", что не позволяло корректно вноситть значения Numeric меньше 28 байт
}
2. Метод ChangeRecordCount
X++:
void ChangeRecordCount()
{
    for (i=0;i<0x20;i++)
       value.byte(i,0);

    value.byte(0,3);
    value.byte(1,1);
    value.byte(2,7);
    value.byte(3,0x0D);
    value.word(4, RecordCount mod 65536);
    value.word(6, RecordCount div 65536);
    value.word(10,RecordSize);
    charBuffer = New binary(RecordSize+1);
    oemBuffer  = New binary(RecordSize+1);
    value.word(8,0x20 + 0x20*it + 1); // размер шапки dbf. было "+2", а правильно "+1"

    hfile       =  WinAPI_YNG::createFile(FileName, 0x40000000, 2 , 3);
    if (hfile){
        WinAPI_YNG::setFilePointer(hfile, 0, 0);
        WinAPI_YNG::writeFile(hfile,value,0x20);
        value       = new Binary(0x20);
        WinAPI_YNG::closeHandle(hfile);
    }
}
3. Метод EndCreateHeader
X++:
void EndCreateHeader()
{
     this.WriteSize();
     this.DefineField();
     this.WriteFieds();

     value.byte(0,0x0D);
//     value.byte(1,0); // завершающий символ, разделяющий шапку и значениия "0x0D"
     WinAPI_YNG::writeFile(hfile,value,1);  // размер концовки шапки dbf. было "2", а правильно "1"
}
4. Метод RecordSize
X++:
void RecordSize(AddFieldDbf_YNG _type,
                int _len = 1)
{
    i++;
    switch (_type)
    {
        case AddFieldDbf_YNG::CharacterDBF:
            RecordSize+= _len;
            FieldCount++;
            break;
        case AddFieldDbf_YNG::DateDBF:
            RecordSize+=8;
            FieldCount++;
            break;
        case AddFieldDbf_YNG::LogicalDBF:
            RecordSize+=1;
            FieldCount++;
            break;
        case AddFieldDbf_YNG::NomericDBF:
            RecordSize+=_len; // было "28", что не позволяло корректно вноситть значения Numeric 
            FieldCount++;
            break;
    }
}
5. Метод StartCreateHeader
X++:
void StartCreateHeader(str _FileName, int _recordCount = 0)
{
    #define.CREATE_NEW           (1)
    #define.CREATE_ALWAYS        (2)
    #define.OPEN_EXISTING        (3)
    #define.OPEN_ALWAYS          (4)
    #define.TRUNCATE_EXISTING    (5)

    #define.GENERIC_READ         (0x80000000)
    #define.GENERIC_WRITE        (0x40000000)
    #define.GENERIC_EXECUTE      (0x20000000)
    #define.GENERIC_ALL          (0x10000000)
    #define.FILE_OPEN_OVERLAPPED (0x40000000)

    hfile       =  WinAPI_YNG::createFileNew(_FileName,#CREATE_ALWAYS,#GENERIC_WRITE|#GENERIC_READ); // заменено "#OPEN_ALWAYS" на "#CREATE_ALWAYS"
    value       = new Binary(0x20);

    fileName    =_FileName;

    winApiDLL = new DLL('USER32');
    charToOem  = new DLLFunction(winApiDLL, 'CharToOemBuffA');
    charToOem.arg(ExtTypes::Pointer, ExtTypes::Pointer, ExtTypes::DWORD);

    countFields = 0;
    RecordCount = 0;

    for (i=0;i<0x20;i++)
       value.byte(i,0);

    value.byte(0,3);
    value.byte(1,1);
    value.byte(2,7);
    value.byte(3,0x0D);
    value.word(4, _recordCount mod 65536);
    value.word(6, _recordCount div 65536);

    FieldCount=1;
    RecordSize = 1;
    Offset = 1;
    i=0;
}
6. Метод WriteSize --
X++:
void WriteSize()
{
    value.word(10,RecordSize);
    charBuffer = New binary(RecordSize+1);
    oemBuffer  = New binary(RecordSize+1);
    value.word(8,0x20 + 0x20*i + 1); // размер шапки dbf. было "+2", а правильно "+1"
    it = i;
    WinAPI_YNG::writeFile(hfile,value,0x20);
}
7. Метор AddStringToTable
X++:
void AddStringToTable(container _string, boolean _bol = false) // добавлен параметр, по которому переводим данные из ANSI в OEM или нет
{
    str _fieldName;
    str _type, RecordStr,y,m,d;
    int  _Offset, _num, _dec, pp;
    int z;
    ;

    if (ConLen(_string) != ConLen(fields))
        throw error('Количество данных несоответствует количеству полей');

    RecordStr = " ";
    for (z=1; z<=ConLen(_string); z++)
    {
        [_fieldName, _type, _Offset, _num, _dec] = ConPeek(fields, z);

        switch (_type)
        {
            case "C":
                if (StrLen(ConPeek(_string, z)) > _num)
                    _string = ConPoke(_string,z,SubStr(ConPeek(_string, z),1,_num));
                RecordStr = RecordStr + ConPeek(_string, z);
                for (i=StrLen(ConPeek(_string, z))+1; i<=_num; i++)
                    RecordStr = RecordStr + " ";
                break;
            case "L":
                if (ConPeek(_string, z))
                    RecordStr = RecordStr + "T";
                else
                    RecordStr = RecordStr + "F";
                break;
            case "D":
                y = int2str(Year(ConPeek(_string, z)));
                m = int2str(MthOfYr(ConPeek(_string, z)));
                d = int2str(DayOfMth(ConPeek(_string, z)));

                if (strlen(m)<2)
                    m = '0'+m;
                if (strlen(d)<2)
                d = '0'+d;
                    RecordStr = RecordStr + y + m + d;
                break;
            case "N":
                if (_dec == 0)
                {
                    if (StrLen(int2str(ConPeek(_string, z))) > _num)
                        throw error('Значение превышает размер поля в DBF');

                    for(i=1; i<=_num - StrLen(int2str(ConPeek(_string, z)));i++)
                        RecordStr = RecordStr + " ";
                    RecordStr = RecordStr + int2str(ConPeek(_string, z));
                }
                else
                {
                    if (StrLen(num2str(ConPeek(_string, z),1,_dec,1,0)) > _num)
                        throw error('Значение превышает размер поля в DBF');

                    for(i=1; i<=_num - StrLen(num2str(ConPeek(_string, z),1,_dec,1,0));i++)
                        RecordStr = RecordStr + " ";
                    RecordStr = RecordStr + num2str(ConPeek(_string, z),1,_dec,1,0);
                }
                break;
            default:
                throw error('Неверно записан контейнер с полями');
        }
    }
    charBuffer.string(0, RecordStr);
    if (_bol)
    { // начало трансляции из кодировки ANSI в OEM
        charToOem.call(charBuffer, oemBuffer, RecordSize);
        WinAPI_YNG::writeFile(hfile,oembuffer,RecordSize);
    }
    else
    { // иначе запись данных в кодировке ANSI
        WinAPI_YNG::writeFile(hfile,charBuffer,RecordSize);
    }
    RecordCount++;
}
__________________
О, как беден, как груб наш русский язык! [c] А.С.Пушкин
За это сообщение автора поблагодарили: tolstjak (1), maze (1), Yegor (2), NeveB (1),  (2), zinius (1), ivas (2).
Теги
dbf, download, faq, законченный пример, запись данных, полезное, производительность, чтение данных, экспорт

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Выгрузка из ODBC naf DAX: Программирование 9 25.12.2008 19:07
почти DBF Gorlum DAX: Программирование 3 17.03.2006 12:52
ODBC/ADO Alexis DAX: Программирование 6 22.12.2005 18:50
Импорт из DBF : кириллица Mechanizm DAX: Программирование 8 29.09.2004 18:31
Достать данные из DBF в форму edd DAX: Программирование 29 06.02.2003 21:01
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:07.