Rave Report zapytanie z parametrem

0

Witam. Czy w Rave Reports pod Delphi w Designerze da się wykonać zapytanie z parametrem tak żeby parametr był pobierany z programu ?

Robiłem coś takiego:
if RvProject1.SelectReport('Report1',False) then
begin
RvProject1.SetParam('p1',DBEdit1.EditText);
RvProject1.SetParam('d1',Edit1.Text);
RvProject1.SetParam('d2',Edit2.Text);
RvProject1.Execute;
end;
RvProject1.Close;

Jak przypisze te parametry do DataEditText pod designerem to pokazuje mi i działa ale chodzi mi o to żeby ten parametr był też przekazywany do zapytania które będzie mi w innych Editach wyświetlać wyniki. Czy da się to zrobić, jesli tak to proszę o jakąś podpowiedź. Jesli nie to co zrobić aby stworzyć raport na podstawie zapytania z parametrami z bazy danych. Technologia ADO, baza mysql.

pozdrawiam

0

To może inaczej: Jak przekazać parametr z delphi do zapytania driverdataview w designerze.
Próbowałem tego co piszą na stronie nevrona.com :

// In Delphi program, set your parameter(s)
RvProject1.SetParam('MyParam1', 'My Param Value 1');
RvProject1.SetParam('MyParam2', 'My Param Value 2');
// Visual Designer - Event Editor
// how to get a parameter within an event
Value := RaveProject.GetParam('MyParam1');
// Visual Designer - Event Editor
// how to set a parameter within an event
RaveProject.SetParam('MyParam1','StringValue');
Remember that parameters are a string
value.

Nie bardzo mi to wychodzi. Może robie coś źle. Ustawiłem parametr z taką sama nazwą w RaveProject - parameters. Stworzyłem takie zapytanie, które wrzuciłem do DriverDataView w Query:

SELECT
pokaz.ID, pokaz.m, pokaz.Dp,
Sum(pokaz.Ile)
FROM
pokaz WHERE pokaz.ID= ':p1'
GROUP BY
pokaz.ID;

Zgodnie z tym co piszą na nevrona:
parametr powinien być zapisany tak:Where ID = ':ID'

Próbowałem różnych wersji np. też tak where ID=:ID

W delphi mam przekazanie parametru ustawione tak:
RvProject1.SetParam('p1',DBEdit1.EditText)

Co jeszcze muszę ustawić lub jaką komendę wpisać żeby np. mój DBEdit z Delphi stał się parametrem do zapytania w DriverDataView ?

0

Daj znać, jak coś wymyślisz, bo właśnie nad tym samym kombinuję :)

0

Witam Panowie.

Wpiszcie w zapytaniu
.... where id=:ID ...
jeśli typ parametru ID nie jest ciągiem znaków. Jeśli jest
..... where id=':ID' ....

Następnie w DriverDataView w QueryParams dodajcie
ID=param.ID
już wszystko będzie działać.
Pierwdze ID to ID z zapytania a drugie to już parametr przekazywany z kodu do Rave, więc zmienne nie muszą mieć tych samych nazw. np można :
ID=param.identyfikator
Tylko teraz przy przekazywaniu parametru do RAVE trzeba użyć polecenia :
RvProject1.SetParam('identyfikator',4);
Można również podać w DriverDataView w QueryParams wartości domyślne w sposób :
ID=param.identyfikator(4)
w DriverDataView w QueryParams nie używamy dwukropka (:) przez znakiem równości(=)
Będzie działać !
Powodzenia.
Paweł

0

Dzięki za odpowiedź, a co jeśli nie mam QueryParams w DriverDataView. U mnie jest tylko Query i własnie tam daję zapytanie z parametrem. Napisz jaką masz wersję Rave. Ja posiadam w. 5.0. Przy wykonaniu tego co powyżej wyskakuje mi pusty raport, czyli parametr nie jest przekazywany. Czy istnieje jeszcze jakiś inny sposób na przekazanie parametru jeśli nie mam QueryParams w DriverDataView.

0

Witam. Ok. Problem rozwiązałem. Ściągnąłem wersję Rave 5.0.8 z netu. Wpierw trzeba było odinstalować poprzednią wersję. W katalogu Delphiego jest pakiet instalatora przez który można odistalować Rave 5.0.
Teraz już mam QueryParams i sobie poradzę. Dzięki za pomoc.

pozdrawiam
[soczek]

0

A mi nie działa :/
Mam Delphi 2010 i RaveReports 7.7BE.

Może powiedzcie co robię źle:

Mam tabele TabelaMaster, gdzie Query wygląda tak:

Select
  zlecenie.nr, zlecenie.nazwa, zlecenie.data
From
  zlecenie
Where
  zlecenie.nr = :nrzlec

a QueryParams wygląda tak:
nrzlec = param.nrzl

Mam też tabelę TabelaSlave, gdzie Query wygląda tak:

Select
  zlecenie_i.kod_mag, zlecenie_i.nazwa
From
  zlecenie_i
Where
 zlecenie_i.NR_DOK = :nrzlecenia

a QueryParams wygląda tak:
nrzlecenia = TabelaMaster.nr

Całość wywołuję kodem:

  BaseRVProject.SetParam('nrzl', '1');
  BaseRVProject.execute;

Błąd już sie pojawia, gdy w TabelaMaster edytuję Query i chcę zaakceptować klikając OK to wyskakuje:
DataLink Error: DataResultSetOpen: List index out of bounds (-1)

Gdy nie przekazuję do TabelaMaster żadnej zmiennej z zewnątrz, czyli Query wygląda tak:

Select
  zlecenie.nr, zlecenie.nazwa, zlecenie.data
From
  zlecenie

to wszystko działa, tylko na wydruku dostaję wszystkie zlecenia po kolei, a ja chcę jedno konkretne, które będę wywoływał tutaj:

  BaseRVProject.SetParam('nrzl', '1');

(w tym przypadku zlecenie nr 1).


Na moje oko, to coś jest nie tak z tym "param", bowiem gdy w TabelaSlave zmienię QueryParams na takie
`nrzlecenia = param.nrzl`
to tez wyskakuje przy tej tabeli:
`DataLink Error: DataResultSetOpen: List index out of bounds (-1)`
0

OZI

Podstawowy błąd to przekazywanie parametru w ten sposób :
BaseRVProject.SetParam('nrzl', '1');
Jeśli jest to zmienna typu liczbowego to musi to wyglądać tak :
BaseRVProject.SetParam('nrzl', 1);

Chyba że jest to typ znakowy, ale wtedy źle masz zapytanie, ponieważ już na poziomie zapytania trzeba użyć zapisu :

zlecenie.nr = ':nrzlec'

Proponuję dla ułatwienia dodać już na poziomie params w query wartość domyślną :
nrzlec = param.nrzl(2)

Wszystko opisałem wcześniej. Zwróć uwagę na typ zmiennych.
Pozdrawiam

0
pawel105 napisał(a)

Podstawowy błąd to przekazywanie parametru w ten sposób :
BaseRVProject.SetParam('nrzl', '1');
Jeśli jest to zmienna typu liczbowego to musi to wyglądać tak :
BaseRVProject.SetParam('nrzl', 1);

Zauważyłem też to już wcześniej. Zmieniałem, ale wtedy podczas kompilacji Delphi wywala błąd:
Incompatible types: 'string' and 'Integer'
Gdzie ja mam w takim razie zadeklarować tą zmienną "nrzl" i ustawić jej typ na Integer?

pawel105 napisał(a)

Proponuję dla ułatwienia dodać już na poziomie params w query wartość domyślną :
nrzlec = param.nrzl(2)

Też już to próbowałem wcześniej. Mimo tej wartości domyślnej przy kliknięciu na OK w Query pojawia się komunikat:
DataLink Error: DataResultSetOpen: List index out of bounds (-1)

0
Ozi napisał(a)
pawel105 napisał(a)

Podstawowy błąd to przekazywanie parametru w ten sposób :
BaseRVProject.SetParam('nrzl', '1');
Jeśli jest to zmienna typu liczbowego to musi to wyglądać tak :
BaseRVProject.SetParam('nrzl', 1);

Zauważyłem też to już wcześniej. Zmieniałem, ale wtedy podczas kompilacji Delphi wywala błąd:
Incompatible types: 'string' and 'Integer'
Gdzie ja mam w takim razie zadeklarować tą zmienną "nrzl" i ustawić jej typ na Integer?

A masz w ogóle dodany parametr w raporcie ? Trzeba dodać na listę parametrów w projekcie tak jak w query.

pawel105 napisał(a)

Proponuję dla ułatwienia dodać już na poziomie params w query wartość domyślną :
nrzlec = param.nrzl(2)

Też już to próbowałem wcześniej. Mimo tej wartości domyślnej przy kliknięciu na OK w Query pojawia się komunikat:
DataLink Error: DataResultSetOpen: List index out of bounds (-1)

A ile masz wierszy w parametrach query ?

0

powiem szczerze ze rave jest slaby i to nawet bardzo ale ze wzgledow oszczednosciowych musialem poswiecic temu troche czasu. Co prawda z designera mi sie nie udalo ale powiodlo sie z kodu np:

procedure TfmRaportKD.UsersOnDevice(Report: TBaseReport);
var
  devices:string;
  j: integer;
begin
  with Report do
  begin
    tlo(Report);
    for j := 0 to 3 do
      NewLine;
    SetFont('Arial', 14);
    PrintCenter(Translate(Self.name,'Raport użytkowników') + ' ', PageWidth/2);
    NewLine;
    SetFont('Arial', 8);
    PrintCenter(Translate(Self.name,'(Raport wyświetla listę urządzeń, w których zarejestrowany jest użytkownik)'), PageWidth/2);
    NewLine;
    NewLine;
    SetFont('Arial', 12);
    Bold := True;
    PrintXY(0.55, YPos, Translate(Self.name,'Dane osobowe'));
    Bold := False;
    NewLine;
    dmRaportKD.qrUsers.Open;
    dmRaportKD.qrUsers.First;
    dmRaportKD.qrUID.Open;
    dmRaportKD.qrUID.First;
    while not dmRaportKD.qrUsers.Eof do
    begin
      SetFont('Arial', 8);
      Italic := True;
      if (LinesLeft < 3) and (not dmRaportKD.qrUsers.Eof) then
      begin
        NewPage;
        tlo(Report);
        Italic := True;
        NewLine;
        NewLine;
      end;
      devices := '';
      SetFont('Arial', 8);
      Bold := True;
      PrintXY(0.55,YPos,dmRaportKD.qrUsersdane.AsString);
      Bold := False;
      NewLine;
      while not dmRaportKD.qrUID.Eof do
      begin
        if (TextWidth(devices) + TextWidth(dmRaportKD.qrUIDnazwa_urzadzenia.AsString)) > PageWidth - 1.5 then
        begin
          PrintXY(0.75,YPos,devices);
          NewLine;
          devices := '';
        end;
          devices := devices + dmRaportKD.qrUIDnazwa_urzadzenia.AsString + ', ';
        if TextWidth(devices) > PageWidth - 1.5 then
        begin
          PrintXY(0.75,YPos,devices);
          NewLine;
          devices := '';
        end;
        dmRaportKD.qrUID.Next;
      end;
      SetFont('Arial', 8);
      Italic := False;
      PrintXY(0.75,YPos,devices);
      NewLine;
      NewLine;
      dmRaportKD.qrUsers.Next;
    end;
  end;
end;

oczywiscie same query sa powiazane miedzy soba:

SELECT 
 ud.idx_osoby,
 ur.nazwa as "nazwa_urzadzenia"
 
 FROM dev.users_in_device as ud
 
 INNER JOIN public.users as us on (us.idx_osoby = ud.idx_osoby)
 INNER JOIN dev.urzadzenia as ur on (ur.idx_device = ud.idx_device)
 
WHERE ud.idx_osoby =:idx_osoby
0
pawel105 napisał(a)

A masz w ogóle dodany parametr w raporcie ? Trzeba dodać na listę parametrów w projekcie tak jak w query.

Mam. W komponencie ProjectManager w zmiennej "Parameters" mam wpisane "nrzl".

pawel105 napisał(a)

A ile masz wierszy w parametrach query ?

Tylko jeden.
W QueryParams dla TabelaMaster mam:
nrzlec = param.nrzl

A dla TabelaSlave:
nrzlecenia = TabelaMaster.nr

0

Udało mi się uzyskać to, co chciałem, ale w sposób taki trochę dziwny. Zgadzam się z przedmówcą, że ten Rave jest słaby.

Zostałem przy wywołaniu z Delphi raportu wg zmiennej typu string, czyli:

//  BaseRVProject.SetParam('nrzl', '1');
  BaseRVProject.SetParam('nrzl', inttostr(query_zlecenie['nr']));
  BaseRVProject.execute;

Co za tym idzie musiałem zmienić też w Query na string (wziąć zmienną w apostrofy), mimo że kolumny "nr" w TabelaMaster i "nr_dok" w TabelaSlave są typu integer:

Select
  zlecenie.nr, zlecenie.nazwa, zlecenie.data
From
  zlecenie
Where
  zlecenie.nr = ':nrzlec'
Select
  zlecenie_i.kod_mag, zlecenie_i.nazwa
From
  zlecenie_i
Where
 zlecenie_i.NR_DOK = ':nrzlecenia'

W QueryParam jeśli chciałbym wtedy dać wartość domyślą, to też tą liczbę musiałbym wziąć w apostrof:
nrzlec = param.nrzl('2')

Podsumowując: co zmieniłem to dodałem apostrofy przy zmiennych w Query.
Nie podoba mi się to za bardzo, bo przecież te pola "nr" i "nr_dok" są typu integer, a tutaj tak sztucznie robię z tego stringi...

W każdym razie dzięki dla pawel105, bo to on mnie naprowadził na to, że to wina typu zmiennych, choć to nie w kodzie Delphi miałem zmienić typ zmiennej, tylko w Query już w RaveReporcie.

0

A używał ktoś z was kiedykolwiek Event Editor w tym Rave Peports?

Prosta funkcja:

{ Event for t_dokument_nie_rozliczony.OnGetText }
function t_dokument_nie_rozliczony_OnGetText(Self: TRaveDataText; var Value: string);
begin
   IF (Value='Z') THEN
     Self.Text := 'DOKUMENT NIE ROZLICZONY'
   ELSE
     Self.Text := 'DOKUMENT ROZLICZONY'; 
end OnGetText;

...i nie chce jej skompilować.

user image
Tam się nie pisze w Pascalu, czy co?

Ja pierdziele, ale ten RaveReporsts jest chore. A Borland się dziwi, że coraz mniej programistów używa Delphi... :/

0

UWAGA, w Query:
Dla ciągu znaków:

zlecenie.nr = ':nrzlec'

Dla liczb:

zlecenie.nr = :nrzlec

UWAGA w QueryParams:
Dla ciągu znaków i dla liczb zawsze dajemy wartość domyślną w apostrofach:

nrzlec = Param.nrzl('2')

Parametry z Delphi także zawsze podajemy jako ciąg znaków:

BaseRVProject.SetParam('nrzl', '1');

Parametry są zawsze ciągiem znaków i podajemy je w apostrofach.
i dopiero to dziala poprawnie.

Przykład z parametrem liczbowym:
RAVE Reports Query:

SELECT *FROM dbo.Magazyny WHERE idMag=:idMag

RAVE Reports QueryParams z wartościa domyślną:

idMag=Param.idMag('5')

Przekazanie parametru z Delphi:

RvProject1.ProjMan.SetParam('idMag','5');

Przykład z parametrem tekstowym:
RAVE Reports Query:

SELECT *FROM dbo.Magazyny WHERE Nazwa LIKE ':Nazwa'

RAVE Reports QueryParams z wartościa domyślną:

Nazwa=Param.Nazwa('Ogólny')

Przekazanie parametru z Delphi:

RvProject1.ProjMan.SetParam('Nazwa','Ogólny');

Pozdrawiam,
Paweł Parzych, AutorNET Łomża</quote>

A próbowałes w EVENTS tak:

 if NazwaTwojegoPola.AsString='Z'
 then
  Value:= 'DOKUMENT NIE ROZLICZONY';
 else
  Value:= 'DOKUMENT ROZLICZONY';
 end;

Value jest do tego, aby zwracać obrobiona wartość, a warunki sprawdzasz na polu z tabeli, które jest wyświetlane w obiekcie DataText.

Pozdrawiam,
Paweł Parzych, AutorNET Łomża

Ozi napisał(a)

A używał ktoś z was kiedykolwiek Event Editor w tym Rave Peports?

Prosta funkcja:

{ Event for t_dokument_nie_rozliczony.OnGetText }
function t_dokument_nie_rozliczony_OnGetText(Self: TRaveDataText; var Value: string);
begin
   IF (Value='Z') THEN
     Self.Text := 'DOKUMENT NIE ROZLICZONY'
   ELSE
     Self.Text := 'DOKUMENT ROZLICZONY'; 
