Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 17.07.2017
Сообщений: 5

OnValidate Delphi 7

17.07.2017, 09:30. Показов 2687. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем. Я хотел поставить одно условие в DBEdit1 чтобы при вводе туда определенных чисел оно проверяла в Таблице1 (БД) наличие такого числа и если такое есть запись не происходила (то есть проверка идет до записи в БД) я так понимаю нужно использовать событие OnValidate действующая на Field к которому привязан DBEdit1?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.07.2017, 09:30
Ответы с готовыми решениями:

Что лучше брать Delphi XE2, Delphi XE, Delphi 7?
Привет форумчане! У меня вопрос: что лучше брать Delphi XE2, Delphi XE, Delphi 7? Как вообще различаются серия Delphi XE, и Delphi 7?

Какие отличия Delphi 5, Delphi 6 и Delphi 7
Кто-нибудь юзал Delphi 6? Если да, то напишите, плиз, его отличия от 5-ой версии (плюсы и минусы) Кстати, никто не слышал ничего о Delphi...

ZipForge для Delphi Xe - интерфейс стал выглядеть как в Delphi 2007
Народ!!! Помоготи!!! Установил компонент ZipForge для Delphi Xe и после этого интерфейс моей программы стал таким, как будто я его в delphi...

36
0 / 0 / 0
Регистрация: 18.07.2017
Сообщений: 13
28.07.2017, 21:00
Студворк — интернет-сервис помощи студентам
Подскажите вот написал так:

Delphi
1
2
3
4
5
adoquery1.sql.text:='select count(*) as C from [ТТП] where [ОСНномер]="%s"', [Edit3.Text]);
adoquery1.open;
if adoquery1.fieldByName('C').asInteger>0 then
  showMessage('Такой номер уже есть.')
adoquery1.close;
код работает нормально (спасибо еще раз что помогли с ним!) но если я оставляю это поле пустым то код тоже говорит что ('Такой номер уже есть.') подскажите пожалуйста как сделать так чтобы он разрешал пустое поле оставлять
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,748
Записей в блоге: 7
28.07.2017, 21:38
Как код может работать нормально, если в первой же строке несоответствие скобок?
0
0 / 0 / 0
Регистрация: 18.07.2017
Сообщений: 13
28.07.2017, 22:25
извиняюсь как то код скопировался странно там в коде Format( пропустил перед 'select

Добавлено через 37 минут
вот так код выглядит:

Delphi
1
2
3
4
5
adoquery1.sql.text:=Format('select count(*) as C from [ТТП] where [ОСНномер]="%s"', [Edit3.Text]);
adoquery1.open;
if adoquery1.fieldByName('C').asInteger>0 then
  showMessage('Такой номер уже есть.')
adoquery1.close;
заметил такую особенность что когда я поле Edit3 не трогаю (а заполняю все кроме него) то код дает сохранять пустое поле

а если например в поле Edit3 впишу цифру 1 а потом сразу удалю ее backspace'ом (тоесть поле сново становится пустым) то код говорит ('Такой номер уже есть.') пока я не залезу и не удалю эту запись в базе вручную

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

подскажите в чем причина?
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,748
Записей в блоге: 7
28.07.2017, 22:39
Исходно Edit3.Text пустое? Не визуально, а на самом деле? То есть, уверены, что там нет ни одного пробела?
0
0 / 0 / 0
Регистрация: 18.07.2017
Сообщений: 13
29.07.2017, 20:37
пробелов нет, изначально оно тоже пустое. Вообщем он создает запись пустую а вторую пустую запись не создает. Как сделать чтобы можно было оставлять это поле пустым сколько угодно раз?

Добавлено через 15 часов 38 минут
помогите пожалуйста

Добавлено через 4 часа 59 минут
ни кто не знает? не как не сделать так чтобы поле пустым сохранялось?
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,683
Записей в блоге: 21
29.07.2017, 23:27
здесь в теме нет ни одной строчки, которая создает запись
хоть пустую, хоть какую. Чем помочь? Обсудить то чего нет?
0
0 / 0 / 0
Регистрация: 18.07.2017
Сообщений: 13
30.07.2017, 00:20
вот код:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.Button1Click(Sender: TObject);
begin
adoquery1.sql.text:=Format('select count(*) as C from [ТТП] where [ОСНномер]="%s"', [Edit3.Text]);
adoquery1.open;
if adoquery1.fieldByName('C').asInteger>0 then
begin
  showMessage('Такой номер уже есть.');
end
else
begin
AdoTable1.Edit;
adotable1.FieldByName('ОСНномер').AsString:=edit3.text;
AdoTable1.Post;
end
end;
когда я пытаюсь оставить edit3 пустым код говорит ('Такой номер уже есть.'); так как уже создана запись с пустым полем (тоесть код думает что я как будто пытаюсь ввести номер который уже есть в базе)

как сделать так чтобы код давал сохранять пустые записи?
0
Модератор
 Аватар для D1973
9950 / 6485 / 2461
Регистрация: 21.01.2014
Сообщений: 27,479
Записей в блоге: 3
30.07.2017, 07:14
АфоняРубльДолж, значит, в вашей БД уже есть записи с пустым полем [ОСНномер]. Вы же сами делаете запрос на поиск количества записей с указанным значением и если такие записи есть - выдаете ошибку и выходите...
0
0 / 0 / 0
Регистрация: 18.07.2017
Сообщений: 13
30.07.2017, 10:41
так я и говорю что они там есть точнее одна запись. можно как то код переделать чтобы он пропускал пустое поле? и давал сохранять еще одно? и потом еще одно и т.д ... (вобщем много пустых давал сохранять)
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,748
Записей в блоге: 7
30.07.2017, 11:44
Так, может, там сделать .Append, а не .Edit?
0
Модератор
 Аватар для D1973
9950 / 6485 / 2461
Регистрация: 21.01.2014
Сообщений: 27,479
Записей в блоге: 3
30.07.2017, 12:19
Ну а тогда на кой ляд проверка эта стоит на отсутствие совпадающих полей? Уберите ее, если Вы считаете, что это поле БД должны быть пустыми... Или, в конце концов, делайте перед этой проверкой еще одну - на заполненность поля Edit3
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TForm1.Button1Click(Sender: TObject);
begin
if Length(Trim(Edit3.Text)) <> 0
 then begin
          adoquery1.sql.text:=Format('select count(*) as C from [ТТП] where [ОСНномер]="%s"', [Edit3.Text]);
          adoquery1.open;
          if adoquery1.fieldByName('C').asInteger>0 
           then begin
                    showMessage('Такой номер уже есть.');
                    Exit;
                  end
        end;
AdoTable1.Edit;
adotable1.FieldByName('ОСНномер').AsString:=edit3.text;
AdoTable1.Post;
end;
Добавлено через 3 минуты
Вот только в Вашем случае абсолютно неясно, в какой именно записи произойдет заполнение поля [ОСНномер]...
1
0 / 0 / 0
Регистрация: 18.07.2017
Сообщений: 13
31.07.2017, 22:57
опять я зашел в тупик(( обрисую ситуацию вобщем я создал форму1 там разместил Dbgrid1 подключил к нему бд ацесс через АДО на этой форме разместил кнопку при нажатии на которую открывается форма2 в которой расположены едиты при их заполнении и нажатии кнопки сохранить (в этой кнопке и располагается код выше для проверки номера) все что там было заполнено сохраняется в бд. потом я начал создавать еще кнопку на форме1 при нажатии на которую открывается форма3 в ней можно отредактировать уже созданые в бд записи (по суте это таже форма2 только в ней отображается то что уже введено в бд едиты заменены на ДБедиты чтобы было видно что редактировать) на этой форме3 располагается кнопка сохранить (в ней я тоже прописал код который выше для проверки номера) но вот беда в том что этот код ругается на номер забитый в эту запись((

тоесть допустим я создал запись ввел для него номер 1. потом я допустим захотел поменять наименование изделия жму на кнопку открывается форма3 там я вижу наименование количество и номер изделия которое я вводил при создании записи (номер изделия 1) вобщем меняю наименование жму сохранить но код ругается на то что номер уже есть (номер 1) тоесть код думает что я пытаюсь сохранить запись с уже созданным номером и не может понять что этот номер уже был привязан к этому изделию. если ввиду другой номер которого нет в бд то все сохраняется как надо. как сделать так чтобы код проверял при открытии формы3 (или както поправить код выше) забитый номер и не ругался на него при сохранении? а ругался только если я хочу ввести другой существующий уже в бд номер не привязанный к этому изделию. надеюсь понятно объяснил проблему. помогите пожалуйста.
0
Модератор
 Аватар для D1973
9950 / 6485 / 2461
Регистрация: 21.01.2014
Сообщений: 27,479
Записей в блоге: 3
01.08.2017, 08:17
1. Зачем отдельные формы для создания и редактирования? Там ведь одно и то же? Ну и используйте спокойненько одну и ту же форму...
2. Откажитесь Вы уже от этих дебильный DBEdit-ов... Работайте через SQL-запросы...
Вот посмотрите примерчик небольшой...
Данные добавляются, изменяются и удаляются, причем одно из полей может оставаться пустым, но если оно не пусто, то его содержимое должно быть уникальным. Надеюсь, я правильно Вашу задачу озвучил?
Вложения
Тип файла: rar OnValidate_Delphi 7.rar (15.2 Кб, 3 просмотров)
0
0 / 0 / 0
Регистрация: 18.07.2017
Сообщений: 13
01.08.2017, 16:13
Спасибо за пример но в вашем примере таже проблемка что я и описал. выбираю например Деталь11 жму кнопку изменить открывается окно меняю там наименование жму ок и выдается ошибка что этот номер уже есть в базе и не дает сохранить изменения.
0
Модератор
 Аватар для D1973
9950 / 6485 / 2461
Регистрация: 21.01.2014
Сообщений: 27,479
Записей в блоге: 3
01.08.2017, 21:02
Вот, блин, не то кинул... Вот так.
Вложения
Тип файла: rar OnValidate_Delphi 7.rar (15.3 Кб, 3 просмотров)
1
0 / 0 / 0
Регистрация: 18.07.2017
Сообщений: 13
01.08.2017, 22:16
Спасибо еще раз.
Вот вопросик у меня есть

Delphi
1
... FROM Tab Where d_Num = "%s"', [Edit4.Text]), 0);
в этой строчке для чего в конце?
Delphi
1
... , 0);
просто я дописал из первой строчки вот это

Delphi
1
... .Modified
и в скобки все взял

и все заработало теперь.
0
Модератор
 Аватар для D1973
9950 / 6485 / 2461
Регистрация: 21.01.2014
Сообщений: 27,479
Записей в блоге: 3
02.08.2017, 04:14
Вот Вы выдрали кусок кода из контекста, поэтому ничего не понятно... Полностью эта строка выглядит так:
Delphi
1
DM.DoSQL(Format('SELECT COUNT(d_Num) AS CCC FROM Tab Where d_Num = "%s"', [Edit4.Text]), 0);
что означает, что вызывается процедура DoSQL, описанная в модуле DM, которая имеет 2 параметра:
1. Строковый параметр - текст SQL запроса
2. Целочисленный параметр - режим выполнения запроса: 0 - запрос вернет НД (конструкция SELECT), 1 - запрос не возвращает НД (конструкции INSERT, UPDATE, DELETE)
Цитата Сообщение от АфоняРубльДолж Посмотреть сообщение
просто я дописал из первой строчки вот это
Что дописали? Куда дописали?
Цитата Сообщение от АфоняРубльДолж Посмотреть сообщение
все заработало теперь
ну и хвала богам...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.08.2017, 04:14

SQL-запрос в Delphi и в Access один и тот же, но в Delphi не работает
ри обращение к базе в Access я использую код: with ADOQueryMain do begin Active:=false; SQL.Clear; SQL.Add('SELECT Code,...

Переписать часть кода с Delphi на ассемблер (ассемблерные вставки в Delphi)
Добрый вечер. Нужно сделать ассемблерные вставки в программе. Первый раз столкнулся с таким заданием, в языке ассемблера почти ноль....

где найти delphi c компилятором? и с чего начинать программирование в delphi?
здравствуйте, вот начинаю изучать delphi с чего начинать лучше?

Почему функция работающая в Delphi 7 не работает в Delphi 2007 и в 2009 ??
Данный код работал нормально в D7: procedure TForm1.Button1Click(Sender: TObject); begin ShowWindow(Application.Handle, 0); end;...

Как в Lazarus сделать интерфейс Delphi 2006 вместо Delphi 7?
Добрый вечер! Подскажите пожалуйста, как в Lazarus сделать интерфейс Delphi 2006 вместо Delphi 7? Т.е. чтобы окна были прикрепленные, а не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru