![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Имеется модуль. Исходник тут.
Использовал для импорта из 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;В новой версии мне необходимо это же казалось бы значение передать в параметр 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;
|
|
#2
|
||||
|
||||
|
Может надо просто так написать:
Код:
MainDM.HaveDuplicate.Parameters.ParamByName('Name').AsString := ExcelApplication.Range[Cell1,Cell1].Value2; |
|
#3
|
||||
|
||||
|
Попробовал, к сожалению трюк не проходит.
Ошибка: Код:
[Error] ExcelToolsDM.pas(243): Undeclared identifier: 'AsString' |
|
#4
|
||||
|
||||
|
Что-то я не совсем понял ... те нужно из StringGrida перегнать значения в Table ? так??
|
|
#5
|
||||
|
||||
|
Что-то вчера не мог зайти на форум вечером.
Я немного поковырялся с глюком. Выяснил фишку. Сама функция работает верно, и возвращает значение из ячейки 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
|
|||
|
|||
|
Может быть здесь ответ (из справки по 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
|
||||
|
||||
|
Как же порой сложно бывает заметить элементарную истину лежащую под ногами...
В общем, в отладчике я вижу каракули потому что свойство параметра Direction по умолчанию стоит ??Input, ну то бишь, только ввод значений, доки не читал, но по логике вещей так и есть. А собственно результат был неверным по причине того что спутал одно поле с другим при сравнении. Сравнивал имя директора с названием организации... Прошу прощения за создаю тему, можно сказать наспех не проверив тщательно всех моментов... И Большое спасибо за Помощь! |