Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DBLookupComboBox, Вопрос про запись значения в таблицу 
:(
    Опции темы
mambo
Дата 28.4.2004, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 28.4.2004

Репутация: нет
Всего: нет



Помогите, пожалуйста, новичку!
Хочу записать код руководителя из таблицы руководителей (Ruk) в таблицу подразделений (Pod), на форме вставки записи - DBLookupComboBox, где значения должностей из таблицы Ruk.
Так вот, делаю следующее
DM.Pod['PKodRuk'] := DBLookupComboBox1.KeyValue;
и в таблице Pod появляются записи по всем кодам руководителей, а не только по выбранному...
Как сделать правильно? butbut.gif
PM MAIL   Вверх
Cashey
Дата 28.4.2004, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Код
DM.Pod.FieldByName('PKodRuk').AsString := DBLookupComboBox1.Text



--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
mambo
Дата 28.4.2004, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 28.4.2004

Репутация: нет
Всего: нет



Все равно - записей столько, сколько значений у DBLookupComoBox wow.gif
PM MAIL   Вверх
x77
Дата 28.4.2004, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 1
Всего: 22



ничего не понял...

зачем вообще руками что-то указывать? у тебя TDbLookupComboBox есть. настрой в нём LookupField, KeyField, ResultField и т.д. и у тебя всё будет писаться само без всяких присвоений. А если ты пишешь руами - то зачем тебе вообще LookupCombo?


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
mambo
Дата 28.4.2004, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 28.4.2004

Репутация: нет
Всего: нет



Настроил правильно ListSource, ListField, KeyField, а в результате все так же прописываются в таблице записи, вместо того, чтобы появлялась одна.
PM MAIL   Вверх
jonik_Dk
Дата 28.4.2004, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 18.2.2004

Репутация: нет
Всего: 1



Можешь по другому :

Создай в Таблице Podr Lookup-поле (Редактор полей), которое будет ссылаться на таблицу Ruk. И в DBLookupComboBox просто пропишешь это аоле в свойстве FieldName, больше ничего настраивать не прийдется.

Но, в принципе если правильно настроил свойства ListSource, ListField, KeyField должно работать.
PM MAIL   Вверх
Cashey
Дата 28.4.2004, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Настраивать св-ва ListSource, ListField, KeyField, не совсем удобно, для этого курсор в таблице должен стоять на добавленной или редактируемой строке. И не будет отката назад.
А мой пример не может не работать. Убери из компонента связи, оставь заполнеными только св-ва KeyField и ListField , убедись, что у тебя открыта таблица и что использованны комманды Append, Insert или Edit. И, что у тебя присваивании происходит не в цикле.


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
mambo
Дата 29.4.2004, 02:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 28.4.2004

Репутация: нет
Всего: нет



Оставляю свойства KeyField и ListField, все равно результат тот же...
PM MAIL   Вверх
mambo
Дата 29.4.2004, 03:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 28.4.2004

Репутация: нет
Всего: нет



С подстановочным полем тоже ничего не выходит.
PM MAIL   Вверх
Cashey
Дата 29.4.2004, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



привиди весь код процедуры, где у тя происходит присвоение


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
mambo
Дата 29.4.2004, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 28.4.2004

Репутация: нет
Всего: нет



procedure TForm6.Button1Click(Sender: TObject);
begin
DM.Pod.Append;
DM.Pod['PKod'] := Edit1.Text;
DM.Pod['PPod'] := Edit2.Text;

А тут разные варианты, которые использовал:

//DM.Pod.FieldByName('PKodRuk').AsString := DBLookupComboBox1.KeyValue;

//DM.Pod['PKodRuk'] := DBLookupComboBox1.KeyValue;

А вот после такого выходит ошибка (Circular data links are not allowed):
//DBLookupComboBox1.DataSource := DM.DataSource2;
//DBLookupComboBox1.DataField := 'PKod_Ruk';
//DBLookupComboBox1.ListSource := DM.DataSource1;
//DBLookupComboBox1.ListField := 'RDolj';
//DBLookupComboBox1.KeyField := 'RKod';

DM.Pod.Post;
DM.Pod_Adm.Active := False;
DM.Pod_Adm.Active := True;
Close;
end;
PM MAIL   Вверх
Cashey
Дата 29.4.2004, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Цитата(mambo @ 29.4.2004, 08:43)
А тут разные варианты, которые использовал:

//DM.Pod.FieldByName('PKodRuk').AsString := DBLookupComboBox1.KeyValue;

//DM.Pod['PKodRuk'] := DBLookupComboBox1.KeyValue;

Обрати внимание! Я же сказал не KeyValue, а
Код
DM.Pod.FieldByName('PKodRuk').AsString := DBLookupComboBox1.[b]Text[/b]



--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
mambo
Дата 29.4.2004, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 28.4.2004

Репутация: нет
Всего: нет



Все равно идет запись по всем руководителям... wow.gif
PM MAIL   Вверх
Cashey
Дата 29.4.2004, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Фигня это все. Так не бывает, что-то зевнул smile.gif
Значит так: убиваешь все, что у тя есть в св-вах DBLookupComboBox1: DataField, DataSource, ImeName. В св-вах DBLookupComboBox1.ListSource пишишь Source справочника, св-ва ListField и KeyField дублируешь именим поля справочника ('RDolj')

И дальше пишишь код:
Код
procedure TForm6.Button1Click(Sender: TObject);
begin
DM.Pod.AppendRecord([Edit1.Text,Edit2.Text,DBLookupComboBox1.Text]);
DM.Pod.Post;
end;


Имей ввиду, что Edit должны соответствовать порядковому номеру фактического поля в таблице, если у тебя первое поле типа AutoIncrement, то тогда первым параметром поставь nil


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
mambo
Дата 29.4.2004, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 28.4.2004

Репутация: нет
Всего: нет



'Pod: Dataset not in edit or insert mode' - такая фигня вылазит при запуске...
PM MAIL   Вверх
Cashey
Дата 29.4.2004, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Если тебе надо добавить только идентификатор (значение поля DM.Pod['PKodRuk']), то можешь либо просто написать
Код
DM.Pod.FieldByName('PKodRuk').AsInteger := Справочник.FieldByName('RKod').AsInteger

или используй KeyValue, как ты и делал раньше, только тогда KeyField присвой значение RKod


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
x77
Дата 29.4.2004, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 1
Всего: 22



Cashey, AppendRecord сам сделает Post smile.gif

mambo, убей последнюю строчку.



--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
mambo
Дата 29.4.2004, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 28.4.2004

Репутация: нет
Всего: нет



Попробовал старые варианты и выяснил, что ко всему прочему в таблицу подразделений записывается не код руководителя, а должность.
И кол-во записей всё такое же. bored.gif
PM MAIL   Вверх
Cashey
Дата 29.4.2004, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Цитата(x77 @ 29.4.2004, 09:38)
Cashey, AppendRecord сам сделает Post smile.gif

mambo, убей последнюю строчку.

Да, если база не буферизированная, но я на всякий случай посоветую сделать так:
Код
if DM.Pod.Modified = true then
if MessageDlg('Данные были изменены. Сохранить данные?',
   mtConfirmation, [mbYes, mbNo], 0) = mrYes then  begin
DM.Pod.Post;
DM.Pod.FlushBuffers;
end;

Добавлено @ 09:48
mambo
AppendRecord, может добавить больше одной записи только в цикле smile.gif. Значит у тебя DataSource не пустое


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
x77
Дата 29.4.2004, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 1
Всего: 22



Cashey, да при чём здесь буферизация. после AppendRecord таблице ляжет в State=dsBrowse и последующий вызов Post всегда будет валить её в эксепшн. ты определись, либо AppendRecord, либо Insert|Edit .. Post.



--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
mambo
Дата 29.4.2004, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 28.4.2004

Репутация: нет
Всего: нет



mad.gif Ничего не выходит...

Вернулся к такому варианту:

procedure TForm6.Button1Click(Sender: TObject);
begin
DM.Pod.Append;
DM.Pod['PKod'] := Edit1.Text;
DM.Pod['PPod'] := Edit2.Text;
DM.Pod.Post;
DM.Pod_Adm.Active := False;
DM.Pod_Adm.Active := True;
Close;
end;

У DBLookupComboBox настройки такие:

ListSource=DM.DataSource1, ListField=RDolj, KeyField=RKod.

Запись в таблицу подразделений выполняется, но снова вместо одной по выбранной должности из DBLookupComboBox получается столько, сколько всего руководителей.
PM MAIL   Вверх
x77
Дата 29.4.2004, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 1
Всего: 22



мда.... шаман, однако. первый раз слышу, чтобы один аппенд приводил к вставке кучи записей. может, я не догоняю чего? это же физически невозможно.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
mambo
Дата 29.4.2004, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 28.4.2004

Репутация: нет
Всего: нет



Вот в этом и вопрос.
Причем получается так:
Количество записей столько, сколько руководителей. В каждой записи наименование подразделения одинаковое, которое вводил в Edit. Код подразделения у всех одинаковый 1. А код руководителя разный...

Что за баг?.. wow.gif
PM MAIL   Вверх
x77
Дата 29.4.2004, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 1
Всего: 22



чудес не бывает. у тебя где-то что-то ещё прописано. в AfterInsert, BeforeInsert, AfterPost, BeforePost, AfterScroll какие-нить обработчики есть?
Добавлено @ 10:24
выложи весь код модуля, если не сложно.

мне аж интиресно стало smile.gif


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
mambo
Дата 29.4.2004, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 28.4.2004

Репутация: нет
Всего: нет



Пожалуйста, вот он:

unit Unit6;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DBCtrls, ExtCtrls, DB, DBTables;

type
TForm6 = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Label3: TLabel;
Button1: TButton;
Button2: TButton;
DBLookupComboBox1: TDBLookupComboBox;
DBComboBox1: TDBComboBox;
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form6: TForm6;

implementation

uses Data_U;

{$R *.dfm}

procedure TForm6.Button2Click(Sender: TObject);
begin
Close;
end;

procedure TForm6.FormCreate(Sender: TObject);
var
CountRowsP, NP: Integer;
SP: String;
begin
if DM.Pod.RecordCount = 0 then
begin
NP := 1;
SP := IntToStr(NP);
Edit1.Text := SP;
end
else
begin
DM.Pod.Last;
CountRowsP := DM.Pod['PKod'];
NP := CountRowsP + 1;
SP := IntToStr(NP);
Edit1.Text := SP;
while not DM.Ruk.Eof do begin
DBComboBox1.Items.Add(DM.Ruk.FieldByName('RDolj').AsString);
DM.Ruk.Next;
end;

end;
end;

procedure TForm6.Button1Click(Sender: TObject);
begin
DM.Pod.Append;
DM.Pod['PKod'] := Edit1.Text;
DM.Pod['PPod'] := Edit2.Text;
DM.Pod.Post;
DM.Pod_Adm.Active := False;
DM.Pod_Adm.Active := True;
Close;
end;



end.


Млин, другой модуль (ранее рабочий) чё-то заглючил... butbut.gif
А тут еще рабочий день закончился hmmm.gif

Пишите, люди добрые!
Буду ждать с нетерпением, завтра посмотрю.
Всем привет и большое спасибо!
До встречи.
PM MAIL   Вверх
x77
Дата 29.4.2004, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 1
Всего: 22



здесь всё относительно нормально. нормально в том плане, что глючить тут нечему.

меня терзают смутные сомнения, что все чудеса творятся в модуле DM. его можно поглядеть?


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
mambo
Дата 30.4.2004, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 28.4.2004

Репутация: нет
Всего: нет



канешна можно вот:

unit Data_U;

interface

uses
SysUtils, Classes, DB, DBTables;

type
TDM = class(TDataModule)
Database1: TDatabase;
Ruk: TTable;
DataSource1: TDataSource;
Pod: TTable;
DataSource2: TDataSource;
Pz: TTable;
DataSource3: TDataSource;
Sot: TTable;
DataSource4: TDataSource;
Zad: TTable;
DataSource5: TDataSource;
Vp: TTable;
DataSource6: TDataSource;
Wp: TTable;
DataSource7: TDataSource;
Pr: TTable;
DataSource8: TDataSource;
Ruk_Adm: TQuery;
DS_Ruk_Adm: TDataSource;
Ruk_AdmRDolj: TStringField;
Ruk_AdmRRuk: TStringField;
Ruk_AdmRName: TStringField;
Ruk_AdmRPasw: TStringField;
Pod_Adm: TQuery;
DS_Pod_Adm: TDataSource;
Pod_Admrdolj: TStringField;
Pod_Admppod: TStringField;
PZ_Adm: TQuery;
DataSource9: TDataSource;
PZ_AdmPzName: TStringField;
PZ_AdmPzPasw: TStringField;
PZ_AdmPPod: TStringField;
Sot_Adm: TQuery;
Sot_A: TDataSource;
Sot_AdmSSot: TStringField;
Sot_AdmPPod: TStringField;
Sot_AdmSDolj: TStringField;
private
{ Private declarations }
public
{ Public declarations }
end;

var
DM: TDM;

implementation

uses Admin_U, Unit2;

{$R *.dfm}

end.
PM MAIL   Вверх
mambo
Дата 30.4.2004, 04:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 28.4.2004

Репутация: нет
Всего: нет



rolleyes.gif Ура!!
Я разобрался.
Причина была вообще в другом: в неправильном SQL-запросе в Query, через который отображаются данные в сетке.
А DBLookupComboBox оказывается прекрасно работает, в нем главное правильно настроить свойства ListSource, ListField, KeyField.

ВСЕМ БОЛЬШОЕ СПАСИБО! smile.gif

Вопрос снимаю, чао-какао...

PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0690 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.