Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.05.2011, 14:14
Sleipnir Sleipnir вне форума
Прохожий
 
Регистрация: 06.05.2011
Сообщения: 18
Репутация: 10
Плохо Странная работа ADO на разных компах

День добрый.
С ftp получаю файл, [имя клиента].dbf и копирую его в ту же папку как [имя клиента]_order.dbf. Затем присваиваю ADOTable.TableName значение [имя клиента]_order, т.е. указываю эту таблицу в качестве источника данных.
ADOTable.LockType := ltBatchOptimistic
После этого пользователь заполняет некие значения в DBGrid и нажимает кнопку "отправить". После нажатия кнопки делаю ADOTable1.UpdateBatch() и копирую файл с источником данных в другую папку (в качестве некого архива) и выкладываю обратно на ftp.

Все бы ничего, но на части компов работает все как часы, а на некоторых почему-то в качестве источника данных используется файл [имя клиента].dbf, а после нажатия на кнопку "отправить" я вижу в "архиве" файл с пустыми значениями.

Как так может быть? Сломал голову.
Прошу сильно не пинать, так как на Delphi пушу мало и последний раз этим занимался еще в институте.
Ответить с цитированием
  #2  
Старый 06.05.2011, 14:16
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

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

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 06.05.2011, 14:18
Sleipnir Sleipnir вне форума
Прохожий
 
Регистрация: 06.05.2011
Сообщения: 18
Репутация: 10
По умолчанию

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

Причем файлы создаются на всех машинах и с нужными именами.

Проблема с их содержимым.

Последний раз редактировалось Sleipnir, 06.05.2011 в 14:23.
Ответить с цитированием
  #4  
Старый 07.05.2011, 09:16
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Без вашего кода это разговор ни о чем
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 10.05.2011, 11:52
Sleipnir Sleipnir вне форума
Прохожий
 
Регистрация: 06.05.2011
Сообщения: 18
Репутация: 10
По умолчанию

Код:
procedure TForm1.FormCreate(Sender: TObject);
var   Result: boolean;
var F: TextFile; S: String;
begin
Result := SQLConfigDataSource(0, 1,
  'Microsoft dBase Driver (*.dbf)', 'DSN=MYODBC;DBQ=C:\1C;DefaultDir=C:\1C;DriverId=277;FIL=dBase IV;MaxBufferSize=2048;PageTimeout=5'#0);

  ADOTable1.Active    := false;

  ADOTable1.LockType  := ltBatchOptimistic;

  if FileExists('C:\1C\PassStore.ini') then
    begin
      AssignFile(F,'C:\1C\PassStore.ini');
      Reset(F);
      ReadLn(F,S);
      S := Decrypt(S, StartKey, MultKey, AddKey);
      CloseFile(F);
      if FileExists('C:\1C\' + S + '.dbf') then
          begin
            CopyFile(PChar('C:\1C\' + S + '.dbf'), PChar('C:\1C\' + S + '_order.dbf'), false);
            ADOTable1.TableName := S + '_order';
            ADOTable1.Active    :=  true;
            DBGreedNames();
            ColumnResize();
          end
      else
        begin
          ADOTable1.Active    :=  false;
          ShowMessage('Загрузите прайс-лист');
        end
    end
  else
    begin
      ADOTable1.Active    :=  false;
      ShowMessage('Не обнаружен файл с сохраненным паролем.' + #13 +
                  'Настройте имя пользователя и пароль и сохраните их в файл.');
    end;
  if not DirectoryExists('C:\1C\Orders') then
    try
      CreateDir('C:\1C\Orders');
    except
      ShowMessage('При создании директории произошла ошибка');
    end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var F: TextFile; S, SS: String;
var   today : TDateTime;
begin
  ADOTable1.UpdateBatch();
  if FileExists('C:\1C\PassStore.ini') then
    begin
      AssignFile(F,'C:\1C\PassStore.ini');
      Reset(F);
      ReadLn(F,S);
      IdFTP1.Username := Decrypt(S, StartKey, MultKey, AddKey);
      ReadLn(F,S);
      IdFTP1.Password := Decrypt(S, StartKey, MultKey, AddKey);
      CloseFile(F);
    end;
  if IdFTP1.Connected = true then
  Begin
    IdFTP1.Abort;
    IdFTP1.Quit;
  End;
  try
    IdFTP1.Connect(true, 5000);
  except
    ShowMessage('Подключение не удалось.');
  end;

  if not DirectoryExists('C:\1C\Orders') then
    try
      CreateDir('C:\1C\Orders');
    except
      ShowMessage('При создании директории произошла ошибка');
    end;

  if DirectoryExists('C:\1C\Orders') then
    begin
      SS    := '';
      today := Now;
      SS    := SS + DateToStr(today);
      SS    := SS + TimeToStr(today);
      SS    := Replace(SS, '.', '');
      SS    := Replace(SS, ':', '');
      SS    := '_' + SS;
      CopyFile(PChar('C:\1C\' + IdFTP1.Username + '_order.dbf'), PChar('C:\1C\Orders\' + IdFTP1.Username + SS +'.dbf'), false);
    end;

  if IdFTP1.Connected = true then
    begin
      try
        IdFTP1.ChangeDir('/');
        IdFTP1.Put('C:\1C\Orders\' + IdFTP1.Username + SS + '.dbf', IdFTP1.Username + SS + '.dbf', false);

        ShowMessage('Заказ отправлен');
      except
        ShowMessage('Передача заказа не удалась');
      end;
    end;
  if IdFTP1.Connected = true then
  Begin
   IdFTP1.Abort;
   IdFTP1.Quit;
  End;
  if FileExists('C:\1C\' + IdFTP1.Username + '.dbf') then
    begin
      ADOTable1.Active    :=  false;
      CopyFile(PChar('C:\1C\' + IdFTP1.Username + '.dbf'), PChar('C:\1C\' + IdFTP1.Username + '_order.dbf'), false);
      ADOTable1.TableName := IdFTP1.Username + '_order';
      ADOTable1.Active    :=  true;
      DBGreedNames();
      ColumnResize();
    end;
  SumZakaz.Caption  := 'Сумма заказа 0 руб.';
end;
Aristarh Dark: ПРО ТЭГИ НЕ ЗАБЫВАЕМ!!!!
Ответить с цитированием
  #6  
Старый 10.05.2011, 13:31
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Первое, что настораживает:
Цитата:
'C:\1C\' + S + '_order.dbf'
ADOTable1.TableName := S + '_order';
Вы уверены, что обязательно для поиска таблицы будет использован каталог C:\1C\? Я так совсем в этом не уверен, хотя вы и упоминаете этот каталог при подключении.
Второе, но тут я возможно и не прав. Судя по всему вы используете файлы 1с, но насколько я помню они только расширение имеют dbf, а вот структура имеет мало общего с dBase IV
И наконец третье, так как вы подключаетесь через ADO к DBF я не пробовал, обычно просто указывается в Extended property ключевая фраза DBase IV. Может и тут собака порылась.
А вообще в подобных ситуациях отладчик пошаговый вам в помощь. Смотрите, что и куда у вас попадает в процессе работы программы.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 10.05.2011 в 13:35.
Ответить с цитированием
  #7  
Старый 10.05.2011, 13:41
Sleipnir Sleipnir вне форума
Прохожий
 
Регистрация: 06.05.2011
Сообщения: 18
Репутация: 10
По умолчанию

1. Насчет того что для поиска таблицы будет использован каталог C:\1C\ я уверен по двум причинам:
а) ADOConnection.DefaultDatabase := 'C:\1C';
b) Этот же каталог указан в ADOConnection.ConnectionString (источник данных, необходимых мне, создается на любом компьютере принудительно, если его там нет).

2. Действительно, 1с использует DBase III+, но там все поля описаны просто string и на части компьютеров все прекрасно работает.

3. "обычно просто указывается в Extended property ключевая фраза DBase IV" - это где? Простите, конечно, за потенциально тупой вопрос, но давно я не использовал delphi.

Именно на той машине, на которой это писалось, все работает "как часы", поэтому и родилась данная тема.
Ответить с цитированием
  #8  
Старый 10.05.2011, 14:04
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Подключение организуется так:
Настраиваем компонент AdoConnection указываем в качестве строки подключения такую конструкцию:
AdoConnection.ConnectionString := Format(
'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Extended Properties=DBase IV',['c:\1c\']);
В этом случае базой считается весь каталог c:\1c\, а таблицами файлы DBF
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #9  
Старый 10.05.2011, 14:17
Sleipnir Sleipnir вне форума
Прохожий
 
Регистрация: 06.05.2011
Сообщения: 18
Репутация: 10
По умолчанию

Спасибо, но не помогло.
На той машине, на которой изначально все работало, продолжает работать, а на той которая не работала, так и не работает.

[имя клиента].dbf и [имя клиента]_order.dbf оказываются заполненными, а та таблица, которая выкладывается на ftp, оказывается девственно чистой.
Ответить с цитированием
  #10  
Старый 10.05.2011, 16:03
Sleipnir Sleipnir вне форума
Прохожий
 
Регистрация: 06.05.2011
Сообщения: 18
Репутация: 10
По умолчанию

Проводил "антинаучные" опыты на той машине, на которой не отрабатывает программа.
Заблокировал таблицу [ИмяКлиента].dbf и получил ошибку.
Заблокировал таблицу [ИмяКлиента]_order.dbf и все замечательно отработалось, хотя должно быть с точностью до наоборот.

Получается что в ADOTable1.TableName стоит имя файла [ИмяКлиента], а не [ИмяКлиента]_order. С другой стороны, я специально вставлял команду ShowMessage(ADOTable1.TableName) и она показывала что ADOTable1.TableName = [ИмяКлиента]_order.

Как так может быть???
Почему на части компов работает правильно, а на части нет???

Помогите, плиз, иначе отпуск под угрозой


Может ли как-то обрезаться имя таблицы???

Последний раз редактировалось Sleipnir, 10.05.2011 в 16:06.
Ответить с цитированием
  #11  
Старый 10.05.2011, 16:13
Sleipnir Sleipnir вне форума
Прохожий
 
Регистрация: 06.05.2011
Сообщения: 18
Репутация: 10
По умолчанию

Нашел причину неправильной работы, но не могу понять как это победить:

ADOTable.TableName на части компьютеров обрезает значение до 8 символов.

Как это обойти?
Неправильно это как-то, имхо...
Ответить с цитированием
  #12  
Старый 10.05.2011, 16:18
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Допускаю такую мысль:
На разных машинах возможна разная настройка драйверов. Т.к. не сказана какая конфигурация системы на машине где не работает то:
В случае если Имя_Пользователя имеет длину 8, а на машине каким-то образом (не знаю каким и не знаю возможно ли это, просто предполагаю) настроено что dbf должно быть вида 8.3, то _order тупо срезается и не дает ошибки. А вот если имя пользователя короче чем 8 символов, то скорее всего возникла бы ошибка типа таблица не найдена.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #13  
Старый 10.05.2011, 16:19
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

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

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #14  
Старый 10.05.2011, 16:21
Sleipnir Sleipnir вне форума
Прохожий
 
Регистрация: 06.05.2011
Сообщения: 18
Репутация: 10
По умолчанию

А вот где может быть такая чудная настройка, что имя файла, *.dbf в частности, должно иметь вид 8.3?
Ответить с цитированием
  #15  
Старый 10.05.2011, 16:22
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Sleipnir
Нашел причину неправильной работы, но не могу понять как это победить:

ADOTable.TableName на части компьютеров обрезает значение до 8 символов.

Как это обойти?
Неправильно это как-то, имхо...
Ну что я могу сказать: "dbf - такая dbf"
Я сталкивался со случаями когда MS Access не хотел открывать файлы имя которых не соответствовало стандарту 8.3
Могу предложить для работы переименовывать во что-то соответствующее стандарту 8.3 (типа worktbl.dbf), а затем, после обработки и перед заливкой на ftp и копированием в архив, переименовывать в "как нада".
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:33.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter