Skocz do zawartości

Pola własne towarów na wydrukach

Polecane posty

Poniższy tutorial opisuje, jak we własnym zakresie na wydruku paczek dodać pole własne towaru.

 

Pola własne na wydrukach?

 

W edytorze wydruków jest dostępny tylko pewien zamknięty zbiór statycznych pól, do których można się odwołać (np Paczka_Dostawa). Nie ma tam pól własnych, które są polami dynamicznymi (można je dodawać lub usuwać w słowniku). Silnik wydruków umożliwia jednak wykonywanie fragmentów skryptów pisanych w języku C#. Poniżej przedstawiamy krok po kroku jak wyświetlić na wydruku dowolne pole własne Sello jak i pole własne zewnętrzne (z Subiekta).

 

Edytor wydruków

 

Edytor wydruków jest dostępny w USTAWIENIA => SŁOWNIKI => Wydruki. W poniższym opisie przedstawimy modyfikację listy magazynowej, ale ten sam sposób można zastosować do dowolnego wydruku. Przed zmianami w wydruku warto zrobić jego kopię bezpieczeństwa (są na to dwa sposoby).
Sposób pierwszy to powielenie wydruku listy magazynowej z poziomu słowników. Sposób ten ma wadę taką, że w razie potrzeby przepięcia się na poprzednią listę magazynową, trzeba zmieniać przypisanie wydruku we wszystkich używanych dostawach.

 

Po otwarciu wydruku edytor można uruchomić linkiem Otwórz edytor wydruków.

image.png.c9abf0b24909f521f0626bddb24fa655.png

Sposób drugi, to skorzystanie z eksportu wzorca wydruku do pliku repx. W edytorze można aktualny wzorzec zapisać korzystając z menu Plik => Zapisz jako... W razie problemów z działaniem wydruku można go w podobny sposób przywrócić, za pomocą funkcji Plik => Otwórz. Ten sposób stworzenia kopii zapasowej zalecamy.

 

Wzorzec wydruku

 

Główną część okna edytora zajmuje wzorzec wydruku. Wygląda na skomplikowany ale w istocie składa się on z różnych sekcji, w których to sekcjach umieszczone są fragmenty wydruku, odpowiedzialne np za nagłówek strony, dane paczki, dane towarów paczki, stopkę listy towarów itp. 

image.png.61869260fa216750e4afa5ac2dbd1730.png

W skrócie, sekcja Detail drukuje się raz dla każdej paczki, sekcja DetailReport - "Towary" drukuje się dla każdego towaru w paczce, tworząc tabelkę z kolejnymi towarami. Tabelka z towarami ma swój nagłówek i stopkę a więc znalazły się one również w tej sekcji jako GroupHeader1 (nagłówek) oraz GroupFooter1 (stopka). W środku sekcja Detail1 jest powtarzana dla każdego towaru w paczce.

 

Edycja wzorca

 

Pola własne należą do towarów, nie do paczek, zatem naturalnie umieścić je należy w sekcji DetailReport - "Towary". Aby dodać nową kolumnę, zacząć należy od sekcji nagłówka tabeli. Klikamy np na nagłówek Nazwa i z menu pod prawym klawiszem myszy wybieramy Wstaw => Kolumnę po prawej (lewej).

 

image.png.a179c0ec54593979438ac4e4729176b1.png

W ten sposób należy dodać także nową kolumnę w sekcji Detail1.

image.png.f57ac667e1ff8b8a4b19566bee23a600.png

Aby zmienić nazwę kolumny nagłówka, czcionkę itp. należy wybrać ten element (xrTableCell9 w tym przypadku) i po prawej stronie w oknie Właściwości zmienić w danych pole Dane->Text, np. na nazwę swojego pola własnego (nazwa tutaj nie ma znaczenia, poniżej kolor).

image.png.da910d640d14d5c5f0b29fca8ec38328.png

 

Podłączanie danych

 

Następnie należy przejść do nowej komórki dodanej w sekcji Detail (tutaj xrTableCell10, nazwy mogą mieć inny indeks) i tym razem wybieramy z właściwości i Zachowanie->Scripts i klikamy przycisk po prawej stronie na skrypcie o nazwie Before Print.

image.png.ff70d5e6fd01e15c970cf1d7c07ef50b.png

Gdyby chodziło o statyczne dane towaru, jak nazwa, symbol itp, można się tutaj odwołać do danych poprzez pole Dołączanie danych i wskazać np. Towary -> Towar_Nazwa. W przypadku pól własnych trzeba dodać skrypt w Before Print.

image.png.4946fe3eaaf61a8e92080f3deb203ed7.png

 

Pojawi się okno z domyślnym (pustym) skryptem wykonywanym tuż przed drukowaniem tej komórki tabeli.

image.png.815bf99a0e03b44606df46865dc8dbc6.png

Aby zawartość pola własnego pojawiła się w tym polu, należy w skrypcie dopisać jedną linijkę:

((XRControl)sender).Text = PoleWlasneSello("kolor");

Aby odwołać się do pola własnego zewnętrznego:

((XRControl)sender).Text = PoleWlasneZewnetrzne("kolor");

Linijkę tę należy wstawić pomiędzy nawiasy { i } oraz zmienić nazwę pola na takie jakie ma być umieszczone w tej komórce (tutaj dałem kolor). Aby sięgnąć do pól, które zawierają spację w nazwie, należy ją zamienić na podkreślnik ("kolor rękawa" -> "kolor_rękawa")

 

Skryptu Before Print powinien wyglądać tak jak poniżej:

image.png.91c957320c88afbf38e6c50417fd5080.png

Podobnie można dodać inne pola własne do tabeli czy do pola tekstowego, istotne jest aby w skrypcie znalazła się taka linijka wskazująca z którego pola własnego ma zostać pobrana wartość.

 

 

Konfiguracja

 

Sięganie do pól własnych działa w oparciu o bezpośrednie połączenie do bazy danych Sello. Należy zatem wykonać jeszcze jeden krok. 

W oknie Eksplorator po prawej stronie, należy zaznaczyć pierwszy element w drzewie (nadrzędny), xtraReport1 i dla niego również przejść do właściwości Zachowanie -> Scripts -> Before Print

image.png.3f273197041419879de7e9852167caa2.png

i wkleić poniższą zawartość (zastąpić domyślny - pusty skrypt). Jeśli skrypty mają jakąś niepustą zawartość, wtedy widać ich pierwszą linijkę (w tym przypadku komentarz // KONFIGURACJA). Dzięki temu łatwo ustalić gdzie jest wpisany jakiś skrypt.

 

// KONFIGURACJA ------------------------------------------------------

// Adres serwera SQL z bazą Sello
string serwerSQL = @"(local)\INSERTGT";

// Autentykacja Windows (true), autentykacja login+hasło (false)
bool autentykacjaWindows = false;

// Login SQL (jeśli autentykacjaWindows = false, domyślnie "sa")
string loginSQL = "sa";

// Hasło SQL (jeśli autentykacjaWindows = false, domyślnie "")
string hasloSQL = "";

// Nazwa bazy danych Sello
string bazaDanych = "TUTAJ_NAZWA_BAZY_DANYCH_SELLO";

// Tryb debugowania (wyświetlania błędów)
bool debug = false;

// KONIEC KONFIGURACJI ------------------------------------------------------








// Poniższego kodu nie edytować

using System.Data.SqlClient;
using System.Data;

string connectionString;
bool connectionValid = false;

private void OnBeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e) {

	SqlConnectionStringBuilder sb = new SqlConnectionStringBuilder();
        sb.ConnectTimeout = 10;
        sb.DataSource = serwerSQL;
	sb.IntegratedSecurity = autentykacjaWindows;
        sb.Password = hasloSQL;
        sb.UserID = loginSQL;            
        sb.InitialCatalog = bazaDanych;
	connectionString = sb.ConnectionString;

	using(SqlConnection conn = new SqlConnection(connectionString))
	{
		try
		{
			conn.Open();
			connectionValid = true;
		}
		catch(SqlException ex)
		{
			System.Windows.Forms.MessageBox.Show(ex.Message);
			connectionValid = false;
		}
	}
}

