Generowanie faktury zakupu w Comarch ERP XL z wykorzystaniem skryptów C#
Informacje podstawowe
1. Instalacja systemu Comarch ERP XL na serwerze IIS 2. Poprawna konfiguracja współpracy pomiędzy systemami Comarch ERP XL oraz Comarch DMS 3. Nadanie użytkownikowi IISUSER uprawnień do zapisu w katalogu bin\Scriptcs_bin oraz katalogu bin\.scriptcs_cache, które znajdują się w plikach aplikacji serwerowej Comarch DMS 4. Skopiowanie biblioteki cdn_api[wersja].net.dll do katalogu bin\Scriptcs_bin, biblioteka znajduje się w katalogu, w którym zainstalowano Comarch ERP XL, w przykładach wykorzystano cdn_api20232.net.dll 5. Należy sprawdzić, czy w katalogu bin aplikacji web Comarch DMS znajduje się plik cdn_sys.dll, jeżeli jest należy usunąć go z tej lokalizacji.
Skrypty C# zostały wykorzystane w kontrolkach typu Własna akcja i Komunikat. Skrypt dla kontrolki typu własna akcja utworzono na podstawie wzorca API XL
Wzorzec API XL dostępny jest na indywidualnych stronach dla Partnerów w obszarze Comarch DMS\Przykłady\ERP XL: Wzorzec API XL
Konfiguracja typu obiegu
Przykład pokazuje, w jaki sposób administrator Comarch DMS może skonfigurować definicję obiegu, aby generować dokument „Faktura zakupu” do systemu Comarch ERP XL, bez pomocy kontrolki typu Dokument ERP XL. W tym celu należy:
1. dodać nowy typ obiegu w ramach zakladki
[Definicje obiegów dokumentów]
2. nadać nazwę typowi obiegu – np. Generowanie faktury zakupu i prefix – np. GEN
3. nadać danemu administratorowi uprawnienie do inicjowania dokumentu na zakładce „Ustawienia obiegu” w sekcji „Uprawnienia do inicjowania dokumentu”

4. W ramach zakładki „Schemat obiegu” utworzyć etap początkowy „Generuj dokument” i etap końcowy „Koniec” oraz dodać uprawnienie dla danego administratora do etapów.

5. W ramach zakładki „Karta obiegu” dodać następujące kontrolki:
A Kontrolka typu Kontrahent – „Kontrahent” (identyfikator: Kontrahent)

B Kontrolka typu Dane tabelaryczne – „Elementy” (identyfikator: Elementy) – w ramach kontrolki należy:
-
- w zakładce „Listy” dodać następujące listy:
- „Jm” z wartością „Jednostki miary” w polu „Inicjowanie”
- „VAT” z wartością „Stawki VAT” w polu „Inicjowanie”
- w zakładce „Listy” dodać następujące listy:

-
- w zakładce „Ogólne” dodać następujące kolumny:
- kolumna typu Towar – „Towar” (identyfikator: Towar)
- kolumna typu Liczba stałoprzecinkowa – „Ilość” (identyfikator: Ilosc)
- kolumna typu Lista – „Jm.” (identyfikator: Jm) z wartością „Jm” wybraną w polu „Listy”
- kolumna typu Lista – „VAT” (identyfikator: VAT) z wartością „VAT” wybraną w polu „Listy”
- kolumna typu Liczba stałoprzecinkowa – „Cena netto” (identyfikator: CenaNetto)
- kolumna typu Liczba stałoprzecinkowa – „Cena brutto” (identyfikator: CenaBrutto)
- kolumna typu Liczba stałoprzecinkowa – „Wartość Netto” (identyfikator: WartoscNetto)
- kolumna typu Liczba stałoprzecinkowa – „Wartość Brutto” (identyfikator: WartoscBrutto)
- w zakładce „Ogólne” dodać następujące kolumny:


-
- w zakładce „Inicjowanie wartości” :
- w ramach pola „Kontrolki powiązane” kliknąć przycisk „Dodaj” i wybrac kontrolkę „Elementy”
- w ramach pola „Wzór na wartość” wybrać opcję „SQL OD”, kliknąć „Ustaw”, a następnie wprowadzić następujące zapytanie:
- w zakładce „Inicjowanie wartości” :
if @^InitSenderControlName@ = 'Elementy'
Begin
declare @vat decimal(22,4) = 0.0
declare @netto decimal (22,4) = 0.0
declare @brutto decimal (22,4) = 0.0
declare @ilosc decimal (22,4) = 0.0
if @Elementy_Column@ in (2,4,5)
Begin
select @netto = CenaNetto, @ilosc = Ilosc from @Elementy@
where POS = @Elementy_Row@
select @vat = case
when VAT = 1 then 23
when VAT = 2 then 8
when VAT = 3 then 0
when VAT = 4 then 0
when VAT = 5 then 0
when VAT = 6 then 7
when VAT = 7 then 5
else 0 end
from @Elementy@ where POS = @Elementy_Row@
set @brutto = ((@netto*@vat)/100)+@netto
update @Elementy@ set CenaBrutto = @brutto, WartoscBrutto = @ilosc * @brutto,
WartoscNetto = @ilosc * @netto where POS = @Elementy_Row@
select * from @Elementy@
End
if @Elementy_Column@ = -1
Begin
update @Elementy@ set Ilosc = 1, JM = 1, VAT = 1
where POS = @Elementy_Row@
select * from @Elementy@
End
End
Wprowadzone zapytanie należy zapisać, klikając w przycisk „Zapisz” w oknie „Wyrażenie kontrolki”


-
- w zakładce „Ograniczenie Edycji” zaznaczyć checkboxy na obydwóch etapach dla kolumn: „Cena netto”, „Cena brutto”, „Wartość Netto”, „Wartość Brutto”

C kontrolka typu Własna akcja – „Generuj dokument” (identyfikator: GenerujDokument) – w ramach definicji kontrolki należy kliknąć w link „Ustaw” w polu „C# Script”, następnie w otwartym oknie „Skrypt C#” w polu „Miejsce wykonania skryptu” wybrać „Proces (exe)” (jeśli istnieje opcja wyboru) i wprowadzić następujący kod:
using System.Threading;
using System.Runtime.InteropServices;
using cdn_api;
static ThreadLocal<bool> threadToClarionAttached = new ThreadLocal<bool>(() => false);
[DllImport("ClaRUN.dll")]
private static extern void AttachThreadToClarion(int flag);
public void AttachThreadToClarion()
{
try
{
if (!threadToClarionAttached.Value)
{
AttachThreadToClarion(1); // C8
threadToClarionAttached.Value = true;
}
}
catch (DllNotFoundException ex)
{
// -----------------------------------------------------------------
// Tu przekaż informacje o statusie działania skryptu
// -----------------------------------------------------------------
Globals.MainFrame.GenerujDokument_CSSCRIPT.Text = ex.Message;
}
}
AttachThreadToClarion();
int _lSesjaID = 0;
string blad = "";
try
{
int documentId = 0;
int wersjaApi = odpowiedniawersjaapi;
var loginInfo = new XLLoginInfo_odpowiedniawersjaapi()
{
Wersja = odpowiedniawersjaapi,
ProgramID = "Comarch DMS",
Winieta = -1,
TrybWsadowy = 1,
Baza = "nazwafirmy",
OpeIdent = "Login",
OpeHaslo = "hasło",
SerwerKlucza = @"serwerklucza"
};
var XLLoginResult = cdn_api.cdn_api.XLLogin(loginInfo, ref _lSesjaID);
if (XLLoginResult != 0)
{
blad = "Funkcja XLLogin zwróciła bład nr: " + XLLoginResult;
throw new Exception();
}
// -----------------------------------------------------------------
// Tu dodaj kod obsługi API
// -----------------------------------------------------------------
var dokumentNagInfo = new XLDokumentNagInfo_odpowiedniawersjaapi
{
Wersja = odpowiedniawersjaapi,
Typ = 1521,//FZ
KntTyp = 32,
KntNumer = Globals.MainFrame.Kontrahent.Id ?? 0, // Pobierz GidNumer kontrahenta
RodzajZakupu = 1,
//Avista = 1
};
var XLNowyDokumentResult = cdn_api.cdn_api.XLNowyDokument (_lSesjaID, ref documentId, dokumentNagInfo);
if (XLNowyDokumentResult != 0)
{
blad = "Funkcja XLNowyDokument zwróciła bład nr: " + XLNowyDokumentResult;
throw new Exception();
}
//var element;
for (int i=0; i<Globals.MainFrame.Elementy.RowCount; i++)
{
var element = new XLDokumentElemInfo_odpowiedniawersjaapi();
element.Wersja = odpowiedniawersjaapi;
element.TwrTyp = 16;
element.Ilosc = Globals.MainFrame.Elementy.Items[i].Ilosc.Value.ToString();
element.TwrNumer = Globals.MainFrame.Elementy.Items[i].Towar.Id;
element.JmZ = Globals.MainFrame.Elementy.Items[i].Jm.Text;
element.Cena = Globals.MainFrame.Elementy.Items[i].CenaNetto.Value.ToString();
var XLDodajPozycjeResult = cdn_api.cdn_api.XLDodajPozycje(documentId, element);
if (XLDodajPozycjeResult != 0)
{
blad = "Funkcja XLDodajPozycje zwróciła bład nr: " + XLDodajPozycjeResult;
throw new Exception();
}
}
var zamkniecieDokumentuInfo = new XLZamkniecieDokumentuInfo_odpowiedniawersjaapi
{
Wersja = odpowiedniawersjaapi,
Tryb = 1
};
var XLZamknijDokumentResult = cdn_api.cdn_api.XLZamknijDokument(documentId, zamkniecieDokumentuInfo);
if (XLZamknijDokumentResult != 0)
{
blad = "Funkcja XLZamknijDokument zwróciła bład nr: " + XLZamknijDokumentResult;
throw new Exception();
}
}
catch (Exception ex)
{
if (blad == "")
blad = "Nieokreślony błąd: " + ex.Message;
}
finally
{
var XLLogoutResult = cdn_api.cdn_api.XLLogout(_lSesjaID);
if (XLLogoutResult != 0)
{
blad = "Funkcja XLLogout zwróciła bład nr: " + XLLogoutResult;
}
// -----------------------------------------------------------------
// Tu przekaż informacje o statusie działania skryptu
// -----------------------------------------------------------------
if ( blad == "")
Globals.MainFrame.GenerujDokument_CSSCRIPT.Text = "Operacja zakończona sukcesem.";
else
Globals.MainFrame.GenerujDokument_CSSCRIPT.Text = blad;
}
gdzie należy zmienić następujące wartości:
odpowiedniawersjaapi – wersja API ERP XL zgodna z wersją pliku cdn_api[wersja].net.dll
nazwafirmy – nazwa Firmy Comarch ERP XL (nazwę firmy można sprawdzić w managerze baz Comarch ERP XL)
Login – login operatora Comarch ERP XL
hasło – hasło operatora Comarch ERP XL
serwerklucza – serwer klucza licencji
Po wprowadzeniu kodu należy nacisnąć przycisk
[Kompiluj i zapisz], a następnie, gdy w dolnej części okna zostanie wyświetlony napis „Kompilacja skryptu zakończyła się sukcesem” nacisnąć przycisk „Zamknij”.

