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

Вниз

Непонятно в Local SQL   Найти похожие ветки 

 
Евгений Р.   (2007-01-09 23:54) [0]

Есть запрос:
select rs.opr2,rs.nomer,rs.data1,rs.data2,rs.kolich,sb.mest
from RschBn rs
left join svBn sv
 on sv.opr1=rs.opr1
left join StrBn sb
 on sb.opr2=rs.opr2
where ((rs.data1<=:data2 and rs.data2>=:data1)
                              or sv.DataR between :data1 and :data2) and
      rs.kGrup=1 and sv.KodStatus=11

Если период (data1 и Data2) достаточно большой (отбирается много записей), то при выполнении выдается ошибка: access violation ... . При меньшем периоде - все работает.
Если в конце первой строки вместо "sb.mest" указать "sb.*", то все замечательно работает при любом периоде.
Таблицы - *.dbf


 
try ©   (2007-01-09 23:59) [1]

У тебя здесь с точки зрения BDE 4 (четыре) параметра. Но у первого и четвёртого совпадают имена, так же как и у второго и третьего.
Так что надо проявить фантазию при именовании параметров, чтобы безболезненно обращаться к ним по имени :-)


 
Евгений Р.   (2007-01-10 00:16) [2]

В запросе 2 параметра Data1 и Data2


 
try ©   (2007-01-10 00:42) [3]

В запросе 4 параметра data2, data1, data1 и data2
Количество считается по двоеточиям перед именем.


 
sniknik ©   (2007-01-10 00:50) [4]

> В запросе 4 параметра data2, data1, data1 и data2
BDE позволяет одноименные, оно с ними "дружит" и понимает ;).
нет, сдесь чтото другое, но что х.з. ошибка для запроса больно странная, не в нем происходит, имхо.


 
Германн ©   (2007-01-10 01:00) [5]


> ошибка для запроса больно странная, не в нем происходит,
>  имхо.
>

Угу. Более вероятно, что ошибка в коде, в котором используются результаты запроса. Очень интересно что ещё есть в таблице sb, кроме
> mest
?


 
Евгений Р.   (2007-01-10 01:32) [6]

Структура sb:
strBN.DBF  31909  31909
 OPR1           C10/11   TStringField
 OPR2           C10/11   TStringField
 NRASP          N  / 8   TFloatField
 KODORG         N  / 8   TFloatField
 NOMER          N  / 2   TSmallintField
 PBRN           L  / 2   TBooleanField
 PRNZ           L  / 2   TBooleanField
 RNZ            N  / 2   TSmallintField
 PBEZPODS       L  / 2   TBooleanField
 PDOPMEST       L  / 2   TBooleanField
 PSTRAXOVKI     L  / 2   TBooleanField
 VDTRF          N  / 2   TSmallintField
 STRANA         C20/21   TStringField
 TIPPROG        N  / 2   TSmallintField
 FIO            C25/26   TStringField
 POL            N  / 2   TSmallintField
 DATA1          D  / 4   TDateField
 TIME1          N  / 8   TFloatField
 DATA2          D  / 4   TDateField
 TIME2          N  / 8   TFloatField
 PROGITO        N  / 8   TFloatField
 TARIF          N  / 8   TFloatField
 PPERESEL       L  / 2   TBooleanField
 MEST           N  / 2   TSmallintField

Ошибку дает именно запрос. Для проверки сделал новое приложение с одной формой. В кнопке код:
  qu.ParamByName("data1").asDateTime:=encodeDate(2006,01,1);
  qu.ParamByName("data2").asDateTime:=encodeDate(2006,12,31);
  showMessage("Перед");
  qu.open;
  showMessage("После");
Окошко с первой надписью показывает, со второй - нет.
То же в отладчике.


 
Германн ©   (2007-01-10 02:08) [7]


> Для проверки сделал новое приложение с одной формой. В кнопке
> код:
>   qu...

А что есть qu?
Если сделал тестовое приложение
> с одной формой.
, то не сложно привести его целиком. Не помню только, когда dfm стали текстовыми :( В Д5 или в Д6?


 
Desdechado ©   (2007-01-10 11:21) [8]

Вполне возможна порча данных в поле. И при "небольшом диапазоне дат" просто эта порченая запись не выбирается.
Встречал такое. Особенно, если происхождение эти DBF - неизвестная ДОС-программа.


 
Anatoly Podgoretsky ©   (2007-01-10 12:30) [9]

> sniknik  (10.01.2007 00:50:04)  [4]

> BDE позволяет одноименные, оно с ними "дружит" и понимает ;).

Что-то не припомню такого, как раз наоборот честный, одно значение - один плейсхолдер.


 
sniknik ©   (2007-01-10 12:57) [10]

> Что-то не припомню такого, как раз наоборот честный, одно значение - один плейсхолдер.
проверял так, как раз после случая на форуме когда уверяли, что работает, а по идее изза задвоенных имен параметров не должно, так то я с BDE практически не работал, бог миловал ;), сразу в дельфи на ADO начал.  

procedure TForm1.Button1Click(Sender: TObject);
begin
 Query1.SQL.Text:= "SELECT ID,:Par AS Param FROM Test.Dbf WHERE ID=:Par"; //2!
 Query1.ParamByName("ID").AsInteger:= 81; //1 раз!
 Query1.Open;
end;

после выполнения было 2 столбца одинаковых цифр. из чего сделал вывод, значения от единственного присвоения получили оба параметра и тот что "AS Param" и в условии, т.к. и условие сработало (выборка 1 значения цифры из множества) и в подстановке нормальное значение есть.
если это означает чтото другое... ну я не знаю тогда что. проверьте сами.
а вот каким образом получили, на уровне движка, или парсер в разборе "умный" делает ссылки на значение, или еще как, не разбирался. да и не нужно мне это. (BDE для меня не рабочий инструмент, а так, иногда развлечься ;о))


 
Евгений Р.   (2007-01-10 16:07) [11]


> то не сложно привести его целиком. Не помню только, когда
> dfm стали текстовыми :( В Д5 или в Д6?


unit qqqq;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 Db, DBTables, StdCtrls, Grids, DBGrids;

type
 TForm1 = class(TForm)
   qu: TQuery;
   Button1: TButton;
   DataSource1: TDataSource;
   DBGrid1: TDBGrid;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  qu.ParamByName("data1").asDateTime:=encodeDate(2006,01,1);
  qu.ParamByName("data2").asDateTime:=encodeDate(2006,12,31);
  showMessage("Перед");
  qu.open;
  showMessage("После");
end;

end.
*****************************************
object Form1: TForm1
 Left = 192
 Top = 107
 Width = 696
 Height = 480
 Caption = "Form1"
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = "MS Sans Serif"
 Font.Style = []
 OldCreateOrder = False
 PixelsPerInch = 96
 TextHeight = 13
 object Button1: TButton
   Left = 288
   Top = 40
   Width = 75
   Height = 25
   Caption = "Button1"
   TabOrder = 0
   OnClick = Button1Click
 end
 object DBGrid1: TDBGrid
   Left = 48
   Top = 168
   Width = 625
   Height = 201
   DataSource = DataSource1
   TabOrder = 1
   TitleFont.Charset = DEFAULT_CHARSET
   TitleFont.Color = clWindowText
   TitleFont.Height = -11
   TitleFont.Name = "MS Sans Serif"
   TitleFont.Style = []
 end
 object qu: TQuery
   DatabaseName = "DebugVest"
   SQL.Strings = (
     "select rs.opr2,rs.nomer,rs.data1,rs.data2,rs.kolich,sb.*"
     "from RschBn rs"
     "left join svBn sv"
     "  on sv.opr1=rs.opr1"
     "left join StrBn sb"
     "  on sb.opr2=rs.opr2"
     "where ((rs.data1<=:data2 and rs.data2>=:data1)"
     
       "                               or sv.DataR between :data1 and :d" +
       "ata2) and"
     "       rs.kGrup=1 and sv.KodStatus=11"
     "")
   Left = 128
   Top = 64
   ParamData = <
     item
       DataType = ftUnknown
       Name = "data2"
       ParamType = ptUnknown
     end
     item
       DataType = ftUnknown
       Name = "data1"
       ParamType = ptUnknown
     end
     item
       DataType = ftUnknown
       Name = "data1"
       ParamType = ptUnknown
     end
     item
       DataType = ftUnknown
       Name = "data2"
       ParamType = ptUnknown
     end>
 end
 object DataSource1: TDataSource
   DataSet = qu
   Left = 192
   Top = 64
 end
end


 
Евгений Р.   (2007-01-10 16:12) [12]


> BDE позволяет одноименные, оно с ними "дружит" и понимает


Оба параметра передаются в запрос без проблем. Отчет работает стабильно у многих клиентов и часто используется.


> Вполне возможна порча данных в поле. И при "небольшом диапазоне
> дат" просто эта порченая запись не выбирается.
> Встречал такое. Особенно, если происхождение эти DBF - неизвестная
> ДОС-программа.

Данные созданы только этой программой через это БДЕ.
Если диапазон проходить по кускам - все нормально для каждого участка. Если целиком - ошибка.
Если из таблицы выбрано одно поле - ошибка, если все - нормально?????


 
sniknik ©   (2007-01-10 18:11) [13]

вышли таблицу вместе с этим примером, домой доеду посмотрю.


 
Евгений Р.   (2007-01-10 19:39) [14]

Качай по ссылке


 
sniknik ©   (2007-01-10 20:24) [15]

> Качай по ссылке
по какой? не вижу никакой ссылки, если ты ее письмом выслал то не дошла, возможно спамофильтры "зарубили".

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


 
Евгений Р.   (2007-01-10 21:23) [16]

Отправил по почте еще 2 раза
Ссылку ввести не получается, наверное рубят.


 
sniknik ©   (2007-01-10 22:45) [17]

да получил, гдето через полчаса после поста...
ошибка в данных всетаки есть, jet не хочет открывать таблицу strBN.DBF если в ней есть 11997-я запись с начала... что в ней такого так и не понял,
зато BDE открывает, ну и ладно (чуток по разному ведут себя и не только в этом).
потом есть 6 пустых записей, т.е. даже индексные (opr1/2) там где пустышки ну никак не уперлись полностью пусты... явно были сбои при записи в таблицу.

по топику, сама с BDE проблема/глюк похоже в ленгдрайвере, если поменять на DBWINUS0 то начинают отрабатывать оба запроса (только не спрашивай как мне в голову пришло проверить ;о)), сам не пойму)
изменить можно так
открыть таблицей (вернее закрыть таблицу, просто должно быть настроено, от нее "пляшем") и выполнить
 Table1.Close;
 ChangeLangDriver(ExtractFilePath(Edit1.Text), ExtractFileName(Edit1.Text), "DBWINUS0");

