enova 8.0 CRM

Transkrypt

enova 8.0 CRM
Ekspert radzi –
mechanizm w enova, umożliwiający wskazanie domyślnej drukarki dla
danego stanowiska i wydruku.
Strona 1 z 8
Ekspert radzi.
Spis treści
1.
2.
Zarys rozwiązania .........................................................................................................3
1.2
Case study ...............................................................................................................3
1.3
Wymagania ..............................................................................................................3
Projekt ...........................................................................................................................3
2.2
Przygotowanie konfiguracji .......................................................................................3
2.3
Szablon projektu.......................................................................................................4
2.4
Rozszerzenie funkcjonalności ..................................................................................5
2.5
Dodatki: pełen kod źródłowy .....................................................................................6
Strona 2 z 8
Ekspert radzi.
1. Zarys rozwiązania
1.2
Case study
Coraz częstszą praktyką stosowaną w przedsiębiorstwach jest automatyzacja pewnych
„wzorcowych”, powtarzalnych procesów w firmie. Przyjmijmy zatem następujący
scenariusz do zaimplementowania w enova.
Operator modułu handel, po zakończeniu wystawiana faktury gotówkowej na jednej
drukarce drukuje FV, a na innej KP. Następnie na magazynach w rozbiciu na miejsce
przebywania towarów drukowały by się wydania zewnętrzne.
Dodatkowo można by sterować w ramach wydruku różnymi sterownikami (tzn. wielokrotność
zainstalowanej danej drukarki z różnymi preferencjami np.1 sterownik drukuje z podajnika nr
1 gdzie jest włożony papier z nadrukami w kolorze) a sterownik nr 2 drukuje z zasobnika nr2
w którym załadowany jest zwykły papier.
Plan zatem, który chcemy osiągnąć: umożliwienie dla danego stanowiska i wydruku wskazanie domyślnej drukarki.
1.3
Wymagania
W celu implementacji poniższego rozwiązania konieczne jest spełnienie następujących
składowych:
Podstawowa wiedza z zakresu programowania obiektowego (C#, .NET)
Skonfigurowane środowisko programistyczne (API) – framework .NET, aktualne biblioteki
logiki enova (Soneta.Business, Soneta.Printer etc.), Microsoft Visual Studio 2005 wzwyż.
Środowisko testowe – enova, kilka osobnych stanowisk, różne sterowniki drukarek.
2. Projekt
2.2
Przygotowanie konfiguracji
W naszym przykładzie stworzymy tylko prosty zarys rozwiązania, które następnie będzie
można do woli modyfikować i rozbudowywać o nowe funkcjonalności. Podstawą będzie
trywialna podmiana domyślnej drukarki na czas wydruku na jednym stanowisku. Jako, że
chcemy by w dalszej przyszłości zmiany były zależne od operatora oraz wzorca wydruku,
przygotujmy wstępnie taką konfigurację, która umożliwi nam osiągnięcie takiej
funkcjonalności bez zbędnych zabiegów środowiskowych czy rekompilacji dodatku.
Strona 3 z 8
Ekspert radzi.
W tym celu nasz worker wzbogacimy o parsowanie własnego XML wrzuconego do tej
samej lokalizacji co pliki konfiguracyjne enova (%APPDATA%\Soneta) gdzie będzie
definiowany sterownik drukarki.
Przykładowa struktura pliku XML (Ustawienia drukarki.xml) wykorzystana w poniższym przykładzie.
Bez problemu dzięki temu można rozbudować funkcjonalność np. odnośnie skojarzenia
wzorca aspx (wystarczy dodanie zupełnie nowej gałęzi do Items np. <report>Handel \
Sprzedaż.aspx</report>) z drukarką i kontekstem w którym operator aktualnie znajduje
się w programie oraz odpowiednią przeciążyć metodę parsującą. Za obsługę natomiast od
strony stanowiska odpowiada już sam XML konfiguracyjny.
2.3
Szablon projektu
Pełen kod projektu wraz z komentarzami zamieszczono na końcu artykułu.
Projekt rozpoczynamy od załadowania wymaganych bibliotek enova (klauzula using).
Następnie definiujemy własny namespace i budujemy w niej główną klasę naszego
projektu.
Przykładowy worker został jak widać zarejestrowany dla kontekstu obiektu Zadania CRM
oraz przypisany na sztywno tylko do jednego wzorca aspx. W rozbudowanej formie
Strona 4 z 8
Ekspert radzi.
będziemy mogli jednak zarejestrować go globalnie (niezależnie od kontekstu, niezależnie
czy wywołanie z poziomu listy czy też formatki danego obiektu) poprzez rejestrację w
atrybucie assembly dla typu Soneta.Business.App.Login, natomiast same dane
odnośnie wydruków pobierać z XML.
Cała idea naszego dodatku będzie opierać się zatem na załadowaniu XML’a
konfiguracyjnego i następnie odpowiednim sparsowaniu go pod kątem potrzebnych nam
danych (dane sterownika drukarki, wzorca wydruku, kontekstu etc.).
Przed przestawieniem sterownika drukarki dla danego wydruku pobierzemy dodatkowo
dane o aktualnej domyślnej drukarce w systemie (celem przywrócenia jej ustawienia po
zakończeniu generowania wydruku). Po wybraniu już docelowego dla nas sterownika,
generujemy
wydruk
z
danego
wzorca
aspx
wykorzystując
obiekt
Soneta.Printer.AspGenerator.
Przykład wywołania workera z przestawieniem domyślnej drukarki na PDFCreator dla danego wydruku.
2.4
Rozszerzenie funkcjonalności.
Jak już wspomniano na wstępie, wykorzystanie idei XML z konfiguracją pozwala nam nie
tylko na bezinwazyjne rozszerzanie funkcjonalności naszego serwisu ale dodatkowo na
łatwą personalną konfigurację zdefiniowaną np. pod kątem specyficznego stanowiska lub
operatora. W celu rozbudowy dodatku wystarczy w zasadzie dodanie nowych gałęzi
odwołujących się do dodatkowych danych tj. np. wzorzec wydruku który chcemy przypisać
do danej drukarki lub format wydruku.
Inną możliwością jest zdefiniowanie własnej klasy parametrów i przekazywanie z niej listy
wszystkich wydruków w danym kontekście. Do tego celu będzie można wykorzystać nowo
dodaną klasę (od wersji 8.0) opartą na interfejsie IWizardGetReportPagesService.
Została ona przygotowana specjalnie na potrzeby użycia w kreatorach a dokładnie w
obiektach WizardStepDefinition (typ kroku – zakładka wydruku).
Strona 5 z 8
Ekspert radzi.
2.5
using
using
using
using
using
using
using
using
using
using
using
using
using
using
using
using
using
using
Dodatki: pełen kod źródłowy
System;
System.Collections.Generic;
System.Linq;
System.Text;
Soneta.Business;
Soneta.Types;
Soneta.Printer;
Soneta.Tools;
Soneta.Forms;
System.Management;
System.Drawing.Printing;
System.Windows.Forms;
System.Runtime.InteropServices;
System.Xml;
System.IO;
Soneta.Business.Db.Wizard;
Soneta.Business.App;
Soneta.Business.Forms.Reports;
// Rejestracja workera
[assembly: Worker(typeof(ASPgenerator.Print),typeof(Soneta.Zadania.Zadanie))]
namespace ASPgenerator
{
public class Print
{
// Przypnij na Toolbar w enova
[Action(
"Drukuj Raport",
Description = "",
CommandShortcut = Soneta.Commands.CommandShortcut.F5,
Priority = 1000,
Icon = ActionIcon.Wizard,
Target = ActionTarget.Menu | ActionTarget.ToolbarWithText)]
public void printer_run(Context cx)
{
string RaportName = "CRM/26etykieta.aspx";
string PrinterName = DefaultPrinterName();
string drukarka_kodow = DefinedPrinter();
SetAsDefaultPrinter(drukarka_kodow);
Strona 6 z 8
Ekspert radzi.
// Generuj wydruk ze wzorca aspx
try
{
Soneta.Zadania.Zadanie zadanie = (Soneta.Zadania.Zadanie)cx[typeof(Soneta.Zadania.Zadanie)];
cx.Set(zadanie);
Soneta.Printer.AspGenerator generator = new Soneta.Printer.AspGenerator();
generator.Name = "Zadanie CRM";
generator.TemplateFileName = RaportName;
generator.Prompt = true;
generator.Destination = Soneta.Printer.AspGenerator.Destinations.Printer;
generator.Print(Soneta.Forms.FormsTools.MainForm, cx, false, new Soneta.Zadania.Zadanie[] { zadanie });
}
catch (System.IO.FileNotFoundException)
{
throw new Exception("Nie znaleziono wzorca wydruku");
}
catch
{
throw new Exception("Problem z drukowaniem raportu");
}
finally
{
// Poczekaj na zakończenie wydruku
System.Threading.Thread.Sleep(1000);
// Przywróć domyślną drukarkę
SetAsDefaultPrinter(PrinterName);
}
}
// Rejestracja workera
/// <summary>
/// Zwróć nazwę domyślnaje drukarki w systemie
/// </summary>
public static string DefaultPrinterName()
{
string functionReturnValue = null;
System.Drawing.Printing.PrinterSettings oPS = new System.Drawing.Printing.PrinterSettings();
try {
functionReturnValue = oPS.PrinterName;
}
catch (System.Exception ex) {
functionReturnValue = "";
}
finally {
oPS = null;
}
return functionReturnValue;
}
static int SetAsDefaultPrinter(string printerDevice)
{
int ret = 0;
string path = "win32_printer.DeviceId='" + printerDevice + "'";
using (ManagementObject printer = new ManagementObject(path))
{
ManagementBaseObject outParams =
printer.InvokeMethod("SetDefaultPrinter",
null, null);
ret = (int)(uint)outParams.Properties["ReturnValue"].Value;
}
Strona 7 z 8
Ekspert radzi.
/// <summary>
/// Metoda parsująca XML konfiguracyjny
/// </summary>
private stringDefinedPrinter()
{
string modelDrukarki = "";
string EnviromentPath = System.Environment.GetEnvironmentVariable("APPDATA");
string strFilename = EnviromentPath + "\\Soneta\\Ustawienia drukarki.xml";
XmlDocument xmlDoc = new XmlDocument();
FileStream xmlStream = null;
if (File.Exists(strFilename))
{
xmlStream = new FileStream(strFilename,
FileMode.Open,
FileAccess.Read);
xmlDoc.Load(xmlStream);
XmlNodeList fnames = xmlDoc.GetElementsByTagName("Model");
modelDrukarki = fnames[0].InnerText;
}
return modelDrukarki;
}
///
///
///
///
<summary>
Metoda przestawiająca domyślną drukarkę na pobraną z konfiguracji
wykorzystaując delegatę systemową InvokeMethod() oraz WMI
</summary>
static int SetAsDefaultPrinter(string printerDevice)
{
int ret = 0;
string path = "win32_printer.DeviceId='" + printerDevice + "'";
using (ManagementObject printer = new ManagementObject(path))
{
ManagementBaseObject outParams =
printer.InvokeMethod("SetDefaultPrinter",
null, null);
ret = (int)(uint)outParams.Properties["ReturnValue"].Value;
}
return ret;
}
}
public static class myPrinters
{
[DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool SetDefaultPrinter(string Name);
}
}
Strona 8 z 8
Ekspert radzi.

Podobne dokumenty