Имя: Пароль:
1C
 
Как получить имя и тип параметра в запросе?
0 Волков Денис
 
01.10.10
13:28
Здравствуйте.

Не могу понять, как получить имя и тип параметра в запросе. Существую функция НайтиПараметры, как можно из нее вытащить сведения о параметре?

Подскажите, пожалуйста.
1 Живой Ископаемый
 
01.10.10
13:31
что сделать нужно скажи лучше
2 чувак
 
01.10.10
13:34
я тоже не понял
3 Волков Денис
 
01.10.10
13:37
Есть Запрос вида:
Запрос = ВЫБРАТЬ
    Банки.Наименование,
    Банки.Город,
    Банки.Адрес ИЗ Справочник.Банки КАК Банки
ГДЕ
    Банки.Город = &Город

Необходимо получить имя параметра(Город в данном случае) и его тип, чтобы дальше присвоить ему значение.
Запрос.НайтиПараметры
...
Как то вытащить имя параметра
...
Запрос.УстановитьПараметр(Город, Москва)

Пишется класс на делфи для работы с запросами в 1С.
4 Дарт Вейдер
 
01.10.10
13:38
Для каждого Параметр из Запрос.НайтиПараметры() цикл
....

КонецЦикла
5 Дарт Вейдер
 
01.10.10
13:39
(4) соотвественно в цикле
Параметр.Имя                - имя
Параметр.ТипЗначения        - тип
6 Волков Денис
 
01.10.10
13:40
Для каждого Параметр из Запрос.НайтиПараметры() цикл
....

КонецЦикла

