![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Доброе время суток уважаемые программисты! Не могли бы вы помочь мне в следующем вопросе. Имеется таблица в 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? а как связать эту таблицу по средством запроса с БД не знаю. ![]() |
#2
|
||||
|
||||
![]() А с чего вдруг в StringGrid? Сей компонент не заточен под работу с базами. Используйте TDBGrid.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
![]() Сделал через DBGrid, а как дальше реализовать?
|
#4
|
||||
|
||||
![]() Поскольку вам надо делать запрос, то подключение через 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
|
|||
|
|||
![]() Цитата:
Как раз таки я так и сделал. 1.Насчет столбцов можно увидеть в архиве 2.Из экселя, который я выгрузил в DBGrid необходимы по первому запросу 4 поля, а вот по второму другие 2 (но они тоже имеются в таблице) 3. В базу ORACLE надо выгрузить (подключение к ней реализовал через SQLConnection) |
#6
|
||||
|
||||
![]() Ага, уже проясняется. Конечно тут вроде напрашиваются гетерогенные запросы, но я в них не силен, особенно с подключением к ораклу, а потому пойдем нешустрым, но надежным путем.
![]() (Непосредственно для передачи данных нам грид не потребуется. Разве что посмотреть, что собственно копируется.) Значит имеем 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; Вроде должно работать. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 31.07.2013 в 14:00. |
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
demon-sheff (01.08.2013)
|
#7
|
|||
|
|||
![]() Спасибо огромное, Вы мне очень сильно помогли! 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
|
||||
|
||||
![]() Видимо хотелось так:
Код:
SQLQ.Params.ParamValues['NUM'] := AdoQuery1.FieldValues['NUM']; И еще, такой момент. Изменение данных производится после SQLQ.ExecSQL, а не до. Если по какой-то причине запрос не прошел, ваше сообщение Showmessage('Данные изменены!'); будет ложным. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 01.08.2013 в 13:03. |
#9
|
|||
|
|||
![]() Цитата:
|
#10
|
|||
|
|||
![]() Цитата:
|
#11
|
||||
|
||||
![]() У вас параметр как-бы прослойка между экселем и ораклом. Т.е. все 3 сущности, поле оракла, поле экселя, имя параметра могут иметь и одинаковые и разные имена. Главное самому не запутаться, что куда передается. В вашем запросе последовательность такая:
AdoQuery1.FieldValues['NUM'] --> SQLQ.Params.ParamValues['NUM'] --> ZKOKS.OBJ.INV_NUM Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
demon-sheff (02.08.2013)
|
#12
|
|||
|
|||
![]() СПАСИБО БОЛЬШОЕ! Очень вразумительный ответ!
Тему можно закрывать. |
#13
|
|||
|
|||
![]() при длительном тестировании выяснилось, что
Код:
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; где x число которое должно быть. Как с этим бороться кто-нибудь знает? |
#14
|
||||
|
||||
![]() Никак с этим бороться не надо. Это все тоже значение,только у вас представление этого числа на экран стало почему-то экспонентным. Например эксель с числами не влезающими в ячейку проделывает такой фокус - для комактности
![]() Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#15
|
|||
|
|||
![]() Цитата:
![]() |