1 (edited by agatlogic101 2019-10-25 23:29:30)

Topic: дубликаты

Нашёл на FAQ данную тему
http://myvisualdatabase.com/forum/viewtopic.php?id=1062
И интересно как её применить в моём случае?
У меня есть 2 разных необходимости в проверке дубликатов.
Первая это когда проверяется дубликат по 2 параметрам, таким как id_человека и id_должности,
которые заносятся в таблицу test через скрипт.
Выглядит это таким способом, в программе которую я на всякий случай приложу для примера, я нажимаю по кнопке "Добавить должность"
https://d.radikal.ru/d28/1910/b3/646e49f8457b.png
затем, из появившейся таблицы "position"
https://c.radikal.ru/c10/1910/1a/4890e16dfa76.png
с помощью скрипта

procedure должности_и_навыки_TableGrid1_OnClick (Sender: TObject);
begin
     idPosition := SQLExecute('SELECT id FROM position WHERE id='+ должности_и_навыки.TableGrid1.sqlValue );
end;

Назначается переменная, и тут же открывается следующая форма
https://c.radikal.ru/c28/1910/09/a134c2bf2f82.png
где под цифрой 1, мы выбираем человека из таблицы, и тут же с помощью скрипта назначается вторая переменная

procedure должности_и_инавыки_добавить_TableGrid2_OnClick (Sender: TObject);
begin
     idPeople2 := SQLExecute('SELECT id FROM people WHERE id='+ должности_и_инавыки_добавить.TableGrid2.sqlValue );
end;

после чего нажимаю на кнопку "назначить" под цифрой "2", и с помощью скрипта на этой кнопке

procedure должности_и_инавыки_добавить_Button4_OnClick (Sender: TObject; var Cancel: boolean);
begin
  if (idPosition <> '') AND (idPeople2 <> '') then
  begin
  SQLExecute('INSERT INTO test(id_people,id_position) VALUES ("'+idPeople2+'","'+idPosition+'");');
  end;
  должности_и_инавыки_добавить.TableGrid1.dbUpdate;
end;

в таблицу test (под цифрой 3) вносится 2 переменные, смысл которых в том, что они не должны дублироваться.  Я понимаю что сам способ введения информации не самый лёгкий, но всё таки хотелось бы именно с таким решением запретить дубликат. Есть ли такая возможность что бы нельзя было создать запись с данным человеком, если она уже была создана? То есть тот же "Максим Котов" не смог бы назначаться на данную вакансию больше чем 1 раз.

Post's attachments

Attachment icon нафорум.rar 299.81 kb, 324 downloads since 2019-10-26 

2 (edited by agatlogic101 2019-10-26 09:08:07)

Re: дубликаты

Кстати, а возможно такое решение? Есть всё те же таблицы, но когда запись с человеком заносится по скрипту, то из первой таблицы он скрывается. То есть как то привязать к Id с такой логикой, что если в таблице 2 есть уже запись с определённой id человека, то с первой таблицы он скрывается и не показывается. Тогда дубликак так же становится невозможным, да и еще не засоряется людьми которые уже были назначены

3 (edited by sibprogsistem 2019-10-26 14:43:17)

Re: дубликаты

используйте в таблице с именами  поле (ДА/НЕТ)
где
ДА -назначен
Нет - не назначен..
   
по умолчанию ( при добовлении человека ) поле записывает значение НЕТ.
при назначении поле обновлется в ДА..

Это позволит легко управлять (назначать и снимать людей)

а в combobox просто установить фильтр на значение поля ДА\НЕТ

4 (edited by agatlogic101 2019-10-26 15:03:08)

Re: дубликаты

Да, это упростит понимание как это сделать, но при вводе новой должности придётся лезть в код, что бы добавить Да-НЕТ в определённые столбцы... Я сделал кстати по примеру с переменными, но почему то работает криво. То есть если у меня по айди есть 1-1 то больше не добавляется, 1-2 бесконечно растёт 2-1 тоже норм, 2-2 вообще не работает, а 3-1 3-2 уже так же бесконечны... код брал из примера от автора программы

Post's attachments

Attachment icon ут.rar 302.34 kb, 323 downloads since 2019-10-26 

5 (edited by sibprogsistem 2019-10-26 18:32:18)

Re: дубликаты

пока нет времени разбираться в Вашем проекте((

 
сделал для Вас пример
в данном примере отфильтровывается запись по гриду и комбобоксу

Post's attachments

Attachment icon test.7z 4.16 kb, 301 downloads since 2019-10-26 

Re: дубликаты

забыл  cheked -true сделать

Post's attachments

Attachment icon test.7z 4.3 kb, 338 downloads since 2019-10-26 

Re: дубликаты

Спасибо, это то что нужно

8 (edited by senseyesenseye1983 2022-09-05 12:34:11)

Re: дубликаты

Помогите допилить кнопку которая имеет свойство сохранять и одновременно проверять на дубликат. У меня не получается прервать сохранение в таблицы если иметься признак дубликата. Ниже скрипт кнопки:
procedure frmZakaz_Save_OnClick (Sender: TObject; var Cancel: boolean);
var
maxID:string;
Dup_Id,DOB,Fld_Concat: String;
sDateV: string;
sDateZ: string;
sDateG: string;
begin
          if frmZakaz.DateTimePicker1.Checked then
          sDateV  := '"' + FormatDateTime('yyyy-MM-DD hh:mm:ss.000', frmZakaz.DateTimePicker1.Date) + '"'
          else sDateV := 'NULL';
          if frmZakaz.DateTimePicker2.Checked then
          sDateZ  := '"' + FormatDateTime('yyyy-MM-DD hh:mm:ss.000', frmZakaz.DateTimePicker2.Date) + '"'
          else sDateZ := 'NULL';
          if frmZakaz.DateTimePicker5.Checked then
          sDateG  := '"' + FormatDateTime('yyyy-MM-DD 00:00:00.000', frmZakaz.DateTimePicker5.Date) + '"'
          else sDateG := 'NULL';

          //Проверка на дубликат
         DOB := FormatDateTime('yyyy-MM-DD 00:00:00.000',frmZakaz.DateTimePicker1.DateTime);
         Fld_Concat := frmZakaz.Edit22.Text + frmZakaz.Edit1.Text + DOB;

         Dup_Id := SqlExecute('Select id From bsm_off Where Upper(FIO) = "' + (frmZakaz.Edit22.Text) + '" and (productname) = "'
          + (frmZakaz.Edit1.Text) + '" and Date(Dates) = "' + DOB + '"');

        // Если дубликат то ошибка и нельзя сохранить - но сохраняет sad
        If Dup_Id <> '' then
          Begin
            MessageBox('ВЫ ДОБАВИЛИ ПОВТОРЯЮЩИЙСЯ ЗАКАЗ!','Duplicate Error',MB_Ok+MB_ICONERROR);
            frmZakaz.Save.Cancel := True;  // Cancel the save if duplicate
          End;
          //Подскажите скрипт если запись повторяеться то нельзя будет кнопкой сохранить ее
          //Нужно если дубликат прервать дальнейшее выполнение скрипта

      // запись в таблицу bsm_off
    SQLExecute('INSERT INTO bsm_off (FIO,Dates,DateZ,sDateG,productname, vfamily, vname, vlastname,record_count,id_bsm_new) VALUES ("'+frmZakaz.Edit22.Text+'",'+sDateV+','+sDateZ+','+sDateG+',"'+frmZakaz.Edit1.Text+'", "'+frmZakaz.Edit11.Text+'","'+frmZakaz.Edit7.Text+'","'+frmZakaz.Edit8.Text+'","'+frmZakaz.EditCounter1.Text+'",
"'+frmZakaz.Combobox10.sqlvalue+'")');
    // получаем id последней записи в таблице В
    maxID := SQLExecute('SELECT MAX(id) FROM bsm_off');
   // запись в таблицу orderproduct
    SQLExecute('INSERT INTO orderproduct (FIO,Dates, DataZ,dater, productname, record_count, id_bsm_off) VALUES ("'+frmZakaz.Edit22.Text+'",'+sDateV+','+sDateZ+','+sDateG+',"'+frmZakaz.Edit1.Text+'", "'+frmZakaz.EditCounter2.Text+'", "'+maxID+'")');
   // обновление таблицы данных главной формы
   frmZakaz.TableGrid2.dbUpdate;

end;

9 (edited by sparrow 2022-09-05 13:17:25)

Re: дубликаты

Cancel := True;

и обратите внимание на это:


sqlDateTime
   

Возвращает значение даты и времени компонента для использования в SQL запросах. Значение свойства уже содержит экранирующие кавычки. В случае пустого значение, вернет строку NULL

пример: SQLExecute ('INSERT INTO tablename (fieldname) VALUES ('+Form1.DateTimePicker1.sqlDateTime+')');

10 (edited by senseyesenseye1983 2022-09-05 13:34:30)

Re: дубликаты

Во спасибо наталкнул на другой способ smile

Я добавил на другую кнопку
procedure CheckDublicate (Sender: TObject; var Cancel: boolean);
var
Dup_Id,DOB,Fld_Concat: String;
begin
         DOB := FormatDateTime('yyyy-MM-DD 00:00:00.000',frmZakaz.DateTimePicker1.DateTime);
         Fld_Concat := frmZakaz.Edit22.Text + frmZakaz.Edit1.Text + DOB;
         Dup_Id := SqlExecute('Select id From bsm_off Where Upper(FIO) = "' + (frmZakaz.Edit22.Text) + '" and (productname) = "'
          + (frmZakaz.Edit1.Text) + '" and Date(Dates) = "' + DOB + '"');
         If Dup_Id <> '' then
         begin
         frmZakaz.Button14.Click; // Открываем форму которая сообщает об ошибке
         end else
         begin
         frmZakaz.Save.Click; // Сохраняем запись
         end;
end;

А сама кнопка сохранения называется Save  - и работает )) спасибо!!! Вот как хорошо что есть поддержка )

Re: дубликаты

Друзья и все таки прошу Вашей помощи в решении головоломки ( по крайней мере для меня) я 100 разных вариантов перепробовал, много читал что то не получается написать необходимый скрипт. Суть его такова:
При сохранении проверяет на дубликат - но при этом если нашел дубликат и у него есть bolean = 0 то он тебе дает сохранить а если =1 то нет. Снизу прикрепил проект для понимания.

Post's attachments

Attachment icon duplicates_test2.rar 295.27 kb, 111 downloads since 2022-09-06 

Re: дубликаты

пример

Post's attachments

Attachment icon duplicates_test3.zip 335.7 kb, 128 downloads since 2022-09-06 

13 (edited by senseyesenseye1983 2022-09-06 14:39:55)

Re: дубликаты

спасибо. большое
Я только не могу понять как склеить два цикла


procedure Form1_Button4_OnClick (Sender: TObject; var Cancel: boolean);
var
  Dup_Id: String;
  Dup_Id2: String;
begin
    Dup_Id := SqlExecute('Select id From machines Where (model) = ' + (form1.Edit1.sqlValue) + ' '+
         'and (serialnumber) = ' + (form1.Edit2.sqlValue) + ' and Date(Dates) = date(' + form1.DateTimePicker1.sqlDateTime + ') '+
         'and RezervObr = 1 ');
         If Dup_Id <> '' then
         begin
           Showmessage('Есть такая запись нельзя сохранять');
           Cancel := true;
         end else
         Dup_Id := SqlExecute('Select id From machines Where (model) = ' + (form1.Edit1.sqlValue) + ' '+
         'and (serialnumber) = ' + (form1.Edit2.sqlValue) + ' and Date(Dates) = date(' + form1.DateTimePicker1.sqlDateTime + ') '+
         'and RezervObr = 0 ');
         begin
         Showmessage('Можно сохранять');
           Cancel := true;
         end;
end;

Что если Rezerv = 0 - то можно сохранить если 1 то нельзя....
Извините за настырность smile

14 (edited by senseyesenseye1983 2022-09-06 14:44:06)

Re: дубликаты

Вот так вроде работает... спасибо smile
procedure Form1_Button4_OnClick (Sender: TObject; var Cancel: boolean);
var
  Dup_Id: String;
begin
    Dup_Id := SqlExecute('Select id From machines Where (model) = ' + (form1.Edit1.sqlValue) + ' '+
         'and (serialnumber) = ' + (form1.Edit2.sqlValue) + ' and Date(Dates) = date(' + form1.DateTimePicker1.sqlDateTime + ') '+
         'and RezervObr = 1 ');
         If Dup_Id <> '' then
         begin
           Showmessage('Есть такая запись нельзя сохранять');
           Cancel := true;
         end else
         begin
         Showmessage('Можно сохранять');
         Cancel := true;
         end;
end;

Re: дубликаты

Я рано радовался... при проверки оказалось что он все таки дает сохранить то что нельзя.
Там еще один bolean взаимодействовует...
Надо я так понимаю склеивать три условия:
если RezervObr=0 то открывает Form2
если RezervObr = 0 и Obrabotka = 0 то открываем Form1
если не то не другое то сохраняем

Post's attachments

Attachment icon duplicates_test3.zip 335.7 kb, 123 downloads since 2022-09-07 

16 (edited by pavlenko.vladimir.v 2022-09-07 04:36:14)

Re: дубликаты

senseyesenseye1983 wrote:

Я рано радовался... при проверки оказалось что он все таки дает сохранить то что нельзя.
Там еще один bolean взаимодействовует...
Надо я так понимаю склеивать три условия:
если RezervObr=0 то открывает Form2
если RezervObr = 0 и Obrabotka = 0 то открываем Form1
если не то не другое то сохраняем

А как Вы проверяете Rezerv, для каждой записи оно у Вас свое... То есть для новой записи оно еще не создано..
   
Для проверки уже существующего набора записей

procedure Form1_Button4_OnClick (Sender: TObject; var Cancel: boolean);
var
  Dup_Id: String;
begin
    Dup_Id := SqlExecute('Select COUNT(id) From machines Where (model) = ' + (form1.Edit1.sqlValue) + ' '+
         'and (serialnumber) = ' + (form1.Edit2.sqlValue) + ' and Date(Dates) = date(' + form1.DateTimePicker1.sqlDateTime + ') '+
         'and RezervObr = 1 ');
         If Dup_Id <> '0' then
         begin
           Showmessage('Есть такая запись Rezerv');
           Cancel := true;
         end;
end;

17 (edited by senseyesenseye1983 2022-09-07 05:03:55)

Re: дубликаты

pavlenko.vladimir.v wrote:
senseyesenseye1983 wrote:

Я рано радовался... при проверки оказалось что он все таки дает сохранить то что нельзя.
Там еще один bolean взаимодействовует...
Надо я так понимаю склеивать три условия:
если RezervObr=0 то открывает Form2
если RezervObr = 0 и Obrabotka = 0 то открываем Form1
если не то не другое то сохраняем

А как Вы проверяете Rezerv, для каждой записи оно у Вас свое... То есть для новой записи оно еще не создано..

В базе у меня записаны уже эти значения:
fio                  dates              RezervObr            Obrabotka
MODEL     01.01.2022             0                               1        ----- Кнопка дает сохранить но только 1 раз так как даты будут совпадать
MODEL     01.01.2022             1                               1        ----- Кнопка не дает сохранить
MODEL      01.01.2022         NULL                       NULL  ------Кнопка не дает сохранить

Павел вот о чем я говорю как это реализовать? три условия ...

Re: дубликаты

senseyesenseye1983 wrote:

[

В базе у меня записаны уже эти значения:
fio                  dates              RezervObr            Obrabotka
MODEL     01.01.2022             0                               1        ----- Кнопка дает сохранить но только 1 раз так как даты будут совпадать
MODEL     01.01.2022             1                               1        ----- Кнопка не дает сохранить
MODEL      01.01.2022         NULL                       NULL  ------Кнопка не дает сохранить

Павел вот о чем я говорю как это реализовать? три условия ...

нет, так у Вас ничего не Выйдет..
с проверкой по базе не получиться..
программа проверяет все записи, а эти записи буду иметь различные значения...

Re: дубликаты

Понял. Спасибо.

20 (edited by senseyesenseye1983 2022-09-07 06:47:14)

Re: дубликаты

Ну а хотя можно чтобы когда создается запись ( она изначально идет с bolean = NULL) - то больше одной записи не могли создать на одну и ту же дату ?  Или только состояние 0 или 1 можно учитывать?

21 (edited by sparrow 2022-09-07 07:01:41)

Re: дубликаты

Example


В примере по условию Модел, Сериал, Дата извлекается одна последняя запись  с двумя полями RezervObr и Obrabotka.
Поля анализируются на содержимое (1, 0 , Null) и принимается решение сохранять или нет.


P.S. И научитесь правильно ставить задачу и задавать вопросы, а не "ой там еще есть".
От каждого "ой" зависит решение.
Я надеюсь что поле Obrabotka не имеет значение 0 ???
По крайней мере вы этого не указали.

Post's attachments

Attachment icon duplicates_test4.zip 336.23 kb, 128 downloads since 2022-09-07 

Re: дубликаты

Да спасибо. Помогло. Единственное что нельзя добавить проверку на дату? Если будет другое число то сохранение возможно! А то получается задействованы bolean и если дату меняешь при сохранении то не дает сохранить, так то запись уже не дубликат будет

23 (edited by sparrow 2022-09-07 14:11:24)

Re: дубликаты

У вас сейчас проверяется три параметра Модель, Сериал и Дата.
При совпадении по этим параметрам анализируются RezervObr и Obrabotka.


На какую еще дату вы хотите проверять ???

А вот этого я вообще не понимаю:
"Если будет другое число то сохранение возможно! А то получается задействованы bolean и если дату меняешь при сохранении то не дает сохранить, так то запись уже не дубликат будет"


Сначала думаем о вопросе, что и как сформулировать,  а потом пишем вопрос. Считайте нас ниже уровнем. )))

P.S. И рекомендую вам обратиться к темам по обучению от пользователя K245.
Особенно о теоретической части и подготовке к написанию программы, алгоритмах. http://myvisualdatabase.com/forum/viewtopic.php?id=4593

Re: дубликаты

Я подправил проверку

procedure Form1_Button4_OnClick (Sender: TObject; var Cancel: boolean);
var
  Results: Tdataset;
begin
        SqlQuery('SELECT id, RezervObr, Obrabotka FROM (Select * From machines Where (model) = ' + (form1.Edit1.sqlValue) + ' '+
         'and (serialnumber) = ' + (form1.Edit2.sqlValue) + ' and Date(Dates) = date(' + form1.DateTimePicker1.sqlDateTime + ') '+
         'ORDER BY id Desc LIMIT 1 ) m ;', Results);
         if ((NOT Results.FieldByName('id').isNull) and (Results.FieldByName('RezervObr').asString = '1') and  (Results.FieldByName('Obrabotka').asString = '1')) or
            ((NOT Results.FieldByName('id').isNull) and (Results.FieldByName('RezervObr').isNull) and  (Results.FieldByName('Obrabotka').isNull)) then
         begin
           ShowMessage('Не даем сохранить');
           Cancel := true;
         end;
     Results.Close;
end;

В проверку включен id записи. В предыдущем варианте возникала ситуация когда такая запись не существовала а проверка не позволяла записать новую. Теперь если id не Null (существует запись) то проверяются и остальные условия.

Re: дубликаты

спасибо огромное! вот это то что надо. я благодарен!