Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];

Вниз

Чудеса с таблицами DBF…   Найти похожие ветки 

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

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


 
Johnmen ©   (2006-11-14 22:19) [1]

Нам вирусов не надо. И качать мы не любим.
Ты код создания таблиц показывай.


 
sniknik ©   (2006-11-14 22:51) [2]

и какой смысл в exe-шнике ??? почему не исходники? не я понимаю, они секретны и т.д. ди и самому лазить по мгабайтам кода ломает, но почему не выделить только сам глюк и выложить его исходники на 15-ть строк и с одной/двумя таблицами? раз такая пьянка. т.е. минимум (по которому исходного суперсекретного кода не воссоздать)

а екзешник из неизвестного источника только псих и согласиться запускать... т.что не соблазняй даже.


 
Anatoly Podgoretsky ©   (2006-11-14 23:03) [3]

> sniknik  (14.11.2006 22:51:02)  [2]

> т.что не соблазняй даже.

А может передумаешь?


 
Германн ©   (2006-11-15 01:57) [4]


> Anatoly Podgoretsky ©   (14.11.06 23:03) [3]
>
> > sniknik  (14.11.2006 22:51:02)  [2]
>
> > т.что не соблазняй даже.
>
> А может передумаешь?
>

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


 
Anatoly Podgoretsky ©   (2006-11-15 09:51) [5]

И они друг друга не видят или как?


 
sniknik ©   (2006-11-15 10:57) [6]

> имею отдельную ось.
вот тебе и флаг в руки, а я все виртуалки что были (PC/VMware) давно снес и не горю желанием опять ставить.

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

p.s. основное то не в этом, главное это то, что решить вопрос можно только с кодом (дело то наверняка в 17й строке), а нам вместо возможности решить предлагается поудивляться "чудом", "вот так работает а вот так нет, ну надо же чудо какое"... без всякой возможности поковыряться в его потрохах (и убедиться что это не совсем чудо...). нафиг, это без толку потратить время (убедится в том что я и так знаю? и там могу, сразу сказать "если не работает то смотри в 17й строке"... а сэкономленное время использовать для более приятных дел (например потрепаться ;))


 
ANB ©   (2006-11-15 11:47) [7]


> Картошка ©   (14.11.06 21:20)

Значится :
1. У DBF нету типа намбер
2. НЕ указано, как именно не работает (ошибку вываливает, поле игнорит или еще чего)
3. Экзешник я качать не буду
4. Возможная причина ошибки : DECIMAL поля в DBF хранятся в виде строк. Теоретически эти строки можно попортить и они перестанут конвертится в число драйвером. Решение - читать файл напрямую и ручками обрабатывать эту ситуювину.


 
Картошка ©   (2006-11-16 00:22) [8]

Извините, пожалуйста, что бестолково объяснил проблему и выложил exe-шник...Все-таки первый раз....
Напомню, в программе мне необходимо пересечь 2 числовых поля(каждое поле делится на несколько диапазонов), другими словами нужно посторить таблицу перекрестных ссылок, внутри которой  отображается кол-во пересечений диапазона с диапазоном...
вот и код...если не понятно, зачем какие переменные, пишите - я отвечу..
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;

procedure TForm1.diapazon(stroka:shortstring; var max,min:real);
begin
 Query1.SQL.Clear;
 Query1.SQL.Add("SELECT MAX("+stroka+") FROM ""+tablica+""");
 Query1.Open;
 max:=Query1.Fields.Fields[0].Value;
 Query1.SQL.Clear;
 Query1.SQL.Add("SELECT MIN("+stroka+") FROM ""+tablica+""");
 Query1.Open;
 min:=Query1.Fields.Fields[0].Value;
end;

function TForm1.kolich_peresech(n_gor,n_vert:integer; max_gor,min_gor,max_vert,min_vert:real; diap_gor,diap_vert:integer;field_gor,field_vert:shortstring):string;
var left_gor, prav_gor, left_vert, prav_vert:real;
begin
 left_gor:=min_gor+(n_gor-1)*diap_gor+1;
 prav_gor:=min_gor+(n_gor)*diap_gor;
 left_vert:=min_vert+(n_vert-1)*diap_gor+1;
 prav_vert:=min_vert+(n_vert)*diap_vert;
 Query1.SQL.Clear;
 Query1.SQL.Add("SELECT count("+field_vert+") from ""+tablica+"" where ("+field_gor+" BETWEEN "+FloatTOStr(left_gor)+" and "+FloatToStr(prav_gor)+") AND ("+field_vert+" BETWEEN "+FloatTOStr(left_vert)+" and "+FloatToStr(prav_vert)+")");
 Query1.Open;
 REsult:=Query1.Fields.Fields[0].AsString;
end;

Form2.Query1.SQL.Add("CREATE TABLE MyTable(Field1 CHAR(20), "); //формируем собственно таблицу перекрестных ссылок, приченм в той же директории, где и                                                                 таблица из которой извлекаем 2 поля
 
for i:=1 to kol do
   if i<>kol then
     Form2.Query1.SQL.Add("Field"+IntToStr(i+1)+" CHAR(20), ")
   else
     Form2.Query1.SQL.Add("Field"+IntToStr(i+1)+" CHAR(20))");
 Form2.Query1.ExecSQL;
 tablica1:=tablica;
 i:=Length(tablica1);
 while tablica1[i] <>"\" do
   i:=i-1;
 delete(tablica1,i+1,length(tablica1));
 tablica1:=tablica1+"MyTable.db";
 

...
 Query1.SQL.Clear;
     if proverka(mas[1])and proverka(mas[2])then   //выбраны оба поля
       begin
         diapazon(mas[1],mx,mn);
         diapazon(mas[2],mx1,mn1);
         diap:=round((mx-mn)/koldv);
         diap1:=round((mx1-mn1)/koldg);
         for i:=1 to koldv do
           begin
             Form2.Table1.Append;
             Form2.Table1.Fields.Fields[0].AsString:="От "+FloatToStr((mn+(i-1)*diap)+1)+" до "+FloatToStr(mn+diap*i);
             for j:=1 to koldg do
               Form2.Table1.Fields.Fields[j].AsString:=kolich_peresech(j,i,mx1,mn1,mx,mn,diap1, diap,mas[2],mas[1]);
             Form2.Table1.Post;
           end;
         for i:=1 to koldg-1 do
           Form2.DBGrid1.Columns[i].Title.Caption:="От "+FloatToStr((mn1+(i-1)*diap1+1))+" до "+FloatToStr((mn1+diap1*i));
         FOrm2.DBGrid1.Columns[koldg].Title.Caption:="От "+FloatToStr((mn1+(koldg-1)*diap1+1))+" до "+FloatToStr(mx1);
       end;


 
Картошка ©   (2006-11-16 00:37) [9]

А ошибка вот такая выскакивает:
Invalid use of keyword.
Token:,2
Line Number:1.


 
Anatoly Podgoretsky ©   (2006-11-16 00:46) [10]

> Картошка  (16.11.2006 0:37:09)  [9]

в каком запросе


 
sniknik ©   (2006-11-16 01:15) [11]

> А ошибка вот такая выскакивает:
ну вот, и никаких чудес... ошибка синтаксиса в запросе, осталось только выяснить в каком... а еще лучше без всяких выяснений, запустить из под делфи, поймать глюк, и начать трассировку по F7, прочитать сформированный запрос, смотреть 2-е слово в 1-ой строке. именно оно не нравится движку sql. (и о чем явно написано в ошибке)


 
Ksan ©   (2006-11-16 11:02) [12]

procedure TForm1.diapazon(stroka:shortstring; var max,min:real);
begin
Query1.SQL.Clear;
Query1.SQL.Add("SELECT MAX("+stroka+",) + MIN("+stroka+") + FROM ""+tablica+""");
Query1.Open;
max:=Query1.Fields.Fields[0].Value;
min:=Query1.Fields.Fields[1].Value;
end;
это так к слову

а по делу давай текст запроса


 
Ksan ©   (2006-11-16 11:03) [13]

пардон два плюса лишнии :)


 
Картошка ©   (2006-11-17 01:43) [14]

при выполнении этой строчки

Form2.Table1.Fields.Fields[j].AsString:=kolich_peresech(j,i,mx1,mn1,mx,mn, diap1,diap,mas[2],mas[1]);

ошибка возникает в функции:

function TForm1.kolich_peresech(n_gor,n_vert:integer; max_gor,min_gor,max_vert,min_vert:real; diap_gor,diap_vert:integer;field_gor,field_vert:shortstring):string;
var left_gor, prav_gor, left_vert, prav_vert:real;
begin
 left_gor:=min_gor+(n_gor-1)*diap_gor+1;
 prav_gor:=min_gor+(n_gor)*diap_gor;
 left_vert:=min_vert+(n_vert-1)*diap_gor+1;
 prav_vert:=min_vert+(n_vert)*diap_vert;
 Query1.SQL.Clear;
 Query1.SQL.Add("SELECT count("+field_vert+") from ""+tablica+"" where ("+field_gor+" BETWEEN "+FloatTOStr(left_gor)+" and "+FloatToStr(prav_gor)+") AND ("+field_vert+" BETWEEN "+FloatTOStr(left_vert)+" and "+FloatToStr(prav_vert)+")");
 Query1.Open;
 REsult:=Query1.Fields.Fields[0].AsString;
end;


ошибка возникает при переходе с предпоследней строчку на последнюю:
Query1.Open;
 REsult:=Query1.Fields.Fields[0].AsString;

И эта ошибка, тоько если выбранно данное несчасливое поле....


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


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

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


 
sniknik ©   (2006-11-17 02:29) [16]

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

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


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

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


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


> вот когда он сформирован (при трассировке стоишь на 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"


 
sniknik ©   (2006-11-18 11:50) [19]

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

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


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

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

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

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


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

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

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


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

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

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


 
Anatoly Podgoretsky ©   (2006-11-18 14:40) [23]

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

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


 
sniknik ©   (2006-11-18 18:49) [24]

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

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


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


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

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

Вся моя проблема заключается в том, что данная прога должна быть универсальной...Так вот с другой уже таблицой обнурежено следующее чудо (без преувеличения)..Имеется значит поле (даже 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-19 14:31) [26]

> то есть компютер почему-то не хочет их считать числовыми....??????
нет, он похоже не хочет считать их 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 (оп свойств установленных зависит)

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


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

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

Например StringReplace


 
Anatoly Podgoretsky ©   (2006-11-19 15:01) [28]

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

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

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


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


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

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


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

люди, плиз, еще один глюк есть(надеюсь что последний)..Как исправить его и из=за чего он??? Проблема заключается в следующем: мне необходимо также чтобы можно было строить таблицу перекрестных ссылок, с полем типа "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-21 16:09) [31]


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

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


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


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

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

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


 
sniknik ©   (2006-11-21 16:38) [33]

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

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


 
Anatoly Podgoretsky ©   (2006-11-21 17:13) [34]

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

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



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.044 c
9-1135854478
Аццкий_рыцарь:)
2005-12-29 14:07
2006.12.10
DoCollision B DelphiX


2-1164267247
TrainerOfDolphins
2006-11-23 10:34
2006.12.10
заголовок столбца в несколько строк


15-1163875662
КаПиБаРа
2006-11-18 21:47
2006.12.10
Вот смотрю я телевизор и возникает у меня


2-1163846597
nop
2006-11-18 13:43
2006.12.10
Проблема с параметром color в XP


15-1163699126
furyz
2006-11-16 20:45
2006.12.10
WineHQ + FreeBSD





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский