Forum Użytkownikow Subiekt GT

InsERT GT => Dodatki - zestawienia - sfera => Wątek zaczęty przez: Onek w Maj 26, 2024, 19:16:43

Tytuł: Sfera + c# + asp.net
Wiadomość wysłana przez: Onek w Maj 26, 2024, 19:16:43
Kopia tematu z forum subiekta, wydaje mi się że to lepsze miejsce. Nie rozejrzałem się po kategoriach przed utworzeniem tematu :).
http://www.forumsubiekta.pl/subiekt/sfera-c-asp-net/

Cześć.
Jestem świeżym użytkownikiem sfery z subiektem, a trochę doświadczenia mam z pisaniem aplikacji w c#.

Chce napisać aplikację web api w .net 8, która będzie integrowała się z subiektem poprzez sferę.
No i natrafiłem na probilem, którego nie mogę przeskoczyć. Mianowicie w momencie inicjalizacji obiektu GT w mojej metodzie dostaje błąd
Cytuj
System.Runtime.InteropServices.COMException (0x8000FFFF): Creating an instance of the COM component with CLSID {F8605331-7454-4A45-98DB-A69EBB3D2947} from the IClassFactory failed due to the following error: 8000ffff Katastrofalny błąd. (0x8000FFFF (E_UNEXPECTED)).

Tak wygląda mój kodzik
public void CreateDoc()
{
 try
 {
     var gt = new GT();
     gt.Serwer = _subiektConfig.Server;
     gt.Baza = _subiektConfig.Database;
     gt.Autentykacja = AutentykacjaEnum.gtaAutentykacjaMieszana;
     gt.Uzytkownik = _subiektConfig.DbUser;
     gt.UzytkownikHaslo = _subiektConfig.DbPassword;
     gt.Operator = "Szef";

     var subiekt = (Subiekt)gt.Uruchom((Int32)UruchomDopasujEnum.gtaUruchomDopasuj, (Int32)UruchomEnum.gtaUruchomNieArchiwizujPrzyZamykaniu);
     subiekt.Okno.Widoczne = false;
     return subiekt;
 }
 catch (Exception)
 {

     throw;
 }
}

Błąd jest już na linii
var gt = new GT();

Czy ktoś może spotkał się z takim problemem. Problem jest w trakcie debugowania programu z poziomu Visual Studio 2022.
Wersja subietka to :1.77

Przez ten problem nie przebrnąłem w żadnych kolejnych czynnościach, a chciałbym za pomocą sfery generować faktury poprzez właśnie web api.
Czy ktoś może spotkał się z takim problemem i jest w stanie nakierować na rozwiązanie.
Przyznam, że nie miałem dotychczas za dużo doczynienia z API pisanymi przez COM.
Tytuł: Odp: Sfera + c# + asp.net
Wiadomość wysłana przez: tomaszf w Maj 28, 2024, 14:08:09
Udało Ci się coś zaradzić?

Też się z tym zderzyłem właśnie i ni jak nie mogę tego rozwiązać :/
Tytuł: Odp: Sfera + c# + asp.net
Wiadomość wysłana przez: Onek w Maj 28, 2024, 15:01:59
Wygląda na to, że tak.
Nie testowałem jeszcze w pełni rozwiązania ale jakąś przykładową fakture udało się przepchać.
Doszedłem do wniosku, że API Subiekta ma problem z wielowątkowością, więc samemu zarządzam wątkiem, który wykonuje zapytania do subiekta.
Przykładowy kodzik (bardzo testowy, nie miałem czasu jeszcze tego zrobić porządnie) jak to u mnie działa.

Wywołanie API:
public void OpenComConnection(Action<Subiekt> useComObject)
{
    var thread = new Thread(() =>
    {
        Subiekt subiekt = null;
        try
        {
            var gt = new GT();
            gt.Serwer = _subiektConfig.Server;
            gt.Baza = _subiektConfig.Database;
            gt.Autentykacja = AutentykacjaEnum.gtaAutentykacjaMieszana;
            gt.Uzytkownik = _subiektConfig.DbUser;
            gt.UzytkownikHaslo = _subiektConfig.DbPassword;
            gt.Operator = "Szef";
            gt.OperatorHaslo = "";
            subiekt = (Subiekt)gt.Uruchom((Int32)UruchomDopasujEnum.gtaUruchomDopasuj, (Int32)UruchomEnum.gtaUruchomNieArchiwizujPrzyZamykaniu);
            subiekt.Okno.Widoczne = false;
            useComObject(subiekt);
       
        }
        catch (Exception)
        {

            throw;
        }
        finally
        {
            if (subiekt != null)
            {
                Marshal.ReleaseComObject(subiekt);
            }
        }
    });

    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
    thread.Join();
}

Użycie api z jakąś wybraną funkcją:
public void CreateDoc()
 {
     _builderService.OpenComConnection(subiekt =>
     {
         var kfs = subiekt.SuDokumentyManager.DodajKFSn();
         kfs = (InsERT.SuDokument)subiekt.Dokumenty.Dodaj(InsERT.SubiektDokumentEnum.gtaSubiektDokumentKFSn);
         kfs.KontrahentId = 303;
         kfs.Wystawil = "Szef";
         kfs.DoDokumentuDataWystawienia = "25/05/2024";


         var kfsEl = kfs.Pozycje.Dodaj(6) as InsERT.SuPozycjaKorekty;
         kfsEl.CenaNettoPrzedRabatem = 15.23;
         kfsEl.CenaNettoPrzedRabatemPoKorekcie = 15.23;
         kfsEl.IloscJm = 2;
         kfsEl.IloscJmPoKorekcie = 2;

         kfs.Zapisz();
         kfs.Zamknij();
     });
 }

_builderService to interfejs wstrzyknięty przez konstruktor gdzie zdefiniowałem pierwszą metodę
Tytuł: Odp: Sfera + c# + asp.net
Wiadomość wysłana przez: dkozlowski w Maj 28, 2024, 16:36:05
Doszedłem do wniosku, że API Subiekta ma problem z wielowątkowością, więc samemu zarządzam wątkiem, który wykonuje zapytania do subiekta.

Można o tym przeczytać w FAQ pomocy do Sfery...
Tytuł: Odp: Sfera + c# + asp.net
Wiadomość wysłana przez: Onek w Maj 28, 2024, 19:19:53
W takim razie dzięki za wskazówkę wcześniej ;).
Jak pisałem ze sferą to moje pierwsze przetarcie i rzeczy oczywiste mogą nie być oczywiste.