Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Oracle+Delphi


Автор: AyanTai 19.12.2008, 11:34
Доброго времени суток всем!
просмотрев темы в поисковике, не нашел для себя ответа.
с БД начал работать недавно- опыта нет(за неадыкватное высказывание прошу прощения).
Задача в следующем: есть папка с файлами *.dbf (в которых есть поля: Фамилия |имя|Отчество|ID, ID пустой), так же есть таблица в БД Оракл с теми же полями (Фамилия |имя|Отчество|ID, НО  ID не пустой). нужно прочитать данные из *.dbf, сравнить с таблицей Оракла и совпадающим по ФИО полям присвоить ID. и все выложить обратно в *.DBF файл. 
использую BDE(для открытия DBF) и ADO(соединение с ораклом). создал таблицу(пусть будет ОРА) в Оракле(однотипную что и DBF файл). затем в Table1 вывожу данные из выбранного файла и отражаю все в гриде...теперь хочу передать данные в пустую созданную таблицу(ОРА)
Трабла в том что не знаю ( ниразу этого не далал) как передать даные из DBGrida в таблицу Оракловую  smile . PS а дальше написал уже процедурку на сравнение двух таблиц по ФИО...
 за ранее всем спасибо кто поможет!!!

Добавлено через 4 минуты и 58 секунд
кстати вывожу данные в грид вот так:

procedure TForm1.btDirIn_ordClick(Sender: TObject);   // кнопка Открыть
begin
Form1.OpenDialog1.Execute;
Form1.Edit1.Text:=OpenDialog1.FileName;
Label2.Caption:=OpenDialog1.FileName;
Form1.Table1.TableName:=OpenDialog1.FileName;
Form1.Table1.Active:=true;
end;




Автор: Frees 19.12.2008, 11:52
Цитата(AyanTai @  19.12.2008,  13:34 Найти цитируемый пост)
с БД начал работать недавно- опыта нет

что же тебя тогда сразу на оракл понисло

по теме, можно примерно вот так сделать

Код

 procedure dbfToOrcl();
 begin
  ADOQuery1.SQL := 'Select * from table1 where FIO = :FIO';
  Table1.First;
  while not Table1.Eof do
  begin
    ADOQuery1.Close;
    ADOQuery1.Parameters.ParamByName('FIO').Value :=
      Table1.FieldByName('FIO').value;
    ADOQuery1.Open;
    if ADOQuery1.RecordCount > 0 then
    begin
      Table1.Edit;
      Table1.FieldByName('ID').Value :=
           ADOQuery1.FieldByName('ID').Value;
      Table1.Post;
    end;
    Table1.Next;
  end;
 end;

Автор: AyanTai 19.12.2008, 11:58
Frees    -  спасибо большое за быстроту ответа сейчас попробую!!! 

Автор: Frees 19.12.2008, 11:59
занести данные в таблицу оракла из dbf можно вот так

Код

procedure IsertToOrcl();
 begin
  ADOQuery1.SQL := 'INSERT INTO ORA (ID,FIO)VALUES (:ID,:FIO)';
  Table1.First;
  while not Table1.Eof do
  begin
    ADOQuery1.Close;
    ADOQuery1.Parameters.ParamByName('ID').Value :=
      Table1.FieldByName('ID').value;
    ADOQuery1.Parameters.ParamByName('FIO').Value :=
      Table1.FieldByName('FIO').value;
    ADOQuery1.ExecSQL;
    Table1.Next;
  end;
 end;

Автор: AyanTai 19.12.2008, 12:15
ADOQuery1.SQL := 'Select * from table1 where FIO = :FIO'

From Table1 - ADO не поймет! я же Table1  получаю через BDE!

Автор: Frees 19.12.2008, 12:16
Цитата(AyanTai @  19.12.2008,  14:15 Найти цитируемый пост)
From Table1 - ADO не поймет

Table1 это имя твоей тоблицы в оракле с фамилиями и ИД

