Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
10-1150442838
RomanH
2006-06-16 11:27
2008.12.21
Программно задать OLE-сервер


2-1226328530
@!!ex
2008-11-10 17:48
2008.12.21
класс, который не нужно создавать.


15-1224154710
Кто б сомневался
2008-10-16 14:58
2008.12.21
Почему у многих девушек нет подруг?


2-1226679594
smartleds
2008-11-14 19:19
2008.12.21
Подскажите плз как процедуру зоздания формы вызвать вручную


15-1224178795
LongLoveLove
2008-10-16 21:39
2008.12.21
Актуальность предметов.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский