Вызов ХП и BDE

ЧАстые Вопросы и Ответы

Модераторы: kdv, CyberMax

Ответить
lvs
Сообщения: 5
Зарегистрирован: 14 дек 2007, 11:01

Вызов ХП и BDE

Сообщение lvs » 14 дек 2007, 11:48

Доброго времени суток, Мэтры.
Я начинающий (хотя по нижеизложенному тексту это и так понятно), с позволения сказать, программист. Прежде чем задать Вам этот вопрос, пытался искать ответ самостоятельно на этом и других интернет ресурсах (www.sql.ru, www.delphikigdom.ru, www.delphiworld.narod.ru и т. п.), читал книжки (Шумаков и пр.). Некоторое (минимальное) прояснение в голове наступило, но ответа так и не нашел. Вероятность того, что я плохо/мало/неправильно искал не исключаю. Поэтому прошу Вашей помощи. Конструктивная (и даже не очень) критика меня и моих начинаний только приветствуется, ибо лучше Вы укажите мне на мои ошибки сейчас (пусть даже в грубой/ехидной форме), чем это сделают другие и потом.
Вот собственно суть моего вопроса:

Имеется небольшая БД (около 20 таблиц).
СУБД - IB 5.5.
Среда разработки клиентской части - Delphi 6.
На сервере была создана хранимая процедура:

Код: Выделить всё

CREATE PROCEDURE P4 (
  IN_METRIC_SIZE VARCHAR(15),
  IN_INCH_SIZE VARCHAR(10),
  IN_MODEL VARCHAR(10),
  IN_PRODUCER VARCHAR(20),
  IN_PLY_RATING INTEGER,
  IN_RIM VARCHAR(10)
)  AS 
declare variable var_tyre_id integer;
begin
select tyre_id from tyre 
where metric_size = :in_metric_size and inch_size = :in_inch_size and model = :in_model and producer = :in_producer and ply_rating = :in_ply_rating
into :var_tyre_id;
insert into rim_allowed values (:var_tyre_id, :in_rim);
end 
Имеются также следующие таблицы:

Код: Выделить всё

CREATE TABLE TYRE (
  TYRE_ID INTEGER NOT NULL,
  MODEL VARCHAR(10),
  TREAD_PATTERN VARCHAR(25),
  RIM_STRIP VARCHAR(10),
  PLY_RATING INTEGER,
  OVERALL_DIAMETER FLOAT,
  TOLERANCE_FOR_DIAMETER VARCHAR(5),
  SECTIONAL_WIDTH_NOT_MORE FLOAT,
  SECTIONAL_WIDTH_TOLERANCE VARCHAR(5),
  LOADED_STATIC_RADIUS FLOAT,
  LOADED_STATIC_RADIUS_TOLERANCE VARCHAR(5),
  HEIGHT_OF_PROFILE FLOAT,
  HEIGHT_OF_CREEPER FLOAT,
  CONTACT_PATCH_AREA FLOAT,
  MAXIMUM_LOAD_PER_TYRE INTEGER,
  MAXIMUM_INFLATION_OF_PRESSURE FLOAT,
  MAX_SPEED INTEGER,
  WEIGHT FLOAT,
  ROLLING_CIRCUMFERENCE INTEGER,
  DEFORMATION FLOAT,
  APPLICATION_DOMAIN VARCHAR(40),
  PRODUCER VARCHAR(20) NOT NULL,
  METRIC_SIZE VARCHAR(15),
  INCH_SIZE VARCHAR(10)
)

Код: Выделить всё

CREATE TABLE RIM (
  RIM VARCHAR(10) NOT NULL,
  RIM_WIDTH FLOAT,
  TILT_RIM_SEAT FLOAT,
  RIM_DIAMETER FLOAT
)

Код: Выделить всё

CREATE TABLE RIM_ALLOWED (
  TYRE_ID INTEGER NOT NULL,
  RIM VARCHAR(10) NOT NULL
)

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Re: Вызов ХП и BDE

Сообщение stix-s » 14 дек 2007, 11:53

Суть вопроса кусок структуры базы?
ЗЫ
По BDE лучше побыстрее забудь

lvs
Сообщения: 5
Зарегистрирован: 14 дек 2007, 11:01

Сообщение lvs » 14 дек 2007, 12:04

Запускал процедуру через WISQL, SQL Exploer - при передаче корректных параметров нормально работает.
Добавляю в Delphi на форму компонент TStoredProc. Задаю соответствующие типы параметров. Устанавливаю свойство компонента "Active" в "True". Получаю следующие ошибки:

1. Field value required validation error for column TYRE_ID value "***null***"
BDE Error 9732 [$26] [$ 4]
Field value required.

2. BDE Error 13059 [$33] [$ 3]
Server error -625 validation error for column TYRE_ID, value "*** null ***"

Собственно вопрос: что я сделал не так?
Т. е. я очень приблизительно представляю, что происходит:
при попытке установки свойства TStoredProc "Active" в "True" кто-то (Delphi, BDE ???) пытается запустить процедуру p4, но поскольку параметров ей никто не передавал, select возвращает null, а вставить значение типа null в поле TYRE_ID таблицы RIM_ALLOWED не получается, поскольку поле входит в PK.

Я даже осознал, что пользы именно от этой ХП - ноль и все можно сделать одним sql запросом.
Но все-таки, где ошибки?

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 14 дек 2007, 12:12

lvs писал(а):Запускал процедуру через WISQL, SQL Exploer - при передаче корректных параметров нормально работает.
Добавляю в Delphi на форму компонент TStoredProc. Задаю соответствующие типы параметров. Устанавливаю свойство компонента "Active" в "True". Получаю следующие ошибки:

1. Field value required validation error for column TYRE_ID value "***null***"
BDE Error 9732 [$26] [$ 4]
Field value required.

2. BDE Error 13059 [$33] [$ 3]
Server error -625 validation error for column TYRE_ID, value "*** null ***"

Собственно вопрос: что я сделал не так?
Т. е. я очень приблизительно представляю, что происходит:
при попытке установки свойства TStoredProc "Active" в "True" кто-то (Delphi, BDE ???) пытается запустить процедуру p4, но поскольку параметров ей никто не передавал, select возвращает null, а вставить значение типа null в поле TYRE_ID таблицы RIM_ALLOWED не получается, поскольку поле входит в PK.

Я даже осознал, что пользы именно от этой ХП - ноль и все можно сделать одним sql запросом.
Но все-таки, где ошибки?
В использовании BDE
зачем эта реинкарнация?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Вызов ХП и BDE

Сообщение WildSery » 14 дек 2007, 12:19

lvs писал(а):СУБД - IB 5.5.
5.5 - глючная версия, см. СЮДА.
Переходи на FB. Он бесплатен, быстр, функционален, с отличной поддержкой в форумах и разработчиками, и т.д.
Можно считать рекламой :)
lvs писал(а):TStoredProc
А ты не пользуйся ТАК этой фигнёй. В ней есть "особенности".
Ты вот объясни, зачем тебе Active=true?

lvs
Сообщения: 5
Зарегистрирован: 14 дек 2007, 11:01

Сообщение lvs » 14 дек 2007, 12:23

В использовании BDE
зачем эта реинкарнация?
Прошу прощения, но смысл данной фразы для меня не понятен. Если можно, изложите проще/доступнее/подробнее.

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 14 дек 2007, 12:25

lvs писал(а):
В использовании BDE
зачем эта реинкарнация?
Прошу прощения, но смысл данной фразы для меня не понятен. Если можно, изложите проще/доступнее/подробнее.
Есть компоненты прямого доступа IBX, FIB+ и др.
В чем причина использования устаревшего движка BDE?
и как уже заметил WildSery устаревшей версии IB
ЗЫ
где вы достаете такие раритеты?

lvs
Сообщения: 5
Зарегистрирован: 14 дек 2007, 11:01

Сообщение lvs » 14 дек 2007, 12:34

5.5 - глючная версия, см. СЮДА.
Может быть оно и так, но процедура на сервере-то работает. Не получается организовать вызов именно из клиентского приложения.
Переходи на FB. Он бесплатен, быстр, функционален, с отличной поддержкой в форумах и разработчиками, и т.д.
Можно считать рекламой
Со всем согласен, в ближайших планах значится переход именно на FB.
А ты не пользуйся ТАК этой фигнёй. В ней есть "особенности".
Ты вот объясни, зачем тебе Active=true?
Дело в том, что судя по всему, я вообще не знаю, как правильно пользоваться этой фигней. Active=true - это для того, чтобы компонент активировать. Чтобы процедура вызывалась в обработчике событий при нажатии на кнопку "Добавить". В этом же обработчике ей (процедуре) передаются параметры, которые беруться из DBGrid'ов.

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 14 дек 2007, 12:40

lvs писал(а): Может быть оно и так, но процедура на сервере-то работает. Не получается организовать вызов именно из клиентского приложения.
Инструментарий, в котором у тебя ХП работает, обращается к IB напрямую, а не ч/з BDE
lvs писал(а): Дело в том, что судя по всему, я вообще не знаю, как правильно пользоваться этой фигней. Active=true - это для того, чтобы компонент активировать. Чтобы процедура вызывалась в обработчике событий при нажатии на кнопку "Добавить". В этом же обработчике ей (процедуре) передаются параметры, которые беруться из DBGrid'ов.
Параметры передаются ДО выполнения, а не после

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 14 дек 2007, 12:44

lvs писал(а): Дело в том, что судя по всему, я вообще не знаю, как правильно пользоваться этой фигней.
В смысле кнопкой F1? Или в смысле не удаётся сначала мышкой попасть в компонент TStoredProc?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 14 дек 2007, 12:46

lvs писал(а):Active=true - это для того, чтобы компонент активировать. Чтобы процедура вызывалась в обработчике событий при нажатии на кнопку "Добавить". В этом же обработчике ей (процедуре) передаются параметры, которые беруться из DBGrid'ов.
Ты сначала задаёшь параметры, затем обычно не Active=true, которое в здравом уме вообще никогда трогать ни у одного DB-компонента не нужно в дизайн-тайме, а TStoredProc.ExecProc, каковая команда и выполняет процедуру с текущими параметрами.

Не пользуйся BDE. Оно не то чтобы полное говно, но управления транзакциями там нет. Зато много чего вредного есть.
Начни изучение с IBX, входят в комплект дельфей стандартно. Чти отличную статью по ним.

lvs
Сообщения: 5
Зарегистрирован: 14 дек 2007, 11:01

Сообщение lvs » 14 дек 2007, 12:59

Большое спасибо.
Внял вашей мудрости (по крайней мере на это надеюсь).

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 14 дек 2007, 13:08

WildSery писал(а):не Active=true, которое в здравом уме вообще никогда трогать ни у одного DB-компонента не нужно в дизайн-тайме
Ты знаешь ещё один способ активизировать в дизайн-тайме наследников датасет, например, чтобы подрихтовать DisplayWidth в гриде? Делись :wink: Другое дело, что TStoredProc - не датасет и эту проперть туда приляпали в надежде когда-нить скрестить ужа с ежом. Слава богу, на полдороге одумались, а проперть осталась. А вот в рантайме, в общем-то, как раз моветон :) Для выполнения действий предназначены методы, а не свойства. И даже состояние датасета и кошерней и информативней анализировать по State.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 14 дек 2007, 14:45

Merlin писал(а):Ты знаешь ещё один способ активизировать в дизайн-тайме наследников датасет, например, чтобы подрихтовать DisplayWidth в гриде?
А нет никакой связи между Width и активностью датасета ;)
За исключением того редкого случая, когда тебе нужно подогнать ширину сильно точно под фиксированные отображаемые данные какие-то.

Ответить