Ругань на преобразование типов

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Uncle_James
Сообщения: 15
Зарегистрирован: 17 фев 2009, 14:57

Ругань на преобразование типов

Сообщение Uncle_James »

Всем привет! Проблема возникла, какой не ждал: в фейсе ищу запись в таблице MARPUNKT таким образом:
...
s := DBFGetFieldValue(f,'Punk_naz');
if (getfirst MARPUNKT where (SubStr(MARPUNKT.code,1,5) = s ) = tsOk) then ...
...

т.е. считываю значение с поля DBF-ки (оно 5 знаков строковое) и по фильтру хочу найти значение в Галактике (у нас в MARPUNKT.code - 6 знак контрольная сумма). Ругается: "Не могу осуществить преобразование типов!". Запускаю такой же пробный селект в ЛОТе - все находит!
Объясните, в чем дело? Везде же стринговые значения что поля, что переменные :o
Давайте жить дружно и работать весело!
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение Ged »

Нарно так

Код: Выделить всё

if ((getfirst MARPUNKT where (SubStr(MARPUNKT.code,1,5) = s )) = tsOk)
Uncle_James
Сообщения: 15
Зарегистрирован: 17 фев 2009, 14:57

Сообщение Uncle_James »

Спасибо за ответ!
Это что получается: если используется конструкция Where , обязательно должны быть перед константой tsOk двойные скобки, а то компилятор не понимает? Интересные дела.. А в справочнике по атлантису это не описано, или я не нашел этого :-?
Давайте жить дружно и работать весело!
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Сообщение Screw »

В скобки нужно заключить конструкцию getfirst вместе со всем ее содержимым, иначе "(SubStr(MARPUNKT.code,1,5) = s ) = tsOk" станет частью where, а результат, возвращаемый модификатором, компилятор попытается преобразовать к boolean. А делать это неявно компилятор не умеет. Вот и ругается.
То есть, дело не в двойных скобках, а только в умелой их расстановке.
Виталий
Gali
Постоянный гость
Сообщения: 71
Зарегистрирован: 16 апр 2007, 11:48
Откуда: г. Кемерово
Контактная информация:

Сообщение Gali »

доброго времени суток.
у меня похожая беда - пишу:
.Create view d1 as SELECT APPOINTMENTS.Apptabnmb, APPOINTMENTS.post, catalogs.nrec, catalogs.name from persons, catalogs where ((Tabn==APPOINTMENTS.Apptabnmb and APPOINTMENTS.POST== catalogs.nrec));

а мне Галка ругается на невозможность преобразования типов.
обе переменные с типом integer.
как с этим бороться? подскажите, плиз.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

Tabn надо longint
а вообще разбейте на несколько строк - будет понятней на что ругается.
Gali
Постоянный гость
Сообщения: 71
Зарегистрирован: 16 апр 2007, 11:48
Откуда: г. Кемерово
Контактная информация:

Сообщение Gali »

Tabn объявлена глобальной переменной типа longint.

на несколько строк разделяла - ругается то на первое условие равенства, то на второе... хотя раельно типы одинаковые
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Сообщение KATZ »

Интереса ради скомпилировал это, получил протокол:

Код: Выделить всё

Предупреждение: Неявное добавление таблицы APPOINTMENTS в логическую таблицу D1
Ошибка: Нужен ключ APPTABNMB для APPOINTMENTS
Ошибка: Ошибка настройки логических таблиц
Т. е. это уже ошибки следующего этапа, проблем с преобразованием типов здесь быть не должно. Посмотрите, что написано непосредственно перед .create view (может быть, предыдущая конструкция не закончена, и этот оператор воспринимается как ее продолжение). Убедитесь, что точка стоит в первой позиции. Либо выкладывайте форму целиком.
Ответить