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

Delphi Sources



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

Закрытая тема
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.07.2008, 12:39
Аватар для XIO
XIO XIO вне форума
Новичок
 
Регистрация: 06.12.2007
Сообщения: 77
Репутация: 32
По умолчанию Импорт из Excel. Сбой рабочего алгоритма.

Имеется модуль. Исходник тут.

Использовал для импорта из Excel в StringGrid. Прекрасно работает.
Сейчас немного модернизировал программу. Теперь необходимо импортировать в БД. Так вот.
При выполнении кода:
Код:
          MailBotForm.StringGrid1.Cells[3,I] := IntToStr(I+1);
          Cell1 := GetCellIndex(2,I+1);
          MailBotForm.StringGrid1.Cells[1,I] := ExcelApplication.Range[Cell1,Cell1].Value2;
          Cell1 := GetCellIndex(3,I+1);
          MailBotForm.StringGrid1.Cells[2,I] := ExcelApplication.Range[Cell1,Cell1].Value2;
Всё замечательно работает. Значение ExcelApplication.Range[Cell1,Cell1].Value2 равно тому значению, что записано в файле Excel и в StringGrid выводится "красивое" и правильное значение...

В новой версии мне необходимо это же казалось бы значение передать в параметр TDataSet. Делаю так:
Код:
      MainDM.HaveDuplicate.Close;
      Cell1 := GetCellIndex(2,I+1);
      MainDM.HaveDuplicate.Parameters.ParamByName('Name').Value := VarToStr(ExcelApplication.Range[Cell1,Cell1].Value2);
      MainDM.HaveDuplicate.Open;

однако вместо ФИО или Email адреса что хранится в Excel файле, я получаю следущего вида значения: '|C:><5;>|.|.'

В чём причина, где я допускаю ошибку, или собственно что вообще делаю не так? Буду рад любому совету или ответу =)

Процедура импорта:
Код:
Procedure TExcelToolsDataModule.ImportAdresses(ExcFile: String);
Var
  i,j,x: Integer;
  I_,J_: Integer;
  Cell1,Cell2: TCellIndex;
begin                               
  //MailBotForm.Memo4.Lines.Clear;
  ExcelApplication.Connect;
  ExcelApplication.Workbooks.Add(ExcFile,1);
  Cell1 := GetCellIndex(1,1);
  I:=0;
  MailBotForm.StringGrid1.CleanupInstance;
  MailBotForm.StringGrid1.RowCount := 0;
  ExcelApplication.cells.specialcells(xlcelltypelastcell,emptyparam).activate;
  x := ExcelApplication.activecell.row;
  MailBotForm.ProgressBar1.Visible := True;
  While I<X do
    begin
      Try
        If (ExcelApplication.Range[Cell1,Cell1].Value2 = null) then Continue;
      Except
      End;
      MainDM.HaveDuplicate.Close;
      Cell1 := GetCellIndex(2,I+1);
      MainDM.HaveDuplicate.Parameters.ParamByName('Name').Value := VarToStr(ExcelApplication.Range[Cell1,Cell1].Value2);
      MainDM.HaveDuplicate.Open;
      If MainDM.HaveDuplicate.RecordCount = 0 then
        begin
          Cell1 := GetCellIndex(1,I+1);
          MailBotForm.StringGrid1.Cells[0,I] := ExcelApplication.Range[Cell1,Cell1].Value2;
          //MailBotForm.Memo4.Lines.Add(IntToStr(I+1)+' - '+MailBotForm.StringGrid1.Cells[0,I]+' - '+MailBotForm.StringGrid1.Cells[1,I]);
          MailBotForm.StringGrid1.Cells[3,I] := IntToStr(I+1);
          Cell1 := GetCellIndex(2,I+1);
          MailBotForm.StringGrid1.Cells[1,I] := ExcelApplication.Range[Cell1,Cell1].Value2;
          Cell1 := GetCellIndex(3,I+1);
          MailBotForm.StringGrid1.Cells[2,I] := ExcelApplication.Range[Cell1,Cell1].Value2;
          MailBotForm.StringGrid1.RowCount := MailBotForm.StringGrid1.RowCount + 1;
          //If Not MailBotForm.CheckBox2.Checked then
           { For I_:= 1 to I do //Проверяем на повторяющиеся адреса.
              begin
                If ((MailBotForm.StringGrid1.Cells[0,I_] = MailBotForm.StringGrid1.Cells[0,I])
                  and (MailBotForm.StringGrid1.Cells[1,I_] = MailBotForm.StringGrid1.Cells[1,I])) and (I_<>I) then
                  begin
                    MessageDlg('Внимание! Есть повторяющиеся адреса! ('+MailBotForm.StringGrid1.Cells[0,I]+')',mtWarning,[mbOK],0);
                    MailBotForm.ProgressBar1.Visible := False;
                    Exit;
                  end;
              end;  }
        end;
      MailBotForm.ProgressBar1.Position :=  (I * 100) div X;
      Inc(I);
      MailBotForm.StaticText1.Caption := 'Количество адресов: '+ IntToStr(I);
    end;
    ExcelApplication.Workbooks.Close(1);
    ExcelApplication.Disconnect;
    MailBotForm.ProgressBar1.Visible := False;
end;
Вложения
Тип файла: rar ExcelToolsDM.rar (2.3 Кбайт, 29 просмотров)
__________________
"Люди никогда не видят то, существование чего им кажется невозможным." ©Терри Пратчетт
  #2  
Старый 14.07.2008, 13:03
Аватар для Thrasher
Thrasher Thrasher вне форума
Illuminati
 
Регистрация: 06.03.2008
Адрес: Крым, г. Симферополь
Сообщения: 348
Репутация: 8808
По умолчанию

Может надо просто так написать:
Код:
 MainDM.HaveDuplicate.Parameters.ParamByName('Name').AsString := ExcelApplication.Range[Cell1,Cell1].Value2;
__________________
Хорошо написанная программа не требует документации
ICQ 9-184-668.
  #3  
Старый 14.07.2008, 14:04
Аватар для XIO
XIO XIO вне форума
Новичок
 
Регистрация: 06.12.2007
Сообщения: 77
Репутация: 32
По умолчанию

Попробовал, к сожалению трюк не проходит.
Ошибка:
Код:
[Error] ExcelToolsDM.pas(243): Undeclared identifier: 'AsString'
__________________
"Люди никогда не видят то, существование чего им кажется невозможным." ©Терри Пратчетт
  #4  
Старый 14.07.2008, 23:31
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

Что-то я не совсем понял ... те нужно из StringGrida перегнать значения в Table ? так??
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
  #5  
Старый 15.07.2008, 07:04
Аватар для XIO
XIO XIO вне форума
Новичок
 
Регистрация: 06.12.2007
Сообщения: 77
Репутация: 32
По умолчанию

Что-то вчера не мог зайти на форум вечером.
Я немного поковырялся с глюком. Выяснил фишку.
Сама функция работает верно, и возвращает значение из ячейки Excel в том виде, в каком положено.
Проверил таким сопособом:
Код:
...
Var
  NameValue: String;
...

      Cell1 := GetCellIndex(2,I+1);
      NameValue := ExcelApplication.Range[Cell1,Cell1].Value2;
      MainDM.HaveDuplicate.Parameters.ParamByName('Name').Value := NameValue;
...

Так вот, в переменную NameValue "помещается" нормальная, "Красивая" строка. Когда я это значение пытаюсь присвоить к параметру TDataSet, вместо строки получается непонятный набор символов который я постил в начале темы.

Тип параметра ftString (size:255). По идее все правильно, но возможно я чего-то незнаю. Возможно строку нужно каким-то образом конвертировать перед передачей в параметр....

2 Yurk@: Не совсем. Конечная цель: передав в TDateSet строку со значением из Excel файла, выполнить запрос, который отобразит все записи в которых имя совпадает с переданным значением, таким образом программа определит, есть в базе такое имя или нет.. Но это глобальная задача.
В данный момент, проблема при передачи строки в параметр TDataSet. Думаю....
__________________
"Люди никогда не видят то, существование чего им кажется невозможным." ©Терри Пратчетт
  #6  
Старый 15.07.2008, 09:24
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Может быть здесь ответ (из справки по ADO):
"Note: ParamByName operates with the name of a parameter as it appears in an SQL statement or stored procedure, not the Name property of a TParameter object. The two ways of referring to a parameter should not be confused."
Смысл в том, что имя, по которому происходит поиск (ParamByName) не имя самого параметра, а то имя параметра, которое записано в SQL выражении. Хотя они могут и совпадать, конечно. Может на поиск параметра влияет и регистрозависимость имени.

Еще. Вот здесь обсуждение похожей проблемы http://www.delphikingdom.com/asp/ans...IDAnswer=60935
__________________
Не забывайте делать резервные копии

Последний раз редактировалось san-46, 15.07.2008 в 09:47.
  #7  
Старый 15.07.2008, 16:35
Аватар для XIO
XIO XIO вне форума
Новичок
 
Регистрация: 06.12.2007
Сообщения: 77
Репутация: 32
По умолчанию

Как же порой сложно бывает заметить элементарную истину лежащую под ногами...

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

А собственно результат был неверным по причине того что спутал одно поле с другим при сравнении. Сравнивал имя директора с названием организации...

Прошу прощения за создаю тему, можно сказать наспех не проверив тщательно всех моментов...

И Большое спасибо за Помощь!
__________________
"Люди никогда не видят то, существование чего им кажется невозможным." ©Терри Пратчетт
Закрытая тема


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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