public string PoleWlasneSello(string nazwa)
{
	if(!connectionValid)
		return "- błąd konfiguracji -";

	using(SqlConnection conn = new SqlConnection(connectionString))
	{
		SqlCommand cmd = new SqlCommand(@"select ia_AttributeValue from it_CustomAttributes 
						join sl_CustomAttributes on cat_id = ia_AttributeId
						where ia_ItemId = @id 
						and cat_name = @name", conn);
	        cmd.Parameters.Add("@id", SqlDbType.Int);
	        cmd.Parameters["@id"].Value = DetailReport.GetCurrentColumnValue("Towar_ID").ToString();

	        cmd.Parameters.Add("@name", SqlDbType.NVarChar);
	        cmd.Parameters["@name"].Value = nazwa;
		try
		{
		        conn.Open();
		        return (string)cmd.ExecuteScalar();
		}
		catch(SqlException ex)
		{
			if(debug)
				System.Windows.Forms.MessageBox.Show(ex.Message);
		}

        }
	return "-błąd-";
}

public string PoleWlasneZewnetrzne(string nazwa)
{
	if(!connectionValid)
		return "- błąd konfiguracji -";

	using(SqlConnection conn = new SqlConnection(connectionString))
	{
		SqlCommand cmd = new SqlCommand(@"select eca_Value from it_ExternalCustomAttributes 
						join it_ExternalCustomAttributesDict on ecd_id = eca_AttributeId
						where eca_ItemId = @id
						and ecd_SelloName = @name", conn);
	        cmd.Parameters.Add("@id", SqlDbType.Int);
	        cmd.Parameters["@id"].Value = DetailReport.GetCurrentColumnValue("Towar_ID").ToString();

	        cmd.Parameters.Add("@name", SqlDbType.NVarChar);
	        cmd.Parameters["@name"].Value = nazwa;
		try
		{
		        conn.Open();
		        return (string)cmd.ExecuteScalar();
		}
		catch(SqlException ex)
		{
			if(debug)
				System.Windows.Forms.MessageBox.Show(ex.Message);
		}

        }
	return "-błąd-";
}

W sekcji // KONFIGURACJA należy uzupełnić dane dostępowe do swojej bazy Sello, z której wydruk ma czerpać dane, w szczególności nazwę bazy danych.

 

Uruchomienie

 

Po wpisaniu danych można uruchomić testowo wydruk, aby sprawdzić, czy pola własne działają, oraz czy połączenie się udało. Jeśli konfiguracja jest niepoprawna, pojawi się okienko z błędem. Jeśli jego treść będzie niezrozumiała prosimy podesłać ją do nas na forum.

image.png.16714192874f9828045b80cdb678e979.png

Aby wyjść z podglądu, należy przełączyć się na zakładkę Projektant.

 

Wartości pól własnych w podglądzie mogą nie być widoczne, gdyż zależy to mocno od korelacji między danymi testowymi na wydruku a istniejącymi w bazie polami własnymi. Jeśli nie pojawi się żaden błąd podczas uruchamiania podglądu, można uznać, że połączenie się udało i przetestować działanie wydruku na faktycznych paczkach.

 

Edytor można tym samym zamknąć (zapisać wzorzec), zapisać wydruk Sello.

Link to postu
  • Bartosz Rosa zmienił tytuł na Pola własne towarów na wydrukach
  • 9 miesięcy temu...

W teorii tak, ale sortowanie w mechanizmie wydruków jest obarczone pewnym błędem w samym komponencie wydruków używanym w Sello - więc posłużenie się tym mechanizmem nie zadziała a z kolei sortowanie narzucone przez Sello z listy paczek nie ma takiej możliwości aby posortować po polu własnym. W praktyce może to być zatem niewykonalne.

Link to postu

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.
Uwaga: Twój wpis zanim będzie widoczny, będzie wymagał zatwierdzenia moderatora.

Użytkownik forum
Odpowiedz...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

×
×
  • Dodaj nową pozycję...