enova dla profesjonalistów
Profil
Wyszukaj
Wyszukaj:
Odpowiedz
Wydruk dokumentu handlowego i raportu
Użytkownik
Postów: 6
Punkty: 7
Witam.

Proszę o pomoc, jeśli ktoś posiada informację jak uruchomić wydruk dokumentu z Enovy z zewnętrznego programu byłbym bardzo wdzięczny za informację.

Ogólnie wydaje mi się, że mój program już prawie działa pojawia się taki błąd po wywołaniu metody generator.Print:
Cytat
Problem z drukowaniem raportu:Spodziewany token <


Wygląda jakby to był problem z raportem .aspx
Ale jaki token jest spodziewany tego już debug nie określił.
W każdym razie próbowałem usuwać po kawałku kodu z działającego wydruku i dotarłem do pustego raportu aspx ale nawet to nie pomogło, błąd nadal ten sam.

Poniżej mój kod:
Kod:

using (Session session = login.CreateSession(false, false))
{
HandelModule hm = HandelModule.GetInstance(session);
using (ITransaction trans = session.Logout(true))
{
var dok = hm.DokHandlowe.WgNumer["FV/02390/17"].CreateView();
if (dok.Count() > 0)
{
//Context cx = dok.Context;
Context cx = Context.Empty.Clone(session);
log(((DokumentHandlowy)dok[0]).NumerPelnyZapisany);
foreach (DokumentHandlowy szt in dok)
{
try
{
//string raport = @"D:\WYDRUKI ENOVA\handel\faktura.aspx";
string raport = @"D:\WYDRUKI ENOVA\handel\sprzedaz.aspx";
//string raport = @"D:\WYDRUKI ENOVA\handel\dokumenty sprzedazy.aspx";
string sciezka = @"D:\F\test.pdf";

Soneta.Printer.AspGenerator generator = new Soneta.Printer.AspGenerator();
generator.Prompt = true;
generator.Name = "Wydruk FV";
generator.TemplateFileName = raport;
generator.Destination = AspGenerator.Destinations.PDF;
generator.Enabled = true;
generator.OutputFileName = sciezka;
generator.TemplateASPX = raport;

generator.Print(Soneta.Forms.FormsTools.MainForm, cx, false, new DokumentHandlowy[] { szt });
}
catch (System.IO.FileNotFoundException) { throw new Exception("Nie znaleziono wzorca wydruku" ); }
catch (Exception ex) { throw new Exception("Problem z drukowaniem raportu:" + ex.Message); }
finally
{
System.Threading.Thread.Sleep(3000);
log("drukowanie: zakończono " ) ;
}

}
}
else { log("brak dokumentów" ) ; }
}
session.Save();

}

log("zakończone" ) ;


Dodam jeszcze, że kiedy kontekst cx = doc.Context to przechodzi bezbłędnie, ale nic nie drukuje.
------- edit
P.S. znalazłem głupotę którą tu zrobiłem. Do generatora podstawiłem plik
Kod:
generator.TemplateFileName = raport;

a potem ten sam plik próbowałem podać bezpośrednio jako ASPX, a tego nie powinno być.
Kod:
generator.TemplateASPX = raport;

Do TemplateASPX mógłbym wpisać bezpośrednio <html></html> a nie podawać ścieżkę do pliku.
Po usunięciu tego przykład zadziała, ale jest gorszy i starszy niż przykład Wojtka.
___________________
Ostatnio zmodyfikowany przez MajerM 2017-09-01 08:02:10
Offline
Profil
Wiadomość
Global Admin
Magnat
Postów: 73
Pochwały: 10
Punkty: 126
Metoda Soneta.Printer.AspGenerator jest przestarzała, lepiej używać nowszych mechanizmów ReportResult i IReportService.

Szablon aspx może być lokalnie na dysku lub z bazy (AspxSource.Storage)

