Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Другие СУБД [игнор отключен] [закрыт для гостей] / Как объединить идентичные таблицы ? ADO / 14 сообщений из 14, страница 1 из 1
23.09.2009, 06:36
    #36211714
Рег
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить идентичные таблицы ? ADO
Как объединить идентичные таблицы ? Delphi 2005 , ADO
Имена файлов одинаковы

A.dbf 12 штук между собой таблицы лежат в разных папках C:\1, C:\2- C:\12
D.dbf 12 штук между собой таблицы лежат в разных папках C:\1, C:\2- C:\12

Желательно в одном запросе или цикле
...
Рейтинг: 0 / 0
23.09.2009, 09:35
    #36211863
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить идентичные таблицы ? ADO
DBF имеет структуру:
-заголовок
-данные
-байт конца файла 0x1A

Все что надо знать о заголовке DBF:
Число записей - 4 байта (integer) со смещением +4 от начала файла
Длина заголовка - 2 байта (word) со смещением +8 от начала файла
Длина записи - 2 байта (word) со смещением +10 от начала файла
Для DBF с одинаковой структурой длина заголовка одинакова.

Слияние:
Работаешь с DBF как с обыкновенными файлами:
-первую DBF копируешь в новый файл полностью за исключением последнего байта
-из всех последующих вырезаешь данные - часть между заголовком и последним байтом и дописываешь в конец нового файла.
-дописываешь в конец нового файла байт завершения = 0x1A
-правишь в заголовке нового файла число записей

Все

Число записей рассчитываешь по формуле (<размер нового файла> - 1 - <длина заголовка>) / <длина записи>.
...
Рейтинг: 0 / 0
23.09.2009, 10:45
    #36212007
Рег
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить идентичные таблицы ? ADO
Слияние:
Работаешь с DBF как с обыкновенными файлами:
-первую DBF копируешь в новый файл полностью за исключением последнего байта
-из всех последующих вырезаешь данные - часть между заголовком и последним байтом и дописываешь в конец нового файла.
-дописываешь в конец нового файла байт завершения = 0x1A
-правишь в заголовке нового файла число записей

Спасибо большое но юзер я подкажи примерный код пожалуйсто
...
Рейтинг: 0 / 0
23.09.2009, 12:36
    #36212329
Рег
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить идентичные таблицы ? ADO
Var InDir,OutDir:String; // объявление строковых переменных

begin

InDir:='c:\1\'; // каталог исходных файлов

OutDir:='c:\2\'; // каталог записуемых файлов

CopyFile(PChar(InDir+'1.DBF'),PChar(OutDir+'1.DBF'),false);

CopyFile(PChar(InDir+'2.DBF'),PChar(OutDir+'2.DBF'),false);

end;
...
Рейтинг: 0 / 0
23.09.2009, 13:21
    #36212455
Рег
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить идентичные таблицы ? ADO
ПОчему выдает ошибку

DataModule2.ADOQuery1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=C:\;Extended Properties=dBASE IV;Persist Security Info=False';

Select * From ('1\A.dbf'), ('2\A.dbf') ......('12\A.dbf')

Ошибка недопустимое имя 1\A.dbf
...
Рейтинг: 0 / 0
23.09.2009, 14:29
    #36212641
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить идентичные таблицы ? ADO
Пуск \ Настройка \ Панель управления \ Администрирование \ Источники данных (ODBC) \ закладка Системные DSN
создать новый источник данных (или найти среди существующих)
Драйвер - выбрать Microsoft FoxPro VFP Driver (*.dbf)
Имя источника данных - любое, я буду использовать DBF
Описание - любое
Тип базы данных - поставить точку Free Table directory (Отдельные таблицы)
Путь - указать путь к папке в которой расположены ваши папки 1, 2, ..., 12. На пример C:\DBF

Код: plaintext
ConnectionString:='Provider=MSDASQL.1;Persist Security Info=False;Data Source=DBF;Extended Properties="DSN=DBF;UID=;SourceDB=С:\DBF;SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;Null=Yes;Deleted=Yes;"'

SQL
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select * from  1 \a.dbf 
union all
select * from  2 \a.dbf
union all
select * from  3 \a.dbf
union all
...
union all
select * from  12 \a.dbf

Если вместо драйвера FoxPro выбрать DBase - то все dbf должны быть в одной папке.
...
Рейтинг: 0 / 0
23.09.2009, 14:46
    #36212686
Рег
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить идентичные таблицы ? ADO
Спасибо пробую
...
Рейтинг: 0 / 0
24.09.2009, 12:20
    #36214627
Рег
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить идентичные таблицы ? ADO
У меня 12 папок выдает такую ошибку "UNIONs error"

вот нашел что вроде должно быть до 10 UNION

SQL: Too many UNIONs (Error 1834)

The maximum number of UNIONs (10) has been exceeded. For more information, see SELECT - SQL.

как же быть ?
...
Рейтинг: 0 / 0
27.09.2009, 16:19
    #36219304
Рег
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить идентичные таблицы ? ADO
>> golsa

напиши код пожалуйста обледенение dbf как файлов

