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

Вниз

Просто Query без table и DBGrid   Найти похожие ветки 

 
Lefan   (2002-12-17 14:54) [0]

Приветсвую всех...
Народ, такая проблема, требуется просто найти запись, имеется ли такая иль нет.
на клиента тащить безполезно (более 70 млн. записей)...
если есть обновить, если нет, добавить....
везде гляжу примерчики, и везде с table или DBGrid.
А так просто можна?

Вот наковырял:
data.Query.SQL.Clear;
data.Query.SQL.Text:="Select * from SAV.DAY8 where datestr=""5/12""";
data.Query.ExecSQL;

проверить не получается, есть такая запись иль нет... :(

Заранее благодарен за ответ.
С уважением Алексей.


 
Calm   (2002-12-17 14:57) [1]

А не подойдет ли
if (exists(select <то, что нужно>))...
?


 
Max Zyuzin   (2002-12-17 14:57) [2]

Не понял в чем именно проблемма... какое у вас ключевое поле в таблице? По нему и ищите... пример у вас в нужном направлении...
Что у вас не получается ?


 
Sergey Masloff   (2002-12-17 15:00) [3]

Проблема в том, что ExecSQL для запросов НЕ ВОЗВРАЩАЮЩИХ НАБОР ДАННЫХ. Для всех SELECT запросов используется Open


 
Max Zyuzin   (2002-12-17 15:02) [4]

>Sergey Masloff (17.12.02 15:00)
Позор на мою седую голову :о) просмотрел :)))


 
lefan   (2002-12-17 15:25) [5]

мне просто нужно выполнить запрос на удаленной машине...
data.Query.SQL.Text:="Select * from SAV.DAY8 where datestr=""5/12"""

и получить какой-нить код иль еще что-нить, чтоб определить имеется ли такая запись иль нет.
Не хочу накручивать table и BDGrid
иль без них накак не обойтись?
Неужели такой элементарный запрос нельзя выполнить?
иль пусть возвращает результат например в String или Edit, если это вообще возможно... :)

Заранее благодарен за ответ.
С уважением Алексей.


 
Max Zyuzin   (2002-12-17 15:32) [6]

>lefan © (17.12.02 15:25)
Конечно можно... теперь давайте определимся где происходит затык...??
Вы пробовали писать не ExecSQL а Open?


 
Sergey Masloff   (2002-12-17 15:33) [7]

data.Query.SQL.Clear;
data.Query.SQL.Text:="Select * from SAV.DAY8 where datestr=""5/12""";
data.Query.ExecSQL;

with Data.Query do
begin
SQL.Clear();
SQL.Text := "Select * from SAV.DAY8 where .............
Open();
try
if Fields[0].IsNull then
ShowMessage("Таких нету!");
finally
Close();
end;
end;


 
Johnmen   (2002-12-17 15:37) [8]

>Sergey Masloff (17.12.02 15:33)
> if Fields[0].IsNull then
> ShowMessage("Таких нету!");

Ты что, серьезно ?!



 
Карелин Артем   (2002-12-17 15:43) [9]

data.Query.SQL.Text:="Select count(*) from SAV.DAY8 where datestr=""5/12";
data.Query.open;
data.Query.Fields[0].AsInteger - Число записей.


 
Val   (2002-12-17 15:57) [10]

>Sergey Masloff (17.12.02 15:33)
а если оно действительно null?
думаю, лучше проверить так:


...
Q.Open;
Q.FetchAll;
if Q.RecordCount>0 then
..
else
..
end;
...


 
Карелин Артем   (2002-12-17 15:58) [11]

Q.FetchAll; - чревато привисанием при большом числе записей.


 
Val   (2002-12-17 16:05) [12]

Согласен, но это лишь предложение, а не аксиома. Лучше все же запросить count, если не важны значения полей.


 
Sergey Masloff   (2002-12-17 16:09) [13]

Johnmen ©
>>if Fields[0].IsNull then
>> ShowMessage("Таких нету!");
>Ты что, серьезно ?!

Человек хотел выполнить запрос:
"Select * from SAV.DAY8 where datestr=""5/12""";
Когда * то IB делает
select * from rdb$relation_fields
where rdb$relation_name = "TABLE_NAME" для определения имен полей. И с вероятностью 99.99 первое поле это ПК. ПК (и любая его часть) не может быть NULL. Если NULL то нету и записи

Хотя, конечно, я бы написал if BOF=EOF then что надежно работает со времен турбопаскаля



 
Max Zyuzin   (2002-12-17 16:16) [14]

А может проще сделать так?
Q.Open;
if Q.IsEmpty then // Амба :о)


 
Johnmen   (2002-12-17 16:19) [15]

>Sergey Masloff (17.12.02 16:09)
>Хотя, конечно, я бы написал if BOF=EOF then

Ты что, серьезно ?!
Прости, но очень веселишь поспешными ответами...:)



 
Anatoly Podgoretsky   (2002-12-17 16:26) [16]

По моему Count единственно, что надежное, в этой мешанине баз м методов доступа


 
Sergey Masloff   (2002-12-17 16:47) [17]

Johnmen ©

Прощаю ;-)


 
Sergey Masloff   (2002-12-17 16:58) [18]

Johnmen ©
If both Eof and Bof are True, the dataset is empty. (Delphi Help)

Max Zyuzin ©
IsEmpty реализован именно через сравнение EOF и BOF

Anatoly Podgoretsky ©
Как обычно самое взвешенное и осмысленное решение. Снимаю шляпу. Серьезно.


 
Johnmen   (2002-12-17 17:14) [19]

>Sergey Masloff (17.12.02 16:58)
>Johnmen ©
>If both Eof and Bof are True, the dataset is empty. (Delphi
>Help)
и
>Sergey Masloff (17.12.02 16:09)
>Хотя, конечно, я бы написал if BOF=EOF then

Не находишь, что это разные вещи ? ;o)










 
Anatoly Podgoretsky   (2002-12-17 17:19) [20]

Sergey Masloff (17.12.02 16:58)
"Eof and Bof"
И например можно получить неприятности на непропатченных версиях и т.д.

На мой взгляд если уж клиент/сервер то и надо использовать соответствующие методы, которые будут работать правильно на большинстве баз данных, я не думаю что можно найти диалект SQL в котором бы не работал COUNT


 
Max Zyuzin   (2002-12-17 17:20) [21]

>Sergey Masloff (17.12.02 16:58)
Нету дельфей под руками, что бы проверить как реализован метод IsEmpty по этому ничего сказать не могу...


 
Sergey Masloff   (2002-12-17 17:26) [22]

Johnmen ©
>Не находишь, что это разные вещи ? ;o)
неа... После открытия НД BOF=true это документировано ;-)
Ладно, это уже в раздел Потрепаться ;-)


 
Johnmen   (2002-12-17 17:41) [23]

>Sergey Masloff (17.12.02 17:26)
>После открытия НД BOF=true это документировано

Подскажи, пожалуйста, где ?
Никакого сарказма ! Мне это интересно.


 
FreeLancer   (2002-12-17 17:45) [24]


Test Bof (beginning of file) to determine if the dataset is positioned at the first record. If Bof is true, the active record is unequivocally the first row in the dataset. Bof is true when an application.

Opens a dataset.
Calls a dataset’s First method.
Call a dataset’s Prior method, and the method fails because the first row is already active.
Calls SetRange on an empty range or dataset.

Bof is false in all other cases.


Привет, это опять я :-)


 
Johnmen   (2002-12-17 17:58) [25]

Привет ! :)
Дествительно ! Хотя вот у меня сложилось (и очень давно) некоторое недоверие ко всему, что пишут в хелпах.
Ну да ладно ! В данном случае это так.
:o)))))


 
Sergey Masloff   (2002-12-17 18:18) [26]

Johnmen ©

файл db.pas:

procedure TDataSet.DoInternalOpen;
begin
FDefaultFields := FieldCount = 0;
InternalOpen;
FInternalOpenComplete := True;
UpdateBufferCount;
FBOF := True;
~~~~~~~~~~~~~
end;



 
Johnmen   (2002-12-17 18:31) [27]

>Sergey Masloff (17.12.02 18:18)

Да ! Да ! Я же высказался. Лишь небольшое добавление : считаю хорошей привычкой полагаться в своих приложениях на свой код, работающий независимо от некоторых внешних факторов, в данном случае от того, открыли мы НД только что, или 100 процедур назад :)))


 
Max Zyuzin   (2002-12-17 18:37) [28]

>Johnmen © (17.12.02 18:31)
Все ты попал :) теперь тебя достанут ;o) говоря при любом удбном и не очень случае, что при открытие датасета BOF = True ;)))
шутка :)))


 
lefan   (2002-12-20 06:03) [29]

Приветсвую народ, спасибо всем, кто помого, вод ряд примеров, которые у мня пошли... :)

---=== 1 ===---
data.Query.SQL.Clear;
data.Query.SQL.Text:="select * from SAV.DAY8 where datestr=""35/12""";
data.Query.Open;
try
if data.Query.Fields[0].IsNull then showmessage("Not OK")
else showmessage("OK")
finally
data.Query.Close;
Data.Database.Close;
end;


---=== 2 ===---
data.Query.SQL.Clear;
data.Query.SQL.Text:="select * from SAV.DAY8 where datestr=""15/12""";
data.Query.Open;
try
if data.Query.IsEmpty then showmessage("Not OK")
else showmessage("OK")
finally
data.Query.Close;
data.day8.Close;
Data.Database.Close;
end;


Эти примера, оба работают как надо... ну думаю isEmpty будет наиболее правильно...
Всем огромнейшее спасибо... :)

С уважением Алексей.


 
lefan   (2002-12-20 06:13) [30]

Кстати во всех примерчиках лучше использовать count(*), т.к. действительно не важно что за данные (как было уже сказано выше)

---===3===---
data.Query.SQL.Clear;
data.Query.SQL.Text:="select count(*) from SAV.DAY8 where datestr=""15/12""";
data.Query.Open;

try
// if data.Query.Fields[0].IsNull then showmessage("Not OK")
// if data.Query.Fields[0].AsInteger>0 then showmessage("OK")
// if data.Query.IsEmpty then showmessage("Not OK")
else showmessage("NOT OK")
finally
data.Query.Close;
end;
еще рабочий... :)
Тож спаибо... :)


 
lefan   (2002-12-20 06:15) [31]

---===3===---
data.Query.SQL.Clear;
опечаточка...

data.Query.SQL.Text:="select count(*) from SAV.DAY8 where datestr=""15/12""";
data.Query.Open;

try

// if data.Query.Fields[0].IsNull then showmessage("Not OK")
if data.Query.Fields[0].AsInteger>0 then showmessage("OK")
// if data.Query.IsEmpty then showmessage("Not OK")
else showmessage("NOT OK")
finally
data.Query.Close;
end;



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

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

Наверх





Память: 0.52 MB
Время: 0.008 c
1-49063
Berg
2003-01-08 09:56
2003.01.16
Уменьшение exe-файла приложения


1-49158
akvilon
2003-01-06 03:21
2003.01.16
Как сделать форму, к примеру, круглой


3-48921
Rule
2002-12-21 11:57
2003.01.16
Помогите разобраться с сортировкиой связаных таблиц в IB6 (FB1)


1-48984
Marko_p
2003-01-06 20:24
2003.01.16
Как создать...


3-48845
Senator
2002-12-19 15:40
2003.01.16
Bookmark





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский