Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2015, 09:57   #1
sdr1
Пользователь
 
Регистрация: 06.10.2014
Сообщений: 46
По умолчанию Проверка на несколько пустых полей

Ребят подскажите пож-та есть форма на ней dbgrid (инф-я из 2-х таблиц access, Adoquery). Нужно чтоб пользователь заполняя запись в dbgrid обязательно заполнял 11 и 12 поле, если поля не заполнены то запись бы не сохранялась или не закрывалась форма.
вот код
Код:
procedure TForm_ins_sotr.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
with dbgrid1.DataSource.DataSet do
while not Eof do begin
if (DBGrid1.DataSource.DataSet.Fields[11].AsString='')and(DBGrid1.DataSource.DataSet.Fields[12].AsString='') then
ShowMessage('некоторые поля не заполнены');
next;
end;
end;
но проблема в том, что второе условие не проверяет (12поле), а если меняешь местами то (11поле) не проверяет.

Помогите плиз разобраться, очень надо, я только учусь
sdr1 вне форума Ответить с цитированием
Старый 15.01.2015, 10:00   #2
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

а если полей проверять надо десять и в десяти разных таблицах?
Я когда то для ADO так делал
пользовать на BeforePost
Код:
procedure TDM.ValidateTable(DataSet: TDataSet;const ATableName:string='');
var
  TableName:string;
  Strings:TStringList;
  DS:TADODataSet;
  IsNullable,Description:TField;
  i:integer;
begin
  if ATableName<>'' then TableName:=ATableName else TableName:=DataSet.Name;
  Strings:=TStringList.Create;
  try
    DS:=TADODataSet.Create(nil);
    try
      Conn.OpenSchema(siColumns,EmptyParam,EmptyParam,DS);
      IsNullable:=DS.FieldByName('IS_NULLABLE');
      Description:=DS.FieldByName('DESCRIPTION');
      for i:=0 to DataSet.FieldCount-1 do
      with DataSet.Fields[i] do
      begin
        if IsNull and not ReadOnly then
        begin
          if not DS.Locate('TABLE_NAME;COLUMN_NAME',VarArrayOf([TableName,FieldName]),[]) then
            Continue;
          if IsNullable.AsBoolean then Continue;
          if not Description.IsNull then
            Strings.Add('"'+Description.AsString+'"')
          else
            Strings.Add('"'+FieldName+'"');
        end;
      end;
    finally
      DS.Free;
    end;
    if Strings.Count>0 then
    begin
      Strings.Insert(0,'Не заполнены обязательные поля:');
      Application.MessageBox(Strings.GetText,'Ошибка!',MB_ICONERROR);
      Abort;
    end;
  finally
    Strings.Free;
  end;
end;
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 15.01.2015 в 10:04.
Slym вне форума Ответить с цитированием
Старый 15.01.2015, 10:03   #3
Iron Monk
Форумчанин
 
Аватар для Iron Monk
 
Регистрация: 05.10.2007
Сообщений: 478
По умолчанию

Цитата:
Сообщение от sdr1 Посмотреть сообщение
Ребят подскажите пож-та есть форма на ней dbgrid (инф-я из 2-х таблиц access, Adoquery). Нужно чтоб пользователь заполняя запись в dbgrid обязательно заполнял 11 и 12 поле, если поля не заполнены то запись бы не сохранялась или не закрывалась форма.
вот код
Код:
procedure TForm_ins_sotr.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
with dbgrid1.DataSource.DataSet do
while not Eof do begin
if (DBGrid1.DataSource.DataSet.Fields[11].AsString='')and(DBGrid1.DataSource.DataSet.Fields[12].AsString='') then
ShowMessage('некоторые поля не заполнены');
next;
end;
end;
но проблема в том, что второе условие не проверяет (12поле), а если меняешь местами то (11поле) не проверяет.

Помогите плиз разобраться, очень надо, я только учусь
or вместо and не?
Iron Monk вне форума Ответить с цитированием
Старый 15.01.2015, 10:04   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
но проблема в том, что второе условие не проверяет (12поле), а если меняешь местами то (11поле) не проверяет.
Поставь or вместо and и будет проверять. First перед циклом тоже к месту, иначе вся свистоплястка будет от текущей записи
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.01.2015, 10:14   #5
sdr1
Пользователь
 
Регистрация: 06.10.2014
Сообщений: 46
По умолчанию

Цитата:
First перед циклом тоже к месту, иначе вся свистоплястка будет от текущей записи
first стоит на кнопке закрыть
спасибо.
sdr1 вне форума Ответить с цитированием
Старый 15.01.2015, 11:34   #6
sdr1
Пользователь
 
Регистрация: 06.10.2014
Сообщений: 46
По умолчанию

что делаю не так? при нажатии на кнопку закрыть, появляется ошибка
"adoquery77:cannot perform this operation on a closed dataset"
Код:
begin
ADOQuery77.First;
with dbgrid1.DataSource.DataSet do
while not Eof do begin
if (DBGrid1.DataSource.DataSet.Fields[5].AsString='')or(DBGrid1.DataSource.DataSet.Fields[11].AsString='')or(DBGrid1.DataSource.DataSet.Fields[12].AsString='') then begin

       MessageDlg('поля не заполнены.',
          mtError,[mbOK],0);
next;
 end else
close;
end;
 end;
sdr1 вне форума Ответить с цитированием
Старый 15.01.2015, 11:35   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

ADOQuery77 это точно то же, что и DBGrid1.DataSource.DataSet?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.01.2015, 11:49   #8
sdr1
Пользователь
 
Регистрация: 06.10.2014
Сообщений: 46
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
ADOQuery77 это точно то же, что и DBGrid1.DataSource.DataSet?
да
datasource77->dataset->adoquery77
dbgrid1->datasource->datasource77

мне нужно сделать так, если проверка прошла успешно, то форма бы закрывалась.
sdr1 вне форума Ответить с цитированием
Старый 15.01.2015, 12:04   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну значит произошло то, о чем и говорится в сообщении об ошибке
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.01.2015, 15:18   #10
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Надо написать Self.Close , а ещё добавить Break перед ним и их вместе окружить бегин-ендом.
Захотите разобраться почему - прочитайте о потенциальных проблемах из-за with в инете.

Последний раз редактировалось phomm; 15.01.2015 в 15:22.
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Посчитать кол пустых значение в сотнях полей soonner JavaScript, Ajax 2 15.07.2014 20:39
Проверка пустых значений в Edit. [Jank] Общие вопросы Delphi 4 22.10.2012 19:30
excel проверка и удаление пустых ячеек reihtmonbern Общие вопросы Delphi 0 27.05.2012 15:17
Проверяю чтобы не было пустых полей, но жму ок, и не выдается оконная ошибка, а просто проект прерывается с ошибкой компилятора. TYMON C/C++ Базы данных 2 13.04.2012 08:29
Скрытие пустых полей в ComboBox CraZZZy-GameRRR Общие вопросы Delphi 6 17.04.2010 22:33