Форум: "Базы";
Текущий архив: 2008.12.21;
Скачать: [xml.tar.bz2];
ВнизКопирование данных из одного набора данных в другой Найти похожие ветки
← →
j111 (2008-05-25 23:34) [0]Здравствуйте.
Делаю копирование между двумя наборами данных. По сути это два ДБФ файла одинаковой структуры. Но вот беда, некоторые записи копируются некоректно. Как видно из картинки
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.
← →
Плохиш © (2008-05-26 01:12) [1]Для получения доступа к файлу введите число, которое вы видите на картинке
Я не понял, кому помощь нужна?
> targetfile.Fields[fi].Assign(sourcefile.Fields[fi]);
Чем присвоение не угодило и почему по индексу, а не по имени?
> var
> targetfile : TTable;
> sourcefile : TTable;
no comment...
← →
AndreyV © (2008-05-26 04:40) [2]У тебе поле KOD - символьное, а данные хранятся бинарные.
Строка читается до 0, при записи дополняется пробелами.
0100->0120 (1->8193)
9101->9101 (401->401)
8800->8820 (136->8328)
← →
AndreyV © (2008-05-26 05:28) [3]Вот так можно переведи сам на Делфи
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 05:31) [4]достаточно
c->ConnectionString = "Provider=VFPOLEDB.1;Data Source=C:\\PROG\\TEST1";
← →
Loginov Dmitry © (2008-05-26 08:04) [5]> targetfile := TTable.Create(nil);
> targetfile.TableName := ParamStr(1);
> targetfile.Open;
1. Не указан тип таблицы.
2. Для копирования попробуй использовать BatchMove.
3. Нет проверки на IsNull перед Assign.
← →
j111 (2008-05-26 20:07) [6]Дело в том, что АДО не совсем подходит, потому что операции производятся в пределах базы данных, а мне нужно объединить два файла с произвольным месторасположением. И у такого подхода есть маленький недостаток, нет контроля над ходом выполнения операции объединения. Но попробовал. и....
Работает!
БатчМув отработал прекрасно, и все данные записались как и хотелось. :-).
Но всё равно какие-то непонятки с этим датасетом.
Просто сложилось так, что дельфийский код, это в принципе код лазаруса с заменёнными типами TDbf на TTable. Причём результат работы и в той среде и в Делфи одинаковый. Но к сожалению аналога БатчМува я не нашёл в лазарусе.
Придётся использовать БДЕ, раз другого решения нет.
Всем участникам спасибо :-).
← →
Сергей М. © (2008-05-26 20:55) [7]
> Придётся использовать БДЕ, раз другого решения нет
Почему нет ?
Есть еще одно, которое, возможно, стоит попробовать - MS Visual FoxPro Run-Time Library.
Доступ к VFP7 RTL через СОМ-интерфейс любезно организовал и предоставил г-н Александр Соломатин.
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=678
← →
Сергей М. © (2008-05-26 22:10) [8]Кстати, решение от Соломатина - весьма привлекательное решение для страждущих иметь полноценный нативный доступ к объектам, созданным кем-то там где-то там в средах FoxPro вплоть до 7-й, при полной при этом поддержке дельфийского TDataSet.
Особо это, возможно, должно заинтересовать тех, кто волей или неволей должен поддерживать работоспособность баз, сверстанных в ДОС-Фоксе. Например, корректная реиндексация/упаковка/очистка таблиц, сверстанных в оной среде с самыми идиотскими выкрутасами в CDX-индексах.
← →
Сергей М. © (2008-05-26 22:19) [9]В ссылке, приведенной выше, кстати, враньё - продукт от Соломатина требует vfp7-, а не vfp6-рантайм модули.
← →
Сергей М. © (2008-05-26 23:04) [10]Ну и для DCOM там нет руководства, к сож. ..
Я его для себя в виде готового REGEDIT4-форматированного *.reg-файла подготовил.
Интересующимся готов предоставить.
← →
AndreyV © (2008-05-27 00:18) [11]Я вот у себя нашёл
FoxOleDataSet ver 1.04 16/04/2003
а по ссылке
1.02b
← →
Германн © (2008-05-27 01:10) [12]
> Loginov Dmitry © (26.05.08 08:04) [5]
>
> > targetfile := TTable.Create(nil);
> > targetfile.TableName := ParamStr(1);
> > targetfile.Open;
>
>
> 1. Не указан тип таблицы.
>
Не обязательно. По умолчанию тип таблицы определяется расширением файла таблицы.
← →
Loginov Dmitry © (2008-05-27 12:42) [13]
> Не обязательно. По умолчанию тип таблицы определяется расширением
> файла таблицы.
Дык мало ли чего юзер в строке параметров написАть вздумает!
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2008.12.21;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.071 c