Forum Użytkownikow Subiekt GT
InsERT GT => Dodatki - zestawienia - sfera => Wątek zaczęty 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
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.
-
Udało Ci się coś zaradzić?
Też się z tym zderzyłem właśnie i ni jak nie mogę tego rozwiązać :/
-
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ę
-
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...
-
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.