Optymalizacja algorytmu drukującego dane z bazy danych.

0

Witam.

Proszę o pomoc w zoptymalizowaniu algorytmu.
Potrzebuje z bazy towarowej wydrukować etykiety (może być po kilka dla jednego towar - to jest sedno problemu).
W opisie towaru niektóre słowa są oznaczone * co oznacza, że słowo na etykiecie ma być pogrubione.

W tej chwili robię to tak:

  1. Wrzucam do listy wszystkie etykiety do wydruku (czyli jeżeli dla danego towaru ma być 5 kopii wrzucam ją do listy 5 razy)
  2. Tworzę pętle lecącą po liście wstawiającą do zmiennej Temp treści kolejnych etykiet
  3. Dla każdej etykiety tworzę pętle sprawdzającą kolejno słowa:
    ##jeżeli słowo nie zaczyna się od * wykonuje e.Graphics.DrawString(TmpWord, normalFont, drawBrush, RectWord);
    ##jeżeli słowo zaczyna się od * wykonuje e.Graphics.DrawString(Tmpord, BoldFont, drawBrush, RectWord); Pozycja i wymiar RectWord jest wyliczana dla każdego słowa w obrębie danej etykiety.
  4. Po wydruku każdej etykiety wyliczana jest pozycja kolejnej.
    Sposób działa poprawnie lecz dla towaru który ma 100 słów w opisie, a ma być 100 kopii jego etykiety pętle muszą wykonać w sumie 100*100 obrotów (100 razy sprawdzając to samo).

Niestety nie mam pomysłu jak to zoptymalizować...

0
hipekk napisał(a):

Potrzebuje z bazy towarowej wydrukować etykiety (może być po kilka dla jednego towar - to jest sedno problemu).

Rozumiem, że wszystko jest trzymane w bazie SQL? Czy te etykiety są różnie, czy po prostu tyle kopii?

0

zamiast wrzucać do listy 100 razy to samo (gratuluje pomysłu) to wrzucaj paczkę - etykieta; ilość kopii (jako rekord np.) i ustawiać https://msdn.microsoft.com/en-us/library/system.drawing.printing.printersettings.copies(v=vs.110).aspx przed wydrukiem. BTW przy takich pytaniach należało by dać chociaż kawałek kodu jak to się odbywa

0

@minik42 tak jak napisałeś wszystko trzymane jest w bazie SQL, dla danego towaru wszystkie kopie są takie same.

@abrakadaber z powielaniem wpisu x razy w liście oczywiście masz rację, ale robione to było na "chwile" żeby zobaczyć czy taki sposób w ogóle zda egzamin - dlatego też nie załączałem kodu bo jest pisany "byle jak aby działał" i zapewne więcej komentarzy dotyczyło by jakie są w nim błędy (mimo że wydruk jest zgodny z oczekiwaniami, niż jak usprawnić sam algorytm). PrinterSettings.Copies Property nie zda egzaminu w tym wypadku, ponieważ chodzi o powielenie pojedynczej etykiety a nie całej strony. W załączniku wstawiłem przykładowy wydruk.

Teraz pomyślałem że można by to zrobić w ten sposób:
Pierwszą kopię etykiety przy pogrubianiu wybranych słów zapisać nie do e.Graphics tylko stworzyć osobny obiekt i dopiero ten obiekt wstawić odpowiednią ilość razy do wydruku.
Dobrze myślę ?

2
  1. tworzysz bitmapę, która "pomieści" pojedynczą etykietę
  2. rysujesz na bitmapie 1 całą etykietę
  3. rysujesz bitmapę 1 na płótnie drukarki tyle razy ile masz wydrukować etykiet
  4. następna etykieta goto 1
0

Czyli coś w ten deseń jak opisałem w poprzednim poście :)
Dziękuję serdecznie !

1 użytkowników online, w tym zalogowanych: 0, gości: 1