форум поддержки VSGroup
http://forum.vsgroup.ua/

Связь программы с учетными системами
http://forum.vsgroup.ua/viewtopic.php?f=60&t=6246
Страница 1 из 1

Автор:  Николай@VSGroup [ 27 дек 2013, 15:04 ]
Заголовок сообщения:  Связь программы с учетными системами

Для связи нашей программы с учетными системами рекомендуем брать данные напрямую из нашей базы данных.
Структура базы данных:
Вложение:
СтруктураЗаказа.xls [17 КБ]
Скачиваний: 66

Как сделать выборку по заказу:

1. Найти соответствующий заказ в таблицу offers
например select * from offfers where znotext = "123-24"

2. Найти все позиции заказа
например select * from constructions where pid = [offers.id]

3. Получить спецификацию заказа
select * from calcrep where pid = [constructions.id]

Выполнить запрос можно подключившись к базе напрямую (например http://www.google.com.ua/search?q=firebird+1c) или выполнить запрос через OLE объект программы.

Пример как выполнить запрос через OLE:

1. Создание COM объекта и запуск программы:

Код:

Процедура ЗапуститьПрограммуWinCalc
   
   Попытка
      // проверка активного Оле соединения
      ПрограммаРасчетаСтартована=OLEСоединениеWinCalc.Started(); // вызов любого метода программы для проверки
   Исключение
      ПрограммаРасчетаСтартована = Ложь;
   КонецПопытки;
   
   WCObject="wincalc.wincalcsrv";
   
   Если НЕ ПрограммаРасчетаСтартована Тогда
      Попытка
         // создание COM объекта
         OLEСоединение       = Новый COMОбъект(WCObject);
         OLEСоединениеWinCalc = Новый COMОбъект(WCObject);
         
         // установка пользователя и пароля
         OLEСоединениеWinCalc.SetLoginData("Пользователь","Пароль");
         
         // строка подключения сервер
         OLEСоединениеWinCalc.SetServerName(Константы.спкОПСервер.Получить());
         
      Исключение
         Предупреждение("Не возможно создать объект оконной программы. "+ИнформацияОбОшибке().Описание, 10, "Оконная программа");
         Возврат;
      КонецПопытки;
      
      OLEСоединениеWinCalc = Неопределено;
   КонецЕсли;
   
   // запуск программы
   OLEСоединениеWinCalc.Start();
   
   // ожидание запуска программы
   Пока НЕ OLEСоединениеWinCalc.Started() Цикл
      OLEСоединениеWinCalc.Wait(100);
   КонецЦикла;
   
конецпроцедуры;      


2. Выполнение запросы:

Код:

   // выполнение запроса в базу wcoffers.fdb
   // Результат - ComSafeArray
   // 1 элемент равен 0 если запрос не удался, 1 если все ок
   // 2 элемент равен количеству строк в результате запроса
   // 3 элемент - ComfaseArray срок результата, каждый также является ComSafeArray, каждый элемент которого является значением колонки в выборке.
   Запрос = OLEСоединениеWinCalc.ExecQueryO(" select ID, ZSUM from constructions where pid = 3 ");
   
   // если запрос выполнен
   если Запрос.getValue(1) = 1 тогда
      
      // получим массив записей
      Записи = Запрос.GetValue(3);
      
      // цикл по количеству записей
      КоличествоЗаписей = Запрос.GetValue(2);   
      для й = 1 по КоличествоЗаписей цикл
         
         // поулчим й-ую запись
         Запись = Записи.GetValue(й);
         
         // 1 поле текущей записи
         сообщить(Запись.getValue(1)); // ID
         // 2 поле текущей записи
         сообщить(Запись.getValue(2)); // ZSUM
         
      конеццикла;
      
   конецесли;


3. Чтобы выполнить запрос к базе wcglobal.fdb нужно использовать функцию ExecQueryG

4. Вот функция, которая преобразовывает результат функции ExecQuery в ТаблицуЗначений:
Код:
функция ЗапросВинКалкВТаблицуЗначений(ЗапросВинКалк) Экспорт
   
   Если ЗапросВинКалк.GetValue(1) = 1 тогда
      
      ТЗ = Новый ТаблицаЗначений;
      
      для й = 1 по ЗапросВинКалк.GetValue(3).GetValue(0).GetUpperBound() цикл
         ТЗ.Колонки.Добавить(ЗапросВинКалк.GetValue(3).GetValue(0).GetValue(й));
      КонецЦикла;
      
      для ц = 1 по ЗапросВинКалк.GetValue(2) цикл
         
         Строка = ТЗ.Добавить();
         для й = 1 по ЗапросВинКалк.GetValue(3).GetValue(0).GetUpperBound() цикл
            Строка[й - 1] = ЗапросВинКалк.GetValue(3).GetValue(ц).GetValue(й);
         КонецЦикла;
         
      КонецЦикла;
      
      возврат ТЗ;
      
   иначе
      возврат Неопределено;
   конецесли;
   
конецфункции

Автор:  Деркач Женя [ 27 дек 2013, 15:44 ]
Заголовок сообщения:  Re: Связь программы с учетными системами

В запросе - Запрос = OLEСоединениеWinCalc.ExecQueryO(" select ID, ZSUM from constructions where pid = 3 "); как задать номер заказа, что такое ZSUM?

Автор:  Николай@VSGroup [ 27 дек 2013, 15:51 ]
Заголовок сообщения:  Re: Связь программы с учетными системами

Деркач Женя писал(а):
как задать номер заказа


Код:
select constructions.* from constructions, offers where constructions.pid = offers.id and offers.znotext = "123-45"


Деркач Женя писал(а):
что такое ZSUM?


описание полей таблицы constructions можно глянуть в файле который приложил в первом сообщении

Автор:  Деркач Женя [ 27 дек 2013, 17:40 ]
Заголовок сообщения:  Re: Связь программы с учетными системами

Что такое в запросе - where pid = 3

Автор:  Деркач Женя [ 27 дек 2013, 17:41 ]
Заголовок сообщения:  Re: Связь программы с учетными системами

Я имею в виду что такое - 3

Автор:  Деркач Женя [ 27 дек 2013, 17:46 ]
Заголовок сообщения:  Re: Связь программы с учетными системами

как воткнутся в таблицу wcoffers.constructions по конкретному номеру заказа?

Автор:  Деркач Женя [ 27 дек 2013, 18:13 ]
Заголовок сообщения:  Re: Связь программы с учетными системами

Те примеры запросов которые вы написали на форуме не работают в конфигурации , выдает ошибку -

{Документ.ЗаказПокупателя.Форма.ФормаДокумента.Форма(3152)}: Ошибка при вызове метода контекста (ExecQueryO)
Запрос = OLEСоединение.ExecQueryO(" select ID, ZSUM from constructions where pid = 3 ");
по причине:
Произошла исключительная ситуация (wincalc.WinCalcSRV): use Open for a Select Statement

Автор:  Николай@VSGroup [ 27 дек 2013, 21:05 ]
Заголовок сообщения:  Re: Связь программы с учетными системами

Деркач Женя писал(а):
как воткнутся в таблицу wcoffers.constructions по конкретному номеру заказа?


select constructions.* from constructions, offers where constructions.pid = offers.id and offers.notext = "[НомерЗаказа]"

Деркач Женя писал(а):
Те примеры запросов которые вы написали на форуме не работают в конфигурации , выдает ошибку -

{Документ.ЗаказПокупателя.Форма.ФормаДокумента.Форма(3152)}: Ошибка при вызове метода контекста (ExecQueryO)
Запрос = OLEСоединение.ExecQueryO(" select ID, ZSUM from constructions where pid = 3 ");
по причине:
Произошла исключительная ситуация (wincalc.WinCalcSRV): use Open for a Select Statement


уберите первый пробел в строке запроса, т.е.
Запрос = OLEСоединение.ExecQueryO("select ID, ZSUM from constructions where pid = 3 ");

ошибку в программе исправил в 22 сборке

P.S. В первое сообщение добавил функцию преобразования запроса WinCalc в ТаблицуЗначений

Страница 1 из 1 Часовой пояс: UTC + 2 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/