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

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

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

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

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

Все

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

Спасибо большое но юзер я подкажи примерный код пожалуйсто
...
Рейтинг: 0 / 0
Как объединить идентичные таблицы ? ADO
    #36212329
Рег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как объединить идентичные таблицы ? ADO
    #36212455
Рег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПОчему выдает ошибку

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
Как объединить идентичные таблицы ? ADO
    #36212641
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пуск \ Настройка \ Панель управления \ Администрирование \ Источники данных (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
Как объединить идентичные таблицы ? ADO
    #36212686
Рег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо пробую
...
Рейтинг: 0 / 0
Как объединить идентичные таблицы ? ADO
    #36214627
Рег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня 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
Как объединить идентичные таблицы ? ADO
    #36219304
Рег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>> golsa

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

Не могу с sql заколебался с циклами Пожалуйсто
...
Рейтинг: 0 / 0
Как объединить идентичные таблицы ? ADO
    #36219307
Рег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
var
i:integer;
begin
i:=1;
while i<12 do
begin
................................
......................
...............
end ;
...
Рейтинг: 0 / 0
Как объединить идентичные таблицы ? ADO
    #36219704
Рег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как объединить идентичные таблицы ? ADO
    #36219730
Рег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может без цикла можно оьеденить
...
Рейтинг: 0 / 0
Как объединить идентичные таблицы ? ADO
    #36222054
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот програмка для слияния двух 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
Как объединить идентичные таблицы ? ADO
    #36223410
Peг
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СПАСИБО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
СПАСИБО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
СПАСИБО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Другие СУБД [игнор отключен] [закрыт для гостей] / Как объединить идентичные таблицы ? ADO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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