Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сделать sql запрос к нескольким таблицам (ADO,MS Access)?


Страницы:   1 2 3

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


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо