03.03.2006, 10:32 | #42 |
Участник
|
А да немного поспешил, это выгрузка в DBF, а не загрузка, но можно написать аналогичную загрузку
|
|
|
За это сообщение автора поблагодарили: (1). |
03.03.2006, 11:19 | #43 |
Гость
|
Thanks
|
|
03.03.2006, 11:25 | #44 |
Moderator
|
Цитата:
Сообщение от Yegor
Когда-то давно писал – не понадобилось
__________________
С уважением, kvan. |
|
03.03.2006, 12:14 | #45 |
Участник
|
Выкладываю проект для чтения данных из dbf файлов.
Поддерживаются символьные, числовые, с типом дата и логические поля (мемо не поддерживается). Скорость чтения - для 10 тыс строк порядка 15 сек
__________________
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 |
AX*****
|
Цитата:
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 байт } 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); } } 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" } 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; } } 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; } 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); } 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 | 9 | |||
почти DBF | 3 | |||
ODBC/ADO | 6 | |||
Импорт из DBF : кириллица | 8 | |||
Достать данные из DBF в форму | 29 |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|