end OnGetText;

...i nie chce jej skompilować.

user image
Tam się nie pisze w Pascalu, czy co?

Ja pierdziele, ale ten RaveReporsts jest chore. A Borland się dziwi, że coraz mniej programistów używa Delphi... :/

0

No zaraz mnie coś weźmie!
Miałem już gotowy post w tym temacie, bo pojawił mi się kolejny problem, a tymczasem katastrofa. Nie potrafię otworzyć swojego pliku RAV w RaveReports!
user image
Wie ktoś może jak na to poradzić? Inne pliki RAV otwierają mi się normalnie. Tylko ten jeden...
Niestety backupa sobie nie zrobiłem. :/

0

Dobra powyższy problem opanowany. Otworzyć raportu się nie dało, ale dało się go zaimportować do innego.

Teraz kolejny problem.

Drukuję wezwanie do zapłaty, którego kawałek wygląda tak:
user image

Mam zapytanie SQL:

select faktura.nr, faktura.data, 
faktura.termin_plat, (datediff("2011-11-04", faktura.termin_plat)) as spozniony,
(faktura.wartosc_brutto - faktura.zaplacono) as do_zaplaty
from faktura
 where  (faktura.wartosc_brutto - faktura.zaplacono) > 0
and faktura.nr_kli=123

Jest one przekazywane do Direct Data View w RaveReports.
I teraz problem polega na tym, że w linii, gdzie pole "spozniony" będzie większe od zera ma się wyświetlać kwota do zapłaty w kolumnie "Wymagane", a gdzie "spozniony" będzie mniejsze lub równe zeru, to ma się wyświetlać kwota do zapłaty w kolumnie "Niewymagane". Obecnie, jak widać na powyższym obrazku, kwota ta wyświetla się w obu kolumnach.

Ideałem byłoby, gdyby w Data Text Editor można było wpisac taką formułkę IF... THEN:
user image
No ale niestety to niemożliwe...
Zaznaczam, że to nie jest pojedynczy wiersz, którego wynik można by było z Delphi do RaveReports przekazać parametrami. Ta tabelka z niezapłaconymi fakturami może mieć nawet kilkaset wierszy.
Ma ktoś jakiś pomył?
Może jakiś kod w EventEditorze, który spowodowałby, że dane pole byłoby niewidoczne w zależności od wartości innego pola? Tylko nie mam koncepcji, jak taki kod miał wyglądać.

0

To mam jeszcze pytanie. U mnie lokalnie baza stoi na localhost port standardowy do tego jakiś login i hasło. Przesłałem plik *.rav do klienta i u niego nie ma żadnych danych. Jak to rozwiązaliście?

0

Podaję przykład kodu do odpalenia zewnętrznego raportu i przekazania mu parametrów połączeniowych do wskazanego serwera i bazy danych:

const __linkADOSQL= 'Provider=SQLOLEDB.1;Password=%s;Persist Security Info=False;User ID=%s;Initial Catalog=%s;Data Source=%s';

var Database: TRaveDatabase;
begin

  RvProject1.Close;

  RvProject1.ProjectFile:= ExtractFilePath(ParamStr(0))+'\Produkcja.rav';
  RvProject1.Open;
  
  RvProject1.SelectReport('Porownanie',True);
  RvProject1.SetParam('idZlec', '12342' );

  Database := TRaveDatabase(RvProject1.ProjMan.FindRaveComponent('Database1', nil));
  if Assigned(Database) then
  begin
    Database.AuthRun.Datasource := SysUtils.Format(__linkADOSQL,['hasłoSQL','sa','bazaSQL','IP do SQL']);
    Database.AuthRun.Username := fDM.MSSQL.Username;
    Database.AuthRun.Password := fDM.MSSQL.Password;
  end;


  RvSystem1.DefaultDest := rdPreview; // lub rdPrinter;
  RvSystem1.SystemSetups:= RvSystem1.SystemSetups-[ssAllowSetup];
  RvProject1.Execute;

  RvProject1.Close;

Pozdrawiam i życzę miłego testowania.

0

Fakt, trochę długo, ale człowiek zajęty jest innymi sprawami i tylko czasami może się zatrzymać na chwilę i przeglądnąć forum.
Pozdrawiam

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