| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Базы данных и репортинг > Oracle+Delphi |
| Автор: AyanTai 19.12.2008, 11:34 |
| Доброго времени суток всем! просмотрев темы в поисковике, не нашел для себя ответа. с БД начал работать недавно- опыта нет(за неадыкватное высказывание прошу прощения). Задача в следующем: есть папка с файлами *.dbf (в которых есть поля: Фамилия |имя|Отчество|ID, ID пустой), так же есть таблица в БД Оракл с теми же полями (Фамилия |имя|Отчество|ID, НО ID не пустой). нужно прочитать данные из *.dbf, сравнить с таблицей Оракла и совпадающим по ФИО полям присвоить ID. и все выложить обратно в *.DBF файл. использую BDE(для открытия DBF) и ADO(соединение с ораклом). создал таблицу(пусть будет ОРА) в Оракле(однотипную что и DBF файл). затем в Table1 вывожу данные из выбранного файла и отражаю все в гриде...теперь хочу передать данные в пустую созданную таблицу(ОРА) Трабла в том что не знаю ( ниразу этого не далал) как передать даные из DBGrida в таблицу Оракловую за ранее всем спасибо кто поможет!!! Добавлено через 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, 11:58 |
| Frees - спасибо большое за быстроту ответа сейчас попробую!!! |
| Автор: Frees 19.12.2008, 11:59 | ||
занести данные в таблицу оракла из dbf можно вот так
|
| Автор: 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 |
Table1 это имя твоей тоблицы в оракле с фамилиями и ИД Добавлено через 43 секунды у те бя это как я понимаю Select * from ORA where FIO = :FIO |
| Автор: Данкинг 19.12.2008, 12:29 |
| Когда-то писал прогу для экспорта из DBF в Oracle (через ADO и DOA соответственно). Вот, прилагаю, может, пригодится. |
| Автор: AyanTai 19.12.2008, 12:38 |
| Респект и уважуха вам ребята!!! |
| Автор: Kbl4AH 20.12.2008, 22:10 |
Я вот, что такое Делфи даже не знал, а мне сказали проги на нем делать, которые с Oracle работают... Хорошо хоть оказалось всего лишь запросы делать |
| Автор: 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 - при такой конструкции разве так будут передаваться данные? у меня Делфи ругается....(( |
| Автор: Данкинг 22.12.2008, 12:04 | ||||
Ты сам понял, что написал? Да и вообще - весь цикл удали и напиши заново, там полная <она> написана. |
| Автор: 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, посмотри мой пример. |
| Автор: AyanTai 22.12.2008, 12:26 |
| и еще выдает ошибку "ORA-00933: SQL command not property ended" (( ставлю после Form1.Table1.Next; -> Form1.ADOQuery1.close; - не помогает(( |
| Автор: Данкинг 22.12.2008, 12:32 | ||||
Зачем тебе изменять поля AdoQuery и вручную, и запросом одновременно? Говорю же, посмотри мой пример! |
| Автор: 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; Данкинг - не могу понять что у тя в примере подошло бы к моей проге(( |
| Автор: Kbl4AH 22.12.2008, 12:56 |
Ошибка в тексте запроса... Делфи здесь не причем... исправляй запрос... Перед выполнением нового запроса текст старого нужно очищать... Я вместо Form1.ADOQuery1.SQL.Add(...); использую Form1.ADOQuery1.SQL.Text := ...; |
| Автор: Данкинг 22.12.2008, 16:45 |
Проход в цикле по таблице 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 | ||||
Ты записи Table перебираешь, а ADOQuery1 - нет... у тебя получается все разы в цикле только одна запись апдейтится... в ADOQuery1 тоже нужно записи перебирать... наверное, так:
|
| Автор: Данкинг 23.12.2008, 11:52 |
| Используйте insert into... , господа!! |
| Автор: 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-й пост... что сделать-то нужно? из грида вставить записи в оракловую таблицу?
не понял что-тут написано... что значит сравнить с таблицей Оракла? и передать данные в пустую созданную таблицу(ОРА)? так таблица в Оракле пустая или нет? |
| Автор: Данкинг 23.12.2008, 20:20 |
Ну правильно, а дальше там цикл по заполнению должен быть. |
| Автор: AyanTai 24.12.2008, 05:19 |
| Kbl4AH, - нужно просто передать данные в пустую таблицу Оракла(таблица в Оракле создана и имеет ту же структуру что и файл DBF), в гриде я файл DBF отразил теперь надо просто перегнать данные в таблицу Оракла. PS: а потом уже будет таблица полученная преобразовываться... Данкинг, - у меня не хватает какого-то компонента ... мож из-за этого. таблицу создает, а данные не передает...( что делать??? |
| Автор: AyanTai 24.12.2008, 08:27 |
| все ребята сделал...всем спасибо большое!!! отдельное спасибо: Данкинг, 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 |
Ну да, у меня же Direct Oracle Access используется. Не за что! |
| Автор: Kbl4AH 24.12.2008, 12:37 |