Wydruk z Comarch Optima

Wydruk z Comarch Optima
b0bik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1114
0

Cześć, próbuję wydrukować dokument do pdf'a z Optimy. Ale coś nie idzie. Kod pisany na czuja, bo dokumentacji nie mogę się doszukać.

  • świeże demo optimy
  • Visual Studio 2022
  • aplikacja konsolowa

Jak pododawałem wszystkie odwołania, i z nuget'a pościągałem zależności, to dochodzi do ostatniej linijki i tam rzuca wyjątek że "Nie można załadować pliku lub zestawu 'Microsoft.Extensions.Logging.Abstractions, Version=8.0.0.2" - bo faktycznie ściągnięta jest wersja 9.0.1. Jak natomiast ściągne te startsze wersje, to znowu wywala się na tworzeniu LoginService - Message=Could not load file or assembly 'Microsoft.Extensions.Logging.Abstractions, Version=8.0.0.2

Oto cały kod:

Kopiuj
using CDNHeal;
using Optima.Common;
using Optima.Common.Logic.Services;

Environment.CurrentDirectory = @"C:\Program Files (x86)\Comarch ERP Optima";
/*
Jak zainstaluje pakiety z nuget w wersji 8.0.1, to poniższa linijka wyrzuca wyjątek:
System.IO.FileNotFoundException HResult=0x80070002
  Message=Could not load file or assembly 'Microsoft.Extensions.Logging.Abstractions, Version=8.0.0.2, Culture=neutral, PublicKeyToken=adb9793829ddae60'. Nie można odnaleźć określonego pliku.Source=Common
*/
LoginService login = new LoginService();
ModuleCollection mc = new ModuleCollection() { Module.KasaBank, Module.Handel };
login.Login("AA", "", "TEST", mc);
var ss = login.LoginInfo.CreateSession();
dynamic Parameters = Activator.CreateInstance(Type.GetTypeFromProgID("CDNLib.Dictionary"));
dynamic Format = Activator.CreateInstance(Type.GetTypeFromProgID("CDN.WydrFormat"));
Format.ZrodloID = 0;
Format.ID = 1834;
Format.FiltrSQL = "TrN_TrNId = 1";
Format.Sortowanie = "";
Format.Urzadzenie = 4;
Format.PlikDocelowy = "d:\\TEST.PDF";
Format.DodajZapytanieAktualizacjiDanychRecordsetu("SELECT * FROM cdn.TraNag WHERE TrN_TrNID = 1");
/* Jeśli mam wszystko poaktualizowane do wersji bieżącej 9.0.1, to dochodzi tutaj i poniższe wywołanie wyrzuca:
System.IO.FileLoadException HResult = 0x80131621
  Message = Nie można załadować pliku lub zestawu 'Microsoft.Extensions.Logging.Abstractions, Version=8.0.0.2, Culture=neutral, PublicKeyToken=adb9793829ddae60' lub jednej z jego zależności. Zlokalizowana definicja manifestu zestawu nie odpowiada odwołaniu do zestawu. (Wyjątek od HRESULT: 0x80131040) Source = Microsoft.CSharp
*/
Format.Wykonaj(Parameters); 

Plik projektu:

<project sdk="Microsoft.NET.Sdk"> <propertygroup> <outputtype>Exe</outputtype> <targetframework>net8.0</targetframework> <implicitusings>enable</implicitusings> <nullable>enable</nullable> <platforms>x86</platforms> </propertygroup> <itemgroup> <packagereference include="Microsoft.Extensions.DependencyInjection" version="8.0.1" /> <packagereference include="Microsoft.Extensions.Logging" version="8.0.1" /> <packagereference include="Microsoft.Extensions.Logging.Abstractions" version="8.0.2" /> <packagereference include="Microsoft.Win32.SystemEvents" version="8.0.0" /> <packagereference include="System.Configuration.ConfigurationManager" version="8.0.1" /> <packagereference include="System.Data.SqlClient" version="4.9.0" /> </itemgroup> <itemgroup> <reference include="ADODB"> <hintpath>..\..\..\..\..\Program Files (x86)\Comarch ERP Optima\Interop\adodb.dll</hintpath> </reference> ... I tutaj pozostałe dll'ki o które krzyczał

Coś chyba robię nie tak. Macie ktoś kawałek działającego kodu ?

b0bik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1114
0

Jeszcze informacyjnie - jak w tej apce po zalogowaniu pobieram kontrahentów, albo dodaję - to wszystko działa jak złoto.

FA
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: warszawa
  • Postów: 315
0

https://en.m.wikipedia.org/wiki/Dependency_hell

Pogoogluj jak zrobic cetral package manager w dot necie i version pinning.

AD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 342
0

A dlaczego nie zrobić raportu w menu? Koniecznie to musi być osobny kod?

b0bik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1114
0
Adin napisał(a):

A dlaczego nie zrobić raportu w menu? Koniecznie to musi być osobny kod?

Chciałbym żeby to była aplikacja konsolowa najlepiej. Bo to ma się uruchamiać w usłudze (windows service) na serwerze.
Dokopałem się do jakichś przykładów w końcu, i zadziałało - ale tylko jako aplikacja WinForms, w konsolowej ten sam kod na pewnym etapie rzuca że nie znaleziono System.Windows.Forms.dll - może biblioteki .net'owe są gdzieś uzależnione od WinForms ? Też jak to w końcu zadziałało, to pojawiało się takie okienko jakby z postępem wydruku. To też mi zupełnie nie potrzebne.

Tak pytanie nadal aktualne - czy ktoś ogarnął to drukowanie w aplikacji konsolowej ?
Przerobiłem też kod na Delphi, z użyciem późnego wiązania, no ale wywala błąd bez szczegółów w funkcji Wykonaj - "Parametr jest niepoprawny"

AdamWox
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Jastrzębie-Zdrój
  • Postów: 2180
1

Problem polega na tym, że Comarch ma dwa różne typy wydruków w Optimie - Crystal Reports oraz GenRap. Kod drukowania różni się w zależności od typu wydruku. W przypadku wydruków Crystal Reports, Optima otwiera okienko z pokazywaniem stanu ile wydruk ma stron oraz którą stronę aktualnie drukuje, dlatego marudzi, że nie ma System.Windows.Forms.dll. Prawdopodobnie wystarczy wrzucić System.Windows.Forms.dll do folderu w którym jest apka konsolowa.

Z własnego doświadczenia polecam zrobić projekt winforms i odpalać to tak samo jak aplikację konsolową z opcją "nie pokazuj okna". Wtedy nie będzie problemu z brakującą DLLką i wszystko się poprawnie wydrukuje. Dodatkowo przekażesz do Comarchu "kontekst" okna, bo COMy Optimy nie radzą sobie jako usługa, nie będzie działać dobrze jako usługa Windows i nie będzie działać dobrze jako API hostowane w IIS. To jest stara technologia, której nie chcą aktualizować, bo im nie zależy na pisaniu dodatków i rozszerzeń.

PS.
To samo się tyczy dependency injection - wszystkie obiekty klas, w których korzystasz z COMów z Optimy (logowanie, tworzenie sesji) muszą być "jawnie" stworzone poprzez new. Dependency injection w tym przypadku kompletnie odpada.

b0bik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1114
0
AdamWox napisał(a):

Problem polega na tym, że Comarch ma dwa różne typy wydruków w Optimie - Crystal Reports oraz GenRap. Kod drukowania różni się w zależności od typu wydruku. W przypadku wydruków Crystal Reports, Optima otwiera okienko z pokazywaniem stanu ile wydruk ma stron oraz którą stronę aktualnie drukuje, dlatego marudzi, że nie ma System.Windows.Forms.dll. Prawdopodobnie wystarczy wrzucić System.Windows.Forms.dll do folderu w którym jest apka konsolowa.

Z własnego doświadczenia polecam zrobić projekt winforms i odpalać to tak samo jak aplikację konsolową z opcją "nie pokazuj okna". Wtedy nie będzie problemu z brakującą DLLką i wszystko się poprawnie wydrukuje. Dodatkowo przekażesz do Comarchu "kontekst" okna, bo COMy Optimy nie radzą sobie jako usługa, nie będzie działać dobrze jako usługa Windows i nie będzie działać dobrze jako API hostowane w IIS. To jest stara technologia, której nie chcą aktualizować, bo im nie zależy na pisaniu dodatków i rozszerzeń.

PS.
To samo się tyczy dependency injection - wszystkie obiekty klas, w których korzystasz z COMów z Optimy (logowanie, tworzenie sesji) muszą być "jawnie" stworzone poprzez new. Dependency injection w tym przypadku kompletnie odpada.

Dziękuję ślicznie za wyjaśnienia. Apka WinForms działa jak złoto.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.