Запуск хранимой процедуры в BPMonline 5.2

Запустить хранимую процедуру без параметров можно следующим программным кодом:

var dataValueTypeManager = (DataValueTypeManager)UserConnection.AppManagerProvider.GetManager("DataValueTypeManager");

var storedProcedure = new StoredProcedure(UserConnection, "tsp_Anny");
using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection()) {
        dbExecutor.StartTransaction(System.Data.IsolationLevel.ReadUncommitted);
        storedProcedure.Execute(dbExecutor);
        dbExecutor.CommitTransaction();
}
return true;

Нравится

Поделиться

10 комментариев

Добрый день, хороший пример, как быть с параметрами
Пример

declare
i integer;
begin
"test1"('10700947',i);
end;

На BPMonline я написал так, но могу получить исходящий параметр

int k =0;
var storedProcedure = new StoredProcedure(userConnection,"test1");

storedProcedure.WithParameter("10700947");
storedProcedure.WithParameter(k);
storedProcedure.Execute();

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

var storedProcedure = new StoredProcedure(UserConnection, "tsp_MergeDuplicates");
storedProcedure.WithParameter(Column.Const(EntityPrimaryColumnValue));
storedProcedure.WithParameter(Column.Const(entitiesToMerge));
storedProcedure.WithParameter(Column.Const(Page.DataSource.Schema.UId));
storedProcedure.WithOutputParameter("return_value", dataValueTypeManager.GetInstanceByName("Integer"));
storedProcedure.WithOutputParameter("error_message", dataValueTypeManager.GetInstanceByName("Text"));
using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection()) {
	dbExecutor.StartTransaction(System.Data.IsolationLevel.ReadUncommitted);
	Page.DataSource.ActiveRow.Save();
	storedProcedure.Execute(dbExecutor);
	if (storedProcedure.Parameters.Count > 0) {
		int result = (int)storedProcedure.Parameters[0].Value;
		string errorMessage = storedProcedure.Parameters[1].Value as string;
		if (result != 0) {
			dbExecutor.RollbackTransaction();
			throw new Exception(errorMessage);
		}
	}	
	dbExecutor.CommitTransaction();	
}
SetCloseStatus(1);

А есть пример получения из хранимой данные курсора из пакета оракл

Пример пакета

CREATE OR REPLACE PACKAGE INT4DB."tspkg_PaymentSchedule" AS
    TYPE  "TypeCursorSchedule" IS REF CURSOR;
    PROCEDURE "GetProducts"(IDin IN NUMBER,DEP_IDin IN NUMBER, result_cursor IN OUT 
"TypeCursorSchedule");
   END "tspkg_PaymentSchedule";
/
CREATE OR REPLACE PACKAGE BODY INT4DB."tspkg_PaymentSchedule"  AS
   PROCEDURE "GetProducts"(IDin IN NUMBER, DEP_IDin IN NUMBER, result_cursor IN OUT "TypeCursorSchedule")
   IS
    v_cursor "TypeCursorSchedule";
   BEGIN
       OPEN v_cursor FOR
            SELECT  code
            FROM   colvir.ZHAS_VIU_GRAF@T_CRM_CORT2
            WHERE ID =  IDin --817514550
            AND      DEP_ID = DEP_IDin;-- 2;
 
       result_cursor := v_cursor;
   END "GetProducts";
   END"tspkg_PaymentSchedule";
/

Сам попытался написать, но ругается на dataValueTypeManager

		var dataValueTypeManager = (DataValueTypeManager)userConnection.AppManagerProvider.GetManager("DataValueTypeManager");
		var storedProcedure = new StoredProcedure(userConnection,"GetProducts");
		storedProcedure.WithParameter("817514550");
		storedProcedure.WithParameter("2");
		storedProcedure.WithOutputParameter("return_value", dataValueTypeManager.GetInstanceByName("REFCursor???"));   
		storedProcedure.PackageName = "tspkg_PaymentSchedule";

Уточните, пожалуйста, какая у Вас версия и сборка BPMonline?

BPMOnline Версия 5.1.1.139

Для версии 5.1 запуск хранимой процедуры осуществляется иначе. Пример:

var contactSchemaId = new Guid("16BE3651-8FE2-4159-8DD0-A803D4683DD3"); //передаваемый в процедуру параметр
var storedProcedure = new StoredProcedure(UserConnection, "tsp_GloballySearchForDuplicates");
storedProcedure.WithParameter(Column.Const(contactSchemaId));
using (var dbExecutor = UserConnection.EnsureDBConnection()) {
	storedProcedure.Execute(dbExecutor);
}
 
StoredProcedure setRecordPositionProcedure = new StoredProcedure(Page.UserConnection, "tsp_SetRecordPosition")
                .WithParameter("TableName", RightsSchemaName)
                .WithParameter("PrimaryColumnName", "Id")
                .WithParameter("PrimaryColumnValue", primaryColumnValue)
                .WithParameter("GrouppingColumnNames", RightsGrouppingColumnNames)
                .WithParameter("Position", position);
setRecordPositionProcedure.PackageName = Page.UserConnection.DBEngine.SystemPackageName;
setRecordPositionProcedure.Execute();

А я вот не совсем понял как запускать процедуру с параметрами. Без параметров запускается, хотя тоже не все понятно)
Например, что у нас хранится в dataValueTypeManager?
Как мне надо описать в BPMonline и запустить процедуру, которая должна получить входящим параметром ID текущего пользователя, ну и например № договора, из которого она запускается?

Версия BPMonline 5.2

Для того, чтобы получить идентификатор записи активной строки реестра из процесса карточки реестра, используйте следующую конструкцию:

Guid actId =Page.DataSource.ActiveRow.GetTypedColumnValue<Guid>("Id");

Соответственно, потом этот идентификатор следует передать в хранимую процедуру.

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

Анна, а не могли бы вы привести пример, о котором я говорил в предыдущем комментарии:

"D.T." написал:

Как мне надо описать в BPMonline и запустить процедуру, которая должна получить входящим параметром ID текущего пользователя, ну и например № договора, из карточки которого она запускается?

Версия BPMonline 5.2

Guid contractId =Page.DataSource.ActiveRow.GetTypedColumnValue<Guid>("Id"); //если мы в реестре договоров
Guid currentUser = UserConnection.CurrentUser.ContactId;
 
var dataValueTypeManager = (DataValueTypeManager)UserConnection.AppManagerProvider.GetManager("DataValueTypeManager");
 
var storedProcedure = new StoredProcedure(UserConnection, "tsp_MergeDuplicates");
 storedProcedure.WithParameter(contractId);
 storedProcedure.WithParameter(currentUser);
 
 storedProcedure.WithOutputParameter("return_value", dataValueTypeManager.GetInstanceByName("Integer"));
 storedProcedure.WithOutputParameter("error_message", dataValueTypeManager.GetInstanceByName("Text"));
using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection()) {
         dbExecutor.StartTransaction(System.Data.IsolationLevel.ReadUncommitted);
         Page.DataSource.ActiveRow.Save();
         storedProcedure.Execute(dbExecutor);
         if (storedProcedure.Parameters.Count > 0) {
                 int result = (int)storedProcedure.Parameters[0].Value;
                 string errorMessage = storedProcedure.Parameters[1].Value as string;
                 if (result != 0) {
                         dbExecutor.RollbackTransaction();
                         throw new Exception(errorMessage);
                 }
         }       
         dbExecutor.CommitTransaction(); 
}
 SetCloseStatus(1);
Показать все комментарии