Autor Wątek: Sfera + c# + asp.net  (Przeczytany 1217 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Offline Onek

  • Nowy użytkownik
  • *
  • Wiadomości: 3
  • Reputacja +0/-0
  • Wersja programu: 1.66
Sfera + c# + asp.net
« dnia: 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.

Offline tomaszf

  • Zaawansowany użytkownik
  • ****
  • Wiadomości: 524
  • Reputacja +12/-0
  • Wersja programu: Subiekt GT 1.66
Odp: Sfera + c# + asp.net
« Odpowiedź #1 dnia: 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ć :/

Offline Onek

  • Nowy użytkownik
  • *
  • Wiadomości: 3
  • Reputacja +0/-0
  • Wersja programu: 1.66
Odp: Sfera + c# + asp.net
« Odpowiedź #2 dnia: 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ę

Offline dkozlowski

  • Ekspert
  • *****
  • Wiadomości: 17082
  • Reputacja +798/-27
  • Wersja programu: GT/Navireo/nexo
Odp: Sfera + c# + asp.net
« Odpowiedź #3 dnia: 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...
Daniel, Białystok.

Offline Onek

  • Nowy użytkownik
  • *
  • Wiadomości: 3
  • Reputacja +0/-0
  • Wersja programu: 1.66
Odp: Sfera + c# + asp.net
« Odpowiedź #4 dnia: 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.

Forum Użytkownikow Subiekt GT

Odp: Sfera + c# + asp.net
« Odpowiedź #4 dnia: Maj 28, 2024, 19:19:53 »