Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2011, 22:44   #1
sasha198407
Пользователь
 
Регистрация: 05.05.2009
Сообщений: 40
По умолчанию SQL

Доброго времени суток. Есть база на MSSQLserver под названием kadr и состоит она из таблиц sotrudniki и otpusk

Таблица sotrudniki
tab_num
fio
dolg
id_otd

Таблица otpusk
tab_num
fio
dolgnost
id_otd

В Делфи7 создаю клиентскую часть. В Delphi подключение к БД происходит с помощью компонента ADOConnection.
Создал две формы. Первая frmSotrudnik с элементами ADOQ_Sotrudnik(ADOQuery1), Source1, DBGrid1, Button1. Вторая frmOtpusk с элементами ADOQ_Otpusk(ADOQuery2), Source2, DBGrid2.
Суть в том что бы, выделив одну из записей поля tab_num элемента DBGrid1 и нажав на кнопку Button1 копировать соответствующую строку в таблицу otpusk
Ниже приводится код:

Код:
unit Unit5;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, DBCtrls, Grids, DBGrids, StdCtrls;

type
  TSotrudnik = class(TForm)
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    Otpusk: TButton;
    procedure FormCreate(Sender: TObject);
    procedure OtpuskClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Sotrudnik: TSotrudnik;

implementation

uses Unit13;

{$R *.dfm}

procedure TSotrudnik.FormCreate(Sender: TObject);
begin
      Sotrudnik.Show;
end;
procedure TSotrudnik.OtpuskClick(Sender: TObject);
begin
    DataModule13.ADOQ_Sotrudnik.Close;
    DataModule13.ADOQ_Sotrudnik.SQL.Clear;
    DataModule13.ADOQ_Sotrudnik.SQL.Add('INSERT INTO otpusk (tab_num, fio, dolgnost, id_otd)');
    DataModule13.ADOQ_Sotrudnik.SQL.Add('SELECT tab_num, fio, dolg, id_otd');
    DataModule13.ADOQ_Sotrudnik.SQL.Add('FROM sotrudniki where tab_num=' +DBGrid1.DataSource.DataSet.fieldbyname('tab_num').asString);
    DataModule13.ADOQ_Sotrudnik.ExecSQL;
    DataModule13.ADOQ_Sotrudnik.SQL.Add('SELECT * FROM sotrudniki');
    DataModule13.ADOQ_Sotrudnik.Active := true;
    DataModule13.ADOQ_Otpusk.SQL.Add('SELECT * FROM otpusk');
    DataModule13.ADOQ_Otpusk.Active := true;
end;

procedure TSotrudnik.FormClose(Sender: TObject; var Action: TCloseAction);
begin
     Action := caFree;
end;

end.
Компиляцию код проходит. но при нажатие на кнопку Button1, то есть при выполнении программы выпадает ошибка: Project kadr.exe raised exception class EDatabaseError with message 'ADOQ_Sotrudnik: Field 'tab_num' not found', Process stoped. Use Step Run to continue.
Я так понимаю он говорит что поле tab_num не найдено, но как так если я его вижу(название: tab_num) и в делфи и в MSSQLserver.
Помогите пожалуйста уже неделю бьюсь и всё никак. Зарание спасибо.

Последний раз редактировалось AlDelta; 12.01.2011 в 22:52.
sasha198407 вне форума Ответить с цитированием
Старый 12.01.2011, 22:55   #2
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

А вам не приходило в голову сначала ознакомиться с синтаксисом команды INSERT INTO ? А жаль...
asmodey1 вне форума Ответить с цитированием
Старый 12.01.2011, 23:42   #3
sasha198407
Пользователь
 
Регистрация: 05.05.2009
Сообщений: 40
По умолчанию

Да я как бы знаком, а что не так?
sasha198407 вне форума Ответить с цитированием
Старый 13.01.2011, 04:12   #4
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

написано по моему понятно
Цитата:
Field 'tab_num' not found'
меня смущает
Цитата:
DBGrid1.DataSource.DataSet.fieldbyn ame('tab_num').asString
DBGrid1.DataSource.DataSet есть ли в этом наборе данных поле с именем tab_num в тот момент когда вы пытаетесь прочитать его значение, и правильно ли написано tab_num может буква a на руссской раскладке.

Последний раз редактировалось vovk; 13.01.2011 в 04:24.
vovk вне форума Ответить с цитированием
Старый 13.01.2011, 15:56   #5
OlegVE
Форумчанин
 
Регистрация: 27.09.2010
Сообщений: 376
По умолчанию

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

1.
Цитата:
Сообщение от sasha198407 Посмотреть сообщение
...Компиляцию код проходит. но при нажатие на кнопку Button1, то есть при выполнении программы выпадает ошибка
На сколько я знаю, в Delphi не проверяется SQL. Инструкции SQL передаются СУБД в виде строки (в том числе с функциями поддерживаемыми только в самой СУБД) и только потом, в момент обращения к СУБД, Вы получаете ошибку.

2.
Цитата:
Сообщение от sasha198407 Посмотреть сообщение
Да я как бы знаком, а что не так?
Я не знаю диалект SQL MSSQLserver. Там должны быть какие-то особенности, в том числе, возможно, и для INSERT INTO... . Может в этом дело?

3. Под Button1 Вы понимаете Otpusk: TButton; и Button1Click одно и то-же с OtpuskClick?

До свидания.
OlegVE вне форума Ответить с цитированием
Старый 13.01.2011, 23:30   #6
sasha198407
Пользователь
 
Регистрация: 05.05.2009
Сообщений: 40
По умолчанию

OlegVE
Цитата:
Сообщение от OlegVE Посмотреть сообщение
3. Под Button1 Вы понимаете Otpusk: TButton; и Button1Click одно и то-же с OtpuskClick?
Да именно так, просто когда писал текст вопроса название кнопки указал не Otpusk, а Button1
sasha198407 вне форума Ответить с цитированием
Старый 14.01.2011, 09:43   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
DataModule13.ADOQ_Sotrudnik.SQL.Add('INSERT INTO otpusk (tab_num, fio, dolgnost, id_otd)');
заменить на:
Код:
DataModule13.ADOQ_Sotrudnik.SQL.Add('INSERT INTO otpusk');
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.01.2011, 21:23   #8
sasha198407
Пользователь
 
Регистрация: 05.05.2009
Сообщений: 40
По умолчанию

Ни чего из вышепредложенного не помогло. Название tab_num я копировал из базы, поэтому возможность неправильного названия исключаю.
sasha198407 вне форума Ответить с цитированием
Старый 14.01.2011, 21:35   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
sasha198407
Вот что я тебе скажу. Выкинь свой учебник и почитай про нормальные формы базы.
У тебя есть таблица сотрудников. Зачем ты повторяешь поля в таблице отпусков?
Оставь в отпусках просто код сотрудника, тогда
Код:
    
with DataModule13.ADOQ_Sotrudnik do begin
 Close;
 SQL.text:='INSERT INTO otpusk SELECT tab_num FROM sotrudniki where tab_num=' +DBGrid1.DataSource.DataSet.fieldbyname('tab_num').asString;
 ExecSQL;
 SQL.text:='SELECT * FROM sotrudniki';
 Оpen;
end;
with  DataModule13.ADOQ_Otpusk do begin
  SQL.text:='SELECT * FROM otpusk';
  open;
end;
Нечего полям fio dolgnost id_otd делать в таблице отпусков.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.01.2011, 13:01   #10
sasha198407
Пользователь
 
Регистрация: 05.05.2009
Сообщений: 40
По умолчанию

Аватар, пробовал та же хрень.
sasha198407 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление строки с помощью SQL запроса (Query1.SQL.ADD('Delete....')) Schutze Помощь студентам 6 29.11.2009 22:15
Создание новых таблиц в MS SQL SERVERE через SQL запрос в Delphi S_Yevgeniy Помощь студентам 1 27.10.2009 06:26
sql или не sql Diamand SQL, базы данных 9 18.09.2008 17:17
SQL запрос на основе другого SQL запрса... Timoxa БД в Delphi 1 07.01.2007 18:15