А в Делфи это никак((
7 Дарт Вейдер
 
01.10.10
13:41
в дельфи можно тупо пропарсить текст запроса
параметры начинаются с "&"
найдешь имена

тип - хз
8 Волков Денис
 
01.10.10
13:42
в дельфи можно тупо пропарсить текст запроса
параметры начинаются с "&"

Не не катит... синтаксис языка запросов 1С не стандартизован тильда может измениться и потом заново класс этот разрабатывать?
9 Дарт Вейдер
 
01.10.10
13:43
(8) ты пошутил что-ли?
10 sash-ml
 
01.10.10
13:44
(6) почему никак?
11 Волков Денис
 
01.10.10
13:44
В смысле?
12 Волков Денис
 
01.10.10
13:46
(10) А как?
13 Дарт Вейдер
 
01.10.10
13:47
что ты передаешь в дельфи вообще?
14 Evg-lylyk
 
01.10.10
13:48
Парсить это проблемно. Метод НайтиПараметры автоматом определяет типы (если нужны типы тогда парсить весь запрос).
15 Волков Денис
 
01.10.10
13:51
В делфи такая конструкция:

Ole1C := CreateOleObject(Edit1.Text);
Resopen := Ole1C.Connect(Edit2.Text);
query := Ole1C.NewObject('Запрос');
query.Text:='ВЫБРАТЬ Банки.Наименование, Банки.Город, Банки.Адрес ИЗ Справочник.Банки КАК Банки ГДЕ Банки.Город = &Город';
vv := query.FindParameters;

А вот как дальше вытаскивать имена и типы я не знаю...
В класс должен приходить текст запроса, он его обрабатывает, выводить список параметров и просить подставить значения к ним, дальше выполнить этот запрос и вернуть результат.
16 Дарт Вейдер
 
01.10.10
13:53
попробуй

vv.Name
vv.ValueType
17 sash-ml
 
01.10.10
13:53
for each p from vv do begin
p.name;
p.ValueType;
end;
18 Волков Денис
 
01.10.10
13:56
(1:) пробовал... не помогло
(17) p какого типа? Variant?
19 Дарт Вейдер
 
01.10.10
13:56
(16)
for i:=1 to vv.Count do
begin
 p:=vv[i];
 p.Name;
 p.ValueType;
end;
20 sash-ml
 
01.10.10
13:58
(18) у тебя отладчик в делфях украли? или табло поломалось?
21 Дарт Вейдер
 
01.10.10
13:58
(18) попробуй vv[i].Name
чтобы с типами переменных не париться
22 Волков Денис
 
01.10.10
14:01
vv[i] - не работает пробовал. Ошибка: Variant не является массивом.
23 Дарт Вейдер
 
01.10.10
14:09
(22) а какое значение вообще в vv возвращается после
vv := query.FindParameters;
?
24 Волков Денис
 
01.10.10
14:13
(23) Возвращается указатель на ячейку
25 Волков Денис
 
01.10.10
14:15
с vv работает:
vv.Count и vv.Find
А вот как оттуда имя достать...
Есть еще идеи???
Уже который день с этим мучаюсь...
26 sash-ml
 
01.10.10
14:20
Имена можно выпарсить по "&"
27 Волков Денис
 
01.10.10
14:22
(26) Можно, но этот метод не подходит...(((
28 Волков Денис
 
01.10.10
14:25
У типа возвращаемого функцией НайтиПараметры есть свойство <Имя параметра> к нему можно как-то обратиться?
29 МихаилМ
 
01.10.10
14:28
(28)
нет.
мучайтесь до просветления, коли парсинг запрещает религия.
30 Дарт Вейдер
 
01.10.10
14:29
(28) НайтиПараметры возвращает список параметров
тебе нужно выбрать элементы списка, тогда Элемент.<ИмяПараметра>
31 Дарт Вейдер
 
01.10.10
14:29
лучше домучай vv, ты на правильном пути
что вернет VarType(vv) ?
32 Волков Денис
 
01.10.10
14:30
(29) т.е. это вообще невозможно сделать?

Тогда у меня еще есть вопросик. Обрабатываю результаты запроса в следующем виде
 for i := 0 to ColCount - 1 do ArrRes[i,0] := OLEQueryRes.Columns.Get(i).Name;

 i := 0;
 while i < ColCount do
 begin
   OLEDataColumns := OLEQueryRes.UnloadColumn(i);
   j := 1;
   while j < OLEDataColumns.UBound do
   begin
     StrTmp := OLEDataColumns.Get(j - 1);
     if StrTmp <> NULL then ArrRes[i, j] := StrTmp
     else ArrRes[i, j] := '';
     inc(j);
   end;
   inc(i);
 end;


Работает достаточно долго, не подскажите почему?
33 Волков Денис
 
01.10.10
14:37
(31) Вернула NULL
34 hhhh
 
01.10.10
14:59
(33) может vv.items? или vv.item? Ты ведь на Дельфи программируешь, должен в этом разбираться.
35 Волков Денис
 
01.10.10
15:12
(34) Вообще с делфи я начинал потом перешел на PHP а потом вообще достаточно долго ничего не кодил...((( Поэтому сейчас сижу и вспоминаю... + 1С изучаю.)))
Щас попробую
36 Волков Денис
 
01.10.10
15:16
(33) Неа не работает...
37 Дарт Вейдер
 
01.10.10
16:08
(36) в общем не получится так получить параметры.. смирись
либо парсить запрос, либо..

есть еще один вариант решения, но не универсальный..
требует внесения изменений в конфигурацию 1С
38 Волков Денис
 
01.10.10
16:37
(37) не в конфигурацию вносить изменения не надо. Ну чтож ладно буду парсить, раз другого решения нет...

Тогда у меня другой вопрос: Как в выборке переходить на следующую строку?
Choose := Query.Execute.Choose;
for i:=0 Choose.count - 1 do
Choose.get(i); //проходит по столбцам а дальше пишет выход за область данных

Пробовал через Выгрузить, но там получается что-то долго все это происходит...
39 Волков Денис
 
01.10.10
16:38
Спасибо Всем!)))
40 Дарт Вейдер
 
01.10.10
16:46
while Choose.Next do
 Value = Choose.<ИмяПеременнойЗапроса>;
end;

а вообще посмотри как в 1С с запросами работают,
там все то же самое будет