Добавлено через 43 секунды
у те бя это как я понимаю Select * from ORA where FIO = :FIO

Автор: Данкинг 19.12.2008, 12:29
Когда-то писал прогу для экспорта из DBF в Oracle (через ADO и DOA соответственно). Вот, прилагаю, может, пригодится. smile 

Автор: AyanTai 19.12.2008, 12:38
 Респект и уважуха вам ребята!!!  smile   

Автор: Kbl4AH 20.12.2008, 22:10
Цитата(Frees @  19.12.2008,  11:52 Найти цитируемый пост)
что же тебя тогда сразу на оракл понисло

Я вот, что такое Делфи даже не знал, а мне сказали проги на нем делать, которые с Oracle работают...
Хорошо хоть оказалось всего лишь запросы делать smile 

Автор: AyanTai 22.12.2008, 08:49
const1 = ' INSERT INTO OPA (vorna) Values ( ' :vorna ' ) ';
....
procedure DbfToOrc();    //Выполнить
var i: integer;
begin
Form1.ADOQuery1.SQL.Clear;
Form1.ADOQuery1.open;
Form1.Table1.First;
For i:=0 to Form1.Table1.Fields.Count do
    begin
    Form1.ADOQuery1.FieldByName('VORNA').Value:=Form1.Table1.fieldbyname('VORNA').Value;
    Form1.ADOQuery1.SQL.Add(const1);
    Form1.ADOQuery1.ExecSQL;
    Form1.ADOQuery1.Active:=true;
    Form1.Table1.Next;
    end;
end;

 :vorna  - при такой конструкции разве так будут передаваться данные? у меня Делфи ругается....((





Автор: Kbl4AH 22.12.2008, 11:55
Цитата(AyanTai @  22.12.2008,  08:49 Найти цитируемый пост)
 :vorna  - при такой конструкции разве так будут передаваться данные? у меня Делфи ругается....((

Это переменная так обозначается... Но перед тем, ка выполнять запрос переменную нужно объявить и значение ей присвоить... может поэтому ругается?
А что за ошибка?

Автор: Данкинг 22.12.2008, 12:04
Цитата(AyanTai @  22.12.2008,  08:49 Найти цитируемый пост)

Код

Form1.ADOQuery1.FieldByName('VORNA').Value:=Form1.Table1.fieldbyname('VORNA').Value;
Form1.ADOQuery1.SQL.Add(const1);

Ты сам понял, что написал? smile 
Да и вообще - весь цикл удали и напиши заново, там полная <она> написана. smile  smile 

Автор: AyanTai 22.12.2008, 12:22
вот так начинает записывать в таблицу оракла(взял только столбец - ИМЯ), но заполняет только последнее имя, как сделать чтоб все имена заполнял?

const1 = 'INSERT INTO nnr_id (vorna) Values ( ';
const3 = ' ); ';

procedure DbfToOrc();    // Выполнить
Цитата



begin
Form1.Table1.First;

While not Form1.Table1.Eof do
    begin
    Form1.ADOQuery1.Open;
    Form1.ADOQuery1.Edit;
    Form1.ADOQuery1.FieldByName('Имя').AsString:=Form1.Table1.FieldByName('Имя').AsString;
    Form1.ADOQuery1.SQL.Add(const1+ Form1.ADOQuery1.FieldByName('Имя').AsString + const3);
    Form1.Table1.Next;

    end;

Автор: Данкинг 22.12.2008, 12:24
AyanTai, посмотри мой пример. smile 

Автор: AyanTai 22.12.2008, 12:26
и еще выдает ошибку "ORA-00933: SQL command not property ended" ((  ставлю после  Form1.Table1.Next;  ->
Form1.ADOQuery1.close; - не помогает((

Автор: Данкинг 22.12.2008, 12:32
Цитата(AyanTai @  22.12.2008,  12:22 Найти цитируемый пост)
Код

Form1.ADOQuery1.FieldByName('Имя').AsString:=Form1.Table1.FieldByName('Имя').AsString;
    Form1.ADOQuery1.SQL.Add(const1+ Form1.ADOQuery1.FieldByName('Имя').AsString + const3);

 smile  smile  smile 
Зачем тебе изменять поля AdoQuery и вручную, и запросом одновременно? Говорю же, посмотри мой пример! smile 

Автор: AyanTai 22.12.2008, 12:49
туплю...исправил..

procedure DbfToOrc();    // Âûïîëíèòü
begin
Form1.Table1.First;

While not Form1.Table1.Eof do
    begin
    Form1.ADOQuery1.Open;
    Form1.ADOQuery1.Edit;
    Form1.ADOQuery1.FieldByName('Имя').AsString:=Form1.Table1.FieldByName('Имя').AsString;
    что здесь надо вставить чтоб записывалось имя - а то у меня просто поверх старого имени записывает новое
    Form1.Table1.Next;
    end;



Данкинг  -  не могу понять что у тя в примере подошло бы к моей проге((  smile 
 smile 

Автор: Kbl4AH 22.12.2008, 12:56
Цитата(AyanTai @  22.12.2008,  12:26 Найти цитируемый пост)
"ORA-00933: SQL command not property ended"

Ошибка в тексте запроса... Делфи здесь не причем... исправляй запрос...
Перед выполнением нового запроса текст старого нужно очищать...
Я вместо  Form1.ADOQuery1.SQL.Add(...); использую  Form1.ADOQuery1.SQL.Text := ...;

Автор: Данкинг 22.12.2008, 16:45
Цитата(AyanTai @  22.12.2008,  12:49 Найти цитируемый пост)
 не могу понять что у тя в примере подошло бы к моей проге

Проход в цикле по таблице DBF и запись значений полей в Oracle...

Автор: AyanTai 23.12.2008, 10:48
ребята все заработало спасибо, но есть одно НО: записывается только последнее значение...как быть???
вот как сделал: 
procedure DbfToOrc();    // Выполнить
begin
Form1.Table1.First;
While not Form1.Table1.Eof do
    begin
    Form1.ADOQuery1.Open;
    Form1.ADOQuery1.Edit;
    Form1.ADOQuery1.FieldByName('Имя').AsVariant:=Form1.Table1.FieldByName('Имя').AsVariant;
    Form1.ADOQuery1.post;
    Form1.Table1.Next;
    end;

Автор: Kbl4AH 23.12.2008, 11:23
Цитата(AyanTai @  23.12.2008,  10:48 Найти цитируемый пост)
но есть одно НО: записывается только последнее значение...как быть???

Ты записи Table перебираешь, а ADOQuery1 - нет... у тебя получается все разы в цикле только одна запись апдейтится... в ADOQuery1 тоже нужно записи перебирать...
наверное, так:
Код

Form1.Table1.First;
Form1.ADOQuery1.First;
While not Form1.Table1.Eof do
    begin
    Form1.ADOQuery1.Open;
    Form1.ADOQuery1.Edit;
    Form1.ADOQuery1.FieldByName('Имя').AsVariant:=Form1.Table1.FieldByName('Имя').AsVariant;
    Form1.ADOQuery1.post;
    Form1.Table1.Next;
    Form1.ADOQuery1.Next;
    end;

Автор: Данкинг 23.12.2008, 11:52
Используйте insert into... , господа!! smile Как у меня в примере: в AdoTable получаем данные из .dbf, а затем вставляем их в цикле (но запросом) в ORA-таблицу!

Автор: AyanTai 23.12.2008, 13:58
Kbl4AH  -  не получаетсЯ (((.
Данкинг  -  сейчас попробую... просто не пойму какая разница как получены данные в грид, и соотв как записываются ...?

Автор: Kbl4AH 23.12.2008, 14:21
а если Form1.ADOQuery1.Open; до цикла поставить?

Автор: AyanTai 23.12.2008, 14:45
Kbl4AH,  и при такой конструкции ничего не получается(((

procedure DbfToOrc();    
begin
Form1.Table1.First;
Form1.ADOQuery1.Open;
Form1.ADOQuery1.First;

While not Form1.Table1.Eof do
    begin

    Form1.ADOQuery1.Edit;
    Form1.ADOQuery1.FieldByName('bukrs').AsVariant:=Form1.Table1.FieldByName('bukrs').AsVariant;
    Form1.ADOQuery1.post;
    Form1.ADOQuery1.Next;
    Form1.Table1.Next;

    end;

Автор: AyanTai 23.12.2008, 15:01
Данкинг  - тыж тут только создаешь таблицу! где передача данных?? или я уже туплю...покажи.
zapros.sql.Text:='create table '+trim(LabeledEdit1.Text)+'2'+' (taff varchar2 (5))';

Автор: Kbl4AH 23.12.2008, 15:41
Перечитал заново 1-й пост... что сделать-то нужно? из грида вставить записи в оракловую таблицу?
Цитата(AyanTai @  19.12.2008,  11:34 Найти цитируемый пост)
Задача в следующем: есть папка с файлами *.dbf (в которых есть поля: Фамилия |имя|Отчество|ID, ID пустой), так же есть таблица в БД Оракл с теми же полями (Фамилия |имя|Отчество|ID, НО  ID не пустой). нужно прочитать данные из *.dbf, сравнить с таблицей Оракла и совпадающим по ФИО полям присвоить ID. и все выложить обратно в *.DBF файл. использую BDE(для открытия DBF) и ADO(соединение с ораклом). создал таблицу(пусть будет ОРА) в Оракле(однотипную что и DBF файл). затем в Table1 вывожу данные из выбранного файла и отражаю все в гриде...теперь хочу передать данные в пустую созданную таблицу(ОРА)

не понял что-тут написано... что значит сравнить с таблицей Оракла? и передать данные в пустую созданную таблицу(ОРА)?
так таблица в Оракле пустая или нет?

Автор: Данкинг 23.12.2008, 20:20
Цитата(AyanTai @  23.12.2008,  15:01 Найти цитируемый пост)
где передача данных

Ну правильно, а дальше там цикл по заполнению должен быть.

Автор: AyanTai 24.12.2008, 05:19
Kbl4AH,  - нужно просто передать данные в пустую таблицу Оракла(таблица в Оракле создана и имеет ту же структуру что и файл DBF), в гриде я файл DBF отразил теперь надо просто перегнать данные в  таблицу Оракла. 
PS: а потом уже будет таблица полученная преобразовываться...

Данкинг,  - у меня не хватает какого-то компонента ... мож из-за этого. таблицу создает, а данные не передает...(


что делать??? smile   smile  

Автор: AyanTai 24.12.2008, 08:27
все ребята сделал...всем спасибо большое!!!  smile 
отдельное спасибо: 
Данкинг, 
Kbl4AH, 
Brees - респект за помощь...
кстати сделал вот так: 

procedure IsertToOrcl();
 begin
  ADOQuery1.SQL := 'INSERT INTO ORA (Имя)VALUES (:Имя)';
  Table1.Open;
  Table1.First;
  while not Table1.Eof do
  begin
    ADOQuery1.Close;
    ADOQuery1.ParamByName('bukrs').Value :=
      Table1.FieldByName('bukrs').value;
    ADOQuery1.ExecSQL;
    Table1.Next;
  end;
 end;

Автор: Данкинг 24.12.2008, 12:05
Цитата(AyanTai @  24.12.2008,  05:19 Найти цитируемый пост)
у меня не хватает какого-то компонента

Ну да, у меня же Direct Oracle Access используется.

Цитата(AyanTai @  24.12.2008,  08:27 Найти цитируемый пост)
всем спасибо большое!!!

Не за что! smile 

Автор: Kbl4AH 24.12.2008, 12:37
Цитата(Данкинг @  24.12.2008,  12:05 Найти цитируемый пост)
Ну да, у меня же Direct Oracle Access используется.

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)