|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Странная работа ADO на разных компах
День добрый.
С ftp получаю файл, [имя клиента].dbf и копирую его в ту же папку как [имя клиента]_order.dbf. Затем присваиваю ADOTable.TableName значение [имя клиента]_order, т.е. указываю эту таблицу в качестве источника данных. ADOTable.LockType := ltBatchOptimistic После этого пользователь заполняет некие значения в DBGrid и нажимает кнопку "отправить". После нажатия кнопки делаю ADOTable1.UpdateBatch() и копирую файл с источником данных в другую папку (в качестве некого архива) и выкладываю обратно на ftp. Все бы ничего, но на части компов работает все как часы, а на некоторых почему-то в качестве источника данных используется файл [имя клиента].dbf, а после нажатия на кнопку "отправить" я вижу в "архиве" файл с пустыми значениями. Как так может быть? Сломал голову. Прошу сильно не пинать, так как на Delphi пушу мало и последний раз этим занимался еще в институте. |
#2
|
||||
|
||||
Тут дело не в ADO однако, а в алгоритме копирования и переименования файла.
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#3
|
|||
|
|||
Согласен, но почему на части машин отрабатывается адекватно, а на части не желает.
Причем файлы создаются на всех машинах и с нужными именами. Проблема с их содержимым. Последний раз редактировалось Sleipnir, 06.05.2011 в 14:23. |
#4
|
||||
|
||||
Без вашего кода это разговор ни о чем
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#5
|
|||
|
|||
Код:
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; |
#6
|
||||
|
||||
Первое, что настораживает:
Цитата:
Второе, но тут я возможно и не прав. Судя по всему вы используете файлы 1с, но насколько я помню они только расширение имеют dbf, а вот структура имеет мало общего с dBase IV И наконец третье, так как вы подключаетесь через ADO к DBF я не пробовал, обычно просто указывается в Extended property ключевая фраза DBase IV. Может и тут собака порылась. А вообще в подобных ситуациях отладчик пошаговый вам в помощь. Смотрите, что и куда у вас попадает в процессе работы программы. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 10.05.2011 в 13:35. |
#7
|
|||
|
|||
1. Насчет того что для поиска таблицы будет использован каталог C:\1C\ я уверен по двум причинам:
а) ADOConnection.DefaultDatabase := 'C:\1C'; b) Этот же каталог указан в ADOConnection.ConnectionString (источник данных, необходимых мне, создается на любом компьютере принудительно, если его там нет). 2. Действительно, 1с использует DBase III+, но там все поля описаны просто string и на части компьютеров все прекрасно работает. 3. "обычно просто указывается в Extended property ключевая фраза DBase IV" - это где? Простите, конечно, за потенциально тупой вопрос, но давно я не использовал delphi. Именно на той машине, на которой это писалось, все работает "как часы", поэтому и родилась данная тема. |
#8
|
||||
|
||||
Подключение организуется так:
Настраиваем компонент AdoConnection указываем в качестве строки подключения такую конструкцию: AdoConnection.ConnectionString := Format( 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Extended Properties=DBase IV',['c:\1c\']); В этом случае базой считается весь каталог c:\1c\, а таблицами файлы DBF Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#9
|
|||
|
|||
Спасибо, но не помогло.
На той машине, на которой изначально все работало, продолжает работать, а на той которая не работала, так и не работает. [имя клиента].dbf и [имя клиента]_order.dbf оказываются заполненными, а та таблица, которая выкладывается на ftp, оказывается девственно чистой. |
#10
|
|||
|
|||
Проводил "антинаучные" опыты на той машине, на которой не отрабатывает программа.
Заблокировал таблицу [ИмяКлиента].dbf и получил ошибку. Заблокировал таблицу [ИмяКлиента]_order.dbf и все замечательно отработалось, хотя должно быть с точностью до наоборот. Получается что в ADOTable1.TableName стоит имя файла [ИмяКлиента], а не [ИмяКлиента]_order. С другой стороны, я специально вставлял команду ShowMessage(ADOTable1.TableName) и она показывала что ADOTable1.TableName = [ИмяКлиента]_order. Как так может быть??? Почему на части компов работает правильно, а на части нет??? Помогите, плиз, иначе отпуск под угрозой Может ли как-то обрезаться имя таблицы??? Последний раз редактировалось Sleipnir, 10.05.2011 в 16:06. |
#11
|
|||
|
|||
Нашел причину неправильной работы, но не могу понять как это победить:
ADOTable.TableName на части компьютеров обрезает значение до 8 символов. Как это обойти? Неправильно это как-то, имхо... |
#12
|
||||
|
||||
Допускаю такую мысль:
На разных машинах возможна разная настройка драйверов. Т.к. не сказана какая конфигурация системы на машине где не работает то: В случае если Имя_Пользователя имеет длину 8, а на машине каким-то образом (не знаю каким и не знаю возможно ли это, просто предполагаю) настроено что dbf должно быть вида 8.3, то _order тупо срезается и не дает ошибки. А вот если имя пользователя короче чем 8 символов, то скорее всего возникла бы ошибка типа таблица не найдена. Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#13
|
||||
|
||||
Ух-ты, а я был прав
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#14
|
|||
|
|||
А вот где может быть такая чудная настройка, что имя файла, *.dbf в частности, должно иметь вид 8.3?
|
#15
|
||||
|
||||
Цитата:
Я сталкивался со случаями когда MS Access не хотел открывать файлы имя которых не соответствовало стандарту 8.3 Могу предложить для работы переименовывать во что-то соответствующее стандарту 8.3 (типа worktbl.dbf), а затем, после обработки и перед заливкой на ftp и копированием в архив, переименовывать в "как нада". Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |