Добавление в данных в dbf-файл

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Epifanich
Сообщения: 18
Зарегистрирован: 30 окт 2006, 15:39

Добавление в данных в dbf-файл

Сообщение Epifanich »

Добрый день! Магическим образом происходит дозапись данных в dbf-файл... И вроде бы все обычным образом делаю: открываю dbf-файл, получаю значения полей и добавляю заполненную запись в dbf. Результат: записи добавляются, но только 3 из 16 полей заполняются данными.
Если перед заполнением DBFClearBuffer не выполню, то в те же 3 поля данные переносятся мои, а остальные поля заполняются значениями из 1-ой записи в файле.

Из-за это происходит?
Таким получается файл с выгруженными данными (последние 6 строк мои - выгруженные). Заполняются поля: KODT, NAIMT, KOL
http://narod.ru/disk/8413797000/file.dbf.html

А исходный текст примерно такой:
var Dbf_Oter : LongInt;
var filename_Oter : string;
filename_Oter := 'Имя_файла';
Dbf_Oter := DBFOpen(filename_Oter,stOpen);
if Dbf_Oter = 0
{
message('Доступ к файлу для выгрузки в ОТЭР запрещен! Возможно, файл занят другим пользователем.');
abort;
exit;
}
DBFClearBuffer(Dbf_Oter);
_loop otpuskgsm
{
DbfputFieldValue(Dbf_Oter,'KOL',otpuskgsm.kol);
DBFPutFieldValue(Dbf_Oter,'NNAK', substr(otpuskgsm.NNAKL,1,6));
DBFPutFieldValue(Dbf_Oter,'DATAS', smenaazs.DNSM);
DBFPutFieldValue(Dbf_Oter,'TABNZ', substr(string(pers1.TABNMB),1,6));
DBFPutFieldValue(Dbf_Oter,'FIOZ', substr(substr(pers1.fio,1,pos(' ',pers1.fio)-1),1,6));
DBFPutFieldValue(Dbf_Oter,'DATAR', otpuskgsm.ZAPDATA);
DBFPutFieldValue(Dbf_Oter,'TIMER', timetostr(otpuskgsm.ZAPTIME,'HH:MM'));

if modifier getfirst toplivo2 = tsok
{
DBFPutFieldValue(Dbf_Oter,'KODT',substr(toplivo2.KODGSM,1,2));
DBFPutFieldValue(Dbf_Oter,'NAIMT',substr(toplivo2.NAME,1,15));
}

if modifier getfirst perspol = tsok
{
DBFPutFieldValue(Dbf_Oter,'TABN',perspol.TABNMB);
DBFPutFieldValue(Dbf_Oter,'FIO', substr(perspol.fio,1,pos(' ',perspol.fio)-1));
DBFPutFieldValue(Dbf_Oter,'KARTA', 123456789123)
}
if modifier getfirst eputlst = tsok
{
DBFPutFieldValue(Dbf_Oter,'NPUT', eputlst.SERIAPL+eputlst.npl);
DBFPutFieldValue(Dbf_Oter,'DATAV', eputlst.datapl);

if modifier getfirst transp = tsok
DBFPutFieldValue(Dbf_Oter,'GARN',transp.GARNOM);
}

DBFInsertRecord(Dbf_Oter);
} // loop
DBFClose(Dbf_Oter);
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение Ged »

1. нада смотреть
Where
((
))

2. Дата пишется как
DBFPutFieldValue(Dbf_Oter,'DATAV', DateToStr(eputlst.datapl,'YYYYMMDD'));
да и другие значения приведите к стринг. Такова специфика.

PS: Очень содержательный файл на народе. Данные с реальными номерами банковских карт?
Epifanich
Сообщения: 18
Зарегистрирован: 30 окт 2006, 15:39

Сообщение Epifanich »

Ув. Ged!
1. Where может быть и пустым, а все связи описываться в modifier getfirst. Это может влиять на ситуацию?
Сразу скажу, что значения полей, записываемых в DBFPutFieldValue, при отладке отображаются верные.

2. Хотите ли Вы сказать, что к стрингу надо приводить и числовые значения, даже если тип поля в dbf-файле числовой? (А ведь поле 'KOL' как раз перенеслось - оно числовое )

P.S. Карты не банковские, а путевые :)
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение Ged »

Код: Выделить всё

Функция DBFPutFieldValue    
Назначение
Установить значение поля текущей записи.
Описание
function DBFPutFieldValue (handle : longInt;
                           fName, str : string
                          ) : integer;

Посмотрите значение KOL через dbfviwer или Excel. Когда смотришь вроде все ок, а когда позиционируешься получаем 0.10
Или посмотрите как живут значения в dbf через текстовый редактор.
Числа живут в строковом виде в отличии от бинарных файлов.

PS: на счет карт - просто, хотел предупредить :) мало ли.. по запарке..
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

приводит надо все кроме строк, при том к нужному виду.
числа приводить так
string(число,размер поля,число знаков после запятой) - в дбф они справа прижаты. Запоните одну строку чем либо(excel, fox и.т.п.) и прочитайте - в каком виде будут?
Ответить