[API] Drukowanie

Zapytania SQL, widoki, Crystal, definicje filtrów, szybkich raportów, wydruków, API, Hydra, .NET

Moderator: mikey

pawel.sroczynski
Posty: 8
Rejestracja: 07 maja 2017, 20:54
Rola: Administrator CDN XL
Wersja: 2016

[API] Drukowanie

Post autor: pawel.sroczynski »

Cześć,

czy da się dla wskazanego dokumentu przy pomocy API lub jakkolwiek z command line wzbudzić drukowanie na konkretną drukarkę lub do pdf?

Potrzebę mam prostą: drukowanie faktury do pdf. Nic więcej.

Z góry dziękuję

RomanP
Posty: 145
Rejestracja: 24 lut 2013, 12:41
Rola: Administrator CDN XL
Lokalizacja: Skarżysko-Kamienna

Re: [API] Drukowanie

Post autor: RomanP »

Najprościej wykorzystać API:

................
var xlWydruk = new XLWydrukInfo_20163
{
Wersja = WersjaApi,
Zrodlo = source,
Wydruk = wydruk,
Format = format,
FiltrSQL = filtrSql,
NazwaDrukarki = printer,
Urzadzenie = urzadzenie,
};
try
{
printReturn = cdn_api.cdn_api.XLWykonajPodanyWydruk(xlWydruk);
}
............................

pawel.sroczynski
Posty: 8
Rejestracja: 07 maja 2017, 20:54
Rola: Administrator CDN XL
Wersja: 2016

Re: [API] Drukowanie

Post autor: pawel.sroczynski »

Dzięki Roman

Przepraszam - nie wspomniałem, że chodzi o Comarch ERP Optima.
Chyba naweł dodałem wątek nie w tym dziale :? Wybaczcie.

W każdym razie dziś powstało coś takiego:

Kod: Zaznacz cały

            AdoSession Sesja = login.CreateSession();
            Type type = Type.GetTypeFromProgID("CDN.WydrFormat", true);
            dynamic Format = Activator.CreateInstance(type);
            SetProperty(Format, "GenRapReportType", 4);
            SetProperty(Format, "GenRapNewReportInitObjects", "FakturaSpr");
            dynamic ZmiennaDyn = Activator.CreateInstance(Type.GetTypeFromProgID("CDNLib.Dictionary"));
            SetProperty(Format, "ZrodloID", 0);
            SetProperty(Format, "ID", 40); // ID Wydruku!
            // 1932 działa, ale to nie jest lista obecnosci a nie faktura!

            SetProperty(Format, "FiltrSQL", "TrN_TRNID = 378215");
            SetProperty(Format, "Urzadzenie", 4);
            SetProperty(Format, "FormatPlikuDocelowego", 2); //PDF
            SetProperty(Format, "PlikDocelowy", "d:\\test.pdf");
            SetProperty(Format, "Drukarka", "Microsoft Print to PDF");
            InvokeMethod(Format, "Wykonaj", new object[] { ZmiennaDyn });
Moje pytania:
1. W jaki sposób wskazac szablon / wydruk źrodłowy jednoznacznie po ID?
Chodzi o to, że primary key jest composite czyli jest złożony z dwóch kolumn: Wdr_ID oraz Wdr_Standardowy
W tabeli CDN.Wydruki mam dwa szablony o ID=40: jeden to faktura a drugi to lista obecności. :roll:
API pobiera nie ten który chciałbym czyli liste obecności.

W jaki sposób podać ID poprawnie?
Jest też parametr WydrukID ale jak go podam to wtedy w SQL nastepuje dopasowanie do kolumn [Wdr_RpWID] i [Wdr_RpFID] ale te kolumny zazwyczaj mają różne wartości, więc niewiele to pomaga.

2. Gdy używam ID wydrukuk (Wdr_ID=605) czyli "Faktura VAT - Wzór standard", to otrzymuję komunikat MessageId = WydrukBrakZaznaczen.
Wiadomo dlaczego? Czy w kodzie jest jakiś błąd?

3. Gdy użyję fakturę VAT bez VAT (ID=1932), to mam pustą fakturę bez danych.
Wiadomo dlaczego? Czy w kodzie jest jakiś błąd?

4. Jeśli użyję Faktura wzór standard z ID = 372 to wyskakuje mi błąd w Message Box:

Kod: Zaznacz cały

---------------------------
OCEAN GenRap
---------------------------
W aplikacji OCEAN GenRap wystąpił nieoczekiwany błąd: 
"UFN data may not be null"
---------------------------
OK   
---------------------------
A może to wszystko powinno inaczej wyglądać?

Z góry dzięki za pomoc.

kluchol
Posty: 11
Rejestracja: 28 lut 2019, 10:18
Rola: Inny
Wersja: 2019

Re: [API] Drukowanie