D Kontrolka typu Komunikat – należy w ramach pola:
-
- „Nazwa (identyfikator)” wprowadzić nazwę „Msg1”
- „Tytuł” wprowadzić tekst „Status wykonania API ERP XL”
- „Kontrolki powiązane” kliknąć w link „Dodaj” i wybrać kontrolkę „Generuj dokument”
- „Wzór na wartość” wybrać wartość „C# Script”, kliknąć „Ustaw”, a następnie wprowadzić następujący kod:
Globals.MainFrame.Msg1.Message = Globals.MainFrame.GenerujDokument_CSSCRIPT.Text;
Po wprowadzeniu kodu należy nacisnąć przycisk
[Kompiluj i zapisz], a następnie, gdy w dolnej części okna zostanie wyświetlony napis „Kompilacja skryptu zakończyła się sukcesem” nacisnąć przycisk „Zamknij”.

6. zapisać typ obiegu za pomocą przycisku
[Zapisz]

Generowanie dokumentu FZ do Comarch ERP XL – jak działa
Po zdefiniowaniu typu obiegu operator przechodzi na zakładkę
[Dokumenty], klika na typ obiegu „Generowanie faktury zakupu” i naciska przycisk
[Dodaj]. Następnie kolejno:
1. zapisuje nowy dokument, naciskając
[Zapisz]
2. wybiera kontrahenta w ramach kontrolki „Kontrahent”
3. w ramach kontrolki „Elementy” dodaje towar w kolumnie „Towar”, wybiera opcję w kolumnach „Jm.” i „VAT” oraz wpisuje wartość w kolumnie „Cena netto” (jeśli poprawnie skonfigurowano obieg, wówczas kolumny „Cena brutto”, „Wartość Netto” i „Wartość Brutto” powinny zostać uzupełnione automatycznie)
4. naciska przycisk „Generuj dokument” – wówczas następuje generowanie dokumentu – poniżej przycisku widoczne są poruszające się punkty
5. Jeśli generowanie dokumentu zakończyło się powodzeniem, wówczas na środku ekranu wyświetlany jest następujący komunikat:

