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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.07.2013, 07:07
demon-sheff demon-sheff вне форума
Прохожий
 
Регистрация: 24.06.2013
Сообщения: 29
Версия Delphi: Delphi 7
Репутация: 10
Печаль Помогите с запросом

Доброе время суток уважаемые программисты! Не могли бы вы помочь мне в следующем вопросе. Имеется таблица в EXCEL в ней 5 столбцов надо их отправить в бд по следующим запросам:
добавление
INSERT INTO ZKOKS.OLD_NUMBER (ID, REG_ID, TYPE, NUM)
VALUES (:ID, :REG_ID, :TYPE, :NUM)


изменение
UPDATE ZKOKS.OBJ
SET INV_NUM = :INV_NUM, CAD_NUM = :CAD_NUM
WHERE (OBJ.CAD_NUM = 'список')

подключение к базе я реализовал, таблицу выгрузил в StringGrid? а как связать эту таблицу по средством запроса с БД не знаю. Прошу Вашей помощи. Заранее благодарен!
Вложения
Тип файла: 7z OLD_NUMBER.7z (7.9 Кбайт, 3 просмотров)
Ответить с цитированием
  #2  
Старый 30.07.2013, 12:10
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

А с чего вдруг в StringGrid? Сей компонент не заточен под работу с базами. Используйте TDBGrid.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 30.07.2013, 13:25
demon-sheff demon-sheff вне форума
Прохожий
 
Регистрация: 24.06.2013
Сообщения: 29
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Сделал через DBGrid, а как дальше реализовать?
Ответить с цитированием
  #4  
Старый 30.07.2013, 15:27
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Поскольку вам надо делать запрос, то подключение через OLE вам не поможет, значит подключаемся к таблице через ADO. Используем примерно такую строку подключения:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Отпуска.xls;Extended Properties=Excel 8.0;Persist Security Info=False

Далее для проверки выполняем запрос к нужному листу в таблице:
select * from [Лист1$]

Все данные с листа экселя прочитаны.

С подключением и чтением данных разобрались. Теперь поясните ваш пост.
1. Вы пишете 5 столбцов, а в запросе вижу только 4.
2. Из экселя считываются все данные или есть критерий какой-то
3. В какую базу надо записать? Об этом ни слова.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 31.07.2013, 11:11
demon-sheff demon-sheff вне форума
Прохожий
 
Регистрация: 24.06.2013
Сообщения: 29
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Поскольку вам надо делать запрос, то подключение через OLE вам не поможет, значит подключаемся к таблице через ADO. Используем примерно такую строку подключения:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Отпуска.xls;Extended Properties=Excel 8.0;Persist Security Info=False

Далее для проверки выполняем запрос к нужному листу в таблице:
select * from [Лист1$]

Все данные с листа экселя прочитаны.

Как раз таки я так и сделал.

1.Насчет столбцов можно увидеть в архиве
2.Из экселя, который я выгрузил в DBGrid необходимы по первому запросу 4 поля, а вот по второму другие 2 (но они тоже имеются в таблице)
3. В базу ORACLE надо выгрузить (подключение к ней реализовал через SQLConnection)
Ответить с цитированием
  #6  
Старый 31.07.2013, 13:55
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Ага, уже проясняется. Конечно тут вроде напрашиваются гетерогенные запросы, но я в них не силен, особенно с подключением к ораклу, а потому пойдем нешустрым, но надежным путем.
(Непосредственно для передачи данных нам грид не потребуется. Разве что посмотреть, что собственно копируется.)
Значит имеем 2 подключения к разным базам. Пишем такой код:
Код:
SQLQuery1.SQL.Text := 'insert into OracleTable (Fld1,Fld2,Fld3,Fld4,Fld5) Values(:Val1, :Val2, :Val3, :Val4, :Val5)';
while not AdoQuery1.Eof
do begin
     SQLQuery1.Params.ParamValues['Val1'] := AdoQuery1.FieldValues['Fld1'];
     SQLQuery1.Params.ParamValues['Val2'] := AdoQuery1.FieldValues['Fld2'];
     SQLQuery1.Params.ParamValues['Val3'] := AdoQuery1.FieldValues['Fld3'];
     SQLQuery1.Params.ParamValues['Val4'] := AdoQuery1.FieldValues['Fld4'];
     SQLQuery1.Params.ParamValues['Val5'] := AdoQuery1.FieldValues['Fld5'];
     SQLQuery1.ExecSQL;
     AdoQuery1.Next;
     end;
Подставьте вместо OracleTable имя таблицы куда грузим, и вместо FldN имена полей в таблицах оракла и экселя.
Вроде должно работать.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 31.07.2013 в 14:00.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
demon-sheff (01.08.2013)
  #7  
Старый 01.08.2013, 10:27
demon-sheff demon-sheff вне форума
Прохожий
 
Регистрация: 24.06.2013
Сообщения: 29
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо огромное, Вы мне очень сильно помогли! 1 запрос прошел на ура!!! а вот со 2 выходит проблемка. Может я чего не так делаю:
Код:
   SQLQ.SQL.Text := 'UPDATE ZKOKS.OBJ SET INV_NUM = :NUM WHERE OBJ.CAD_NUM = '+':CAD_NUM';
while not AdoQuery1.Eof
do begin
     SQLQ.Params.ParamValues['INV_NUM'] := AdoQuery1.FieldValues['NUM'];
     SQLQ.Params.ParamValues['CAD_NUM'] := AdoQuery1.FieldValues['CAD_NUM'];
     Showmessage('Данные изменены!');
     SQLQ.ExecSQL;
     AdoQuery1.Next;
     end;

А выдает такую ошибку: SQLQ:Parameter 'INV_NUM' not found
Ответить с цитированием
  #8  
Старый 01.08.2013, 12:58
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Видимо хотелось так:
Код:
SQLQ.Params.ParamValues['NUM'] := AdoQuery1.FieldValues['NUM'];
т.е. полю INV_NUM в оракле будет присвоено значение параметра NUM который в свою очередь будет хранить значение эксельного столбца NUM. Так?
И еще, такой момент. Изменение данных производится после SQLQ.ExecSQL, а не до. Если по какой-то причине запрос не прошел, ваше сообщение Showmessage('Данные изменены!'); будет ложным.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 01.08.2013 в 13:03.
Ответить с цитированием
  #9  
Старый 01.08.2013, 13:03
demon-sheff demon-sheff вне форума
Прохожий
 
Регистрация: 24.06.2013
Сообщения: 29
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
т.е. полю INV_NUM в оракле будет присвоено значение параметра NUM который в свою очередь будет хранить значение эксельного столбца NUM. Так?
именно так!
Ответить с цитированием
  #10  
Старый 02.08.2013, 07:24
demon-sheff demon-sheff вне форума
Прохожий
 
Регистрация: 24.06.2013
Сообщения: 29
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Видимо хотелось так:
Код:
SQLQ.Params.ParamValues['NUM']:= AdoQuery1.FieldValues['NUM'];
т.е. полю INV_NUM в оракле будет присвоено значение параметра NUM который в свою очередь будет хранить значение эксельного столбца NUM. Так?
только вот поле INV_NUM содержится в другой таблице и называется оно не NUM, а INV_NUM будет ли это правильный вариант?
Ответить с цитированием
  #11  
Старый 02.08.2013, 10:33
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

У вас параметр как-бы прослойка между экселем и ораклом. Т.е. все 3 сущности, поле оракла, поле экселя, имя параметра могут иметь и одинаковые и разные имена. Главное самому не запутаться, что куда передается. В вашем запросе последовательность такая:
AdoQuery1.FieldValues['NUM'] --> SQLQ.Params.ParamValues['NUM'] --> ZKOKS.OBJ.INV_NUM
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
demon-sheff (02.08.2013)
  #12  
Старый 02.08.2013, 11:19
demon-sheff demon-sheff вне форума
Прохожий
 
Регистрация: 24.06.2013
Сообщения: 29
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

СПАСИБО БОЛЬШОЕ! Очень вразумительный ответ!
Тему можно закрывать.
Ответить с цитированием
  #13  
Старый 07.08.2013, 13:59
demon-sheff demon-sheff вне форума
Прохожий
 
Регистрация: 24.06.2013
Сообщения: 29
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

при длительном тестировании выяснилось, что
Код:
kol:integer;
begin
    kol:= DBGrid3.DataSource.DataSet.RecordCount;
 SQLQ.SQL.Text := 'UPDATE ZKOKS.OBJ SET INV_NUM =(:NUM) WHERE OBJ.CAD_NUM = '+'(:CAD_NUM)';
while not AdoQuery1.Eof
do begin
     SQLQ.Params.ParamValues['NUM'] := AdoQuery1.FieldValues['NUM'];
     SQLQ.Params.ParamValues['CAD_NUM'] := AdoQuery1.FieldValues['CAD_NUM'];
     SQLQ.ExecSQL;
     AdoQuery1.Next;
     Label2.Caption:='Выполненое действие: изменены '+inttostr(kol)+' запис(и)ей!';
     end;
INV_NUM был такого типа 2333, а в базу с он попадает таким видом 2,333E+003 и со всеми числами делает такое x,xxxE+003
где x число которое должно быть.
Как с этим бороться кто-нибудь знает?
Ответить с цитированием
  #14  
Старый 07.08.2013, 20:35
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Никак с этим бороться не надо. Это все тоже значение,только у вас представление этого числа на экран стало почему-то экспонентным. Например эксель с числами не влезающими в ячейку проделывает такой фокус - для комактности Просто задайте формат представления числа и все должно исправится.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #15  
Старый 08.08.2013, 14:54
demon-sheff demon-sheff вне форума
Прохожий
 
Регистрация: 24.06.2013
Сообщения: 29
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Просто задайте формат представления числа и все должно исправится.
пробовал не работае...
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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