Не могу с sql заколебался с циклами Пожалуйсто
...
Рейтинг: 0 / 0
27.09.2009, 16:22
    #36219307
Рег
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить идентичные таблицы ? ADO
var
i:integer;
begin
i:=1;
while i<12 do
begin
................................
......................
...............
end ;
...
Рейтинг: 0 / 0
28.09.2009, 08:25
    #36219704
Рег
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить идентичные таблицы ? ADO
FileName: Общее имя для всех файлов, из которых будет собираться один
CombinedFileName: Имя файла, который получится в итоге
}

function CombineFiles(FileName, CombinedFileName : TFileName) : Boolean;
var
i: integer;
fs, sStream: TFileStream;
filenameOrg: String;
begin
i := 1;
fs := TFileStream.Create(CombinedFileName, fmCreate or fmShareExclusive);
try
while FileExists(FileName) do
begin
sStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
fs.CopyFrom(sStream, 0);
finally
sStream.Free;
end;
Inc(i);
FileName := ChangeFileExt(FileName, '.'+ FormatFloat('000', i));
end;
finally
fs.Free;
end;
end;

как переделать код под мой
...
Рейтинг: 0 / 0
28.09.2009, 08:56
    #36219730
Рег
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить идентичные таблицы ? ADO
Может без цикла можно оьеденить
...
Рейтинг: 0 / 0
29.09.2009, 11:04
    #36222054
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить идентичные таблицы ? ADO
Вот програмка для слияния двух DBF файлов.
Если повторить часть относящуюся ко второму DBF файлу нужное число раз, то получите то что вы хотите. А как, тупым копированием или хитрым циклом - ваше дело.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
procedure TForm1.Button1Click(Sender: TObject);
var fIn: File;
    fOu: File;
    iFileSize   : longint;
    iRecCount   : longint;
    wBegDate    : word;
    wRecSize    : word;
    iNumRead    : integer;
    iNumWritten : integer;
    Buf         : array [ 0 .. 65535 ] of byte;

begin
  // открываем файл для объединенного DBF
  AssignFile(fOu, 'C:\DBF\merge.dbf');
  ReWrite(fOu,  1 );

  { переписываем первый файл в объединенный DBF }
  AssignFile(fIn, 'C:\DBF\1\A.dbf');
  Reset (fIn,  1 );

  // начало первой записи данных в файле (только для первого файла)
  Seek(fIn,  8 );
  BlockRead(fIn, wBegDate,  2 , iNumRead);

  // длина записи данных в файле (только для первого файла)
  Seek(fIn,  10 );
  BlockRead(fIn, wRecSize,  2 , iNumRead);

  // вернемся в начало исходного файла
  Seek(fIn,  0 );

  // записываем в DBF файл слияния заголовок (только для первого файла)
  BlockRead(fIn, Buf, wBegDate, iNumRead);
  BlockWrite(fOu, Buf, wBegDate, iNumWritten);

  // переписываем данные в объединеный DBF файл по одной записи
  repeat
    BlockRead(fIn, Buf, wRecSize, iNumRead);
    if iNumRead = wRecSize then
      BlockWrite(fOu, Buf, wRecSize, iNumWritten);
  until (iNumRead <> wRecSize) or (iNumWritten <> iNumRead);

  CloseFile(fIn);
  {= обработка первого исходного файла завершена =}

  { переписываем данные второго файла в объединенный DBF }
  AssignFile(fIn, 'C:\DBF\2\A.dbf');
  Reset (fIn,  1 );

  // переходим на первую запись исходного файла
  Seek(fIn, wBegDate);

  // переписываем данные в объединеный DBF файл по одной записи
  repeat
    BlockRead(fIn, Buf, wRecSize, iNumRead);
    if iNumRead = wRecSize then
      BlockWrite(fOu, Buf, wRecSize, iNumWritten);
  until (iNumRead <> wRecSize) or (iNumWritten <> iNumRead);

  CloseFile(fIn);
  {= обработка второго исходного файла завершена =}

  { завершающие штрихи формирования объединенного DBF }

  // записываем в объединенный DBF последний байт
  iFileSize := $1a;
  BlockWrite(fOu, iFileSize,  1 , iNumWritten);

  CloseFile(fOu);

  // открываем объединенный DBF для корректировки заголовка
  Reset(fOu,  1 );

  // расчитываем число записей в объединенном DBF
  iFileSize := FileSize(fOu);                            // размер файла
  iRecCount := (iFileSize - wBegDate -  1 ) div wRecSize;  // число записей

  // исправлям число записей в заголовке объединенного DBF
  Seek(fOu,  4 );
  BlockWrite(fOu, iRecCount,  4 , iNumWritten);

  CloseFile(fOu);

end;
...
Рейтинг: 0 / 0
29.09.2009, 17:30
    #36223410
Peг
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как объединить идентичные таблицы ? ADO
СПАСИБО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
СПАСИБО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
СПАСИБО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
...
Рейтинг: 0 / 0
Форумы / Другие СУБД [игнор отключен] [закрыт для гостей] / Как объединить идентичные таблицы ? ADO / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]