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

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

Чудеса с таблицами DBF… [D7, dBase, FoxPro]


Страницы:   1 2

Картошка ©   (2006-11-14 21:20:00) 

Чудеса с таблицами DBF…
Кто-нибудь может объяснить следующее... Мне необходимо написать некую программу для загрузки таблиц (dbf) и далее по 2-м выбранным полям строить Таблицу перекрестных ссылок. Все это более менее сделал…только обнаружились следующие чудеса….Предположим в таблице все числовые поля типа Number. Выбираем любые 2 поля и моя программа работает – все ОК….но вот почему-то в  каждой таблице существует какое-нибудь поле(бывает и не одно) точно такого же типа (Number), внешне ничем не отличающееся от других, только вот программа с ним не работает…..????
Для наглядности вот выложил архив, где exe-шник проги и таблицы…Так вот в данной таблице полем загадкой является «Mibid3»…..(интерфейс проги оч простой)..Поэтому если кто может, посмотри, плиз….В чем проблема??? Что за мистика такая????
Вот 2 ссылки на всякий случай http://www.ann-baulina.narod.ru/error.rarи http://www.sendspace.com/file/lnzxsz
Архивчик весит 352 КБ


Anatoly Podgoretsky   (2006-11-21 17:13:00) [1]

> Картошка  (21.11.2006 16:07:30)  [30]

В приведеном коде такой идентификатор не фигурирует, отсюда вывод - этот код не реальный, у тебя другой код.


sniknik   (2006-11-21 16:38:00) [2]

> 'Type mismatch in expession.'
> тьфу, в смысле после с датой
а в условии число, неудивительно что ошибка не того типа в выражении, не находишь?
есть конечно движки с авто конвертацией (jet например), и это бы "прокатило", но BDE судя по всему не из их числа.

про параметры тебе еще не говорили?... попробуй, классная штука.


Картошка   (2006-11-21 16:12:00) [3]


> Значение Query1
> 'SELECT count(поле1) from "директория" where (поле2 between
> 34535 and 34716) and (поле2 between 131 and 153)'#$D#$A

во втором случае не поле 2, а поле 1 уже...

P.S. Неплохо было бы сделать кнопку редактировать сообщение =)


Картошка   (2006-11-21 16:09:00) [4]


> поле2 - это есть числовое поле..

тьфу, в смысле после с датой


Картошка   (2006-11-21 16:07:00) [5]

люди, плиз, еще один глюк есть(надеюсь что последний)..Как исправить его и из=за чего он??? Проблема заключается в следующем: мне необходимо также чтобы можно было строить таблицу перекрестных ссылок, с полем типа "DateTime"(дата)...что я делаю для этого:
в условие добавил типы ftDate и ftDateTime..Условие выполняется, все оК
Но вот здесь происходит ошибка:

Query1.SQL.Add('SELECT count('+field_vert+') from "'+tablica+'" where ('+field_gor+' BETWEEN '+left_gorS+' and '+prav_gorS+') AND ('+field_vert+' BETWEEN '+left_vertS+' and '+prav_vertS+')');
Query1.Open;

Значение Query1
'SELECT count(поле1) from "директория" where (поле2 between 34535 and 34716) and (поле2 between 131 and 153)'#$D#$A
и
Undeclared identifier: 'query 1'
поле2 - это есть числовое поле..
ошибка вот такая вылетает:

Project Project1.exe raised exception class EDBEngineError with message 'Type mismatch inexpession.'. Process stopped.Use Step or Run to continue.


Картошка   (2006-11-19 17:51:00) [6]


> все ясно, бросай все пока не поздно и увольняйся... универсальных
> прог не бывает (пока что ни одной не написано), все по до
> чтото и для чегото

=)))) Это моя бакалаврская работа =))) Такие вот грамотные преподаватели в институтах..... Насчет типов - спасибо, попробую добавить еще BCD...


Anatoly Podgoretsky   (2006-11-19 15:01:00) [7]

> sniknik  (19.11.2006 14:31:26)  [26]

> бросай все пока не поздно и увольняйся

Зачем? Это же такое выгодное дело, кусок хлеба до пенсии обеспечен.


Anatoly Podgoretsky   (2006-11-19 15:00:00) [8]

> Картошка  (19.11.2006 14:10:25)  [25]

Например StringReplace


sniknik   (2006-11-19 14:31:00) [9]

> то есть компютер почему-то не хочет их считать числовыми....??????
нет, он похоже не хочет считать их ftInteger или ftFloat которыми все множество числовых типов не ограничивается...

TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString, ftLargeint, ftADT, ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob, ftVariant, ftInterface, ftIDispatch, ftGuid, ftTimeStamp, ftFMTBcd)

Number(2,0) это будет скорее всего ftBCD (оп свойств установленных зависит)

> Вся моя проблема заключается в том, что данная прога должна быть универсальной...
все ясно, бросай все пока не поздно и увольняйся... универсальных прог не бывает (пока что ни одной не написано), все по до чтото и для чегото.


Картошка   (2006-11-19 14:10:00) [10]


> В Дельфи есть функции замены, что бы не городить свои циклы.

А что за функции конкретно???

Вся моя проблема заключается в том, что данная прога должна быть универсальной...Так вот с другой уже таблицой обнурежено следующее чудо (без преувеличения)..Имеется значит поле (даже 2) типа Number(2,0)...и эти самые поля не проходят вот это вот условие:

function TForm1.proverka(stroka:shortstring):boolean;
begin
 Result:=false;
 if (Table1.Fields.FieldByName(stroka).DataType=ftInteger) or (Table1.Fields.FieldByName(stroka).DataType=ftFloat) then
   Result:=true;
end;


то есть компютер почему-то не хочет их считать числовыми....??????


sniknik   (2006-11-18 18:49:00) [11]

Картошка ©   (18.11.06 13:39) [20]
> в 17 посту написано ошибка, а решения нету...
читаем
ЮЮ ©   (17.11.06 05:28) [17]
> Если DesimalSeparator отличен от '.', то использование FloatToStr()...
что стоит посмотреть, при трассировке, естественно перед использованием FloatToStr ???
посмотреть, убедится что действительно отличается, и сделать чтобы не отличалось, простым присвоением нужного значения.

p.s. ну нельзя же ждать полностью разжеванного, готового решения... это и бвло решение.
p.p.s. параметры естественно лучше.


Anatoly Podgoretsky   (2006-11-18 14:40:00) [12]

> Картошка  (18.11.2006 14:26:22)  [22]

В Дельфи есть функции замены, что бы не городить свои циклы.


Картошка   (2006-11-18 14:26:00) [13]

В общем не знаю, правильно это или нет, но сделал вот так
L:=FloatToStr(left_gor);
for i:=1 to length(L) do
 if L[i]=',' then L[i]:='.';

проверить до конца не успел, но вроде работает


Anatoly Podgoretsky   (2006-11-18 14:03:00) [14]

> Картошка  (18.11.2006 13:39:20)  [20]

Никаких проблем, используй параметры и забудь про все беды с литералами.


Картошка   (2006-11-18 13:39:00) [15]

Все правильно...проблема из-за запятой в SQL запросе..В настройках компа разделитель целой и дробной части заменил с ","на "."и все заработало...
Только все равно мне не понятно, как можно по-другому обойти эту ошибку?

> решение см. [17], или задавай число числом, через параметры,
>  без переводов в строку.

в 17 посту написано ошибка, а решения нету...и число задавать числом, а если опять число дробное и дробь от целого отделена запятой???
Вобщем, никто не знает как можно выкрутиться?


sniknik   (2006-11-18 11:50:00) [16]

Select count(поле1) from "директрория" where (поле2 between 4 ,2and 66 ,2) and (поле1 between 131 and 153)

разделитель дробной части цифр в запросах всегда точка "." т.к. запятая отдана для перечислений. вот тебе и "чудо", то что с другими полями этого не происходит, ну вероятно в них нет дробных значений как в этой.
решение см. [17], или задавай число числом, через параметры, без переводов в строку.
+ названия полей/файлов по русски это нехорошо, бывают трудно отслеживаемые глюки, можеш еще и с этим "налететь".


Картошка   (2006-11-18 01:04:00) [17]


> вот когда он сформирован (при трассировке стоишь на Query1.
> Open;) и скопируй получившийся запрос из Query1.SQL.Text
> сюда

вот

до <Query1.Open>:
'Select count(поле1) from "директрория" where (поле2 between 4,2 and 66,2) and (поле1 between 131 and 153)'#$D#$A

после <Query1.Open>:
Undeclared identifier:'Query1'


ЮЮ   (2006-11-17 05:28:00) [18]

Если DesimalSeparator отличен от '.', то использование FloatToStr() при наличии у числа дробной части приведет к формированию синтаксически неверного SQL предложения, что у автора и наблюдается.


sniknik   (2006-11-17 02:29:00) [19]

> ошибка возникает при переходе с предпоследней строчку на последнюю:
выполнение запроса...
вот когда он сформирован (при трассировке стоишь на Query1.Open;) и скопируй получившийся запрос из Query1.SQL.Text сюда... потому как это он выполняется (пытается), а все эти твои переменные, это ни о чем, только затрудняют восприятие...
естественно копировать надо когда, и только
> И эта ошибка, тоько если выбранно данное несчасливое поле....
выбрано это несчастное поле...

можеш даже сам найти... в ошибке -> [9] сказано что это слово запятая с двойкой (вместо имени чегото. судя по всему вместо имени поля).


Германн   (2006-11-17 01:59:00) [20]


> Anatoly Podgoretsky ©   (15.11.06 09:51) [5]
>
> И они друг друга не видят или как?
>

Она других не видит, я думаю. Она 98-я. NTFS ей вроде не виден.


Страницы:   1 2

Наверх

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