Kod:
private bool WydrukujFV(DokumentHandlowy dok, ref string pdfFile)
{
try
{

Soneta.Business.Context context = Soneta.Business.Context.Empty.Clone(dok.Session);
context.Set(dok);
string path = System.IO.Path.GetTempPath();
string pathaspx = @"aspx/webservice/sprzedaz.aspx";
// string pathaspx = Path.Combine(path, "Wydruki\\Szablony\\sprzedaz.aspx");
string pathpdf = Path.Combine(path, pdfFile);
if (File.Exists(pathpdf))
{
try
{
File.Delete(pathpdf);
}
catch
{
return false;
}
}

var rr = new ReportResult
{
TemplateFileSource = AspxSource.Storage,
TemplateFileName = pathaspx,
Format = ReportResultFormat.PDF,
Context = context
};

ParametryWydrukuDokumentu param = new ParametryWydrukuDokumentu(context);
param.Oryginał = true;
param.Duplikat = false;
if (!context.Contains(typeof(ParametryWydrukuDokumentu)))
context.Set(param);

IReportService rs;
context.Session.GetService(out rs);

Stream pdfs = rs.GenerateReport(rr);

using (FileStream fs = new FileStream(pathpdf, FileMode.Create))
{
pdfs.CopyTo(fs);
}


if (File.Exists(pathpdf))
{
pdfFile = pathpdf;
return true;
} else return false;
}
....
Autor postu otrzymał pochwałę
Offline
Profil
Wiadomość
Użytkownik
Postów: 6
Punkty: 7
Dziękuję za odpowiedź i konkretny przykład. Zaimplementowałem u siebie, jednak pojawił się błąd.

w miejscu pobierania serwisu - context.Session.GetService(out rs);
Cytat
Nieudana próba utworzenia serwisu Soneta.Business.UI.IReportService


Czy te metody są tak nowe, że w wersji 12.2 jeszcze nie działają? Z tego co kojarzę to nowe drukarki pdf wprowadzono już z rok temu.
--------- edit
Przekompilowałem na najnowszych bibliotekach jednak błąd jest dalej.
Google też zbytnio nie potrafi powiedzieć dlaczego.
Jakaś sugestia?
___________________
Ostatnio zmodyfikowany przez MajerM 2017-08-29 07:22:40
Offline
Profil
Wiadomość
Użytkownik
Postów: 6
Punkty: 7
Ok, problem już rozwiązany, może się komuś przyda. Dziękuję Wojtku za ogromną pomoc.

Przy aplikacji zewnętrznej trzeba załadować wszystkie biblioteki w taki sposób:
Kod:
Soneta.Start.Loader loader = new Soneta.Start.Loader();
loader.WithExtensions = true;
loader.WithUI = true;
loader.WithExtra = true;
loader.Load();

Do tego potrzebny jest jeszcze plik Soneta.files.xml który jest w katalogu enovy.
Offline
Profil
Wiadomość
Użytkownik
Postów: 6
Punkty: 7
Poproszę jednak jeszcze raz o pomoc. Jak ustawić kontekst dla
- listy faktur sprzedaży (podpinam prawidłowy wydruk, kontekst ustawiam dla dokumentów handlowych mimo to nie działa)
- listy zobowiązań i należności
- niezapłaconych zobowiązań kontrahenta

----------- edit
O co chodzi z błędem :
Cytat
Właściwość o nazwie 'DokHandloweViewInfo+WParams.Definicja' nieznaleziona w obiekcie (Context).
___________________
Ostatnio zmodyfikowany przez MajerM 2017-09-06 14:42:06
Offline
Profil
Wiadomość
Global Admin
Magnat
Postów: 73
Pochwały: 10
Punkty: 126
To są parametry z górnej belki na liście w enova. W wydrukach często te wartości są pobierane informacyjnie do nagłówka. W zewnętrznej aplikacji nie będziemy tego mieli w kontekście. Same dokumenty również pobieramy bezpośrednio z tabel danego modułu. Można spróbować stworzyć instancję tej klasy i wrzucić do kontekstu (context.Set) lub zmodyfikować odpowiednio wydruk tak aby działał niezależnie od listy.
Offline
Profil
Wiadomość
Użytkownik
Postów: 7
Punkty: 7
Witam.
Czy ktoś miał potrzebę wywołania wydruku paragonu lub faktury fiskalizowanej na drukarce fiskalnej? Szukam sposobu jak można by to zrobić. Do komunikacji z enova używam WebServicu i przy nim chciałbym pozostać.
Offline
Profil
Wiadomość
Odpowiedz
Powered by MWCMS.php       MAGNAT © 2011 All rights reserved.       Copyright © 2011 BY Magnat Sp. z .o.o.
PHP  MySQL  SMARTY  XHTML 1.1  CSS