Последняя версия DataExpress 22.3.12

Изображение Скачать | Изображение Что нового?

Подскажите с программным добавлением записей

Раздел для обсуждений характера, прямо не связанного с остальными разделами форума.
Для тех кто:
1. Надо бы высказаться, но негде.
2. Забрел, но не знает куда написать (полезная информация будет заботливо перенесена администрацией в соответствующий раздел форума)
3. Умышленно или неумышленно отошел от основной темы в полезном разделе форума.
Vofka18
Знаток
Сообщения: 602
Зарегистрирован: 04 мар 2018, 16:54
Благодарил (а): 69 раз
Поблагодарили: 85 раз

Подскажите с программным добавлением записей

Сообщение Vofka18 » 13 май 2022, 21:31

admin писал(а):Теперь я вообще ничего не понял. Какие все поля?..

Сейчас нет доступа к компьютеру, можно на пальцах? :)
Есть форма например с 3-мя обязательными полями, в нее я добавляю запись следующим кодом

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

If not fm.locate('fld1;fld2',['значение1','значение2'],[])then
Begin
  Fm.append;
  Fm['fld1']:='значение1';
  Fm['fld2']:='значение2';
  Fm post;
End;

В теории этот код должен добавить только одну запись(сколько его не выполняй), но по факту каждый раз при выполнении данного кода(если не заполнять третье обязательное поле)будут создаваться дубли.
Если что сори за синтаксис(если где ошибся) пишу с телефона.

Аватара пользователя
admin
Разработчик
Сообщения: 6148
Зарегистрирован: 14 мар 2016, 11:32
Откуда: Ленинградская
Благодарил (а): 88 раз
Поблагодарили: 692 раза

Подскажите с программным добавлением записей

Сообщение admin » 13 май 2022, 21:51

Лучше сделайте пример базы, как будет время.

Vofka18
Знаток
Сообщения: 602
Зарегистрирован: 04 мар 2018, 16:54
Благодарил (а): 69 раз
Поблагодарили: 85 раз

Подскажите с программным добавлением записей

Сообщение Vofka18 » 13 май 2022, 22:32

admin писал(а):Лучше сделайте пример базы, как будет время.

Отобрал у дитя компьютер :D
Пример во вложении.
Форма "товары" поле "группа" и "единицы измерения" сделал обязательными. На вкладке "Фильтры списков" создал кнопку "Добавить запись". В ней такой скрипт:

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

procedure Click(Sender: TObject);
var
  fm:tdxForm;
begin
  fm:=tdxForm.Create('Товары');
  fm.open;
  if not fm.locate('Название',['qwerty'],[]) then
  begin
    fm.append;
    fm['Название']:='qwerty';
    fm.post;
    debug('Запись удачно добавлена');
  end;
  fm.close;
  fm.free;
end;

Я ж не поплыл мозгами (а то не исключаю :) )? Если много раз нажать на кнопку, то должна добавиться только одна запись? Да?
По факту, пока незаполненные поля указаны как обязательные, то с каждым нажатием на кнопку, добавляется новая запись.
Просто покликайте по ней, а потом уберите "обязательность" с полей "группа" и "единицы измерения", и гляньте, в форме "товары" будет куча одинаковых записей.
Вложения
DEMO_DB.rar
(71.31 КБ) 5 скачиваний

Аватара пользователя
admin
Разработчик
Сообщения: 6148
Зарегистрирован: 14 мар 2016, 11:32
Откуда: Ленинградская
Благодарил (а): 88 раз
Поблагодарили: 692 раза

Подскажите с программным добавлением записей

Сообщение admin » 14 май 2022, 12:20

Vofka18 писал(а):Если много раз нажать на кнопку, то должна добавиться только одна запись? Да?

Нет. При нажатии на кнопку каждый раз открывается набор данных формы, в котором нет записей с пустыми обязательными [иерархическими] полями.
Или используйте SQLSelect, или объявляйте глобальную переменную Fm и открывайте набор данных за пределами обработчика Click.

Vofka18
Знаток
Сообщения: 602
Зарегистрирован: 04 мар 2018, 16:54
Благодарил (а): 69 раз
Поблагодарили: 85 раз

Подскажите с программным добавлением записей

Сообщение Vofka18 » 14 май 2022, 12:36

admin писал(а):
Vofka18 писал(а):Если много раз нажать на кнопку, то должна добавиться только одна запись? Да?

Нет. При нажатии на кнопку каждый раз открывается набор данных формы, в котором нет записей с пустыми обязательными [иерархическими] полями.
Или используйте SQLSelect, или объявляйте глобальную переменную Fm и открывайте набор данных за пределами обработчика Click.

Имхо, немного не привычное поведение(как по мне сам синтаксис функции этому противоречит, ведь мы ищем по конкретным полям, конкретные значения, и не находим их из-за того, что "третьи" поля(которые нас не интересуют пока) не заполнены).
Ну да ладно, не сильно критично, главное это не забыть :)
Спасибо за разъяснения ;)

Аватара пользователя
admin
Разработчик
Сообщения: 6148
Зарегистрирован: 14 мар 2016, 11:32
Откуда: Ленинградская
Благодарил (а): 88 раз
Поблагодарили: 692 раза

Подскажите с программным добавлением записей

Сообщение admin » 14 май 2022, 15:08

Вы так ничего и не поняли :(

Vofka18
Знаток
Сообщения: 602
Зарегистрирован: 04 мар 2018, 16:54
Благодарил (а): 69 раз
Поблагодарили: 85 раз

Подскажите с программным добавлением записей

Сообщение Vofka18 » 14 май 2022, 15:44

admin писал(а):Вы так ничего и не поняли :(

Теперь я напрягся :D что я не понял? :( Принцип работы функции я вроде понял, и в дальнейшем буду учитывать. Также я понял что при непрерывном добавлении записей (в пределах одного открытого набора данных), функция будет срабатывать.
Я просто выразил свое мнение по поводу того, не всегда набор данных висит открытым.
И если мы когда-то добавили записи, и хотим еще добавить, то функция Locate не обнаружит существующую запись.
В описании функции указано, что поиск ведется с начала набора данных(но не уточняется что некоторые данные могут просто не попасть в набор).
Как в моем примере: фактически в базе данных присутствует запись с "названием"="qwerty" (она отображается в выпадающем списке объекта, и ее можно выбрать в этом объекте), ее не видно только в таблице.
Но если я захочу проверить наличие этой записи, то я ее не найду... :cry:
Вложения
2022-05-14_15-30-40.png
2022-05-14_15-30-40.png (21.18 КБ) 124 просмотра

Аватара пользователя
admin
Разработчик
Сообщения: 6148
Зарегистрирован: 14 мар 2016, 11:32
Откуда: Ленинградская
Благодарил (а): 88 раз
Поблагодарили: 692 раза

Подскажите с программным добавлением записей

Сообщение admin » 14 май 2022, 19:08

Vofka18 писал(а):В описании функции указано, что поиск ведется с начала набора данных(но не уточняется что некоторые данные могут просто не попасть в набор).
Как в моем примере: фактически в базе данных присутствует запись с "названием"="qwerty" (она отображается в выпадающем списке объекта, и ее можно выбрать в этом объекте), ее не видно только в таблице.

Содержимое набора данных зависит от SQL-запроса, который программа посылает Firebird. Где-то в методе Open формируется SQL-запрос, который зависит от фильтров, условий отбора. На SQL-запрос также влияет установленное свойство "Обязательное" для иерархического объекта. Следовательно Locate не найдет запись, если ее в принципе нет в наборе, хоть 10 параметров ей добавляй. Я думаю, если человек понимает что такое "набор данных", то нет необходимости в каких-либо уточнениях в описании Locate.

Аватара пользователя
Develop-Soft
Сообщения: 2060
Зарегистрирован: 05 мар 2019, 18:09
Откуда: Белгород
Благодарил (а): 130 раз
Поблагодарили: 692 раза

Подскажите с программным добавлением записей

Сообщение Develop-Soft » 15 май 2022, 00:38

Можно так попробовать на..бать эту "логику":

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

  fm:=tdxForm.Create('...');

   for i:=0 to fm.ComponentCount-1 do
   begin
     try
       SetPropValue(fm.Components[i],'Required',false);
     except
     end;
   end;

  fm.open;
  ... 

Vofka18
Знаток
Сообщения: 602
Зарегистрирован: 04 мар 2018, 16:54
Благодарил (а): 69 раз
Поблагодарили: 85 раз

Подскажите с программным добавлением записей

Сообщение Vofka18 » 15 май 2022, 10:11

Develop-Soft писал(а):Можно так попробовать на..бать эту "логику":

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

  fm:=tdxForm.Create('...');

   for i:=0 to fm.ComponentCount-1 do
   begin
     try
       SetPropValue(fm.Components[i],'Required',false);
     except
     end;
   end;

  fm.open;
  ... 

Не, думаю это перебор :) хотя идея интересная. :)


Вернуться в «Курилка.»