Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.21;
Скачать: CL | DM;

Вниз

Копирование данных из одного набора данных в другой   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.017 c
2-1226161946
Надуев Алексей
2008-11-08 19:32
2008.12.21
WebBrowser


15-1224078829
БарЛог
2008-10-15 17:53
2008.12.21
PHP imagecopymerge


2-1226181426
Scary
2008-11-09 00:57
2008.12.21
StringGrid и полоса прокрутки


15-1223971637
123-ий
2008-10-14 12:07
2008.12.21
Работа с Drupal CMS


2-1226751519
TRSteep
2008-11-15 15:18
2008.12.21
DirectX