Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > связать dbgrid с бд с помощью хранимой процедуры


Автор: Anatom 22.3.2009, 23:42
Здравствуйте у меня такая ситуация, я dbgrid вывожу данные из двух табл с помощью представления:
CREATE VIEW dbo.VIEW1
AS SELECT     dbo.[заказ билета].*, dbo.билет.[№билета] AS [№билета], dbo.билет.[№рейса] AS [№рейса],   dbo.билет.[id место отправления] AS [id место отправления], dbo.билет.[дата отправления] AS [дата отправления],   dbo.билет.[id место прибытия] AS [id место прибытия], dbo.билет.[дата прибытия] AS [дата прибытия], dbo.билет.[id тип вагона] AS [id тип вагона], bo.билет.[номер места] AS [номер места]
FROM         dbo.билет INNER JOINbo.[заказ билета] ON dbo.билет.[№паспорта] = dbo.[заказ билета].[№паспорта] AND dbo.билет.[№паспорта] = dbo.[заказ билета].[№паспорта]
все выводиться классно, но возникают проблемы когда начинаю вносить в дбгрид для этого я использую хранимую процедуру:
procedure TForm1.Button5Click(Sender: TObject);
begin
ADOStoredProc1.Parameters.ParamByName('@FIO').Value:=AdoTable2.FieldByName('ФИО').Value;
ADOStoredProc1.Parameters.ParamByName('@№pasporta').Value:=AdoTable2.FieldByName('№паспорта').Value;
ADOStoredProc1.Parameters.ParamByName('@telefon').Value:=AdoTable2.FieldByName('телефон').Value;
ADOStoredProc1.Parameters.ParamByName('@firma').Value:=AdoTable2.FieldByName('название фирмы').Value;
ADOStoredProc1.Parameters.ParamByName('@mestootp').Value:=AdoTable2.FieldByName('id место отправления').Value;
ADOStoredProc1.Parameters.ParamByName('@mestoprib').Value:=AdoTable2.FieldByName('id место прибытия').Value;
ADOStoredProc1.Parameters.ParamByName('@tipvagona').Value:=AdoTable2.FieldByName('id тип вагона').Value;
ADOStoredProc1.Parameters.ParamByName('@nomerbilet').Value:=AdoTable2.FieldByName('№билета').Value;
ADOStoredProc1.Parameters.ParamByName('@nomerreisa').Value:=AdoTable2.FieldByName('№рейса').Value;
ADOStoredProc1.Parameters.ParamByName('@nomermesta').Value:=AdoTable2.FieldByName('номер места').Value;
ADOStoredProc1.Parameters.ParamByName('@otprav').Value:=AdoTable2.FieldByName('дата отправления').Value;
ADOStoredProc1.Parameters.ParamByName('@prib').Value:=AdoTable2.FieldByName('дата прибытия').Value;
ADOStoredProc1.Parameters.ParamByName('@poriadok').Value:=AdoTable2.FieldByName('порядковый № вагона').Value;
ADOStoredProc1.Parameters.ParamByName('@nomerpoezda').Value:=AdoTable2.FieldByName('№поезда').Value;
ADOStoredProc1.ExecProc;
ADOTable2.Close;
ADOTable2.Open;
end;
и процедура на sql :alter procedure ADOStoredProc1
  @FIO varchar(60),
  @telefon int,
  @nomerpasporta int,
@firma varchar(40),
@nomerbilet int,
@nomerreisa int,
@mestootp int,
@mestoprib int,
@otprav datetime,
@prib datetime,
@tipvagona int,
@nomermesta int,
@poriadok int,
@nomerpoezda int
as 
insert into [заказ билета]  ([ФИО],[телефон], [№паспорта], [название фирмы])
values (@FIO,@telefon,@nomerpasporta,@firma)
  insert into [билет]  ([№билета],[№паспорта],[№рейса],[id место отправления],[id место прибытия],[дата отправления],[дата прибытия],[id тип вагона],
[номер места],[порядковый№ вагона],[№поезда])
values (@nomerbilet,@nomerpasporta,@nomerreisa,@mestootp,@mestoprib,@otprav,@prib,@tipvagona,@nomermesta,@poriadok,@nomerpoezda)
go

может я что-то не правильно написал подскажите пожалуйста?

Автор: Данкинг 23.3.2009, 00:10
Цитата(Anatom @  22.3.2009,  23:42 Найти цитируемый пост)
но возникают проблемы

Какие проблемы-то?

Автор: Dmi3ev 23.3.2009, 00:28
Anatom, отформатируй все нормально (с помощью кнопки код), потом проблему свою освети получше... тогда и поговорим...

