![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глюк базы 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