Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глючит OraQuery, Возникает ошибка при выполнении запроса 
:(
    Опции темы
AlexLogos
Дата 15.9.2009, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 23.4.2009

Репутация: нет
Всего: 1



Ситуация такая: на форме в определенном порядке валяються кнопка и ДеБеГрид. по кнопке выполняется запрос к ДБ Оракл в цыкле, значения подставляються из масива:
Код

with Form1,OraQuery1 do
 begin
    Active:=false;
    SQL.Clear;
    SQL.Add('select idattr from commonattr where iddoc='+IntToStr(UniGlo[i].n));
    ExecSQL; 
 end;

Прикол вот в чем при значении UniGlo[i].n = 3 по запросу должны выдаваться 27 записей, а выдается 25. При этом если я вне цыкла по другой кнопке с той же OraQuery1 выполню запрос "select idattr from commonattr where iddoc=3", мне вернуться 27 записей. Перед выполнением запроса в своей программе проверяю правильность синтаксиса с помощью TOAD. И теперь гвоздь программы - если мне вдруг вздумаеться увеличить высоту ДеБеГрида на такую что влазит без скрола > 25 записей - все работает как часики. В чем прикол, дамы и господа?
PM MAIL   Вверх
Romikgy
Дата 15.9.2009, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 4
Всего: 146



Цитата(AlexLogos @  15.9.2009,  14:34 Найти цитируемый пост)
ExecSQL; 

мож на Open заменишь ?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
AlexLogos
Дата 15.9.2009, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 23.4.2009

Репутация: нет
Всего: 1



Заменил. Запустил. История повторилась - при уменшении размера ДеБеГрида получаю 25 записей. Удаление Грида равно как и опустошение его ДатаСорса - ничего не дает - 25 хоть ты тресни. Какая тут связь?
PM MAIL   Вверх
former
Дата 15.9.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 7
Всего: 17



AlexLogos, случаем не D2009? А то я подобную ситуацию наблюдал с LookupComboBox. Подключаешь, раскрываешь список, а в нем область видимости только одна строка. Если проскроилить ниже и повторно раскрыть, то уже до той строки, на которой скрол остановился. И это не смотря на то, что DropDownRows = 7.
Видимо что-то глючное в пакете разработчики натворили.

Добавлено через 54 секунды
AlexLogos, а источник данных сколько записей возвращает?


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
AlexLogos
Дата 15.9.2009, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 23.4.2009

Репутация: нет
Всего: 1



причина в том что именно источник данных возвращает количество затисей в зависимости от высоты Грида. Но если я выполняю отдельно запрос вне цыкла - эта зависимость исчезает. 
PM MAIL   Вверх
former
Дата 15.9.2009, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 7
Всего: 17



Цитата(AlexLogos @  15.9.2009,  16:24 Найти цитируемый пост)
причина в том что именно источник данных возвращает количество затисей в зависимости от высоты Грида. Но если я выполняю отдельно запрос вне цыкла - эта зависимость исчезает.  

А сам цикл можешь показать. Скорее всего ошибка в нем. Или не все UniGlo[i].n имеют значение 3.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
AlexLogos
Дата 15.9.2009, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 23.4.2009

Репутация: нет
Всего: 1



Код

  SetLength(Attr,Length(UniGlo));
  for i:=0 to Length(UniGlo)-1 do
   begin
    OraQuery1.Active:=false;
    OraQuery1.SQL.Clear;
    OraQuery1.SQL.Add('select idattr from commonattr where iddoc='+IntToStr(UniGlo[i].n));
    OraQuery1.ExecSQL;

    RichEdit1.Lines.AddStrings(OraQuery1.SQL);

    if OraQuery1.RecordCount>0 then
     begin
      RichEdit1.Lines.Add('Кількість записів: '+inttostr(OraQuery1.RecordCount));
      SetLength(Attr[i],OraQuery1.RecordCount);
      OraQuery1.First;
      for j:=0 to OraQuery1.RecordCount-1 do
       begin
        Attr[i,j]:=OraQuery1.Fields.Fields[0].AsInteger;
        RichEdit1.Lines.Add(IntToStr(j)+':  '+OraQuery1.Fields.Fields[0].AsString);
        OraQuery1.Next;
       end;
     end
    else
     begin
      SetLength(Attr[i],1);
      Attr[i,0]:=0;
     end;
   end;


это цыкл в котором выполняется поиск. но я спецыально проверил что выдает запрос если я например напишу 
Код

SQL.Add(Edit2.Text+inttostr(UniGlo[1].n));

где Edit2.Text = "select idattr from commonattr where iddoc =" и выполню его по кнопке без цыкла - выдает все нужные записи...
PM MAIL   Вверх
vovk
Дата 15.9.2009, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 28.2.2008

Репутация: 6
Всего: 6



с датасетами лучше использовать цикл так
Код

OraQuery1.First;
While not OraQuery1.Eof do
Begin
.....
.......
.......
OraQuery1.next;
end;

иначе у тебя будет проходить только по тем записям, которые в данный момент в датасет содержатся. А без фетч олл там вполне могут и не все быть.

и проверку на содержание записей лучше IsEmpty, если есть у OraQuery конечно(просто не знаю что за компонент) хотя 1 запись вроде всегда подгружать должен, даже если не в чем отображать..

Это сообщение отредактировал(а) vovk - 15.9.2009, 18:17
PM MAIL   Вверх
former
Дата 15.9.2009, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 7
Всего: 17



Поставь на входе и в начале цикла:
Код

ShowMessage(IntToStr(Length(UniGlo)));

и посмотри.

Это сообщение отредактировал(а) former - 15.9.2009, 16:50


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
AlexLogos
Дата 15.9.2009, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 23.4.2009

Репутация: нет
Всего: 1



Це спрацювало. Виникає питання: чому РекордКаунт мені видає невірні значення?

Добавлено через 4 минуты и 25 секунд
 
Код

 SetLength(Attr,Length(UniGlo));
  for i:=0 to Length(UniGlo)-1 do
   begin
    OraQuery1.Active:=false;
    OraQuery1.SQL.Clear;
    OraQuery1.SQL.Add('select idattr from commonattr where iddoc='+IntToStr(UniGlo[i].n));
    OraQuery1.ExecSQL;
    RichEdit1.Lines.AddStrings(OraQuery1.SQL);
    if UniGlo[i].n=3 then ShowMessage(inttostr(OraQuery1.RecordCount));
    //Тут показує 25
    if OraQuery1.RecordCount>0 then
     begin
      RichEdit1.Lines.Add('Кількість записів: '+inttostr(OraQuery1.RecordCount));
      SetLength(Attr[i],0);
      OraQuery1.First;
      j:=0;
      While not OraQuery1.Eof do 
       begin
        SetLength(Attr[i],Length(Attr[i])+1);
        Attr[i,j]:=OraQuery1.Fields.Fields[0].AsInteger;
        RichEdit1.Lines.Add(IntToStr(j)+':  '+OraQuery1.Fields.Fields[0].AsString);
        OraQuery1.Next;
        inc(j);
       end;
     end
    else
     begin
      SetLength(Attr[i],1);
      Attr[i,0]:=0;
     end;
   end;

Модифікую код - працює добре, але мене не влаштовує те що доводиться постійно збільшувати розмір масива в ході циклу - при великій кількості даних може затримувати роботу...

Добавлено через 9 минут и 51 секунду
як можна інакше дізнатися кількість записів коли OraQuery1.RecordCount видає невірне значення і при цьому не використовувати цикл, як вказано в прикладі?
PM MAIL   Вверх
vovk
Дата 15.9.2009, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 28.2.2008

Репутация: 6
Всего: 6



запросом 
Select Count(*) From <таблица> where <условия>
PM MAIL   Вверх
AlexLogos
Дата 15.9.2009, 17:31 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 23.4.2009

Репутация: нет
Всего: 1



Код

    OraQuery1.Active:=false;
    OraQuery1.SQL.Clear;
    OraQuery1.SQL.Add('select count(*) as cou from commonattr where iddoc='+IntToStr(UniGlo[i].n));
    OraQuery1.ExecSQL;

    RichEdit1.Lines.AddStrings(OraQuery1.SQL);
    RichEdit1.Lines.Add(OraQuery1.Fields.Fields[0].AsString);

    if OraQuery1.Fields.Fields[0].AsInteger>0 then
     begin
      SetLength(Attr[i],OraQuery1.Fields.Fields[0].AsInteger);
      OraQuery1.Active:=false;
      OraQuery1.SQL.Clear;
      OraQuery1.SQL.Add('select idattr from commonattr where iddoc='+IntToStr(UniGlo[i].n));
      OraQuery1.ExecSQL;

      RichEdit1.Lines.AddStrings(OraQuery1.SQL);

      if UniGlo[i].n=3 then ShowMessage(inttostr(OraQuery1.RecordCount));

      RichEdit1.Lines.Add('Кількість записів: '+inttostr(OraQuery1.RecordCount));
      OraQuery1.First;

      for j:=0 to Length(Attr[i])-1 do
       begin
        Attr[i,j]:=OraQuery1.Fields.Fields[0].AsInteger;
        RichEdit1.Lines.Add(IntToStr(j)+':  '+OraQuery1.Fields.Fields[0].AsString);
        OraQuery1.Next;
       end;
     end
    else
     begin
      SetLength(Attr[i],1);
      Attr[i,0]:=0;
     end;
   end;


Кінцева версія. Дакую, товариші - все працює. Правда, якби не глючили компоненти я б вже на початковому етапі зменшив би код в півтора рази, а так як деякі запити виконуються невірно - доводиться шукати довші шляхи. 
Випадково не підкажете для Delphi 7 яку версію ODAC встановити щоб таких проблем уникати і де її скачати. У мене зараз версія 5.7. 
PM MAIL   Вверх
vovk
Дата 15.9.2009, 17:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 28.2.2008

Репутация: 6
Всего: 6



Это не глюки компонентов, по моему почти все компоненты работающие не с локальными бд, подгружает записи по мере их необходимости (ну по крайней мере те в которых используются запросы), если конечно не ставить в опциях подгружать все записи. Поэтому при выполнении запроса на выборку в датасете содержится то количество записей, которое нужно для отображения.
В общем это нормальное поведение для многих датасетов. 

//это уже кажется позновато добавил smile
Если записей заведомо немного то можно использовать FetchAll. 

Это сообщение отредактировал(а) vovk - 15.9.2009, 17:56
PM MAIL   Вверх
AlexLogos
Дата 15.9.2009, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 23.4.2009

Репутация: нет
Всего: 1



якщо брати до уваги вказані зауваження і дійсно поправити значення FetchAll встановивши значення True - найперший варіант процедури теж працює без всіляких обходів типу визначення кількості записів через запит... Вік живи, вік учись... Дякую.
PM MAIL   Вверх
Vas
Дата 16.9.2009, 06:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



По умолчанию у OraQuery стоит выбор 25 записей, если стать на последнюю в гриде и попытаться прокрутить ниже, то все подгрузится, по крайней мере у меня никаких глюков никогда не возникало, если размер грида позволяет показать >25 записей просто установите свойство OraQuery.FetchRows нужному значению и будет все ок. 
FetchAll конечно хорошо, но если запрос будет возвращать >1000 записей, то нахрен они сразу все пользователю все равно со всеми он сразу работать не сможет.


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0837 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.