DBGrid + LookupComboBox + новая запись.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

DBGrid + LookupComboBox + новая запись.

Сообщение snkip » 22.06.2020 13:01:10

Добрый день!
Не получается сохранить новую запись при добавлении значения через выпадающий список в гриде.
Дата-сеты для подстановки значений и для главного грида присутствуют, все отображается и выбирается, но при сохранении возникает ошибка, что нет такого поля "name". Это поле из дата-сета для подстановки.
Подскажите пожалуйста в чем может быть причина?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось snkip 22.06.2020 17:37:32, всего редактировалось 1 раз.
snkip
незнакомец
 
Сообщения: 9
Зарегистрирован: 14.06.2020 16:27:30

Re: DBGrid + LookupComboBox + новая запись.

Сообщение DedFrend » 22.06.2020 14:19:58

LookupResultField д.б. type
DedFrend
постоялец
 
Сообщения: 156
Зарегистрирован: 25.11.2018 12:21:50

Re: DBGrid + LookupComboBox + новая запись.

Сообщение snkip » 22.06.2020 17:32:20

Прошу прощения! Я на схеме таблиц неправильно указал название поля, оно называется "name", а не "type" и в настройке столбцов запроса оно же и указано в строке "LookupResultField"

Добавлено спустя 5 минут 39 секунд:
Поменял скрин с таблицами.

Добавлено спустя 41 минуту 44 секунды:
Сейчас попробовал такой пример в Delphi и там все работает, может баг в Lazarus или реализация как-то отличается? Хотя все один в один сделал.
snkip
незнакомец
 
Сообщения: 9
Зарегистрирован: 14.06.2020 16:27:30

Re: DBGrid + LookupComboBox + новая запись.

Сообщение mig-31 » 22.06.2020 20:16:51

Я списки в DbGrid делаю, через PickList, например
Код: Выделить всё
  DbGrid.Columns.Items[0].ButtonStyle := cbsPickList;
  DbGrid.Columns.Items[0].PickList.Add('Item1');
  DbGrid.Columns.Items[0].PickList.Add('Item2');

Данные в PickList можете добавлять из чего угодно.

Еще одной причиной может быть, что у вас сложный запрос в SQLQuery, например из нескольких таблиц. Тогда надо явно прописать SQL запросы update, insert в SQLQuery.UpdadeSQL.Text и SQLQuery.InsertSQL.Text
mig-31
постоялец
 
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

Re: DBGrid + LookupComboBox + новая запись.

Сообщение snkip » 23.06.2020 06:51:57

mig-31 писал(а):Я списки в DbGrid делаю, через PickList, например
Код: Выделить всё
  DbGrid.Columns.Items[0].ButtonStyle := cbsPickList;
  DbGrid.Columns.Items[0].PickList.Add('Item1');
  DbGrid.Columns.Items[0].PickList.Add('Item2');

Данные в PickList можете добавлять из чего угодно.

Еще одной причиной может быть, что у вас сложный запрос в SQLQuery, например из нескольких таблиц. Тогда надо явно прописать SQL запросы update, insert в SQLQuery.UpdadeSQL.Text и SQLQuery.InsertSQL.Text


Спасибо за ответ!
Запрос на выборку простой - SELECT * FROM t_phone.

Чтобы работать через PickList мне нужно будет в цикле пройти по датасету? И так понимаю, что добавление данных в таблицу также описать в коде?

Вообще есть ощущение, что при формировании запроса на добавление записи, подставляется Lookup столбец "Name" (тот, что создан для отображения данных подстановки), а по идее должен - "id_t_type"
snkip
незнакомец
 
Сообщения: 9
Зарегистрирован: 14.06.2020 16:27:30

Re: DBGrid + LookupComboBox + новая запись.

Сообщение DedFrend » 23.06.2020 10:44:01

Все должно работать!. Я в таком стиле сто раз делал, правда. с IBX компонентами. А если убрать Lookup поле все сохраняется?. Чтобы разговор был более предметным желательно привести текст lfm файла.
DedFrend
постоялец
 
Сообщения: 156
Зарегистрирован: 25.11.2018 12:21:50

Re: DBGrid + LookupComboBox + новая запись.

Сообщение snkip » 23.06.2020 12:47:34

Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, sqldb, db, mysql57conn, Forms, Controls, Graphics, Dialogs,
  DBGrids, DBCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    DataPhones: TDataSource;
    DataPhoneTypes: TDataSource;
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    Connection: TMySQL57Connection;
    QueryPhones: TSQLQuery;
    QueryPhonesid: TAutoIncField;
    QueryPhonesid_t_types: TLongintField;
    QueryPhonesphone: TStringField;
    QueryPhoneTypes: TSQLQuery;
    StringField1: TStringField;
    Transaction: TSQLTransaction;
    procedure FormShow(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormShow(Sender: TObject);
begin
  QueryPhones.Open;
end;

end.


Добавлено спустя 2 минуты 2 секунды:
Без Lookup сохраняется, просто ввожу id типа телефона и все ОК!

Добавлено спустя 47 минут 34 секунды:
Попробовал сейчас на PostgreSQL, тот же эффект! Судя по ошибке, данные из Lookup поля тоже пытаются добавиться в таблицу.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
snkip
незнакомец
 
Сообщения: 9
Зарегистрирован: 14.06.2020 16:27:30

Re: DBGrid + LookupComboBox + новая запись.

Сообщение mig-31 » 23.06.2020 14:13:59

Сюда по этой ошибке, вам надо задать запрос на вложение записи в SQLQuery.InsertSQL.Text.
mig-31
постоялец
 
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

Re: DBGrid + LookupComboBox + новая запись.

Сообщение snkip » 23.06.2020 14:16:45

Всем спасибо за помощь! Вроде разобрался в чем проблема!
При создании поля подстановки, по умолчанию активны пара чекбоксов, снял галки и все заработало! Ура!
Настройка на скрине, мож кому пригодится!
У вас нет необходимых прав для просмотра вложений в этом сообщении.
snkip
незнакомец
 
Сообщения: 9
Зарегистрирован: 14.06.2020 16:27:30


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Alex2013, Google [Bot], Yandex [Bot] и гости: 44

Рейтинг@Mail.ru