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


Автор: sasha198407 12.1.2011, 22:29
Доброго времени суток. Есть база на 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.
Помогите пожалуйста уже неделю бьюсь и всё никак. Зарание спасибо.

Автор: Keeper89 13.1.2011, 01:27
Странно. Если база пустая, можно попробовать пересоздать это поле и посмотреть.

Автор: Deniz 13.1.2011, 06:20
sasha198407, во-первых, нужно пользоваться форматированием в посте.
Во-вторых, ADOQ_Sotrudnik привязан к DBGrid1 и после
Код
DataModule13.ADOQ_Sotrudnik.Close;
обращаться к полям этого датасет'а нельзя.
В-третьих, между
Код
DataModule13.ADOQ_Sotrudnik.ExecSQL;
DataModule13.ADOQ_Sotrudnik.SQL.Add('SELECT * FROM sotrudniki');
нужно добавить 
Код
DataModule13.ADOQ_Sotrudnik.SQL.Clear;

Автор: superVad 13.1.2011, 10:27
Зачем дублировать одни и те же данные в двух таблицах? В таблице отпусков тебе должно хватить одного табельного номера.

И отформатируй код - трудно читать.

Автор: Akella 13.1.2011, 11:36

M
Akella
используйте кнопку КОД


http://forum.vingrad.ru/forum/topic-126445.html

Автор: ziga 18.1.2011, 13:57
Сделай лучше такую структуру БД :

Код

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

Таблица otpusk
id_otpusk
id_sotrudnik
dt_open
dt_close


связь по столбцу id_sotrudnik

в гриде сотрудников отображай 

Код

select *
  from sotrudniki



в гриде сотрудников в отпуске отображай 

Код

select * 
  from sotrudniki st, otpusk ot
 where ot.id_sotrudnik = st.id_sotrudnik
   and ot.dt_close is null

   
и при нажатии кнопки остаётся только сделать инсёрт в таблицу otpusk

Код

insert into otpusk (id_otpusk, id_sotrudnik, dt_open, dt_close) 
values ((select count (*) + 1 from otpusk),
        :p_id_sotrudnik,
        sysdate,
        null)


Передав в отдельный квери пааметр :p_id_sotrudnik (SQL запросы писал в oracle )

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