Форум » [x]Harbour » Как побороть результат ошибки DBFNTX/1021 Ошибка размера данных? » Ответить

Как побороть результат ошибки DBFNTX/1021 Ошибка размера данных?

mikeas: Прошу помощи. В результате незамеченных сбоев: ошибки DBFNTX/1021 - ошибка размера данных (сейчас исправленных) сформировался dbf-файл с полями заполненными звездочками ****. В harbour-е все читается (такие поля =0). Но этот файл передается в приложение 1С, где бракуется. Стоит задача исправления этого файла. Сейчас исправил вручную с помощью DBEDIT Паши (Alt-E проверка файла). Хорошо бы исправлять автоматом перед посылкой в приложение 1С. Пока не нашел способ выявить эти переполненные поля кроме как чтения dbf как файла и поиска "***". Может есть более надежный способ?

Ответов - 2

Pasha: Примерно. Так. Код не тестировал, только откомпилировал [pre]proc main Local cRec, aFld, aNO := {}, anf, aStru Local nOfs := 2 use test new aStru := dbStruct() for each aFld in aStru if aFld[2] = 'N' AADD(aNO, {nOfs, aFld[3], aFld[1]}) endif nOfs += aFld[3] next go top while ! eof() cRec := dbRecordGet() for each anf in aNO if Substr(cRec, anf[1], anf[2]) = Replicate('*', anf[2]) .and. RLock() // здесь исправлять Field->&(anf[3]) := 0 dbUnlock() endif next skip enddo retu #pragma BEGINDUMP #include "hbapi.h" #include "hbapirdd.h" HB_FUNC( DBRECORDGET ) { AREAP pArea = ( AREAP ) hb_rddGetCurrentWorkAreaPointer(); PHB_ITEM pItem = hb_itemPutNI( NULL, 0 ); HB_BYTE *pRec; if( pArea && (SELF_INFO( (AREAP) pArea, DBI_GETRECSIZE, pItem ) == HB_SUCCESS) && ( SELF_GETREC( (AREAP) pArea, &pRec ) == HB_SUCCESS ) ) { hb_retclen( pRec, hb_itemGetNI(pItem) ); } hb_itemRelease( pItem ); } #pragma ENDDUMP [/pre]

mikeas: Класс! Здорово! Все получилось! Огромное человеческое СПАСИБО, Паша! Никогда в своей практике не пользовался встроенными С-ми функциями. Оказалось очень прикольно! Правда при сборке было насколько предупреждений, но все собралось и работает. Еще раз СПАСИБО!



полная версия страницы