Il 26/05/2014 13:26, Koenraad Lelong ha scritto:
Hi,

I want to make a report of database data. The data has a master-detail relationship. For every master-record there are a fixed number of detail-records.
A detail record = ItemCode, ItemValue

So I make a lazreport. I put a masterheader band on the report and I put some text on it. Then I put a masterdata band on the report and I put some rectangle objects on that band and connect those the master-table. When I show the report, everything is like I want it. Next step is to add detail-fields. I though that using a cross-data band was the needed tool. On the crossing of the masterheader-band I put a rectangle-object and couple this to the detail-field ItemCode. On the crossing of the masterdata-band I put a rectangle-object coupled to the detail-field ItemValue.

When I now show the report, my master-information is OK, for all master-records, but the detail-information is that of the first detail-record, for all master-records. Also the information of the detail in the master-header is OK. I have two grids showing the master-detail information so I know my queries are OK.

What am I doing wrong ?
Enclosed a screenshot. Green ovals contain correct data, the red oval contains bad data.

It would appear that your detail-field always points to the first item of your query. Which is not unexpected, because, most likely your detail fields come from a different query than that of the master fields. Master query automatically increment at each line, other data do not. If such is the case, you should take care of filling up your detail fields programmatically, using variables instead of query fields in your form, and taking advantage of a frWhateverGetValue, returning a ParValue taken from your query. Sort of:

procedure TMyForm.frWhateverGetValue(const ParName: String;
  var ParValue: Variant);
.....

if ParName = 'SA1' then ParValue := SQLQueryXX.FieldByName('SA1').AsInteger
else if ParName = ...
....

and, for the last parameter of the line, incrementing to next line of your query. Sort of:

else if ParName = 'LASTParam' then begin
  ParValue := SQLQueryXX.FieldByName('LASTParamName').AsWhatever;
  SQLQueryXX.Next;
  end;

Of course this works fine if there's a one-to-one correspondence between master and detail query lines. Otherwise your code must be a little more elaborated.

Hope that it helps,

Giuliano


--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to