![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Копирование данных из одного набора данных в другой [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...