Szablon RTF w PostgreSQL - wydruk RAVE i replace

0

Witam.
Nie wiem czy utrafiłem w dział bo jest to kilka tematów połączonych, więc z góry przepraszam jeżeli źle wybrałem.

Mam taki problem:
W bazie Postgresql 8.3 trzymam w tabeli z wzorami umów (pole typu "bytea") szablon w RTF-ie i tam tekstem jest np |imie| |nazwisko| itp.
Do wydrukowania używam RAVE Report i komponentu DataMemo.
Do tego momentu wszystko jest OK. Umowa się drukuje są paragrafy i pogubiona czcionka itd. - SUPER.

Problem jest w tym, że nie wiem jak w szablonie podmienić znacznik |imie| , |nazwisko| itp na dane z tabeli.

Próbowałem różnych sposobów, ale albo delphi krzyczy że "bytea" nie jest stringiem,
albo postgres, że funkcje replace(bytea, unknow,unknow) nieistnieje,
w końcu wpadłem na pomysł żeby do zmiennej wczytać z tabeli szablon z konwesją sqla
select *, wu_tekst_rtf::text as tekst from umowytmp
a następnie użyć replace w delphi, i TO działa, ale jak próbuje potem pouścić zmienną do RAVE jako parametr komponentu, to drukuje mi się {\\rtf\\ansi\\ansi....

Proszę o podpowiedź czy

  1. używam dobrego pola do trzymania RTFa ?
  2. czy da się na poziomie bazy zrobić jakiegoś update na polu bytea
  3. lub czy da się jakoś ze stringa zrobić znowu bytea, atak aby po podstawieniu do RAVE wydrukował się dokument a nie jego "żródło" ?

Będę wdzięczny za podpowiedź innego rozwiązania jeżeli w ogóle źle się zabieram do tematu.

0

Najlepiej daj kod jakim to wszystko robisz, jeżeli nie jest string'iem, to czym jest, może stream albo array of byte to dało by się napisać procedure do podmiany tych danych?
1.Masz dobre pole
2.Nie, musisz załadować całość > operować na niej > całość wysłać jako update nie da się jakiejś części zmienić.
3.To zależy czym tak na prawdę jest bytea


Jakie środowisko, komponenty i wersje sql'a masz?

0

po prostu przyjąłeś zły sposób trzymania szablonów. Dlaczego szablon masz w RTFie a nie wewnętrzny RaveReport? Wtedy takiego problemu byś nie miał.

0

Struktura tabeli :

CREATE TABLE umowy
(
  id integer NOT NULL,
  imie character varying(40),
  nazw character varying(60),
  tekst_rtf bytea,
  CONSTRAINT umowy_pkey PRIMARY KEY (id)
);

Kod: w delphi:

  try
    adqUmoZlec.SQL.Text := 'select id, imie, nazw, tekst_rtf from umowy where id=1';
    adqUmoZlec.Open;

    SSS := adqUmoZlec.FieldByName('tekst_rtf').AsWideString;

    sss := StringReplace(sss,'|imie|','JAN',[]);
    sss := StringReplace(sss,'|nazw|','NOWAK',[]);

    adqUmoZlec.Edit;
    adqUmoZlec.FieldByName('tekst_rtf').AsWideString := sss;
    adqUmoZlec.Post;

    RvProject1.Close;
    RvProject1.ProjectFile := 'Umowa.rav';
    RvProject1.Execute;

  finally
    adqUmoZlec.Close;
  end;

Co do RTF, to trzymam w bazie bo wolę mieć możliwość prostej edycji RTFa bez konieczności grzebania w RAV-ie.

To jest jedna z wersji drukują się kwadraciki.

Jeżeli zaremuję tę część

    adqUmoZlec.Edit;
    adqUmoZlec.FieldByName('tekst_rtf').AsWideString := sss;
    adqUmoZlec.Post;

To drukuje się ok, tylko w tekscie pozostają znaczniki |imie| itp, które chcę zmienić do wydruku.

Baza: PostgreSQL8.3 (linux) UTF8 (bo są polskie i niemieckie znaki diakrytyczne)
Turbo Delphi Pro + AnyDac + RAVE 6.5.0

0

Jakich typów danych używasz i jak to drukujesz to wszystko jest ważne.
Mogłeś pomieszać typy, String - i znak to i bajt, WideString - to unicode więc znak zajmuje 2bajty lub więcej

0

W bazie tak jak pisałem kodowanie jest UTF8.
Pole tak jak podałem "bytea"

W rave tak jak piosałem używam komponenetu DataMemo i nic więcej nie ustawiam.

W delphi jeżeli zrobię tak:

    adqUmoZlec.SQL.Text := 'select id, imie, nazw, tekst_rtf from umowy where id=1';
    adqUmoZlec.Open;

    RvProject1.Close;
    RvProject1.ProjectFile := 'Umowa.rav';
    RvProject1.Execute;

To wszystko jest cacy, tylko nie wiem, jak zmieniać dane więc drukuje się np. " umowa została zawarta dnia |data|, pomiędzy Panem |imie| |nazw| zamieszkałym ........"
a powinno być " umowa została zawarta dnia 201.12.12, pomiędzy Panem Jan Kowalski zamieszkałym ........"

Więc muszę gdzieś "wciąć" się z kodem i podmienić |imie| na JAN i |nazw| na KOWALSKI. - i tu właśnie nie wiem jak i w którym miejscu to zrobić.
Ponieważ jest UTF8 więc chciałem użyć WideString, ale to chyba był głupi pomysł, próbowałem też string, (też bez sensu).
Przez chwilę myślałem nad STREAM lub array of byte, ale nie wiem jak się do tego zabrać.

1

Ewidentnie masz problem z kompatybilnością typów danych tylko teraz musisz znaleźć gdzie xD
Jak dla mnie to jest przekombinowane wszystko ja bym na twardo trzymał szablon i remake umów na HDD i tylko podawał linki w db nie było by takich dzikich problemów i baza by tak nie puchła, raz widziałem baze co miała 3gb i zapytanie z 2x join i jednym where wykonywało się ~30s+ bo ktoś stwierdził że fajnie będzie mieć jpg'i w bazie :D


Skoro to jest jako binarka (typ danych) to nie pobieraj tego jako AsWideString tylko jako String

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