Post autor: kluchol »

Cześć,

i udało się rozwiązać jakoś ten problem, coś pomożesz?

pawel.sroczynski
Posty: 8
Rejestracja: 07 maja 2017, 20:54
Rola: Administrator CDN XL
Wersja: 2016

Re: [API] Drukowanie

Post autor: pawel.sroczynski »

Cześć

Niestety nie udało się.
Nadal jestem zainteresowany rozwiązaniem.

taszek
Posty: 587
Rejestracja: 12 wrz 2012, 13:20
Rola: Administrator CDN XL
Wersja: 2016

Re: [API] Drukowanie

Post autor: taszek »

Pole ZrodloID przyjmuje wie wartośco 0 i 1.
Gdzie:
0 - oznacza wydruk standardowy (ten, który z programem jest dostarczany)
1 - oznacza wydruk użytkownika (ten, który sam sobie dodasz)

Pole ID odnosi się do tej wartości:
Ashampoo_Snap_2022.03.02_07h48m41s_001_Edycja wydruku.jpg
Ashampoo_Snap_2022.03.02_07h48m41s_001_Edycja wydruku.jpg (47.99 KiB) Przejrzano 4786 razy
No i aby wydruk ci się wydrukował musisz przekazać jeszcze filtr.
Poniżej przykład funkcji wydruku w JS:

Kod: Zaznacz cały

function WykonajWydrukFS(Filtr , Drukarka_ , Path  )
\{
		

                var ZmienneDyn = new ActiveXObject("CDNLib.Dictionary")
	        var Format = new ActiveXObject("CDN.WydrFormat")
                var ZmiennaDyn = new ActiveXObject("CDN.ZmiennaDyn")
		 

		//Jeśli wydruk ma drukować się do "maila" lub do "kopii elektronicznej" 
		//konieczne jest przekazanie obiektu do pola OptimaObjectTypeInfo

        	var rDok = ss.CreateObject("CDN.DokumentyHaMag").Item( ""  +  Filtr )
		Format.OptimaObjectTypeInfo = rDok

                        
			Format.ZrodloID = 0
			
			Format.ID       = 372
			Format.FiltrTPS   = Filtr
			Format.FiltrSQL   = Format.FiltrTPS
			Format.Sortowanie = ""
			Format.Urzadzenie = ??CDN_Urzadzenie
			Format.GenRapContextAttribute = "TrNEdycjaFA"

			if ( ??CDN_Urzadzenie == 3 )  Format.Drukarka = Drukarka_

			var sciezka = Path

                                                
						while ( sciezka.search( /\\/ ) != -1 || sciezka.search( /\// )!=-1 )
						        sciezka = sciezka.replace( /\\/ ,"_").replace(/\//,"_")

                                                sciezka = sciezka.replace("_**","_FA_")

			Format.PlikDocelowy =  sciezka

			Format.Wykonaj(ZmienneDyn)

return ""

\}
Pozdrawiam
Wojtek Cyrklewicz

pawel.sroczynski
Posty: 8
Rejestracja: 07 maja 2017, 20:54
Rola: Administrator CDN XL
Wersja: 2016

Re: [API] Drukowanie

Post autor: pawel.sroczynski »

Dzięki Wojtek

Możesz mi jeszcze wkleić jak wywołujesz funkcję i jak wygląda filtr?

Właśnie spróbowałem ustawić "ZrodloID = 1" i nie rzuciło żadnym wyjątkiem, ale też nie zapisało pliku eksportu nigdzie.
Szukam przyczyny.

Kod:

Kod: Zaznacz cały

var documentsInfo = (DokumentHaMag)dbSession.CreateObject(
                    "CDN.DokumentyHaMag", "[TrN_NumerPelny]='" + receiptNumber + "' ");

                var fileName = $"{receiptNumber.NormalizeFilename()}.pdf";
                var filePath = Path.Combine(_outputFilesPath, fileName);

                var format = new WydrFormat
                {
                    GenRapReportType = 4,
                    GenRapNewReportInitObjects = "FakturaSpr",
                    OptimaObjectTypeInfo = documentsInfo,
                    ZrodloID = 1,
                    ID = _printTemplateIdentifier,
                    FiltrSQL = "TrN_NumerPelny = '" + receiptNumber + "'",
                    Urzadzenie = (int)UrzadzenieWydrukuTyp.PlikEksp,
                    FormatPlikuDocelowego = (int)UrzadzenieWydrukuFormatEksportu.PortableDocFormat,
                    PlikDocelowy = filePath
                };

                var zmienne = new CDNLib.Dictionary();
                format.Wykonaj(zmienne);

pawel.sroczynski
Posty: 8
Rejestracja: 07 maja 2017, 20:54
Rola: Administrator CDN XL
Wersja: 2016

Re: [API] Drukowanie

Post autor: pawel.sroczynski »

Sprawdziłem co mogłem w kwestii samych wydruków.
Wydruki Crystal reports działają.
Wydruki Genrap nie.

Różnica jest taka, że pod spodem uruchamiana jest aplikacja GenRapClient.exe jako osobny proces.
Jej uruchomienie nie kończy się zapisanym plikiem PDF.

Czy ktoś może drukował dokumenty przy użyciu api oraz szablonów Genrap zamiast Crystal?

taszek
Posty: 587
Rejestracja: 12 wrz 2012, 13:20
Rola: Administrator CDN XL
Wersja: 2016

Re: [API] Drukowanie

Post autor: taszek »

Ja drukuję z ERP Optima za pomocą COM wydruki GenRap.

Poniżej kod funkcji, która drukuje mi z listy faktur seryjnie dokumenty zaznaczone, wywoływany wydruk jest GenRap.

Kod: Zaznacz cały

[SQL]

--@PAR ?@Hs200_NQ|Filtr:''@? PAR@
--@PAR ?@Hn1|CDN_Urzadzenie|CDN_Urzadzenie:2@? PAR@
--@PAR ?@Hs200|Printer|Printer:''@? PAR@
--@PAR ?@Hs255|CDN_PlikDocelowyBezRozszerzenia|CDN_PlikDocelowyBezRozszerzenia:''@? PAR@
--@PAR ?@Hs255|CDN_PlikDocelowyRozszerzenie|CDN_PlikDocelowyRozszerzenie:''@? PAR@
--@PAR ?@X|CDN_DaneJednostkiSamorzadowejNaWydruku|&CDN_DaneJednostkiSamorzadowejNaWydruku:0@? @H() PAR@



SELECT RpZ2_GIDNumer,Printer= ??_QPrinter , Trn_NumerPelny, TrN_Rodzaj, TrN_PCID, TrN_PCJSID
FROM CDN.RptZaznaczenia2
join CDN.TraNag on TrN_TrNId = RpZ2_GIDNumer
WHERE (TrN_FVMarza=0 or TrN_FVMarza is Null) and TrN_Rodzaj in (
--Faktura sprzedaży 302  
302000 ,
--Faktura sprzedaży z wygenerowanym WZ 302 
302004 ,
--Faktura sprzedaży z paragonu 302 
302006 ,
--Faktura sprzedaży Z RO 302 
302008 ,
--Faktura sprzedaży Z Pro-Formy 302 
302009 ,
--Faktura sprzedaży z wydania kaucji 302 
302090 ,
--Faktura sprzedaży pierwotna 302 
302100,
--Faktury sprzedaży korekty
302001, 302002, 302003, 302005, 302007, 302081, 302082, 302083, 302091, 302092, 302101, 302102, 302103) and  
?@Hs200_NQ|Filtr:''@?
order by TrN_NumerString,TrN_NumerNr

[XSL]
<xsl:stylesheet  version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
xmlns:usr="urn:the-xml-files:xslt" >
<xsl:output omit-xml-declaration="yes" method="html"/>
<msxsl:script language="JScript" implements-prefix="usr">
<![CDATA[	




	function WykonajWydrukFS(Filtr,Drukarka_,NrDokumentu,Rodzaj,PCID,PCJSID)
		\{
 var result=""
 var bt  = new ActiveXObject ("CDNBase.BaseTools")
 var ot  = new ActiveXObject ("CDN.OptimaTools")
 var ss  = ot.Session.Login.CreateSession()  //bt.Login.CreateSession()
  
      try \{
      var ZmienneDyn = new ActiveXObject ("CDNLib.Dictionary")
			var ZmiennaDyn = new ActiveXObject ("CDN.ZmiennaDyn")
var ZmiennaDynA = new ActiveXObject ("CDN.ZmiennaDyn")
var ZmiennaDynB = new ActiveXObject ("CDN.ZmiennaDyn")
var ZmiennaDynC = new ActiveXObject ("CDN.ZmiennaDyn")
			var Format     = new ActiveXObject ("CDN.WydrFormat")

			Format.ZrodloID = 1

if ( Rodzaj=="302000" || Rodzaj=="302004" || Rodzaj=="302006" || Rodzaj=="302008" || Rodzaj=="302009" || Rodzaj=="302090" || Rodzaj=="302100")
			
\{      		
			Format.ID       = 28
\}

if ( Rodzaj=="302001" || Rodzaj=="302005" || Rodzaj=="302081" || Rodzaj=="302091" || Rodzaj=="302101")
\{      		Format.WydrukID = 746
			Format.ID       = 1
\} 

if ( Rodzaj=="302002" || Rodzaj=="302007" || Rodzaj=="302082" || Rodzaj=="302092" || Rodzaj=="302102")
\{      		Format.WydrukID = 813
			Format.ID       = 3
\} 

if ( Rodzaj=="302003" || Rodzaj=="302083" || Rodzaj=="302103")
\{      		Format.WydrukID = 816
			Format.ID       = 1
\} 
			Format.FiltrTPS   = "trn_trnID=" + Filtr
			Format.FiltrSQL   = Format.FiltrTPS
			Format.Nazwa + "_" + Filtr +".pdf"
			Format.Sortowanie = ""
			Format.Urzadzenie = ??CDN_Urzadzenie
Format.IloscKopii = 1
			Format.DodajZapytanieAktualizacjiDanychRecordsetu("SELECT * FROM cdn.TraNag WHERE TrN_TrNID = " + Filtr);



      ZmiennaDyn.Nazwa   = "Identyfikator"
      ZmiennaDyn.Wartosc =   Filtr   
      ZmienneDyn.Add(ZmiennaDyn.Nazwa,ZmiennaDyn)

	ZmiennaDynA.Nazwa   = "TRN_PCID"
      ZmiennaDynA.Wartosc =   PCID   
      ZmienneDyn.Add(ZmiennaDynA.Nazwa,ZmiennaDynA)

	ZmiennaDynB.Nazwa   = "TRN_PCJSID"
      ZmiennaDynB.Wartosc =   PCJSID   
      ZmienneDyn.Add(ZmiennaDynB.Nazwa,ZmiennaDynB)


	ZmiennaDynC.Nazwa   = "CDN_DaneJednostkiSamorzadowejNaWydruku"
      ZmiennaDynC.Wartosc =   ??CDN_DaneJednostkiSamorzadowejNaWydruku   
      ZmienneDyn.Add(ZmiennaDynC.Nazwa,ZmiennaDynC)

	// if ( ??CDN_Urzadzenie != 3 )
	\{
		 var rDok = ss.CreateObject("CDN.DokumentyHaMag").Item( ""  +  Filtr )      
                                if ( rDok.Waluta.CzySystemowa == 0 ) throw "Drukowane mogą być tylko wydruki w walucie systemowej. Waluta dokumentu to: " + rDok.Waluta.Symbol 
	 	Format.OptimaObjectTypeInfo = rDok
	\}
 
 			if ( ??CDN_Urzadzenie == 3 ) Format.Drukarka = Drukarka_
			//Format.PlikDocelowy =  ??CDN_PlikDocelowyBezRozszerzenia + Filtr + "." + ??CDN_PlikDocelowyRozszerzenie;

var NrDok = NrDokumentu

Format.WatekID=Filtr

while ( NrDok.search( /\\/ ) != -1 || NrDok.search( /\// )!=-1 )
         NrDok = NrDok.replace( /\\/ ,"_").replace(/\//,"_")

    var ZmiennaDyn1 = new ActiveXObject ("CDN.ZmiennaDyn")
    ZmiennaDyn1.Nazwa   = "EMAIL_ATTACHFILEPREFIX"
    ZmiennaDyn1.Wartosc = NrDok

ZmienneDyn.Add(ZmiennaDyn1.Nazwa,ZmiennaDyn1)


			Format.Wykonaj(ZmienneDyn)
      \} catch(e) \{   result ="- "+e+ " -" + e.description   \}
    if   (result =="")  result = "Wysłano do wydruku dokument : " + NrDokumentu
    else result = "Nastąpił błąd przy wydruku dokumentu : "+ NrDokumentu + " : "+ result 
	return result+"\r\n"
		\}
		
    ]]>
  </msxsl:script>
<xsl:output omit-xml-declaration="yes"/>
<xsl:preserve-space elements="*"/>

<xsl:template match="/">
	<xsl:for-each select="ROOT">
Raport wydruku zaznaczonych dokumentów.

<xsl:apply-templates select="RECORDSET1"/>
	</xsl:for-each>
Koniec drukowania
</xsl:template>

<xsl:template match="RECORDSET1">
<xsl:apply-templates select="RECORD" mode="r1"/>
</xsl:template>


<xsl:template match="RECORD" mode="r1">
	<xsl:value-of select="usr:WykonajWydrukFS(string(@RpZ2_GIDNumer),string(@Printer), string(@Trn_NumerPelny), string(@TrN_Rodzaj), string(@TrN_PCID), string(@TrN_PCJSID))"/>
</xsl:template>


</xsl:stylesheet>

[RUN]
Pozdrawiam
Wojtek Cyrklewicz

Awatar użytkownika
Tym
Posty: 27
Rejestracja: 05 kwie 2019, 09:32
Rola: Inny
Wersja: 2019

Re: [API] Drukowanie

Post autor: Tym »

Czy komuś udało się dotrzeć do tego jak ustawić nazwę pliku PDF, do którego Optima ma generować wydruk?

ODPOWIEDZ