Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.08.2011, 18:24
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
Вопрос Пара простых вопросов по Delphi + БД

Здравствуйте!

Возникла пара вопросов по Delphi + Firebird:

1. Многие функции в программе связанные с БД, например выборки или установка значений (через FIBDataset или FIBQuery) итд срабатывают со второго раза, то есть заходим в программу - первый раз не срабатывает, со второго раза и далее работает нормально. Очевидно какой-то компонент связи с БД (DB? Dataset? Datasource?) неактивен, после первой команды просыпается, и вторую команду уже обрабатывает нормально. Пока только начинаю разбираться с БД - прошу подсказать как решить данную проблему? в каком компоненте искать и какой параметр? может написать что-то при включении программы вида all.datasets.prepare ?

2. Есть форма, в ней невизуальный объект FIBDataset с уже настроенными командами SQL. В конце ввода данных в форме происходит - Dataset.Post, но в случае ввода новых данных оптимально Insert, а в случае исправления данных в форме оптимально Update... пробую писать очевидную вещь: Dataset.Insert и Dataset.Update, но Delphi ругается на Dataset.Update - говорит такого не знает. Там есть разные варианты начинающиеся на Dataset.Upd.... подскажите какой из них оптимально использовать?

3. В БД процедура вида insert into ..... values (....., 'менеджер ' add coalesce(:name_a,:name_b,:name_c));
Так якобы неправильно, пробовал вместо "add" писать "+", но всё равно ошибка. Как правильно написать, чтобы отправлялось значение собранное из текста {'менеджер '} и {coalesce(:name_a,:name_b,:name_c)} ??

Последний раз редактировалось delphicoding, 02.08.2011 в 19:24.
Ответить с цитированием
  #2  
Старый 02.08.2011, 19:25
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,020
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

1. Вероятно, TIBDatabase
2. Используй TIBQuery совместно с TIBUpdate (кажется так). Там есть все нужные методы.
Ответить с цитированием
  #3  
Старый 03.08.2011, 15:20
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Вопросы 2-3 решены.

А вопрос 1 не решён. Вот опять вызов хранимой процедуры через FIBStoredProc срабатывает только со второго раза:

Код:
procedure TBaseForm.btEditClick(Sender: TObject);
begin
  inherited;
  With dm.spOfficesEdit do begin        // FIBStoredProc 
    Close;
    ParamByName('OFFICE_CONTACT_USERS_ID').Value := null;
    .............. ещё параметры
    ExecProc;
    close;
  end;
end;
Никаких других переходов и объектов нет - из программы при нажатии кнопки через FIBStoredProc вызывается хранимая процедура БД.

Поковырял настройки FIBPlus Каждой процедуре и датасету в FIB назначается DB, которой в свою очередь назначаются 2 так называемые FIBTransaction - Read и Write. При этом по-сути и параметрами они идентичны, кроме одного параметра "Active" - для Write он почему-то выключен... может в этом дело? Какие есть предположения почему мог быть установлен Write Active = False ??? Собственно изменение Write Active = True результата не дало - всё равно некоторые действия с БД работают только со второго раза!
Ответить с цитированием
  #4  
Старый 04.08.2011, 21:17
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Столкнулся с совершенно банальной проблеммой - нужно join несколько таблиц, всё понятно, но в одном месте непонятно - нужно два раза привязать к таблице A таблицу-справочник B по параметрам
on A.id1=B.id
on A.id2=B.id
чтобы в итоге для A.id1 и A.id1 получить B.name ввиде двух разных значений A.name1 и A.name2

Написать всё могу, но вот что писать в select и как объяснить SQL, что нужно два разных значения - не представляю и код всё время вызывает ошибку!

Подскажите кто разбирается!
Ответить с цитированием
  #5  
Старый 04.08.2011, 21:33
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,020
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Код:
SELECT T.*, D1.FieldName, D2.FieldName
FROM MainTable T 
  LEFT JOIN DicTable D1 ON T.Dic1ID = D1.ID
  LEFT JOIN DicTable D2 ON T.Dic2ID = D2.ID
...
Ответить с цитированием
  #6  
Старый 05.08.2011, 09:01
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Всё просто Спасибо!

Остался не решён вопрос №1... может у кого есть соображения?

Последний раз редактировалось delphicoding, 05.08.2011 в 09:25.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:57.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter