Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Копирование данных из одного набора данных в другой [D6, dBase, FoxPro]


j111 ©   (2008-05-25 23:34:00) 

Здравствуйте.
Делаю копирование между двумя наборами данных. По сути это два ДБФ файла одинаковой структуры. Но вот беда, некоторые записи копируются некоректно. Как видно из картинки

http://narod.ru/disk/515298000/2b.GIF.html

две записи из трёх содержат неверные данные в первой колонке, а одна скопировалась успешно! имеет значение 401. Соединялся дбф со своей копией. Объясните почему так происходит. И что делать чтобы копирование происходило верно. Полный проект и тестовые ДБФ файлы доступны по этой ссылке.

http://narod.ru/disk/515076000/concat_dbf.zip.html

Но на всякий случай копирую код в форум, может там явная ошибка.


program concatdbf;

{$APPTYPE CONSOLE}

uses
 SysUtils, DBTables;

var
 targetfile : TTable;
 sourcefile : TTable;
 fi : Integer;
begin
 if ParamStr(1) = ParamStr(2) then begin writeln('Can not add file to it self'); exit; end;
 if not FileExists(ParamStr(1)) then begin writeln('File does not exists -- ', ParamStr(1)); exit; end;
 if not FileExists(ParamStr(2)) then begin writeln('File does not exists -- ', ParamStr(2)); exit; end;

 targetfile := TTable.Create(nil);
 targetfile.TableName := ParamStr(1);
 targetfile.Open;

 sourcefile := TTable.Create(nil);
 sourcefile.TableName := ParamStr(2);
 sourcefile.Open;

 while not sourcefile.EOF do
 begin
   targetfile.Append;

   for fi := 0 to Pred(targetfile.Fields.Count) do
   begin
    // targetfile.Fields[fi].Value:= sourcefile.Fields[fi].Value;
    targetfile.Fields[fi].Assign(sourcefile.Fields[fi]);
    //getmem(buffer,sourcefile.Fields[fi].DataSize);
    //sourcefile.Fields[fi].GetData(buffer,True);
    //targetfile.Fields[fi].SetData(buffer,True);
    //freemem(buffer);
   end;

   targetfile.Post;

   sourcefile.Next;
 end;

 targetfile.Close;
 sourcefile.Close;

 targetfile.Free;
 sourcefile.Free;

 writeln('Done');
end.


Loginov Dmitry   (2008-05-27 12:42:00) [1]


> Не обязательно. По умолчанию тип таблицы определяется расширением
> файла таблицы.


Дык мало ли чего юзер в строке параметров написАть вздумает!


Германн   (2008-05-27 01:10:00) [2]


> Loginov Dmitry ©   (26.05.08 08:04) [5]
>
> > targetfile := TTable.Create(nil);
> > targetfile.TableName := ParamStr(1);
> > targetfile.Open;
>
>
> 1. Не указан тип таблицы.
>

Не обязательно. По умолчанию тип таблицы определяется расширением файла таблицы.


AndreyV   (2008-05-27 00:18:00) [3]

Я вот у себя нашёл
FoxOleDataSet ver 1.04  16/04/2003
а по ссылке
1.02b


Сергей М.   (2008-05-26 23:04:00) [4]

Ну и для DCOM там нет руководства, к сож. ..
Я его для себя в виде готового REGEDIT4-форматированного *.reg-файла подготовил.
Интересующимся готов предоставить.


Сергей М.   (2008-05-26 22:19:00) [5]

В ссылке, приведенной выше, кстати, враньё - продукт от Соломатина требует vfp 7-, а не vfp 6-рантайм модули.


Сергей М.   (2008-05-26 22:10:00) [6]

Кстати, решение от Соломатина - весьма привлекательное решение для страждущих иметь полноценный нативныйдоступ к объектам, созданным кем-то там где-то там в средах FoxPro вплоть до 7-й, при полной при этом поддержке дельфийского TDataSet.

Особо это, возможно, должно заинтересовать тех, кто волей или неволей должен поддерживать работоспособность баз, сверстанных в ДОС-Фоксе. Например, корректная реиндексация/упаковка/очистка таблиц, сверстанных в оной среде с самыми идиотскими выкрутасами в CDX-индексах.


Сергей М.   (2008-05-26 20:55:00) [7]


> Придётся использовать БДЕ, раз другого решения нет


Почему нет ?
Есть еще одно, которое, возможно, стоит попробовать - MS Visual FoxPro Run-Time Library.

Доступ к VFP 7RTL через СОМ-интерфейс любезно организовал и предоставил г-н Александр Соломатин.
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=678


j111   (2008-05-26 20:07:00) [8]

Дело в том, что АДО не совсем подходит, потому что операции производятся в пределах базы данных, а мне нужно объединить два файла с произвольным месторасположением. И у такого подхода есть маленький недостаток, нет контроля над ходом выполнения операции объединения. Но попробовал. и....
Работает!

БатчМув отработал прекрасно, и все данные записались как и хотелось. :-).

Но всё равно какие-то непонятки с этим датасетом.

Просто сложилось так, что дельфийский код, это в принципе код лазаруса с заменёнными типами TDbf на TTable. Причём результат работы и в той среде и в Делфи одинаковый. Но к сожалению аналога БатчМува я не нашёл в лазарусе.

Придётся использовать БДЕ, раз другого решения нет.

Всем участникам спасибо :-).


Loginov Dmitry   (2008-05-26 08:04:00) [9]

> targetfile := TTable.Create(nil);
> targetfile.TableName := ParamStr(1);
> targetfile.Open;


1. Не указан тип таблицы.
2. Для копирования попробуй использовать BatchMove.
3. Нет проверки на IsNull перед Assign.


AndreyV   (2008-05-26 05:31:00) [10]

достаточно
c->ConnectionString = "Provider=VFPOLEDB.1;Data Source=C:\\PROG\\TEST1";


AndreyV   (2008-05-26 05:28:00) [11]

Вот так можно переведи сам на Делфи

 TADOCommand *c = new TADOCommand(NULL);
 try
 {
   c->ConnectionString = "Provider=VFPOLEDB.1;Data Source=C:\\...\\TEST1;Mode=Share Deny None;Extended Properties="";User ID="";Password="";Mask Password=False;Cache Authentication=False;Encrypt Password=False;Collating Sequence=MACHINE;DSN=""";
   c->CommandText = "INSERT INTO PLORG SELECT * FROM PLORG2";
   c->Execute();
 }
 __finally
 {
   delete c;
 }


AndreyV   (2008-05-26 04:40:00) [12]

У тебе поле KOD - символьное, а данные хранятся бинарные.
Строка читается до 0, при записи дополняется пробелами.
0100->0120 (1->8193)
9101->9101 (401->401)
8800->8820 (136->8328)


Плохиш   (2008-05-26 01:12:00) [13]

Для получения доступа к файлу введите число, которое вы видите на картинке

Я не понял, кому помощь нужна?

>     targetfile.Fields[fi].Assign(sourcefile.Fields[fi]);

Чем присвоение не угодило и почему по индексу, а не по имени?

> var
>  targetfile : TTable;
>  sourcefile : TTable;

no comment...


Наверх

Титульная страница Поиск, карта сайта Написать письмо