Передача Таблицы Значений в Delphi #588673


#0 by steep1
Здравствуйте, есть com_object на дельфи. подскажите как заполнить таблицу значений переданную из 1с в Delphi и вернуть обратно заполненную.
#1 by Dethmont
Разве в делфях есть такой тип Таблица значений?
#2 by Torquader
Интересно, а каким методом эта таблица значений попадает в Delphi, так как от метода попадания будет зависеть и способ заполнения.
#3 by steep1
передача через параметр ТаблицаЗначенийЗаполненная = comobject.GetTable(ТаблицаЗначенийПустая)
#4 by Torquader
То есть ты передаёшь стороннему OLE-объекту таблицу значений, а он получит "плохой тип переменной", так как таблицу ни во что преобразовать нельзя. Если же будет внешняя компонента, то она получить IDispatch от таблицы значений и стандартными методами сможет её заполнить.
#5 by steep1
ком объект не сторонний, а мой. Мне бы исходники или пример как работать с ТЗ в дельфи
#6 by Dethmont
А что array не покатит?
#7 by steep1
пробовал, но двухмерный массив нужен, а его передать нельзя насколько я понял.
#8 by Mashinist
Tab:=GetNParam(paParams,1); - из 1С передается таблица значений и она попадает в дельфи - второй параметр метода если считать от нуля... Error:=Error+IsValueTable(Tab); - IsValueTable - функция проверяющая действительно ли передали таблицу значений дальше выполним запрос и получим датасет          if Error=0 then          begin если все нормально - сконвертируем его в ТЗ ConvertDataSetToValueTable(q,Tab); - конфертирует DataSet - тут уже нужно смотреть что есть у кого - в таблицу значений { Переводим DataSet в таблицу значений } function TAddSQLObject.ConvertDataSetToValueTable(q: TDataSet; Tab: OleVariant): integer; var  if Err = 0 then      for i:=0 to q.FieldCount-1 do        f:=q.Fields[i];        if Ver1C = ver1cv8 then          Tab.Колонки.Добавить(f.FieldName)      if Ver1C = ver1cv8 then      begin        while not q.EOF do          Str:=Tab.Добавить;          for j:=0 to q.FieldCount-1 do              if f.DataType=ftFloat then                Str.Установить(j,StringReplace(s,',','.',[rfReplaceAll]))        while not q.EOF do          for j:=0 to q.FieldCount-1 do              if f.DataType=ftFloat then                Tab.УстановитьЗначение(i+1,j+1,StringReplace(s,',','.',[rfReplaceAll])) function TAddSQLObject.CallAsFunc(lMethodNum: Integer; var pVarRetValue: OleVariant; var paParams: PSafeArray{(OleVariant)}): HResult; stdcall; var .....................    methOpenQuery:        if sql.IsConnected then        begin          pStatusLine.SetStatusLine('Query is executing ...');          if Error=0 then            else if sql.ErrorFlag = 0 then  try    {если ошибка, считаем переменную не таблицей значений}    if Ver1C = ver1cv8 then      Tab.Колонки.Количество
#9 by steep1
можешь кинуть исходник?
#10 by Mashinist
так а я что выложил? это не мое. Автор Ганьшин Михаил (ganshin_m@mail.ru) у него есть AddSQL - библиотека прямого доступа к ORACLE для 1С:Предприятия 7.7/8.0 там как раз оно и возвращает ТЗ назад я у него этот код выпросил отдал своему программеру-дельфисту ему хватило ВК сделать, которая мне ТЗ возвращает и на 7.7. и на 8.1
#11 by steep1
Спасибо за наводку, я сам делаю, вот и задаю вопросы нубские
#12 by H A D G E H O G s
XDTO сериализацию используйте. Потом, в native api пригодится.
#13 by Torquader
Кстати, а в 1С можно передать двумерный массив из VbScript причём даже динамический (если описать свой Class), так что, есть мнение, что таблица - это лишнее.
#14 by steep1
не подходит, так как работает тока в 8.2 заморочек с Delphi уже много, вплетать VbScript уже лишнее с моей точки зрения.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С