W Comarch DMS dostępne są procedury (wyzwalacze), które rozszerzają funkcjonalność modelowania procesów o możliwość wykonywania dodatkowych akcji, uruchamiane poprzez określone zdarzenie występujące podczas pracy z aplikacją.
Jeśli użytkownik w dotychczasowej procedurze miał dodatkowy własny kod, wówczas po aktualizacji powinien dodać go jeszcze raz.
Comarch DMS wyposażony m. in. jest w następujące wyzwalacze:
[su_list icon=”icon: check” icon_color=”#009de0″]
- Baza Comarch DMS:
- do.OnAfterDocumentCreated – procedura uruchamiana po każdym utworzeniu dokumentu w Comarch DMS.
- do.OnAfterDocumentSave – procedura uruchamiana po każdej aktualizacji dokumentu Comarch DMS:
- po kliknięciu w ikonę zapisu,
- w przypadku, gdy na typie obiegu ustawiono automatyczny zapis po zainicjowaniu dokumentu,
- po kliknięciu ‘Utwórz’ w celu utworzenia dokumentu w masowym skanowaniu,
- po kliknięciu w ‘Generuj’ w celu wygenerowania dokumentu w punktach ACD,
- przy próbie zapisu dokumentu w obiegu utworzonego z poziomu kolumny typu Dokumenty w obiegu w kontrolce typu Dane tabelaryczne.
- do.OnBeforeDocumentShow – procedura uruchamiana przed wyświetleniem szczegółów dokumentu Comarch DMS:
- do.OnDocumentPropagation – procedura uruchamiana jest podczas każdego przekazania dokumentu do kolejnego etapu.
- do.OnAfterDocumentDeleted – procedura dodana w wersji 2024.0.0; zostaje uruchomiona przy usuwaniu dokumentu
- Bazy Comarch ERP XL, Comarch ERP Optima, Comarch ERP Altum – podczas propagacji dokumentu Comarch DMS można wykonać procedurę na bazie systemu Comarch ERP:
- CDN.OnDocumentPropagation – procedura uruchamiana jest podczas każdego przekazania dokumentu do kolejnego etapu.[/su_list]
W każdej z procedur (wyzwalaczy) obsłużono wyjątki (Try-Catch) z możliwością przekazania informacji do aplikacji jako komunikat (MessageBox). Ponadto wyjątek zwrócony poprzez instrukcję THROW spowoduje cofnięcie transakcji. Możliwość tą można wykorzystać np. do zatrzymania przekazania dokumentu do kolejnego etapu (procedura OnDocumentPropagation) w sytuacji, gdy nie został spełniony warunek przekazania. Kliknięcie „Przekaż do kolejnego etapu” może spowodować wyświetlenie komunikatu zdefiniowanego w procedurze i zatrzymanie akcji przekazania.
Budowa procedur (wyzwalaczy) rozszerzających funkcjonalność modelowania procesów (budowa procedury zostanie wyświetlona po kliknięciu w nazwę):
[su_accordion]
[su_spoiler title=”do.OnDocumentPropagation”]
Procedura jest wywoływana podczas przekazania dokumentu do następnego etapu.
CREATE PROCEDURE do.OnDocumentPropagation
@WorkflowId as int = NULL,
@StageId as int = NULL,
@DocumentId as int = NULL,
@PropagatedById as int = NULL,
@DocumentOwnerId as int = NULL,
@IsAutomaticPropagation as bit = NULL
AS
BEGIN
declare @test int
— Tutaj można obsłużyć dodatkowe akcje użytkownika.
END
Opis argumentów:
[su_list icon=”icon: check” icon_color=”#009de0″]
-
-
- @WorkflowId – int, id Obiegu dokumentów (DSH_Id),
- @StageId – int, id etapu (DDS_Id),
- @DocumentId – int, id dokumentu (DWD_ID),
- @PropagatedById – int, id użytkownika przekazującego dokument (DCD_Id),
- @DocumentOwnerId int, id właściciela dokumentu (DCD_Id) – przyjmuje zawsze wartość 0,
- @IsAutomaticPropagation bit, wartość prawdziwa, jeśli dokument był przekazany przez propagację czasową.[/su_list][/su_spoiler]
-
[su_spoiler title=”do.OnAfterDocumentSave”]
Procedura jest wykonywana podczas zapisu dokumentu.
CREATE PROCEDURE do.OnAfterDocumentSave
@DocumentId as int = NULL, — DWD_ID z tabeli DF_Work
@SavedBy as int = NULL — DCD_ID z tabeli DF_ConfOSDictionary
AS
BEGIN
declare @test int;
— Tutaj można obsłużyć dodatkowe akcje użytkownika.
END
Opis argumentów:
[su_list icon=”icon: check” icon_color=”#009de0″]
-
-
- @DocumentId – id dokumentu (DWD_ID),
- @SavedBy – id użytkownika zapisującego dokument (DCD_Id).[/su_list][/su_spoiler]
-
[su_spoiler title=”do.OnAfterDocumentCreated”]
Procedura jest wykonywana przy zapisie nowego dokumentu.
CREATE PROCEDURE do.OnAfterDocumentCreated
@DocumentId as int = NULL, — DWD_ID z tabeli DF_Work
@SavedBy as int = NULL — DCD_ID z tabeli DF_ConfOSDictionary
AS
BEGIN
declare @test int;
— Tutaj można obsłużyć dodatkowe akcje użytkownika.
END
Opis argumentów:
[su_list icon=”icon: check” icon_color=”#009de0″]
-
-
- @DocumentId – id dokumentu (DWD_ID),
- @SavedBy – id użytkownika zapisującego dokument (DCD_Id).[/su_list][/su_spoiler]
-
[su_spoiler title=”do.OnBeforeDocumentShow”]
Procedura uruchamiana jest przed wyświetleniem szczegółów dokumentu DMS
CREATE PROCEDURE do.OnBeforeDocumentShow
@documentId as int = NULL, — DWD_ID z tabeli DF_Work
@workflowId as int = NULL, — DFH_ID z tabeli DF_HeadDokumentFlow
@userId as int = NULL — DCD_ID z tabeli DF_ConfOSDictionary
AS
BEGIN
begin try
declare @test int
— Tutaj można obsłużyć dodatkowe akcje użytkownika.
end try
begin catch
DECLARE @ErrorMessage varchar(max) = 'W procedurze do.OnBeforeDocumentShow wystąpił błąd: ’ + ERROR_MESSAGE();
–THROW 50001, @ErrorMessage ,1;
declare @ErrorSeverity int = ERROR_SEVERITY(), @ErrorState int = ERROR_STATE()
raiserror (@ErrorMessage, @ErrorSeverity, @ErrorState);
end catch
END
Opis argumentów:
[su_list icon=”icon: check” icon_color=”#009de0″]
-
-
- @DocumentId – identyfikator dokumentu (DWD_Id),
- @WorkflowId – identyfikator typu obiegu (DFH_Id),
- @UserId – identyfikator operatora (DCD_Id).[/su_list][/su_spoiler]
-
[/su_accordion]
[su_spoiler title=”do.OnAfterDocumentDeleted”]
Procedura dodana w wersji 2024.0.0; zostaje uruchomiona przy usuwaniu dokumentu.
Procedura przyjmuje następujące parametry:[su_list icon=”icon: check” icon_color=”#009de0″]
-
- @documentId – id usuwanego dokumentu (DWD_ID);
- @userId – id użytkownika, który usuwa dokument (DCD_ID) [/su_list][/su_spoiler]
Przykład zastosowania procedury do.OnAfterDocumentCreated
W przykładzie zastosowano funkcję skalarną do.ModWorkflowName zwracającą nazwę typu obiegu. W procedurze do.OnAfterDocumentCreated dodano warunek, który ogranicza wywołanie procedury do nazwy typu obiegu. Oznacza to, że procedura zostanie uruchomiona każdorazowo, gdy w ramach wskazanego typu obiegu zostanie utworzony nowy dokument i zostanie podjęta próba jego zapisu w bazie.
W przypadku, gdy kontrolka, której identyfikator wskazano w procedurze, ma uzupełnioną wartość, dokument zostanie zapisany.
W przypadku, gdy w kontrolce, której identyfikator określono w procedurze, nie zostanie uzupełniona wartość, dokument nie zostanie zapisany i zostanie wyświetlony komunikat o treści określonej w poleceniu THROW w procedurze.
Operator w ramach definicji typu obiegu „Faktury – procedura do.OnAfterDocumentCreated” dodał cztery kontrolki:[su_list icon=”icon: check” icon_color=”#009de0″]
- Numer dokumentu (Numer_dokumentu)
- Data wystawienia (Data_wystawienia)
- Wartość netto (netto)
- Wartość brutto (brutto)[/su_list]
[su_lightbox type=”image” src=”https://pomoc.comarch.pl/dms/wp-content/uploads/2023/11/procedury1.png”]

[/su_lightbox]
Następnie operator znalazł w bazie DMS procedurę do.OnAfterDocumentCreated w katalogu Programmability/Stored Procedures, kliknął na nią prawym przyciskiem myszki, wybrał opcję Modify i wprowadził następujące zapytanie:
USE [DMS]-- w nawiasie kwadratowym należy wpisać nazwę bazy Comarch DMS GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [do].[OnAfterDocumentCreated] @DocumentId as int = NULL, --DWD_ID z tabeli DF_Work @SavedBy as int = NULL --DCD_ID z tabeli DF_ConfOSDictionary AS BEGIN BEGIN TRY declare @string varchar(max)=''; if do.ModWorkflowName (@DocumentId)='Faktury - procedura do.OnAfterDocumentCreated' /*nazwa typu obiegu, w którym nastąpi blokada*/ Begin select @string= isnull (w.DWC_ValueString,'') from do.DF_Work d join do.DF_ConfDSHead i on d.DWD_DSHId=i.DSH_ID join do.DF_ConfCFCardDokFlow k on k.DKO_DSHId=i.DSH_ID join do.DF_WorkCF w on w.DWC_DKOId = k.DKO_ID where DWD_ID=@DocumentId and k.DKO_Name='Numer_dokumentu' /* identyfikator kontrolki, dla której wymagane jest uzupełnienie wartości*/ if @string ='' THROW 50001, 'Pole Numer dokumentu jest wymagane' ,1; -- -treść wyświetlanego komunikatu End END TRY BEGIN CATCH DECLARE @ErrorMessage varchar(max) = ERROR_MESSAGE(); THROW 50001, @ErrorMessage ,1; declare @ErrorSeverity int = ERROR_SEVERITY(), @ErrorState int = ERROR_STATE() raiserror (@ErrorMessage, @ErrorSeverity, @ErrorState); end catch END
[su_lightbox type=”image” src=”https://pomoc.comarch.pl/dms/wp-content/uploads/2022/10/onafterdocumentcreated1.png”]

[/su_lightbox]
Później operator nacisnął przycisk „Execute”, aby procedura została zastosowana, zapisał typ obiegu w Comarch DMS i spróbował zapisać nowy dokument bez wpisywania wartości do kontrolki „Numer dokumentu”. Dokument nie został zapisany i wyświetlony został komunikat Pole Numer dokumentu jest wymagane. Operator mógł zapisać dokument dopiero po wprowadzeniu wartości w kontrolce „Numer dokumentu”.
[su_lightbox type=”image” src=”https://pomoc.comarch.pl/dms/wp-content/uploads/2022/10/onafterdocumentcreated2.png”]

[/su_lightbox]
[su_lightbox type=”image” src=”https://pomoc.comarch.pl/dms/wp-content/uploads/2023/11/procedury-2-e1700058289916.png”]

[/su_lightbox]
Przykład zastosowania procedury do.OnAfterDocumentSave
Operator w ramach definicji typu obiegu dodał cztery kontrolki:[su_list icon=”icon: check” icon_color=”#009de0″]
- Numer dokumentu (Numer_dokumentu)
- Data wystawienia (Data_wystawienia)
- Wartość netto (netto)
- Wartość brutto (brutto)[/su_list]
[su_lightbox type=”image” src=”https://pomoc.comarch.pl/dms/wp-content/uploads/2023/11/proceduryprim1.png”]

[/su_lightbox]
Następnie operator znalazł w bazie DMS procedurę do.OnAfterDocumentSave w katalogu Programmability/Stored Procedures, kliknął na nią prawym przyciskiem myszki, wybrał opcję Modify i wprowadził następujące zapytanie:
USE [DMS]-- w nawiasie kwadratowym należy wpisać nazwę bazy Comarch DMS GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [do].[OnAfterDocumentSave] @DocumentId as int = NULL, -- DWD_ID z tabeli DF_Work @SavedBy as int = NULL -- DCD_ID z tabeli DF_ConfOSDictionary AS BEGIN begin try --declare @test int --------------------------------Blokada zapisu----------------------------- If exists( select * from do.RO_ObjectsTypes t join do.RO_Documents d on d.DFH_Id=t.DFH_Id where d.DWD_ID=@DocumentId and t.DFH_Name='Faktury' ) Begin declare @Numer_dokumentu varchar (max) declare @data_wystawienia varchar declare @netto decimal (20,4) declare @brutto decimal (20,4) select @Numer_dokumentu=isnull (value, ' ') from do.RO_ControlsValue where DKO_Name='Numer_dokumentu' and DWD_ID=@DocumentId If @Numer_dokumentu=' ' THROW 50001, 'Nie możesz zapisać dokumentu, ponieważ nie wprowadzono numeru dokumentu' ,1; select @Data_wystawienia=isnull (Value,' ') from do.RO_ControlsValue where DKO_Name='Data_wystawienia' and DWD_ID=@DocumentId If @Data_wystawienia=' ' THROW 50001, 'Nie możesz zapisać dokumentu, ponieważ nie wprowadzono daty wystawienia dokumentu' ,1; select @netto=isnull (Value,0) from do.RO_ControlsValue where DKO_Name='netto' and DWD_ID=@DocumentId If @netto=0 THROW 50001, 'Nie możesz zapisać dokumentu, ponieważ nie wprowadzono wartości netto dokumentu' ,1; select @brutto=isnull (Value,0) from do.RO_ControlsValue where DKO_Name='brutto' and DWD_ID=@DocumentId If @brutto=0 THROW 50001, 'Nie możesz zapisać dokumentu, ponieważ nie wprowadzono wartości brutto dokumentu' ,1; END end try begin catch DECLARE @ErrorMessage varchar(max) = 'W procedurze do.OnAfterDocumentSave wystąpił błąd: ' + ERROR_MESSAGE(); --THROW 50001, @ErrorMessage ,1; declare @ErrorSeverity int = ERROR_SEVERITY(), @ErrorState int = ERROR_STATE() raiserror (@ErrorMessage, @ErrorSeverity, @ErrorState); end catch END
[su_lightbox type=”image” src=”https://pomoc.comarch.pl/dms/wp-content/uploads/2022/10/onafterdocumentsave2-1.png”]

[/su_lightbox]
Później operator nacisnął przycisk „Execute”, aby procedura została zastosowana, zapisał typ obiegu w Comarch DMS i spróbował zapisać nowy dokument bez wpisywania wartości do kontrolek.
Pierwsza próba zapisu nie powiodła się, a na ekranie został wyświetlony komunikat W procedurze do.OnAfterDocumentSave wystąpił błąd: Nie możesz zapisać dokumentu, ponieważ nie wprowadzono numeru dokumentu.
[su_lightbox type=”image” src=”https://pomoc.comarch.pl/dms/wp-content/uploads/2022/10/onafterdocumentsave3-1.png”]

[/su_lightbox]
[su_lightbox type=”image” src=”https://pomoc.comarch.pl/dms/wp-content/uploads/2023/11/proceduryprim2.png”]

[/su_lightbox]
Operator wpisał numer dokumentu i ponownie próbował zapisać dokument, jednak próba zapisu nie powiodła się, a na ekranie został wyświetlony komunikat W procedurze do.OnAfterDocumentSave wystąpił błąd: Nie możesz zapisać dokumentu, ponieważ nie wprowadzono daty wystawienia dokumentu.
[su_lightbox type=”image” src=”https://pomoc.comarch.pl/dms/wp-content/uploads/2023/11/proceduryprim3.png”]

[/su_lightbox]
Operator wprowadził datę wystawienia dokumentu i znów próbował zapisać dokument, ale próba zapisu nie powiodła się, a na ekranie został wyświetlony komunikat W procedurze do.OnAfterDocumentSave wystąpił błąd: Nie możesz zapisać dokumentu, ponieważ nie wprowadzono wartości netto dokumentu.
[su_lightbox type=”image” src=”https://pomoc.comarch.pl/dms/wp-content/uploads/2023/11/proceduryprim4.png”]

[/su_lightbox]
Operator wprowadził wartość netto dokumentu i po raz kolejny próbował zapisać dokument, lecz próba zapisu nie powiodła się, a na ekranie został wyświetlony komunikat W procedurze do.OnAfterDocumentSave wystąpił błąd: Nie możesz zapisać dokumentu, ponieważ nie wprowadzono wartości brutto dokumentu.
[su_lightbox type=”image” src=”https://pomoc.comarch.pl/dms/wp-content/uploads/2023/11/proceduryprim5.png”]

[/su_lightbox]
Operator uzupełnił wartość brutto, spróbował zapisać dokument – i tym razem próba zapisu zakończyła się sukcesem, bo wszystkie wymagane kontrolki zostały uzupełnione.
[su_lightbox type=”image” src=”https://pomoc.comarch.pl/dms/wp-content/uploads/2023/11/proceduryprim6.png”]

[/su_lightbox]
Operator utworzył typ obiegu Blokada przekazania bez komentarza i zapisał go.
[su_lightbox type=”image” src=”https://pomoc.comarch.pl/dms/wp-content/uploads/2023/11/procedurydwa1.png”]

[/su_lightbox]
Następnie operator znalazł w bazie DMS procedurę do.OnDocumentPropagation w katalogu Programmability/Stored Procedures, kliknął na nią prawym przyciskiem myszki, wybrał opcję Modify i wprowadził następujące zapytanie:
USE [DMS] -- nazwa bazy Comarch DMS GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [do].[OnDocumentPropagation] @WorkflowId as int = NULL, -- DSH_ID z tabeli DF_ConfDSHead @StageId as int = NULL,-- DDS_ID z tabeli DF_ConfDSDictionary @DocumentId as int = NULL, -- DWD_ID z tabeli DF_Work @PropagatedById as int = NULL, -- DCD_ID z tabeli DF_ConfOSDictionary @DocumentOwnerId as int = NULL, -- DWD_DCDOwnerId z tabeli DF_Work @IsAutomaticPropagation as bit = NULL AS BEGIN If exists ( select * from do.RO_ObjectsTypes t join do.RO_StageActive s on t.DFH_Id=s.DFH_Id join do.RO_Documents d on s.DWD_ID=d.DWD_ID where d.DWD_ID=@DocumentId and t.DFH_Name= 'Blokada przekazania bez komentarza' -- Nazwa typu obiegu ) If exists (select * from do.RO_StageActive sa join do.DF_WorkDS ds on sa.dds_id=ds.DWS_DDSId and sa.DWD_ID=ds.DWS_DWDId where sa.DWD_ID=@DocumentId and ds.DWS_IsCurrent=1 and isnull (ds.dws_message, '')='' ) THROW 50001, 'Nie wpisano komentarza - uzupełnij puste pole pod nazwą kolejnego etapu',1; END
Później operator nacisnął przycisk „Execute”, aby procedura została zastosowana, utworzył nowy dokument i próbował przekazać go do następnego etapu bez wpisania komentarza. Dokument nie został przekazany, natomiast wyświetlony został komunikat Nie wpisano komentarza – uzupełnij puste pole pod nazwą kolejnego etapu. Operator mógł przekazać dokument dopiero po uzupełnieniu pola komentarza.
[su_lightbox type=”image” src=”https://pomoc.comarch.pl/dms/wp-content/uploads/2022/10/ondocument-propagation2.png”]

[/su_lightbox]
[su_lightbox type=”image” src=”https://pomoc.comarch.pl/dms/wp-content/uploads/2022/10/ondocument-propagation3.png”]

[/su_lightbox]
[su_lightbox type=”image” src=”https://pomoc.comarch.pl/dms/wp-content/uploads/2023/11/procedurydwa2.png”]

[/su_lightbox]
[su_note note_color=”#DDFACB” text_color=”#240b0b”]Rozpoczynasz pracę z Comarch DMS i chcesz dowiedzieć się, jak korzystać z programu? A może masz już podstawową wiedzę o Comarch DMS i chcesz dowiedzieć się więcej?
[su_button url=”https://pomoc.comarch.pl/dms/index.php/dokumentacja/szkolenia-comarch-dms/”]Sprawdź Szkolenia Comarch DMS![/su_button]
[/su_note]
[su_divider top=”yes” text=”Powrót do początku artykułu” style=”default” divider_color=”#1914D6″ link_color=”#1914D6″ size=”1″ margin=”16″]