procedure ChangeLangDriver(DatabaseName, TableName, LDName: string);
var
 TblExt: string;
 Database: TDatabase;
 TblDesc: CRTblDesc;
 OptDesc: FLDDesc;
 OptData: array [0..250] of Char;
 Cur: hDBICur;
 Rec: CFGDesc;
begin
 if (TableName="") or (LDName="") then raise Exception.Create("Unknown TableName or LDName");
 Database:= Session.OpenDatabase(DatabaseName);
 try
   if Database.IsSQLBased then raise Exception.Create("Function ChangeLangDriver working only with dBase or Paradox tables");
   FillChar(OptDesc, SizeOf(OptDesc), #0);
   FillChar(TblDesc, SizeOf(TblDesc), #0);
   StrCopy(OptDesc.szName, "LANGDRIVER");
   OptDesc.iLen:=Length(LDName)+1;
   with TblDesc do begin
     StrPCopy(szTblName, TableName);
     TblExt:=UpperCase(ExtractFileExt(TableName));
     if TblExt=".DBF" then StrCopy(szTblType, szDbase)
     else if TblExt=".DB" then StrCopy(szTblType, szParadox)
     else begin
       AnsiToOEM(StrPCopy(OptData, DatabaseName), OptData);
       if DbiOpenCfgInfoList(nil, dbiREADONLY, cfgPersistent, StrPCopy(OptData, "\DATABASES\"+StrPas(OptData)+"\DB INFO\"),Cur)<>DBIERR_NONE
         then raise Exception.Create("Unknown table type");
       try
         while DbiGetNextRecord(Cur, dbiNOLOCK, @Rec, nil)<>DBIERR_EOF do
           if StrComp(Rec.szNodeName, "DEFAULT DRIVER")=0 then begin
             StrCopy(szTblType, Rec.szValue);
             Break;
           end;
       finally
         Check(DbiCloseCursor(Cur));
       end;
     end;
     iOptParams:=1;
     pfldOptParams:=@OptDesc;
     pOptData:=@OptData;
   end;
   StrPCopy(OptData, LDName);
   Check(DbiDoRestructure(Database.Handle, 1, @TblDesc, nil,nil, nil, False));
 finally
   Session.CloseDatabase(Database);
 end;
end;

в общемто и все, после этого твоя тестовая програмка уже ошибок не давала.

на всякий случай уже исправленный файл strBN.DBF вместе с програмкой которой можно поменять ленгдрайвер (показанный код из нее).
http://webfile.ru/1275296
пробуй.

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


 
sniknik ©   (2007-01-10 22:48) [18]

> кстати неплохо былобы создать таблицу заново
а еще лучше забросить BDE совсем, и заняться базами данных... ;о))


 
sniknik ©   (2007-01-10 22:56) [19]

> открыть таблицей (вернее закрыть таблицу, просто должно быть настроено, от нее "пляшем") и выполнить
> Table1.Close;
oops... это в программе я от нее "пляшу", т.к. она открыта из введенного в эдит, а сам ChangeLangDriver ни с чем не связан... не помню ничего уже ;(
ну да сам разберешься. вроде несложно. по именам параметров понять чего туда нужно. :)


 
Евгений Р.   (2007-01-11 00:49) [20]


> если поменять на DBWINUS0 то начинают отрабатывать оба запроса

Действительно помогло, но ...
Захожу через DataBaseDeskTop. Показывает драйвер Ansi2. Наверное он DBWINUS0 не знает, ставит стандартный. Меняю на 866 - снова глючит. Возвращаю Анси-нормально.
Но у меня там есть русские поля (fio,strana). Они, увы, анси не признают.

Пробовал удалять записи из strBn. Ошибка исчезает только когда удаляется определенное количество записей именно входящих в выборку. Удаление даже всех не входящих ничего не дает.
Но самое странное - почему работает при sb.*?????
Удаление и перезапись тоже не помогают, как и удаление индекса.


> а еще лучше забросить BDE совсем, и заняться базами данных.
> ..

а еще лучше забросить программирование и занятся добычей нефти. Но не всегда выходит делать то, что лучше.

А из СУБД, рекомендовал бы FB или MS SQL?


 
Германн ©   (2007-01-11 00:54) [21]


> sniknik ©   (10.01.07 22:48) [18]
>
> > кстати неплохо былобы создать таблицу заново
> а еще лучше забросить BDE совсем, и заняться базами данных.
> .. ;о))
>

Лучше было бы и не начинать с ней шаманские пляски. Но если он только начал, тогда ещё может быть и не поздно.


 
sniknik ©   (2007-01-11 01:09) [22]

> Но самое странное - почему работает при sb.*?????
наверное не анализирует по полям, открывает как бы таблицей.

попытайся всеже сделать корректировку структуры/данных (последний абзац в [17]), + вообще наведи порядок в таблице, там у тебя например куча логических полей (у которых в принципе Null нету) не заполнено.
пустышки опять же.
потом связка(обьеденение) по строковым полям тоже какаято... ;(, не нравится мне чегото, на числа нельзя перейти? (потому как это первые поля по которым заподозрил ленгдрайвер... а уж после того как пытался посчитать повторения и сделал группировку по одному из них и SQL Explorer выдал ошибку индекса or ланпдравера... ну понятно)

> А из СУБД, рекомендовал бы FB или MS SQL?
мне практически все равно, но на работе у нас больше востребован MS SQL поэтому им больше и занимаюсь. (под IB 6.5 заказ был 1 единственный раз в 5 лет...)
имхо, что угодно, лиш бы не BDE. :)


 
sniknik ©   (2007-01-11 01:27) [23]

+
в самих "ключевых" полях зачастую концевики у значений символом "_", опасный символ... ;), это в запросах с LIKE  означает любой символ, а как его обрабатывает ленгдрайвер в нестандартной ситуации? хз.
к тому же это явно результат некорректного переноса  с какойто системы... в оригинале их наверняка не было (имхо), а при переносе ими "добили" короткие varchar-ы, до максимального размера поля. (заметь они длинной строго 10 даже там где это не нужно, ну не считая пустышек от явных глюков записи)



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

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

Наверх





Память: 0.54 MB
Время: 0.04 c
2-1168706574
ice321i
2007-01-13 19:42
2007.01.28
Отчет в не правильное кодировке


2-1168357487
Pisar
2007-01-09 18:44
2007.01.28
CoolBar


2-1168376640
Lamer666
2007-01-10 00:04
2007.01.28
DBGridEh1.SelectedRows


15-1168341757
Александр Иванов
2007-01-09 14:22
2007.01.28
Как вам такое тестовое задание?


15-1168324917
zdm
2007-01-09 09:41
2007.01.28
Со всеми прошедшими и наступающими!!!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский