AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.12.2004, 12:05   #1  
LSA is offline
LSA
Участник
 
4 / 10 (1) +
Регистрация: 23.12.2004
? Как вызвать через ADO хранимую процедуру с параметрами ?
Задача такая - нужно из таблиц аксапты экспортировать данные на SQL.....
( Так что для любителей все делать средствами аксапты для обеспечения целостности сразу скажу что ничего не пострадает... ;-) )
Написана хранимая процедура экспорта которая нормально работает - например такая -
CREATE PROCEDURE [dbo].[axExp] @Res_ TINYINT OUTPUT AS.... и т. д.

Нужно запустить процедуру из аксапты передав ей параметр и получить значение этого параметра после выполнения....

ПОмогите плиз....
Старый 23.12.2004, 12:31   #2  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Про Oracle я писал здесь (http://www.axforum.info/forums/showt...E5%E4%F3%F0%E0).
Переделайте под MS SQL.

Цитата:
Задача такая - нужно из таблиц аксапты экспортировать данные на SQL.....
А DTS не смотрели ?
Старый 23.12.2004, 12:31   #3  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Я делал так.
В моем примере хранимая процедура принимает один параметр - дату
PHP код:
    CCADOConnection cn;
    
COM                           comCN;
    
str     serverName      "myServer";
    
str     baseName        "myDatabase";
    
str     userId          "sa";
    
str     userPassword    "1";
    ;

    
cn = new CCADOConnection();
    
cn.open(
        
"Provider=SQLOLEDB;"+
        
"Data Source="      serverName    +   ";" +
        
"Initial Catalog="  baseName      +   ";" +
        
"uid="              userId        +   ";" +
        
"pwd="              userPassword);

    
comCN cn.connection();
    
comCN.Execute("set dateformat dmy exec myStoredProcedure '" date2str(systemDateGet(),123,2,2,2,2,2) + "'"); 
Я правда не получал назад значение из параметра. Для этого надо использовать COM-объект ADO::Command

Старый 23.12.2004, 12:39   #4  
LSA is offline
LSA
Участник
 
4 / 10 (1) +
Регистрация: 23.12.2004
В том-то и дело что у CCADOComand нет такой хорошей и полезной вещи как ADOParameter....
Как же с его помошью вернуть значение ? Помогите начинающему аксаптеру....
Старый 23.12.2004, 12:43   #5  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Я ближе к вечеру Вам напишу. Сейчас некогда. А вообще - если Вы умеете работать с ADO на VB или Delphi - очень просто переписать этот код в Аксапту. Та же последовательность действий при инициализации объектов.
Старый 23.12.2004, 13:05   #6  
LSA is offline
LSA
Участник
 
4 / 10 (1) +
Регистрация: 23.12.2004
?
Очень жду ответа....
А Delphi проблем набыло - но там в ADO компонентах реализованы и методы и "пропитисы"..... Здесь непоняытно - стандартных нет - надо описывать свой класс ?
Каскадные обращения не прокатили... или делал что-то не так....
Старый 23.12.2004, 13:54   #7  
simply2double is offline
simply2double
Участник
Аватар для simply2double
 
556 / 19 (2) ++
Регистрация: 08.09.2004
Адрес: alfa cen
Цитата:
Изначально опубликовано LSA
Очень жду ответа....
А Delphi проблем набыло - но там в ADO компонентах реализованы и методы и "пропитисы".....
хе-хе... ADO как технология доступа к данным проектировалась для VB... вот там надо и смотреть как с этим работает правильно...

если в двух словах то объектная модель ADO состоит из объектов

коннект
комманд
параметерс
еррорс

с коннектом понятно, ониинициализируется строкой подключения и устанавливает соединение с сервером

с команд тоже, он инициализируется командой и ее типом, в Вашем случае это хранимая процедура.

параметерс, это колекция параметров каждый из которых инициализируется значением параметра, его типом и свойством возвращаемы или нет

еррорс это коллекция ошибок, которую по правилам хорошего тона перед каждым шагом обнуляют а после читают на предмет ошибок

сценарий доступа к данным в общем такой:

- инициализировать объект коннект и подключиться к серверу
- инициализировать обект комманд командой (именем SP)
- инициализировать коллекцию параметерс
- добавить параметер (по числу парметров SP )
- иниализировать параметры
- выполнить команду
- прочитать возвращенное значение переметра
- закрыть соединение

Каджый объект создается на основании интерфейса ком сервера ADO...
по другому возвратить параметры нельзя. Можно правда запускать запускать процедуру еще одной поцедурой-оболочкой, которая будет возращать значение в возвращаемом курсоре, но это криво и не красиво..
Старый 23.12.2004, 13:56   #8  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Готово!
Вот такая хранимая процедура:
PHP код:
DROP PROCEDURE [dbo].[axExp]
GO
CREATE PROCEDURE 
[dbo].[axExp] @Res_ TINYINT OUTPUT AS
BEGIN
    SET 
@Res_22
END 

Вот такой код в Аксапте вызывает эту процедуру и передает/получает из нее значение параметра:
PHP код:

static void DD_StoredProcWithParam(Args _args)
{
    
str     serverName      "AXAPTA-SQL";
    
str     baseName        "AXDB";
    
str     userId          "sa";
    
str     userPassword    "";
    
CCADOConnection         cn;
    
COM                     comCN;
    
COM                     cmd;
    
COM                     paramparams;
    
COMVariant              emptyParam;
    
COMVariant              result;
    ;

    
cn = new CCADOConnection();
    
cn.open(
        
"Provider=SQLOLEDB;"+
        
"Data Source="      serverName    +   ";" +
        
"Initial Catalog="  baseName      +   ";" +
        
"uid="              userId        +   ";" +
        
"pwd="              userPassword);

    
comCN cn.connection();

    
cmd     = new COM("ADODB.Command");
    
param   = new COM("ADODB.Parameter");
    
cmd.activeConnection(comCN);
    
param.Type(16);      //adTinyInt, смотрите броузер объектов в среде VB в Экселе
    
param.Value(55);     //передаем в процедуру число 55
    
param.Name("@Res_"); //для Оракла обязательно передавать имя параметра
    
param.direction(3);  //adParamInputOutput, смотрите броузер объектов в среде VB в Экселе
    
params cmd.Parameters();
    
params.append(param);
    
cmd.commandType(4);  //adCmdStoredProc, смотрите броузер объектов в среде VB в Экселе
    
cmd.CommandText("axExp");
    
emptyParam = new COMVariant(COMVariantInOut::OutCOMVariantType::VT_INT);
    
cmd.Execute (emptyParamparams);
    
result param.Value();
    
info(int2str(result.byte()));
    
cn.close();

Старый 23.12.2004, 14:02   #9  
simply2double is offline
simply2double
Участник
Аватар для simply2double
 
556 / 19 (2) ++
Регистрация: 08.09.2004
Адрес: alfa cen
Цитата:
Изначально опубликовано LSA
В том-то и дело что у CCADOComand нет такой хорошей и полезной вещи как ADOParameter....
Как же с его помошью вернуть значение ? Помогите начинающему аксаптеру....
Его там и не может быть. Потому что Parameters это еще один COM интерфейс который нужно объявлять отдельно, а класс CCADOComand инкапсулирует всего один интерфейс - Command.
Старый 23.12.2004, 16:41   #10  
LSA is offline
LSA
Участник
 
4 / 10 (1) +
Регистрация: 23.12.2004
Спасибо большое ! Все получилось !!!
Во только работает крайне медленно...
Существует ли способ ускорить ?
Старый 23.12.2004, 17:37   #11  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
А Вы код приведите. Должно все бысто работать. Судя по трасссировке в SQL Profiler, Аксапта сама через ADO или OLEDB с SQL-сервером работает.

Старый 23.12.2004, 17:49   #12  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Вот такой код у меня работает 6 секунд:
PHP код:

static void DD_StoredProcWithParam(Args _args)
{
    
str     serverName      "AXAPTA-SQL";
    
str     baseName        "AXDB";
    
str     userId          "sa";
    
str     userPassword    "";
    
CCADOConnection         cn;
    
COM                     comCN;
    
COM                     cmd;
    
COM                     paramparams;
    
COMVariant              emptyParam;
    
COMVariant              result;
    
int                     i;
    ;

    
cn = new CCADOConnection();
    
cn.open(
        
"Provider=SQLOLEDB;"+
        
"Data Source="      serverName    +   ";" +
        
"Initial Catalog="  baseName      +   ";" +
        
"uid="              userId        +   ";" +
        
"pwd="              userPassword);

    
comCN cn.connection();

    
cmd     = new COM("ADODB.Command");
    
param   = new COM("ADODB.Parameter");
    
params cmd.Parameters();
    
param.Type(16);      //adTinyInt, смотрите броузер объектов в среде VB в Экселе
    
param.Name("@Res_"); //для Оракла обязательно передавать имя параметра
    
param.direction(3);  //adParamInputOutput, смотрите броузер объектов в среде VB в Экселе
    
params.append(param);
    
cmd.activeConnection(comCN);
    
cmd.commandType(4);  //adCmdStoredProc, смотрите броузер объектов в среде VB в Экселе
    
cmd.CommandText("axExp");
    
emptyParam = new COMVariant(COMVariantInOut::OutCOMVariantType::VT_INT);
    for (
i=;i<1000i++)
    {
        
param.Value(55);     //передаем в процедуру число 55
        
cmd.Execute (emptyParamparams);
        
result param.Value();
        
info(int2str(result.byte()));
    }
    
cn.close();

Старый 23.12.2004, 17:52   #13  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
А без вызова info() вообще меньше секунды отрабатывает!
Старый 23.12.2004, 17:56   #14  
simply2double is offline
simply2double
Участник
Аватар для simply2double
 
556 / 19 (2) ++
Регистрация: 08.09.2004
Адрес: alfa cen
Цитата:
Изначально опубликовано Ace of Database
А Вы код приведите. Должно все бысто работать. Судя по трасссировке в SQL Profiler, Аксапта сама через ADO или OLEDB с SQL-сервером работает.

можно вопрос... как Вы с помощью трассировщика узнаете, с помощь какой технологии произволиться доступ к серверу ???

насколько мне известно, все технологии всего лишь интерфейсная надстройка над API SQL server...
Старый 23.12.2004, 18:07   #15  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Выдержка из MS SQL Server BooksOnline
___________________________________________________
These system stored procedures support the cursor functionality of ADO, OLE DB, ODBC, and the DB-Library Cursor Library:

sp_cursor sp_cursorclose sp_cursorexecute
sp_cursorfetch sp_cursoropen sp_cursoroption
sp_cursorprepare sp_cursorunprepare
___________________________________________________

Почему я пришел к выводу, что Аксапта использует OLE DB, наверное потому, что при установке клиента Аксапта требует наличия не самой древней версии MDAC.
Старый 23.12.2004, 18:15   #16  
simply2double is offline
simply2double
Участник
Аватар для simply2double
 
556 / 19 (2) ++
Регистрация: 08.09.2004
Адрес: alfa cen
Цитата:
Изначально опубликовано Ace of Database
Выдержка из MS SQL Server BooksOnline
___________________________________________________
These system stored procedures support the cursor functionality of ADO, OLE DB, ODBC, and the DB-Library Cursor Library:


Других технология я и не слышал ))) но они то и являются всего лишь оболочками, правда в ADO есть еще свой процессор данных (RecordSet)


Почему я пришел к выводу, что Аксапта использует OLE DB, наверное потому, что при установке клиента Аксапта требует наличия не самой древней версии MDAC. [/

Косвенные методы тоже имеют место в познании... но согласись, к трассировщику они не имеют ни какогоотношения...

Хотя скорее всего ты прав, доступ осуществляется посредством OLE DB провайдера...
Старый 23.12.2004, 18:17   #17  
simply2double is offline
simply2double
Участник
Аватар для simply2double
 
556 / 19 (2) ++
Регистрация: 08.09.2004
Адрес: alfa cen
стоп.. поначалу не понял ))) да действительно процесс создания аксаптой курсоров виденв трассировщике... ))) ты прав...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вспомогательный класс для импорта из Excel через ADO gl00mie DAX: База знаний и проекты 80 10.04.2017 10:55
Подключение к базе на Oracle через ADO miklenew DAX: Программирование 6 19.12.2007 15:41
Как управлять транзакциями через ADO? Silence DAX: Программирование 4 19.11.2007 17:00
Как вызвать хранимую процедуру (функцию) Oracle и вернуть значение bocman DAX: Программирование 11 20.08.2004 10:28
Можно ли из Аксапты вызвать хранимую процедуру на SQL Server Yuri Safronov DAX: Программирование 8 02.09.2002 14:25
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:54.