Автор: Anatom 23.3.2009, 17:15
при запуске процедуры в QA он выдает мне следующюю ошибку:
INSERT statement conflicted with COLUMN FOREIGN KEY constraint 'FK_билет_рейсы'. The conflict occurred in database 'gd', table 'рейсы', column '№рейса'.
The statement has been terminated.
И еще я хотел спросить правильно ли я вообще сделал процедуру, код дв делфи?

Автор: Akella 23.3.2009, 17:21
Цитата(Anatom @  23.3.2009,  17:15 Найти цитируемый пост)
INSERT statement conflicted with COLUMN FOREIGN KEY constraint 'FK_билет_рейсы'. 

Ты вставляешь в столбец ссылку на несуществующую запись. Почитай, что такое ссылочная целостность (FOREIGN KEY), внешние ключи.

Автор: pseud 23.3.2009, 17:21
форматирование поста Anatom:
Код

CREATE VIEW dbo.VIEW1
AS SELECT     dbo.[заказ билета].*, dbo.билет.[№билета] AS [№билета], dbo.билет.[№рейса] AS [№рейса],   dbo.билет.[id место отправления] AS [id место отправления], dbo.билет.[дата отправления] AS [дата отправления],   dbo.билет.[id место прибытия] AS [id место прибытия], dbo.билет.[дата прибытия] AS [дата прибытия], dbo.билет.[id тип вагона] AS [id тип вагона], bo.билет.[номер места] AS [номер места]
FROM         dbo.билет INNER JOINbo.[заказ билета] ON dbo.билет.[№паспорта] = dbo.[заказ билета].[№паспорта] AND dbo.билет.[№паспорта] = dbo.[заказ билета].[№паспорта]

Код

procedure TForm1.Button5Click(Sender: TObject);
begin
  ADOStoredProc1.Parameters.ParamByName('@FIO').Value:=AdoTable2.FieldByName('ФИО').Value;
  ADOStoredProc1.Parameters.ParamByName('@№pasporta').Value:=AdoTable2.FieldByName('№паспорта').Value;
  ADOStoredProc1.Parameters.ParamByName('@telefon').Value:=AdoTable2.FieldByName('телефон').Value;
  ADOStoredProc1.Parameters.ParamByName('@firma').Value:=AdoTable2.FieldByName('название фирмы').Value;
  ADOStoredProc1.Parameters.ParamByName('@mestootp').Value:=AdoTable2.FieldByName('id место отправления').Value;
  ADOStoredProc1.Parameters.ParamByName('@mestoprib').Value:=AdoTable2.FieldByName('id место прибытия').Value;
  ADOStoredProc1.Parameters.ParamByName('@tipvagona').Value:=AdoTable2.FieldByName('id тип вагона').Value;
  ADOStoredProc1.Parameters.ParamByName('@nomerbilet').Value:=AdoTable2.FieldByName('№билета').Value;
  ADOStoredProc1.Parameters.ParamByName('@nomerreisa').Value:=AdoTable2.FieldByName('№рейса').Value;
  ADOStoredProc1.Parameters.ParamByName('@nomermesta').Value:=AdoTable2.FieldByName('номер места').Value;
  ADOStoredProc1.Parameters.ParamByName('@otprav').Value:=AdoTable2.FieldByName('дата отправления').Value;
  ADOStoredProc1.Parameters.ParamByName('@prib').Value:=AdoTable2.FieldByName('дата прибытия').Value;
  ADOStoredProc1.Parameters.ParamByName('@poriadok').Value:=AdoTable2.FieldByName('порядковый № вагона').Value;
  ADOStoredProc1.Parameters.ParamByName('@nomerpoezda').Value:=AdoTable2.FieldByName('№поезда').Value;
  ADOStoredProc1.ExecProc;
  ADOTable2.Close;
  ADOTable2.Open;
end;


Код

alter procedure ADOStoredProc1
  @FIO varchar(60),
  @telefon int,
  @nomerpasporta int,
@firma varchar(40),
@nomerbilet int,
@nomerreisa int,
@mestootp int,
@mestoprib int,
@otprav datetime,
@prib datetime,
@tipvagona int,
@nomermesta int,
@poriadok int,
@nomerpoezda int
as 
insert into [заказ билета]  ([ФИО],[телефон], [№паспорта], [название фирмы])
values (@FIO,@telefon,@nomerpasporta,@firma)
  insert into [билет]  ([№билета],[№паспорта],[№рейса],[id место отправления],[id место прибытия],[дата отправления],[дата прибытия],[id тип вагона],
[номер места],[порядковый№ вагона],[№поезда])
values (@nomerbilet,@nomerpasporta,@nomerreisa,@mestootp,@mestoprib,@otprav,@prib,@tipvagona,@nomermesta,@poriadok,@nomerpoezda)
go

Автор: Anatom 23.3.2009, 17:38
Akella,  но у меня же есть такая табл рейсы в которой есть одно поле №рейса.
pseud, спасибо я просто не знал как так красиво отредактироваровать

Автор: Anatom 23.3.2009, 18:02
или я просто не могу вносить такие же данные как в этой табл?

Автор: Anatom 23.3.2009, 22:48
с тем вопросом разобрался но столкнулся с другим когда пытаюсь внести данные в бдгрид у меня возникает такая ошибка. прикрепляю ее. встрял с этим вопросом помогите!!!! 

Автор: Данкинг 23.3.2009, 23:12
Цитата(Anatom @  23.3.2009,  22:48 Найти цитируемый пост)
у меня возникает такая ошибка.

Прочитать сообщение об ошибке пробовал? Получилось? Если нет (судя по всему), то перевожу с китайского: ты пытаешься вставить пустое (NULL значение) в поле, которое не допускает нулевых значений. smile 

Автор: Akella 24.3.2009, 09:33
Данкинг, да они просто не знают даже про онлайн переводчики. А легче ведь задать вопрос на форумах (скопипайстить) и пойти пить пиво, а утром прийти на работу и оппаа, а тут уже всё решили за меня умные парни, а мне типо и париццо не нужно.
На таких форумах как sql.ru и ibase.ru таких пользователей ленивых просто тупо задрачивают (не побоюсь этого слова) и они туда больше не приходят.

Автор: Dobermann 24.3.2009, 10:02
Цитата(Akella @  24.3.2009,  09:33 Найти цитируемый пост)
Данкинг, да они просто не знают даже про онлайн переводчики. А легче ведь задать вопрос на форумах (скопипайстить) и пойти пить пиво, а утром прийти на работу и оппаа, а тут уже всё решили за меня умные парни, а мне типо и париццо не нужно.
На таких форумах как sql.ru и ibase.ru таких пользователей ленивых просто тупо задрачивают (не побоюсь этого слова) и они туда больше не приходят. 

а мы тут как няньки smile  smile 

Автор: Anatom 24.3.2009, 22:14
Нет товарищи это не так, вы видили какой од я выкладывал выше, для  вывода информацию в грид из двух табл я использую представление, правда я его сделал в конструкторе, и получаеться что в одну табл я могу заносить №паспорта, а во вторую не могу потому что оно не ключевой поле в этой табл, а в которую вношу оно явл ключем. мне сказали сделать процедуру для того чтобы можно было внести данные из грид сразу в обе табл, но это не помогло(процедуру проверял она работает и получаеться занести данные) а вот чтобы из делфи появляеться такая ошибка, мол я не могу занести пустое значение в табл, но на самом деле я его занес только в одну табл. скрин представления в конструкторе прилогаю

Автор: pseud 25.3.2009, 10:42
Цитата(Anatom @  24.3.2009,  22:14 Найти цитируемый пост)
Присоединённый файл ( Кол-во скачиваний: 1 )
 5.JPG 157,07 Kb

офф
какие книжки учат давать русские имена таблицам/столбцам??? 
можно не отвечать, лучше сразу сжечь.


Автор: Frees 25.3.2009, 11:18
ОФФ
Цитата(Akella @  24.3.2009,  11:33 Найти цитируемый пост)
На таких форумах как sql.ru и ibase.ru таких пользователей ленивых просто тупо задрачивают (не побоюсь этого слова) и они туда больше не приходят.

и они приходят сюда

Автор: Данкинг 25.3.2009, 12:00
Цитата(pseud @  25.3.2009,  10:42 Найти цитируемый пост)
какие книжки учат давать русские имена таблицам/столбцам???

Если СУБД допускает - так в чём проблема, собственно?
ЗЫ: я русских имён никогда не даю, но не понимаю, почему народ этим возмущается.

Автор: Anatom 25.3.2009, 16:50
В том то и дело я из грида во все свои табл С РУССКИМИ ИМЕНАМИ могу заносить данные а в эту табл не получаеться. вопрос когда я запускаю ехе, ввожу все данные (у меня нет пустых полей), а он ругаеться что поле №паспорта вводиться пустое значение. я и создал впринципе эту тему, потому что куда могут пропасть данные я не знаю, а вы меня за ламера считаете. 

Автор: Anatom 25.3.2009, 23:02
я сделал скрин из профайлер может тут что-нибудь подскажите

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)