Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с вызовом хранимки из 1С  (Прочитано 14528 раз)
0 Пользователей и 1 Гость смотрят эту тему.
fire_anngel
Интересующийся

ru
Offline Offline

« : 27-12-2013 11:34 » 

Доброго времени суток! У меня возникла проблема загрузки данных из БД (FireBird) в 1С 7. А точнее, если в 1С писать прямой запрос к БД, то данные получаю, а вот если нужно получить данные из хранимой процедуры - траблы. С 1С работаю мало, опыта нет. Может кто подскажет...

Хранимка SERT_SELL_FOR_1C имеет 2 входных параметра типа TIMESTAMP и 2 выходных параметра типа Integer.
Код: (1C v8)
 Соединение = СоздатьОбъект("ADODB.Connection");
 ADOConnectionString =  "Provider=LCPI.IBProvider.1;Persist Security Info=False;User ID=UserId;Password=password;";
 ADOConnectionString =  ADOConnectionString+"Data Source="+ПутьКБД;
 Соединение.ConnectionTimeOut =600;
 Соединение.CursorLocation = 3;
 try    
    Соединение.Open(ADOConnectionString);  
 except    
    Предупреждение("Невозможно установить соединение с бд "+ПутьКБД);
    Возврат;
 endtry;  


 Command = СоздатьОбъект("ADODB.Command");
 RecordSet = СоздатьОбъект("ADODB.RecordSet");

 Command.ActiveConnection = Соединение;
 Command.CommandText = "SERT_SELL_FOR_1C"; // хранимая процедура

 Command.CommandType = 8;

// НачДата и КонДата - входные параметры, задаются пользователем в диалоговом окне

 Param1 = Command.CreateParameter("ABD", 7, 1, 4, НачДата);
 Command.Parameters.Append(Param1);

 Param2 = Command.CreateParameter("AED", 7, 1, 4, КонДАта);
 Command.Parameters.Append(Param2);

 RecordSet = Command.Execute();

 Пока RecordSet.EOF() = 0 Цикл
        // ИдСклада и Сумма - выходные параметры процедуры
        ИдСклада = СуммаПродаж.Fields("DEPID").Value;
        Сумма = СуммаПродаж.Fields("COST").Value;
..............
        RecordSet.MoveNext();
 КонецЦикла;


 Соединение.CommitTrans();
 Соединение.Close();
В итоге выдает ошибку:
Bind parameter errors:
  • :[code:0x80040E55]Bad IN-parameter ordinal:1 - range [1..0]
  • [1]:
[code:0x80040E55]Bad IN-parameter ordinal:2 - range [1..0]

Я так понимаю, проблема в неверном определении входных параметров. Но как задать их ума не приложу Здесь была моя ладья...
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 27-12-2013 19:51 » 

К 1С это, к сожалению, отношения не имеет - это ошибка, возвращаемая драйвером FireBird при работе через ADO.
Варианты решения:
1. Сменить драйвер
2. Искать на сайтах по FireBird
3. (Изврат) работать через какую-то прокладку, например, через WSH (jscript/vbscript)
Записан
fire_anngel
Интересующийся

ru
Offline Offline

« Ответ #2 : 30-12-2013 06:27 » 

Продолжая эксперементировать,  изменила способ определения входных параметров хранимой процедуры:
Код: (1C v8)

 Command = СоздатьОбъект("ADODB.Command");
 RecordSet = СоздатьОбъект("ADODB.RecordSet");

 Command.ActiveConnection = Соединение;
 SQL = "exec  SERT_SELL_FOR_1C "+"'"+НачДата+"','"+ КонДата + "'";
 Command.CommandText = SQL;
 Command.CommandType = 8;

// НачДата и КонДата - входные параметры, задаются пользователем в диалоговом окне

 RecordSet = Command.Execute();  

 Пока RecordSet.State=0 цикл
          RecordSet = RecordSet.NextRecordset;
 КонецЦикла;

 Пока RecordSet.EOF=0 Цикл     
        // ИдСклада и Сумма - выходные параметры процедуры
        ИдСклада = СуммаПродаж.Fields("DEPID").Value;
        Сумма = СуммаПродаж.Fields("COST").Value;

        RecordSet.MoveNext();
 КонецЦикла;
   Соединение.CommitTrans();
КонецПроцедуры
Теперь выдает ошибку:
ADODB.Recordset: Текущий проводник не поддерживает возврат нескольких наборов записей в результате одной операции.
Записан
fire_anngel
Интересующийся

ru
Offline Offline

« Ответ #3 : 09-01-2014 08:14 » 

Мучаюсь дальше над своей проблемой....
Извратилась над кодом: расписала всю хранимку на отдельные запросы из 1С по циклам:
Все работает, но очень медленно....
Я так понимаю 1С просто не хочет работать с хранимыми процедурами.
Подскажите, кто может, как решить проблему!!!
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 09-01-2014 12:56 » 

Вот интересно - а какому из моих советов ты последовала? Ага

Если я правильно понял твой предпоследний пост - у тебя возвращается из хранимой процедуры несколько наборов? Попробуй не возвращать ничего: запиши результаты во временные таблицы и после вызова хранимой процедуры выбирай данные select-ами из временных таблиц
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines