Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.12.25;
Скачать: CL | DM;

Вниз

Ошибка: Поставщик данных ....... состояние E_FAIL   Найти похожие ветки 

 
oleg_veles   (2011-07-26 11:02) [0]

Добрый день ! Помогите разобраться с ошибкой:
Поставщик данных или другая служба вернули состояние E_FAIL.
Вылетает при выполнении следующего куска:
procedure TForm2.BitBtn2Click(Sender: TObject);
Var
Stroca: String;
Konec: String;
Nachalo: String;
Schet:String;
d: Integer;
r: Integer;
m:integer;
n:integer;
f:integer;
begin
    Begin
    //Определим количество записей в секции
    For i:=0 to Memo1.Lines.Count -1 do // Запускаем цикл поиска строки начала документа
    If Pos("СЕКЦИЯДОКУМЕНТ", Memo1.Lines[i])<>0 Then
       Begin
         m := i;
       End;
    For d:=0 to Memo1.Lines.Count -1 do // Запускаем цикл поиска строки конца документа
    If Pos("КОНЕЦДОКУМЕНТА", Memo1.Lines[d])<>0 Then
       Begin
         n := d;
       End;
    r := n-m;// Количество строк документа
    end;
    For i:=0 to Memo1.Lines.Count -1 do // Запускаем цикл поиска строки начала документа
    If Pos("СЕКЦИЯДОКУМЕНТ", Memo1.Lines[i])<>0
    Then
    Begin
      ADOTable1.Append;
      for f := 1 to r  do
        Begin
          rsh := Memo1.Lines[f + i];// Строка документа
          Stroca := Copy(rsh, 1, 6);
          Konec :=  Copy(rsh, 1, 14);
          Schet :=  Copy(rsh, 1, 13);
          Znach := Copy(rsh,Pos("=",rsh)+1, Length(Rsh));
          if Znach = "" then Znach := "0";
          ADOTable1.Edit;
          If (Stroca = "ДАТАСП") OR (Stroca = "ДАТАПО") OR (Stroca = "ДАТАОП") Then Begin
                   ADOTable1Data.Value := Znach
                   end
                   Else
          If (Stroca = "СУММА=") OR (Stroca = "СУММАП") OR (Stroca = "СУММАР") Then Begin
                   ADOTable1Summa.Value := Znach
                   end
                   Else
          If (Schet = "ПЛАТЕЛЬЩИКСЧЕ") OR (Schet = "ПЛАТЕЛЬЩИКИИК") OR (Schet = "ПЛАТЕЛЬЩИК2  ") Then Begin
                   ADOTable1PlatSchet.Value := Znach
                   end
                   Else
          If Stroca = "НАЗНАЧ" Then Begin
                   ADOTable1NaznPlat.Value := Znach;
          ADOTable1Bank.Value := Nomer;
          If Konec = "КОНЕЦДОКУМЕНТА" Then End;
       End;
          ADOTable1.Post;
    End;
    ADOTable1.Active := False;
    Memo1.CharCase := ecNormal;
    ADOTable1.Active := True;
end;

Вылетает непонятно в каком месте и не зависит (проверял) от загружаемого файла, т.е. может два раза файл загрузиться, а третий (пятый, двадцатый) появится эта ошибка. Харанее благодарен за ответ...


 
SQLEXPRESS   (2011-07-26 11:19) [1]

Access?


 
Dennis I. Komarov ©   (2011-07-26 11:30) [2]

Ужасть, а не код.
1. циклы for заменить на один while
2. Учить SQL
3. Судя по присутствующим терминам "ПЛАТЕЛЬЩИК", "СУММА" и т.п. автора придать анафеме


 
oleg_veles   (2011-07-26 11:31) [3]

Он проклятый :-( , но уйти ни как... там древняя программуля обрабатывает полученные данные. Мне только и надо из декста в mdb перегнать...


 
И. Павел ©   (2011-07-26 11:34) [4]

> Вылетает непонятно в каком месте

Даже после трассирования непонятно?


 
oleg_veles   (2011-07-26 11:35) [5]

To Dennis I. Komarov

> 2. Учить SQL

Где тут SQL !

> 3. Судя по присутствующим терминам "ПЛАТЕЛЬЩИК", "СУММА"
> и т.п. автора придать анафеме

И за что ? За то что вынужден выполнять прихоть бухов? Ты видно счастливый делаешь только то что хочешь...
А по существу вопроса можешь что подсказать ?


 
oleg_veles   (2011-07-26 11:36) [6]


> Даже после трассирования непонятно?


      End;
  >>>       ADOTable1.Post;
   End;


 
Anatoly Podgoretsky ©   (2011-07-26 11:39) [7]

> oleg_veles  (26.07.2011 11:02:00)  [0]

TAdoDataset


 
oleg_veles   (2011-07-26 11:40) [8]


> Даже после трассирования непонятно?

Но это ни о чём... может вылететь в ошибку, а может и нет... связи не нахожу...


 
oleg_veles   (2011-07-26 11:49) [9]


> Anatoly Podgoretsky

А как мне тут TAdoDataset поможет ? Если бы надо было работать с готовым набором данных то я и использовал бы тот же SQL. А тут выписки банковские, при чем документы содержат произвольное число строк. Да и поля текстовые сами видете по IF-ам минимум трех вариантов....


 
SQLEXPRESS   (2011-07-26 11:52) [10]

у меня что-то было такое, все переписал на
begintran
INSERT INTO (F1, F2) VALUES (:F1, :F2)
parameters.parambyname(F1).type :=
parambyname(F1).value :=
и т.п.
committran

чистую таблицу, файл, тестовый проектик посмотрит может кто


 
Dennis I. Komarov ©   (2011-07-26 11:52) [11]


> Где тут SQL !

Вот нету, а быть должен.

> И за что ? За то что вынужден выполнять прихоть бухов?

За написание такого кода в приложении, используемого в коммерческих целях

> А по существу вопроса можешь что подсказать ?

Читай [1] и [7] до полного просветления


 
Dennis I. Komarov ©   (2011-07-26 11:54) [12]

т.е. [2] и [7]


 
И. Павел ©   (2011-07-26 11:57) [13]

> [9] oleg_veles   (26.07.11 11:49)

Посмотрите - если у вас MDAC ниже версии 2.6 то может быть ошибка связана с багом Микрософта. Тогда просто обновите MDAC.

Хотя тут, конечно, нужно все переписать через ADODataSet.


 
sniknik ©   (2011-07-26 11:59) [14]

> автора придать анафеме
придать, но за ADOTable1, ламеризм, и не использование параметризованных запросов.

Znach := Copy(rsh,Pos("=",rsh)+1, Length(Rsh));
if Znach = "" then Znach := "0";

например
Znach := "####.##";
???

> а может и нет... связи не нахожу...
запись разных данных. в смысле правильных и не правильных.


 
oleg_veles   (2011-07-26 12:00) [15]


> И. Павел



> Хотя тут, конечно, нужно все переписать через ADODataSet.

Спасибо, буду пробовать...


 
sniknik ©   (2011-07-26 12:00) [16]

> Хотя тут, конечно, нужно все переписать через ADODataSet.
на ADOCommand, тут нет отображения/работы с рекордсетом, тут только запись в таблицу.


 
Плохиш ©   (2011-07-26 12:06) [17]

Это правильно. Сначала высосать ... пардон ... создать проблему, а затем е&#235; героически решать...
Только не понятно, ч&#235; они сюда прутся, здесь же не решают высосанных проблем?


 
oleg_veles   (2011-07-26 12:06) [18]

Всем спасибо... Буду пробовать...
Для критикующих - форум называется: "Начинающим".
"Все проходит - и это пройдет"
                             (Надпись на пестне Соломона)


 
Dennis I. Komarov ©   (2011-07-26 12:10) [19]


> oleg_veles   (26.07.11 12:06) [18]

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


 
SQLEXPRESS   (2011-07-26 13:01) [20]

попробуйте еще обернуть в

try

 except
   on E:Exception do
   begin
     for i := 0 to ac1.Errors.Count - 1 do
      mmo1.Lines.Add(ac1.Errors.Item[i].Source + ac1.Errors.Item[i].Description);
     raise;
   end;
 end

mmo1 - Tmemo
ac1 - TAdoConnection

ничего нового не читается?


 
Игорь Шевченко ©   (2011-07-26 13:59) [21]


>    on E:Exception do


при EAccessViolation будет масса полезной информации.

"Только массовые расстрелы спасут отечество"


 
SQLEXPRESS   (2011-07-26 14:12) [22]

а что не так?

 M: TADOCommand;
begin
 try
   M.Execute; // AV
 except
   on E:Exception do
   begin
     for i := 0 to ac1.Errors.Count - 1 do // ошибок не найдено
      mmo1.Lines.Add(ac1.Errors.Item[i].Source + ac1.Errors.Item[i].Description);
     raise; // ловите AV выше
   end;
 end


 
Игорь Шевченко ©   (2011-07-26 14:29) [23]


> а что не так?


а то, что заполнять имеет смысл только при том типе исключения, когда в ac1.Errors гарантировано содержится актуальная информация.


 
skiph ©   (2011-09-15 11:44) [24]

Подобная проблема связана с тем, что в исходных данных содержатся значения данных NULL либо дата и/или время в значении "0000-00-00"/"00:00:00"


 
skiph ©   (2011-09-15 12:05) [25]

По поводу NULL уточню: Ошибка возникает, когда NULL содержится в поле, которое не может быть NULL-евым. Объясню, как такое возможно.
Предположим, что у нас есть 2 таблицы: Основная Т1 и справочник Т2 (имеет поля key и mainfield) и мы хотим выполнить запрос вида
SELECT *
FROM T1 LEFT OUTER JOIN T2 ON T1.key=T2.key

Ясное дело, что при таком соединении в результирующей таблице не все поля T2.key и Mainfield будут иметь значение (они будут равны NULL), однако в описании таблицы T2, скорее всего, они будут обязательными


 
Anatoly Podgoretsky ©   (2011-09-15 13:46) [26]

> skiph  (15.09.2011 12:05:25)  [25]

Чудеса, но попробуй поставить другой сервер, это налицо непригодный.


 
Inovet ©   (2011-09-15 14:34) [27]

> [25] skiph ©   (15.09.11 12:05)
> е все поля T2.key и Mainfield будут иметь значение (они будут равны NULL),

А такой запрос
SELECT * FROM T1 WHERE key IS NULL
И такой
SELECT * FROM T2 WHERE key IS NULL
что вернут?



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

Текущий архив: 2011.12.25;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.009 c
2-1315654752
TheEd
2011-09-10 15:39
2011.12.25
Первая видимая запись в TDBStringGrid


1-1277967525
istok
2010-07-01 10:58
2011.12.25
TChart...


2-1316273416
Anny
2011-09-17 19:30
2011.12.25
Координаты точек


8-1219696911
Zilog
2008-08-26 00:41
2011.12.25
Как узнать, насоклько один цвет отличается от другого (RGB)


15-1315548799
user1987
2011-09-09 10:13
2011.12.25
Часы на рабочем столе