Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.09.04;
Скачать: [xml.tar.bz2];

Вниз

доступ к результатам запроса   Найти похожие ветки 

 
777   (2005-07-26 10:34) [0]

Проблема следующая. Надо результат запроса к одной из БД записать (а потом дополнить) данными из другой БД. Для этого во второй БД создается таблица. Потом результат запроса к 1-ой базе (ADOQuery1) пытаюсь затолкать во вторую:
ADOQuery1.Open;
for Index := 1 to ADOQuery1.RecordCount do
 begin
   QueryText := QueryText + "INSERT INTO TempTable (ProviderID, Name, Characteristics, ProviderPrice, Presence) VALUES (""" + ADOQuery1.DataSource.DataSet.FieldByName("Code").Value + """, """ + ADOQuery1.DataSource.DataSet.FieldByName("Name").Value + """, """ + ADOQuery1.DataSource.DataSet.FieldByName("Characteristics").Value + """, " + StringReplace(FloatToStr(ADOQuery1.DataSource.DataSet.FieldByName("Price").Value), ",", ".", []) + ", """ + ADOQuery1.DataSource.DataSet.FieldByName("Presence").Value + """) ";
   ADOQuery1.Next
 end;
ADOQuery2.SQL.Text := QueryText;
ADOQuery2.ExecSQL
Так вот проблем возникает на 3-ей строке, когда пытаюсь QueryText присвоить некоторые значение из ADOQuery1. По отладке видно, что DataSource у него Nil. Что делать?
PS однако сам результат запроса в Query1 прекрасно отображается в гриде, если грид настроить на Query1


 
Lexer ©   (2005-07-26 10:37) [1]

А зачем ты обращаешься к ADOQuery1.DataSource, я так понял тебе надо к самому ADOQuery1, тогда так:
ADOQuery1..FieldByName(.....).Value


 
777   (2005-07-26 10:40) [2]

Просто я не знал, что у ADOQuery есть метод FieldByName, т.е. я думал, что он доступен только через DataSourse.DataSet
Спасибо! Сейчас попробую


 
msguns ©   (2005-07-26 11:01) [3]

Св-во DataSet.DataSource служит для связки датасета с главным НД в линковках типа Master-Detail и к сабжу никакого отношения не имеет.

Попутно вопрос:
А зачем так вычурно, нельзя ли во временную таблицу вставлять из ADOQuery1 непосредственно запросом ?
Т.е. заменить SQL в ADOQuery1 с SELECT FROM TABLE1 на
INSERT INTO TEMPTABLE .. SELECT FROM TABLE1

?


 
Ega23 ©   (2005-07-26 11:06) [4]

2 msguns ©   (26.07.05 11:01) [3]
Св-во DataSet.DataSource служит для связки датасета с главным НД в линковках типа Master-Detail и к сабжу никакого отношения не имеет.

Это только одно из применений. Основное - TDataLink.DataSource.DataSet. А потомки TDataLink есть у каждого DB-компонента


 
msguns ©   (2005-07-26 11:06) [5]

Если уж так надо заполнять TEMPTABLE именно в цикле через открытый запрос к 1-й базе (while not Eof do .. Next ..), то зачем добавлять запросами ? Не проще ли добавление делать методами самого датасета, например AppendRecord ?


 
msguns ©   (2005-07-26 11:11) [6]

>Ega23 ©   (26.07.05 11:06) [4]
>Это только одно из применений.
Основное - TDataLink.DataSource.DataSet.

Поясни для особо тупых.

Читаем справку:
Specifies the data source component from which to extract current field values to use in same-name parameters in the ADO query’s SQL statement.

property DataSource: TDataSource;

Description

Set DataSource to automatically fill parameters in a query with fields values from another dataset. Parameters that have the same name as fields in the other dataset are filled with the field values. Parameters with names that are not the same as fields in the other dataset do not automatically get values, and must be programmatically set. For example, if the SQL property of the TADOQuery contains the SQL statement below and the dataset referenced through DataSource has a CustNo field, the value from the current record in that other dataset is used in the CustNo parameter:

SELECT *

FROM Orders O

WHERE (O.CustNo = :CustNo)

DataSource must point to a TDataSource component linked to another dataset component; it cannot point to this query component. The dataset specified in DataSource must be created, populated, and opened before attempting to bind parameters. Parameters are bound by setting the ADO query’s Prepared property to True prior to executing the query. If the SQL statement used by a query does not contain parameters, or all parameters are bound by the application using the Parameters property or the ParamByName method, DataSource need not be assigned. The example below shows setting the DataSource property of ADOQuery2 to the data source for ADOQuery1, preparing ADOQuery2, and activating ADOQuery2:

with ADOQuery2 do begin

 DataSource := DataSource1;
 Prepared := True;
 Open;

end;


В простонародье такая привязка именуется Master-Detail


 
msguns ©   (2005-07-26 11:15) [7]

Приведенная выше справка - из TADOQuery

Теперь читаем о "дедушке" (TDataSet):

Represents the data source of another dataset that supplies values to the dataset.

property DataSource: TDataSource;

Description

As implemented in TDataSet, the DataSource property is always nil.

Descendant dataset classes that support specifying a data source redeclare and implement methods for getting and setting the DataSource property


Ну и где ж тут собачка закопалась ? В смысле связь с [4]


 
Ega23 ©   (2005-07-26 11:17) [8]

Поясню. Откуда, по-твоему, компонент TDBGrid знает про данные? Ведь у него свойство TDataSource, а не TDataSet?

А знает он о данных вот откуда: есть у него "внутре" класс TDataLink, точнее TGridDataLink. У которого есть свойство TDataSource, у которого, в свою очередь, есть свойство TDataSet. И данные для отображения в гриде беруться как раз из этой связки.


 
Ega23 ©   (2005-07-26 11:18) [9]

Ганз, пардон!
Я невнимательно посмотрел. Ты о TDataSet.DataSource, а я о TdataSource.DataSet.
Прошу прощения.


 
msguns ©   (2005-07-26 11:20) [10]

>Ega23 ©   (26.07.05 11:17) [8]

Только вот не надо в церковь с б..ми, а в бордель с попами, ладушки ? Грид - это грид, а датасет - это датасет. И датасету глубоко серобуромалиново, кто там юзает его рекорды для визуализации или чего-там еще. Кстати, из сабжа вообще не видно, отображается ли квери1 или нет.

Ежа, не умничай ;))


 
Lexer ©   (2005-07-26 11:23) [11]

>msguns ©   (26.07.05 11:20) [10]
>Кстати, из сабжа вообще не видно, отображается ли квери1 или нет

>777   (26.07.05 10:34) [0]
>PS однако сам результат запроса в Query1 прекрасно отображается в гриде, если грид настроить на Query1


 
Ega23 ©   (2005-07-26 11:24) [12]

2 msguns ©   (26.07.05 11:20) [10]
Ежа, не умничай ;))

Да я просто как раз сейчас эту фигню мучаю, с TDataLink...
Достало уже...


 
msguns ©   (2005-07-26 11:25) [13]

>Lexer ©   (26.07.05 11:23) [11]
>777   (26.07.05 10:34) [0]
>PS однако сам результат запроса в Query1 прекрасно отображается в гриде, если грид настроить на Query1

Блин, имелось в виду, что к сабжевой проблеме грид ни ухом, ни рылом.
Лишь бы прикопаться ?
;)))


 
777   (2005-07-26 11:26) [14]

2 msguns
Да, все нормально! Всем огромное спасибо! За просвещение особенно!!!


 
ANB ©   (2005-07-26 11:31) [15]

Автору :

Поубивал бы за такой код.

1. Напиши инсерт с параметрами.
2. Полный изгал - пихать в SQL.Text кучу инсертов.
3. Вместо ADOQuery1.DataSource.DataSet.FieldByName
надо ADOQuery1.FieldByName. А DataSource у нее и должен быть nil (хорошо хоть сразу на ошибку нарвался).
4. Еще лучше для такого варианта - как в msguns ©   (26.07.05 11:01) [3]
4. Купи книжку. И прочитай ее.


 
msguns ©   (2005-07-26 11:38) [16]

>Ega23 ©   (26.07.05 11:24) [12]
>Да я просто как раз сейчас эту фигню мучаю, с TDataLink...
Достало уже...

Кто о чем, а матрос о сиське ;))
Сори за офтоп


 
777   (2005-07-26 11:40) [17]

2 ANB
1. инсерт с параметрами писать не умею: маленький еще, студент;
2. согласен, просто другого способа не знаю;
3. уже все давно понял;
4. книжку я и так читаю, но не всё сразу!
а если результат query1 еще пока не есть таблица в базе (просто набор данных в моей программе), то как я могу делать такой запрос:
insert into TempTable (...) values ((select ..., ..., ... from <вот здесь данные у меня в query1, а не в таблицеб которая в базе>))


 
Fay ©   (2005-07-26 11:41) [18]

2 ANB ©   (26.07.05 11:31) [15]
>> 2. Полный изгал - пихать в SQL.Text кучу инсертов.
INSERT-ов нужно писать ровно столько, сколько требуется.

>> 4. Купи книжку. И прочитай ее.
Согласен, клиент созрел 8)


 
Fay ©   (2005-07-26 11:42) [19]

2 777   (26.07.05 11:40) [17]
Читай книжку внимательнее. У тебя очень подозрительное (для MSSQL) имя временной таблицы.


 
Fay ©   (2005-07-26 11:44) [20]

2 777   (26.07.05 11:40) [17]
Ещё. Никаких for Index := 1 to ADOQuery1.RecordCount do! В крайнем случае
ADOQuery1.First;
while not ADOQuery1.Eof do
 begin
   ...
   ADOQuery1.Next;
 end;


 
777   (2005-07-26 11:45) [21]

2 Fay
Да, но мне же надо сначала посмотреть, как она заполняется, вот я и сделал пока не временную, а простую.
а по поводу книжки... Есть просто вещи, которые только с опытом приходят. по крайней мере мне так кажется


 
msguns ©   (2005-07-26 11:47) [22]

>777   (26.07.05 11:40) [17]
>insert into TempTable (...) values ((select ..., ..., ... from <вот здесь данные у меня в query1, а не в таблицеб которая в базе>))

values тут не нужен

INSERT INTO T1 (P1,P2,P3,..PN)
  SELECT P1,P2,P3,...PN FROM T2
    WHERE ...

Главное, чтобы все эти P1,P2..PN были однотипными.

А вообще Delphi->Help->Deplhi Tools->Local SQL->DML-Statements->INSERT


 
msguns ©   (2005-07-26 11:50) [23]

Для работы со скалой из дельфей (ADO+Jet) почитай еще jetsql40.chm


 
Fay ©   (2005-07-26 11:52) [24]

2 777   (26.07.05 11:45) [21]
Стоит послушать msguns

2 msguns ©   (26.07.05 11:47) [24]
>> А вообще Delphi->Help->Deplhi Tools->Local SQL->DML-Statements->INSERT
На самом деле автору нужно в Books Online.


 
Ega23 ©   (2005-07-26 11:52) [25]

Мне так кажется, что и Delphi-то тут не нужен...
Всё можно средствами MS SQL решить...


 
Fay ©   (2005-07-26 11:52) [26]

2 msguns ©   (26.07.05 11:47) [24]
Потрясаюшая креативность!!! 8)


 
77   (2005-07-26 11:56) [27]

нет гарантии, что они однотипные, поэтому приходится юзать кучу инсертов.


 
msguns ©   (2005-07-26 11:59) [28]

>77   (26.07.05 11:56) [27]

CAST/CONVERT в помощь


 
Fay ©   (2005-07-26 12:01) [29]

2 77   (26.07.05 11:56) [27]
Это не причина. Приведение можно сделать и на T-SQL.

З.Ы.
77 после 777 - это повышение/понижение по званию? 8)


 
ANB ©   (2005-07-26 12:04) [30]


> Fay ©   (26.07.05 11:41) [18]
- не нужно, а можно. Но не нужно. Куда эту строку потом пихать ? И, имхо, далеко не все сервера едят пакетные инсерты. Это особенность MS SQL. Зачем извращаться то.


> 77   (26.07.05 11:56) [27]
> нет гарантии, что они однотипные, поэтому приходится юзать
> кучу инсертов.
??????? Если у тебя Table1.P1 и Table2.P1 разнотипные, то тут и куча инсертов не поможет.


 
Fay ©   (2005-07-26 12:11) [31]

2 ANB ©   (26.07.05 12:04) [30]
>> И, имхо, далеко не все сервера едят пакетные инсерты. Это особенность MS SQL.

Враки. Злобные враки.

>> Зачем извращаться то.
Это не извращение. Запрос должен включать с себя то, что он должен делать. Не вижу повода для воздержания.


 
ANB ©   (2005-07-26 12:23) [32]


> Fay ©   (26.07.05 12:11) [31]

Oracle + Odac - не работает.


 
777   (2005-07-26 12:23) [33]

Ну вот!
Запрос
INSERT INTO TempTable (ProviderID,  [Name], Chatacteristics, ProviderPrice, Presence)
(SELECT Code, [Name], Characteristics, Price, Presence
FROM ADOQuery1)
ошибка: неопознал ADOQuery1. в запросах же можно только объекты БД указывать, а не мешать их с объектами программы.


 
ANB ©   (2005-07-26 12:25) [34]


> 777   (26.07.05 12:23) [33]

Читать учебники еще раз, до полного просветления.
Ну откуда MS SQL знает о существовании ADoQuery, твоей программы и вообще Delphi ?
У тебя в ADOQuery1 что лежит ?


 
753   (2005-07-26 12:27) [35]

результат запроса


 
Fay ©   (2005-07-26 12:30) [36]

2 ANB ©   (26.07.05 12:23) [32]

>> Это особенность MS SQL.
>> 2 Oracle + Odac - не работает.

Во первых.
Что-то я не совсем понимаю. IMHO, (ODAC <> dbGO) & (MSSQL <> Oracle).

Во-вторых. (Odac+Oracle) и так не жуют?
begin
 insert into Table1(... ;
 insert into Table1(... ;
 insert into Table1(... ;
 insert into Table1(... ;
 insert into Table1(... ;
 insert into Table1(... ;
 commit;
end;


 
777   (2005-07-26 12:32) [37]

вы бы открыли параллельную ветку и разговаривали бы там про оракл и одак. конечно, спасибо вам огромное (и за насмешки ваши тоже), но...


 
Fay ©   (2005-07-26 12:36) [38]

2 777   (26.07.05 12:23) [33]

ADOQuery2.SQL.Text :=
"insert into TempTable (ProviderID,  [Name], Chatacteristics, ProviderPrice, Presence)"#13#10+
"select Code, [Name], Characteristics, Price, Presence"#13#10+
"from ("+ADOQuery1.SQL.Text+") Q";


 
msguns ©   (2005-07-26 12:40) [39]

>Fay ©   (26.07.05 12:36) [38]

Так не корректно (в квери могут быть параметры или "лишние" поля)


 
777   (2005-07-26 12:43) [40]

так не прокатит:
1-ая база MS Access
2-ая база MS SQL Server
Query1:
SELECT
 (iif(InStr([F2], "(") > 0, Mid([F2], 1, InStr([F2], "(") - 1), iif(InStr([F2], "/") > 0, Mid([F2], 1, InStr([F2], "/") - 1), iif(InStr([F2], ",") > 0, Mid([F2], 1, InStr([F2], ",") - 1), [F2])))) AS Name,
 (iif(InStr([F2], "(") > 0, Mid([F2], InStr([F2], "(")), iif(InStr([F2], "/") > 0, Mid([F2], InStr([F2], "/")), iif(InStr([F2], ",") > 0, Mid([F2], InStr([F2], ",") + 1), Null)))) AS Characteristics,
 F14 AS Price,
 F6 AS Presence,
 "1-" + F1 AS Code
FROM Лист1
WHERE ((Лист1.F9) <> "") AND ((Лист1.F2) <> "Наименование товаров")
UNION ALL
SELECT
 (iif(InStr([F5], "(") > 0, Mid([F5], 1, InStr([F5], "(") - 1), iif(InStr([F5], "/") > 0, Mid([F5], 1, InStr([F5], "/") - 1), iif(InStr([F5], "<") > 0, Mid([F5], 1, InStr([F5], "<") - 1), iif(InStr([F5], "[") > 0, Mid([F5], 1, InStr([F5], "[") - 1), iif(InStr([F5], ",") > 0, Mid([F5], 1, InStr([F5], ",") - 1), [F5])))))) AS Name,
 (iif(InStr([F5], "(") > 0, [F6] + Mid([F5], InStr([F5], "(")), iif(InStr([F5], "/") > 0, [F6] + Mid([F5], InStr([F5], "/")), iif(InStr([F5], "<") > 0, [F6] + Mid([F5], InStr([F5], "<"), InStr([F5], ">")), iif(InStr([F5], "[") > 0, [F6] + Mid([F5], InStr([F5], "[")), iif(InStr([F5], ",") > 0, Mid([F5], InStr([F5], ",") + 1), [F6])))))) AS Characteristics,
 F9 AS Price,
 F10 AS Presence,
 "2-" + Trim(Str(F14)) AS Code
FROM In_a
WHERE (((In_a.F14) <> 0) AND ((In_a.F1) <> "Категория"))
многие функции, которые стандартные для аксес, не знакомы SQL Server, поэтому этот запрос будет для него... синтаксически неверен



Страницы: 1 2 вся ветка

Форум: "Базы";
Текущий архив: 2005.09.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.014 c
4-1121525767
PSV84
2005-07-16 18:56
2005.09.04
Работа с тензоизмерителями М0600-Д4 "Микросим"


4-1121502941
Delphi_is_cool
2005-07-16 12:35
2005.09.04
Как отловить клик правой кнопи мыши ?


3-1121936680
Fynjy1984
2005-07-21 13:04
2005.09.04
сумму по модулю DBGridEh


11-1106233060
DummyCoder
2005-01-20 17:57
2005.09.04
TKOLTreeView -> ToFile


11-1106564069
Sphinxx
2005-01-24 13:54
2005.09.04
Вопрос о TKOLEcmListEdit





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский