|
COMObject | ☑ | ||
---|---|---|---|---|
0
MrSmola
25.10.12
✎
11:15
|
С COMObject столкнулся впервые. Что требуется
В 1с есть функция которая возвращает результат запроса в виде таблицы значений. Например: Функция ПолучитьТЗ() |
|||
1
rutony
25.10.12
✎
11:17
|
(0) Нипанятно нисего...
|
|||
2
Axel2009
25.10.12
✎
11:17
|
написать можно любую функцию..
|
|||
3
Wobland
25.10.12
✎
11:17
|
(0) так. теперь говори, что есть
|
|||
4
yuch
25.10.12
✎
11:18
|
Там можно практически все что угодно.
А чего тебе надо, нимпанятна... |
|||
5
1Страх
25.10.12
✎
11:18
|
(0) ставлю на слово "экспорт" и имя модуля
|
|||
6
Wobland
25.10.12
✎
11:19
|
телепатов тут много. телепатирую: не используй свои корявые функции, используй запрос ком-объекта
|
|||
7
rutony
25.10.12
✎
11:19
|
(5) Вот так взял и все карты на стол выложил =(
|
|||
8
Reset
25.10.12
✎
11:23
|
Наверное, ему COMобъект вернула функция и он не может его, запример, Загрузить()
|
|||
9
MrSmola
25.10.12
✎
11:25
|
Функция ПолучитьТЗ() Экспорт
Запрос = Новый Запрос; ... Результат = Запрос.Выполнить().Выгрузить(); Возврат Результат; КонецФункции; Делаю из "соседней" базы 1С: Ole1C = Новый COMObject("V82.COMConnector"); Ole1C2 = Ole1C.Connect("Srvr=1c:1741;Ref=База;Usr=Пользователь;Pwd=Пароль"); Result = Ole1C2.МойМодуль.ПолучитьТЗ(); Работает. Возвращает ТЗ как COM Делаю так (в Delphi): var Ole1C : OleVariant; Ole1C2 : OleVariant; begin Ole1C := CreateOleObject('V82.Application'); Ole1C2 := Ole1C.Connect('Srvr=1c:1741;Ref=База;Usr=Пользователь;Pwd=Пароль'); Result := Ole1C2.МойМодуль.ПолучитьТЗ(); end; Не работает. выдает ошибку [Record, object or class type required] Куда смотреть?( |
|||
10
Wobland
25.10.12
✎
11:26
|
а мы продолжаем серию игр "Что, почему и как". сегодняшняя команда знатоков борется против телезрителя MrSmola
итак, время вышло. кто будет отвечать? |
|||
11
Wobland
25.10.12
✎
11:27
|
итак, Reset объявляется победителем состязаний и получает в награду шапочку из фольги
|
|||
12
MrSmola
25.10.12
✎
11:27
|
(10) мне тут помощь нужна, а не поговорить
|
|||
13
1Сергей
25.10.12
✎
11:28
|
(9) ты думаешь в дельфях есть таблицы значений?
|
|||
14
1Страх
25.10.12
✎
11:29
|
а так?
Result := Ole1C2.МойМодуль.ПолучитьТЗ; |
|||
15
Reset
25.10.12
✎
11:29
|
Я не шарю в дельфях(разве на уровне турбо паскаля 8х г.в.), но разве переменная Result не должна была быть объявленной в секции var?
Хотя это так, "поговорить" |
|||
16
1Страх
25.10.12
✎
11:31
|
(15) это скорее всего тело функции, Result это предопределенная в контексте функции переменная - ее результат
|
|||
17
Reset
25.10.12
✎
11:32
|
(16) т.е. имя функции Result? дада что-то было такое
|
|||
18
Wobland
25.10.12
✎
11:32
|
соревнования продолжаются. телезритель уже телепатически передаёт знатокам второй вопрос
|
|||
19
1Страх
25.10.12
✎
11:33
|
(17) нет, имя другое
|
|||
20
Wobland
25.10.12
✎
11:33
|
(17) типа ретурн?
|
|||
21
1Страх
25.10.12
✎
11:34
|
||||
22
Wobland
25.10.12
✎
11:34
|
а отвечать на этот раз будет 1Сергей
|
|||
23
Reset
25.10.12
✎
11:34
|
хм ну ладно.
А может, раз это возвращаемое значение, то описана функция не с тем типом |
|||
24
Reset
25.10.12
✎
11:35
|
(21) Спасибо
|
|||
25
1Страх
25.10.12
✎
11:35
|
(23) возможно надо узнать, что делается с этим результатом дальше
|
|||
26
1Сергей
25.10.12
✎
11:36
|
Не поймёт Дельфя ТЗ. Возможно передавать только простые типы
|
|||
27
1Страх
25.10.12
✎
11:37
|
(26) да что ты говоришь, она поймет любой COM-объект
просто надо работать с ним правильно |
|||
28
Wobland
25.10.12
✎
11:37
|
ну что, 1:1?
|
|||
29
Wobland
25.10.12
✎
11:38
|
я вот тоже, как (27) задумался, что возвращается-то не ТЗ, а КОМ
|
|||
30
Wobland
25.10.12
✎
11:38
|
(29) ну.. подлежит возвращению
|
|||
31
MrSmola
25.10.12
✎
11:38
|
(14) а если надо параметры передать?
|
|||
32
1Страх
25.10.12
✎
11:39
|
(31) тогда со скобками, нет параметров - нет скобок
|
|||
33
Wobland
25.10.12
✎
11:40
|
меня смущает это "результат запроса в виде таблицы значений". не лучше ль взять и самостоятельно запросить?
|
|||
34
1Страх
25.10.12
✎
11:42
|
хотя насчет (14) могу врать, но попробовать стоит
|
|||
35
MrSmola
25.10.12
✎
11:43
|
вот что делается с Result^
procedure TShpScript.Make; var ResultTable : OleVariant; JvInterpreterProgram1: TJvInterpreterProgram; Row, Col : Integer; FieldsStr : String; InsField, InsVal : String; begin JvInterpreterProgram1 := TJvInterpreterProgram.Create(nil); try JvInterpreterProgram1.Pas.Text := InitParamInSQL((Collection as TShpScripts).Report.Params.ListOfParams, Text); JvInterpreterProgram1.Run; ResultTable := JvInterpreterProgram1.VResult; FieldsStr := ''; for Col := 0 to ResultTable.Columns.Count() - 1 do FieldsStr := FieldsStr + '"'+ResultTable.Columns.Get(Col).Name+'" VARCHAR2(2000), '; SetLength(FieldsStr, Length(FieldsStr) - 2); DropTable(OraDBName, TableName); RunSQL(OraDBName,'CREATE TABLE %s (%s) %s',[TableName, FieldsStr, TableSpace4CreateTMPTables]); // Заполняем DataSet for Row := 0 to ResultTable.Count() - 1 do begin InsField := ''; InsVal := ''; for Col := 0 to ResultTable.Columns.Count() - 1 do begin if not VarIsType(ResultTable.Get(Row).Get(Col),varDispatch) then begin InsField := InsField + '"'+ResultTable.Columns.Get(Col).Name+'", '; InsVal := InsVal + ''''+ VarToStr(ResultTable.Get(Row).Get(Col))+''', '; end; end; SetLength(InsField, Length(InsField) - 2); SetLength(InsVal, Length(InsVal) - 2); RunSQL(OraDBName,'insert into %s (%s) values (%s)',[TableName,InsField, InsVal]); end; finally JvInterpreterProgram1.Free; end; end; |
|||
36
1Сергей
25.10.12
✎
11:44
|
(35) И какой тип у ResultTable?
|
|||
37
MrSmola
25.10.12
✎
11:46
|
здесь выполняется часть скрипта описанного ранее:
JvInterpreterProgram1.Pas.Text := InitParamInSQL((Collection as TShpScripts).Report.Params.ListOfParams, Text); JvInterpreterProgram1.Run; в том скрипте есть переменная Result которой присваевается результат скрипта (т.е. ком объект) строчку- ResultTable := JvInterpreterProgram1.VResult; можно рассматривать как: ResultTable := Result; |
|||
38
MrSmola
25.10.12
✎
11:47
|
(36) ResultTable := ---это COM
|
|||
39
1Страх
25.10.12
✎
11:48
|
так ошибка то в какой строке?
|
|||
40
MrSmola
25.10.12
✎
11:49
|
(39) JvInterpreterProgram1.Run;
|
|||
41
1Страх
25.10.12
✎
11:50
|
(40) может твой интерпретатор не умеет работать с COM-объектами?
Если этот код всунуть непосредственно в код Delphi? |
|||
42
MrSmola
25.10.12
✎
11:50
|
Скажу что обработка КОМа работет - проверено, не работает вот эта часть
var Ole1C : OleVariant; Ole1C2 : OleVariant; begin Ole1C := CreateOleObject('V82.Application'); Ole1C2 := Ole1C.Connect('Srvr=1c:1741;Ref=База;Usr=Пользователь;Pwd=Пароль'); Result := Ole1C2.МойМодуль.ПолучитьТЗ(); end; |
|||
43
MrSmola
25.10.12
✎
11:52
|
СОМ не хочет работать именно с моей функцией Result := Ole1C2.МойМодуль.ПолучитьТЗ();
|
|||
44
1Страх
25.10.12
✎
11:53
|
(43) так ты (14) пробовал?
|
|||
45
MrSmola
25.10.12
✎
11:55
|
(44) а как мне тогда параметры передать в мою функцию?
|
|||
46
1Страх
25.10.12
✎
11:56
|
(45) у тебя же их нет или ты как всегда не договариваешь?
|
|||
47
MrSmola
25.10.12
✎
11:58
|
(46) решил не перегружать подробностями. Да, мне надо ещё передать параметры.
|
|||
48
1Страх
25.10.12
✎
12:00
|
(47) какие параметры? интересно: не договарить как раз строку в которой ошибка
|
|||
49
1Сергей
25.10.12
✎
13:42
|
(47) параметры, поди, ещё агрегатные?
|
|||
50
oleg_km
25.10.12
✎
13:42
|
(43) А эта конструкция вообще дельфями компилируется? Насколько я понимаю, ты хочешь использовать раннее связывание, но для этого нужно импортнуть в проект библиотеку типов. Мне кажется в данном случае нужно использовать позднее связывание что-то типа:
HRESULT hRes; CLSID ClsID; hRes = CLSIDFromProgID(cProgID, &ClsID); if (!CheckError(hRes, TEXT("CLSIDFromProgID"))) return false; hRes = CoCreateInstance(ClsID, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, Это на VC++ |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |