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