Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.12.2010, 19:03
Irehon Irehon вне форума
Прохожий
 
Регистрация: 04.12.2010
Сообщения: 5
Репутация: 10
По умолчанию чтение БД из MSSQL Server и сохранения в DBF (Foxpro)

Весь ваш форум перерыл и не мог найти не чего толкового по этому вопросу так что создаю новую тему.
Уважаемые форумчане у меня возникла проблема при сохранения бд в формате dbf (FoхPro). Начну с начало у меня на работе есть сервер MS SQL на нем лежит БД. Я через делфи создаю форму подключаюсь к SQL серверу нормально, вытаскиваю таблицу с данными которые мне нужны и делаю фильтр. Как мне эту таблицу уже отфильтрованную сохранить БД в dbf (FoxPro) формат?
Уже голову слома как это можно сделать программно не как не догоняю, может что посоветуете или в какую сторону копать, а если может у кого есть схожие исходники буду благодарен.
Ответить с цитированием
  #2  
Старый 21.12.2010, 19:16
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Это гораздо проще сделать средствами самого сервера. Смотри в сторону DTS
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 21.12.2010, 19:20
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Если задача принципиально через Delphi это сделать, то я вижу два решения:
A)
1. Подключить таблицу из MSSQL
2. Подключить таблицу из FoxPro
3. По таблице MSSQL сделать обход добавляя записи в таблицу FoxPro
B)
1. Воспользоваться мастером запросов в TQuery. (компоненты BDE) Там есть возможность работать одновременно с двумя разными источниками данных.

Но я бы просто воспользовался мощным инструментом DTS (Data transformation service) который уже имеется на MSSQL
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 21.12.2010, 19:22
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

Если с DTS не разберешься, то программно тоже можно. как вариант, самый деревянный,ADOQuery В котором запрос с фильтром к MSSQL, table (BDE) ссылающаяся на dbf файл. далее по циклу выставляешь из ADOQUERY в Table.
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #5  
Старый 22.12.2010, 05:39
Irehon Irehon вне форума
Прохожий
 
Регистрация: 04.12.2010
Сообщения: 5
Репутация: 10
По умолчанию

Цитата:
Сообщение от Aristarh Dark
Это гораздо проще сделать средствами самого сервера. Смотри в сторону DTS
Вот имено мне это надо сделать программно в delphi.

Да я все это понимаю но я в тупеке, уже сделал подключение к серверу, перенос структуры а вот саму таблицу(данные) не могу перенести, неможете пример кода привести как это делаеться?
Я тыпался сделать одним способом вот он
Код:
While not ADODataSet1.EOF do
     begin
          for i := 0 to ADODataSet1.Fields.Count-1 do
          table1.FieldByName(ADODataSet1.Fields[i].FieldName).Assign(ADODataSet1.Fields[i]); //вот тут ругаеться
          ADODataSet1.Next;
     end;
кто знает подскажите или пример кода можете дать.
Ответить с цитированием
  #6  
Старый 22.12.2010, 06:35
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Потому что так не правильно. Метод Assing вообще не для этого предназначен.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #7  
Старый 22.12.2010, 14:37
Irehon Irehon вне форума
Прохожий
 
Регистрация: 04.12.2010
Сообщения: 5
Репутация: 10
По умолчанию

Цитата:
Сообщение от Aristarh Dark
Потому что так не правильно. Метод Assing вообще не для этого предназначен.
А тогда подскажи как правельно будет написать?
Ответить с цитированием
  #8  
Старый 22.12.2010, 14:40
Irehon Irehon вне форума
Прохожий
 
Регистрация: 04.12.2010
Сообщения: 5
Репутация: 10
По умолчанию

Цитата:
Сообщение от Black Raider
Если с DTS не разберешься, то программно тоже можно. как вариант, самый деревянный,ADOQuery В котором запрос с фильтром к MSSQL, table (BDE) ссылающаяся на dbf файл. далее по циклу выставляешь из ADOQUERY в Table.
Чето я написал а он нефига не работает только структуру перекидыват, а саму таблицу нет. Если можешь накидай код этой процедурки.
Ответить с цитированием
  #9  
Старый 22.12.2010, 15:51
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

Код:
if adoquery1.isEmpty=false then begin
  ADOQUERY1.first;
  repeat
    table1.append;
    table1.field['field1'].value:=Adoquery1.fieldbyname('fieldADO1').value;
    table1.field['field2'].value:=Adoquery1.fieldbyname('fieldADO2').value;
    table1.post;
    adoquery1.next;
  until adoquery1.eof;
end;
Где то так. под рукой сейчас Дельфи нет. но чтото около того.
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #10  
Старый 22.12.2010, 20:21
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Интересно, это только мне глаз режет такой код:
Код:
if adoquery1.isEmpty=false then 
И еще, не стоит для прохода по БД использовать repeat т.к. первый проход будет выполнен всегда независимо от наличия данных в БД.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 22.12.2010 в 20:24.
Ответить с цитированием
  #11  
Старый 23.12.2010, 05:57
Irehon Irehon вне форума
Прохожий
 
Регистрация: 04.12.2010
Сообщения: 5
Репутация: 10
По умолчанию

Цитата:
Сообщение от Black Raider
Где то так. под рукой сейчас Дельфи нет. но чтото около того.
Выдает странную ошибку Table1 Cannod perform this operation on a closed dataset и прерываеться работа цикла на строчке добавления table1.append;
Я вписывал имя таблици.

Я недосмотрел, надо было включить таблицу. И заменить field на fieldbyname везде.
Table1.Active:=True;
While not ADOQuery1.EOF do
begin
table1.append;
table1.FieldByName('ID').value:=Adoquery1.fieldbyN ame('ID').value;
table1.post;
adoquery1.next;
end;

Благадарю за помошь.

Последний раз редактировалось Irehon, 23.12.2010 в 06:05.
Ответить с цитированием
  #12  
Старый 23.12.2010, 09:05
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

2 Страдалецъ
Цитата:
т.к. первый проход будет выполнен всегда независимо от наличия данных в БД.
не будет т.к. впереди то что тебе режет глаз! (кстати почему?) если данных не будет он просто не войдет в блок с циклом.
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #13  
Старый 23.12.2010, 12:19
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Режет глаз не проверка, а то как вы это делаете.
1) adoquery1.isEmpty - функция возвращающая логическое значение.
2) оператор if работает с логическим условием
Так-что выполнение этих двух пунктов достаточно и незачем еще раз сравнивать adoquery1.isEmpty=false
Итогом моих умствований будет такой код:
Код:
if not adoquery1.isEmpty then 
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #14  
Старый 23.12.2010, 13:08
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

Цитата:
Сообщение от Страдалецъ
Режет глаз не проверка, а то как вы это делаете.
1) adoquery1.isEmpty - функция возвращающая логическое значение.
2) оператор if работает с логическим условием
Так-что выполнение этих двух пунктов достаточно и незачем еще раз сравнивать adoquery1.isEmpty=false
Итогом моих умствований будет такой код:
Код:
if not adoquery1.isEmpty then 

ну можно и так
для меня в целом не принципиально.
могу и так писать. например на старом месте работы нач. бесили такие выражения какое указали вы, типа не понятно, с аргументом функция isEmpty возвращает False True вот и сравнивай их, читать легче.
тут главное ведь было не стилистика кода, а просто подсказать куда "копать".
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:13.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter