![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать sql запрос к нескольким таблицам (ADO,MS Access)?
gedevan © (2016-01-08 14:52:00)есть несколько таблиц которые на выходе запроса я хочу превратить в одну. Причем в интернете описывается как одну таблицу присоединить к другой (т.е. делается соединение приклеиванием справа колонок другой таблицы). Мне же нужно, чтобы мои таблицы в результирующей выборки шли одна за другой. Причем в таблицах есть как одинаковые колонки, так и уникальные для каждой таблицы. Т.е. как сделать чтобы в итоговой выборке совпадающие по имени колонки совместились (по вертикали), а несовпадающие также присутствовали в итоговой выборке, но в тех частях данных которые соответствуют таблицам где такой колонки нет, там просто были бы пустые значения. И еще как прикрутить к этой таблице колонку "Имя таблицы" и записать в него имя таблицы из которой собственно эти данные в выборку и попали?
Сейчас я сделал отдельный запрос к каждой таблице, работает жутко медленно, вот и возник вопрос, надеюсь что одним запросом быстрее получится.
gedevan (2016-01-29 08:46:00) [1]разобрался TVTableLog.Canvas.Font.Color := clGreen; нужно писать
gedevan (2016-01-28 13:43:00) [2]глюк случается если в одной колонке в разных ячейках выполняются оба этих условия(т.е. есть и tempfound = true и tempfound = false в колонке):
if ADODataSet1.FieldByName('tempfound').Value = true then
Font.Color := clGreen;
//else if ADODataSet1.FieldByName('tempfound').Value = false then
// Font.Color := clred;
и вот если например, второе закомментировать, то глюка нет. А как тогда раскрасить в разные цвета? (
gedevan (2016-01-28 13:28:00) [3]Делфи xe5 AdoDataSet использую.
В общем я сделал перерисовывание в ДБГриде. Но есть одна беда. Переодически после очередного запроса DBGrid начинает непрерывно и без остановки вызывать функцию (запрос при этом не вызывается вновь, т.е. оно "само")
procedure TTv.TVTableLogDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: integer; Column: TColumn; State: TGridDrawState);
var
t: string;
begin
if ADODataSet1.FieldByName('tempfound').Value = true then
Font.Color := clGreen
else if ADODataSet1.FieldByName('tempfound').Value = false then
Font.Color := clred;
if (Column.FieldName = 'Expr1000') or (Column.FieldName = 'Name') or
(Column.FieldName = 'ItemName') then
begin
with TVTableLog.Canvas do
begin
Brush.Color := clwhite;
if Column.Field <> nil then
begin
FillRect(Rect);
TextOut(Rect.Left + 2, Rect.Top + 2, Column.Field.Text);
end;
end;
end
else
begin
with TVTableLog.Canvas do
begin
Brush.Color := clwhite;
if Column.Field <> nil then
begin
t := Column.Field.Text;
if (Column.FieldName = 'FourSearch') or
(Column.FieldName = 'SearchFixed') or
(Column.FieldName = 'anotherTime') then
begin
if t = '-1' then
t := 'True'
else if t = '0' then
t := 'False';
end;
FillRect(Rect);
TextOut(Rect.Right - 2 - TextWidth(t), Rect.Top + 2, t);
end;
end;
end;
end;
из за этого все мигает и криво перерисовывается. В принципе если вот это решить то тогда с остальным можно не мучиться.
sniknik (2016-01-28 13:10:00) [4]> т.к. Column.Field = nil тогда (
как у булена с дефзначением вдруг значение nil???
+
AsBoolean должно преобразовывать в фалсе.
sniknik (2016-01-28 13:06:00) [5]> ошибка аксес виолейшн.
пятая дельфя и adoquery используешь?
http://www.delphisources.ru/pages/faq/base/ado_acc_viol_err.html
gedevan (2016-01-28 13:05:00) [6]т.к. Column.Field = nil тогда (
gedevan (2016-01-28 13:02:00) [7]я понял он вылетает в Column.Field.Text этом месте когда Column.FieldName = 'FourSearch', Т.е. туда должно было быть помещено значение помноженное на -1 или свичем полученное
gedevan (2016-01-28 12:49:00) [8]НЕ БЫВАЕТ ОШИБОК "ошибку выдает". в ошибке обычно ИНФОРМАЦИЯ о том что происходит.
ошибка аксес виолейшн. Выдается если не закомментировать при этом функцию из [37]. Где конкретно выдается понять так и не удалось...т.к. это происходит на какой то 100500 итерации или я вообще хз где.
sniknik (2016-01-28 11:59:00) [9]> 'Switch (FourSearch<>0, ''true'', FourSearch=0, ''false''),'
> вот это в запрос вставлять?
все зависит от контекста КАК ИМЕННО вставлять, и для чего. вставить к примеру палку в колесо велосипеда на ходу, или на стоянке разные вещи. чтобы велосипед остановить/он не поехал или подогнуть спицы тоже.
> ошибку выдает (
НЕ БЫВАЕТ ОШИБОК "ошибку выдает". в ошибке обычно ИНФОРМАЦИЯ о том что происходит.
> чего секретный то, я ж показывал запрос
т.е. мы уже столько общаемся а запрос не поменялся вообще никак... смысл тогда?
gedevan (2016-01-28 11:52:00) [10]свич тоже работает...одна проблема, DBGrid тогда вообще ничего не показывает.
В общем если делать через дбгрид (что я уже пытался, но не очень успешно). То вопрос.
Если я с одной стороны подключаю TADODataSet к DBGrid, а с другой бегаю циклам по выборке TADODataSet - это правильно или будет вызывать проблемы? (потому что у меня DBGrid глючит при попытках в нем что либо перерисовывать).
procedure TTv.TVTableLogDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: integer; Column: TColumn; State: TGridDrawState);
begin
if ADODataSet1.FieldByName('tempfound').Value = true then
Font.Color := clGreen
else if ADODataSet1.FieldByName('tempfound').Value = false then
Font.Color := clred;
if (Column.FieldName = 'Expr1000') or (Column.FieldName = 'Name') or
(Column.FieldName = 'ItemName') then
begin
with TVTableLog.Canvas do
begin
Brush.Color := clwhite;
FillRect(Rect);
TextOut(Rect.Left + 2, Rect.Top + 2, Column.Field.Text);
end;
end
else
begin
with TVTableLog.Canvas do
begin
Brush.Color := clwhite;
FillRect(Rect);
TextOut(Rect.Right - 2 - TextWidth(Column.Field.Text), Rect.Top + 2,
Column.Field.Text)
end;
end;
end;
gedevan (2016-01-28 11:42:00) [11]ошибка при умножении возникала в другом месте..это не в запросе
gedevan (2016-01-28 11:35:00) [12]чего секретный то, я ж показывал запрос
Function GetPhotoQueryText(AConnection: TADOConnection;
var parQty: integer): string;
begin
result := '';
parQty := 0;
if TableExists(AConnection, 'Templates') then
begin
result := result +
'Select ' +
'''Tem'','+
'ShotNumber,' +
'Name,' +
'ItemName,' +
'NumberOfSearch,' +
'tempfound,'+
'itIsTemplate, '+
'anotherTime, '+
'SearchFixed, '+
'x1,' +
'x2,' +
'y1,' +
'y2,' +
'ksov,' +
'searchtime,' +
'FourSearch*(-1), '+
'NULL,' +
'errorCode ' +
'FROM Templates where ShotNumber = :prm0';
inc(parQty);
end;
//if result <> '' then
// result := result + ';';
// exit;
if TableExists(AConnection, 'ColorSearch') then
begin
if result <> '' then
result := result + ' UNION ';
result := result + 'Select ''Col'',ShotNumber, ' +
'Name,''no items'',0,tempfound,''false'',''false'',''false'',x1,x2,y1,y2,0,searchtime,' +
'''false'',NULL,errorCode FROM ColorSearch where ShotNumber = :prm2';
inc(parQty);
end;
if TableExists(AConnection, 'DynObj') then
begin
if result <> '' then
result := result + ' UNION ';
result := result + 'Select ' +
'''Dyn'',' +
'ShotNumber, ' +
'Name,' +
'''no items'',' +
'NumberOfSegment,' +
'tempfound,' +
'''false'',' +
'''false'',' +
'''false'',' +
'x1,' +
'x2,' +
'y1,' +
'y2,' +
'0,' +
'searchtime,' +
'''false'',' +
'NULL,' +
'errorCode' +
' FROM DynObj where ShotNumber = :prm1';
inc(parQty);
end;
if TableExists(AConnection, 'TextRecognize') then
begin
if result <> '' then
result := result + ' UNION ';
result := result + 'Select ''Tex'',ShotNumber, ' +
'Name,''no items'',NumberOfSegment,tempfound,''false'',''false'',''false'',x1,x2,y1,y2,0,se archtime,' +
'''false'',RecognizedText,errorCode FROM TextRecognize where ShotNumber = :prm3';
inc(parQty);
end;
if result <> '' then
result := result + ';';
end;
gedevan (2016-01-28 11:32:00) [13]
'Switch (FourSearch<>0, ''true'', FourSearch=0, ''false''),'
вот это в запрос вставлять? ошибку выдает (
sniknik (2016-01-28 11:27:00) [14]> на -1 отказывается умножать, вылетает с ошибкой запрос.
значит ты врешь, что у тебя accecc, либо "творчески" интерпретируешь мною сказанное и скрываешь инфу. (ошибка/как делаешь/чего этим добиваешься)
похоже проект секретный... "умываю руки".
sniknik (2016-01-28 11:22:00) [15]> вот это выражение выдает ошибку, что не может преобразовать.
> sniknik © (27.01.16 11:14) [15]
> > В остальных я просто подставляю
> подставляй No, если дело в том о чем пишешь, а не в 17й строке, поможет. хотя... насколько помню 0 прекрасно преобразуется в буленовский тип.
предположение про 17ю строку обретает смысл.
> Вот я и хочу подменить их также на строки прям в запросе
идиотское желание... верные данные, реальные типы менять на кривые/требующие дополнительного кода строки и только из-за представления их в гриде...
не нравится представление/отображение его и меняй, сами данные не трогай.
gedevan (2016-01-28 11:21:00) [16]
somefield * -1
если, как я понял, у тебя там "извращенное значение типа" - 0 = false, 1 = true.
на -1 отказывается умножать, вылетает с ошибкой запрос. Если убрать запросы с фиктивными полями, то DBGrid показывает True и False как и задумано. Причем я точно уверен что в запросе 0 и 1, где DBGrid берет -1 я понятия не имею.
sniknik (2016-01-28 11:16:00) [17]> про свич я ничего не нашел
ищи в справке акссса, гугль не нужен!
gedevan (2016-01-28 11:14:00) [18]на NO он не ругается и запрос выполняет. Но FourSearch := ADODataSet.FieldByName('FourSearch').Asboolean; вот это выражение выдает ошибку, что не может преобразовать. А если вставить строку то не выдает. В общем эту проблему я можно сказать решил, меня это устраивает.
Не устраивает же что DBGrid мне показывает 0 и -1 (вместо false, true)для значений из таблицы Templates (где я не просто нарисовал эти поля в запросе, а они реально есть в таблице Templates). Вот я и хочу подменить их также на строки прям в запросе
gedevan (2016-01-28 11:06:00) [19]да, забанили ( про свич я ничего не нашел. А Case when then else end выдает ошибку
sniknik (2016-01-28 10:39:00) [20]> А просто No нет.
выполни запрос -
SELECT yes, no