Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Глюк базы dBase если поле пустое [D6, dBase, FoxPro]


leonidus ©   (2005-05-12 10:16:00) 

Мастера подскажите как победить такую проблему. В процессе применения фильтра (Table.Filtered:=true) в обработчике
procedure TForm1.TTable1FilterRecord(DataSet: TDataSet; var Accept: Boolean); для последующего составления отчета нужно в собрать данные из нужных полей и занести в архив (а потом в отчет). Делаю так:

st:='';

IF (dataset['Econom1']<>'') and (dataset['Econom1']<>' ') and (dataset['Econom1']<>null) and (dataset['Data_prikaz1']<>'') and (dataset['Data_prikaz1']<>' ') and (dataset['Data_prikaz1']<>null) THEN
st:=st+'  '+dataset['Econom1']+'-'+dataset['Data_prikaz1'];

Проблема в том, что если поле пустое, то получаю exception EVariantError "Invalid variant type conversion", если закрыть проверку блоком try - except то чтение всех последующих записей так же читается с ошибкой (но конечно "тихо" т.к. try - except тушит все ошибки) и в результате даже если потом пойдут не пустые поля прочесть их содержимое уже не удается:

 try
  if (dataset['Econom1']<>'') and (dataset['Econom1']<>' ') and (dataset['Econom1']<>null) and
     (dataset['Data_prikaz1']<>'') and (dataset['Data_prikaz1']<>' ') and (dataset['Data_prikaz1']<>null) then
   st:=st+'  '+dataset['Econom1']+'-'+dataset['Data_prikaz1'];
 except
  memo1.Lines.Add('Econom1-Data_prikaz1 - ошибка');
 end;

в результате получаю кучу записей  'Econom1-Data_prikaz1 - ошибка'.

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


evvcom   (2005-05-13 10:19:00) [1]

И все же оптимальнее

str := DataSet.FieldByName('Econom1').AsString;
if (Trim(str)<>'') and ...
then st:=st+' '+str+ ...


leonidus   (2005-05-13 10:14:00) [2]

>AlexO спасибо, теперь понял свою ошибку.
Спасибо всем за подсказки.


AlexO   (2005-05-12 11:49:00) [3]

IF (TRIM(DataSet.FieldByName('Econom1').AsString)
<> '') and (TRIM(DataSet.FieldByName('Data_prikaz1').AsString) <> '')
THEN st:=st + '  ' + DataSet.FieldByName('Econom1').AsString + '-' + DataSet.FieldByName('Data_prikaz1').AsString;


Johnmen   (2005-05-12 11:40:00) [4]

>Т.е. я запускаю фильтрацию базы,

Вот это странная фраза...
В данном случае фильтрация не процесс, а состояние. И если так чуднО использовать OnFilterRecord, то работать, как ожидается, это не будет.


msguns   (2005-05-12 11:34:00) [5]

Обращение к полю НД с помощью массива [] лишь один из множества методов, причем едва ли не самый неуклюжий.
Возьми на себя труд и почитай справку по TTable,TADOTable или что там ты используешь, в общем по св-вам и методам TDataSet, который является папанькой большинства "датасетов".


Anatoly Podgoretsky   (2005-05-12 11:27:00) [6]

TDataset + F1 легко докажетс, что у тебя есть не только это, а много больше.
И весьма интересное использование фильтрации для заполнения массива :-)


leonidus   (2005-05-12 11:21:00) [7]

Дело в том, что я работаю именно в обратобчике procedure TForm1.TTable1FilterRecord(DataSet: TDataSet; var Accept: Boolean);  т.е. с текущей записью и следовательно для работу й меня есть только dataset['имя поля'] и мне че-то не онятно как тут сделать проверку используя IsNull, Trim тут вроде тоже не в тему, или я чего-то не понимаю?

Обращаться к методам через TField As... это да, но как мне быть в данном конкетном случае?

Т.е. я запускаю фильтрацию базы, проверяю соответствует ли данная запись моим кртериям и если все ок, то читаю данные из ее полей Econom1 Data_prikaz1 и если поля не пустые то помещаю их в массив. Так как же мне тут не напоросься на исключчительную ситуацию?


Anatoly Podgoretsky   (2005-05-12 10:28:00) [8]

Это твой глюк, а не базы. И поострожней с Variant, ты от него еще не раз по зубам получишь.


msguns   (2005-05-12 10:22:00) [9]

Корректнее обращаться к полям НД через методы TField As...


evvcom   (2005-05-12 10:21:00) [10]

И по ходу: а еще есть функция trim


Johnmen   (2005-05-12 10:18:00) [11]

IsNull


Наверх

Титульная страница Поиск, карта сайта Написать письмо