| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 и после
В-третьих, между
|
| Автор: superVad 13.1.2011, 10:27 |
| Зачем дублировать одни и те же данные в двух таблицах? В таблице отпусков тебе должно хватить одного табельного номера. И отформатируй код - трудно читать. |
| Автор: Akella 13.1.2011, 11:36 | ||
http://forum.vingrad.ru/forum/topic-126445.html |
| Автор: ziga 18.1.2011, 13:57 | ||||||||
Сделай лучше такую структуру БД :
связь по столбцу id_sotrudnik в гриде сотрудников отображай
в гриде сотрудников в отпуске отображай
и при нажатии кнопки остаётся только сделать инсёрт в таблицу otpusk
Передав в отдельный квери пааметр :p_id_sotrudnik (SQL запросы писал в oracle ) |