![]() |
|
|
Регистрация | << Правила форума >> | 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; Хорошо написанная программа не требует документации ICQ 9-184-668. |
#3
|
||||
|
||||
![]() Попробовал, к сожалению трюк не проходит.
Ошибка: Код:
[Error] ExcelToolsDM.pas(243): Undeclared identifier: 'AsString' "Люди никогда не видят то, существование чего им кажется невозможным." ©Терри Пратчетт |
#4
|
||||
|
||||
![]() Что-то я не совсем понял ... те нужно из StringGrida перегнать значения в Table ? так??
Поживу - увижу, Доживу - узнаю, Выживу - учту. ![]() [P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
|
#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, ну то бишь, только ввод значений, доки не читал, но по логике вещей так и есть. А собственно результат был неверным по причине того что спутал одно поле с другим при сравнении. Сравнивал имя директора с названием организации... Прошу прощения за создаю тему, можно сказать наспех не проверив тщательно всех моментов... И Большое спасибо за Помощь! "Люди никогда не видят то, существование чего им кажется невозможным." ©Терри Пратчетт |