Das Band Detaildaten nur bedingt ausgeben [erl.]

Alles über Formulare, deren Erstellung und deren eventueller Austausch

Moderator: SYNERPY

Antworten
koch
Beiträge: 97
Registriert: Mo Dez 11, 2006 1:28 pm

Das Band Detaildaten nur bedingt ausgeben [erl.]

Beitrag von koch »

Hallo,

ich brauche mal wieder Eure Hilfe. Sitze vor einem Problem das ich leider nicht selbstständig lösen kann ...

Ich habe eine neue Maske (V_BSL) erstellt um Schulungen zu dokumentieren - klappte ausgezeichnet.
In dieser Tabelle lassen sich pro Datensatz div. Schulungen für unsere Mitarbeiter anlegen.
Der Mitarbeiter taucht also öfter in der Tabelle auf, mit verschiedenen Schulungen.
Nun möchte ich 'Individuelle Ausdrucke' für jeden Mitarbeiter ausdrucken, in dem aber alle Schulungen einer Mitarbeiters ausgegeben werden.
Dazu habe ich ein Report mit folgenden Eigenschaften erstellt:

Queries:
q1: Select * FROM V_BSL
q2: Select * FROM V_BSL

Um den Mitarbeiter über die Datenübersicht auszuwählen und den Namen / Personalnummer in Variablen zu speichern -
folgender Code auf ButtonOk_OnClickSkript

Code: Alles auswählen

Begin
	// Letzte Änderung am 10.02.2010 WK
	DebugOn := True;
  MyQuery := frmData.Universal;
  MyQuery.SQL.text := 'SELECT A.MASKENKEY AS "Pers.Nr.", A.NAME AS "Name", A.ID ' +
											'FROM V_BSMALLE A ' + 
                      'ORDER BY MASKENKEY';
  MyQuery.open();

  //bOK := UniversalAuflist('Maskenauswahl');
  bOK := UniversalAuflist(LB_Mitarbeiter.caption);
  sPersNr := AsInteger(MyQuery.FieldByName('MASKENKEY'));
  sName := AsString(MyQuery.FieldByName('Name'));
  
 	if (bOK) then
 	 begin
 	   sPersNr := AsInteger(MyQuery.FieldByName('MASKENKEY'));
	   sName := AsString(MyQuery.FieldByName('Name'));
	   MASKEDIT_1.Text := sPersNr;
	   MASKEDIT_2.Text := sName;
	   
	 end;
  MyQuery.close();
  
  // sReportvariablen belegen Bsp.: sReportvariablen  := '"String='+myString+'"'; 
  sReportvariablen  := '"PersNr='+MASKEDIT_1.Text+'",'+
											 '"Name='+MASKEDIT_2.Text+'"'; 
End;
Soweit so gut, nun kann ich mir die Variablen 'Pers.Nr' u. 'Name' im Formular anzeigen lassen.
Wie bekomme ich nun das 'Detaildaten Band' angesprochen, daß es nur die Datensätze ausgibt,
die auch als 'BSM_MASKENKEY' die ausgewählte 'Pers.Nr.' enthalten?

Ich dachte an so etwas wie:

q2: Select * FROM V_BSL WHERE BSM_MASKENKEY = :sPersNr

doch ohne Erfolg ...

Kann mich bitte jemand in die richtige Richtung schubsen 8)

Gruß
Werner

Edit1: q1 im Report = Hauptdaten ; q2 im Report = Detaildaten;
Zuletzt geändert von koch am Do Feb 11, 2010 10:11 am, insgesamt 1-mal geändert.
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Re: Das Band Detaildaten nur bedingt ausgeben

Beitrag von admin »

koch hat geschrieben: q2: Select * FROM V_BSL WHERE BSM_MASKENKEY = :sPersNr
Das ist zwar nicht aus dem Lehrbuch, aber gar kein schlechter Anfang.

Man könnte in den ButtonClick sehr wohl ein:

q_rep2.sql.text := ... WHERE BSM_MASKENKEY = :sPersNr;

einfügen. Was klappt daran denn nicht? Bitte kompletten Code posten. Danke.
koch
Beiträge: 97
Registriert: Mo Dez 11, 2006 1:28 pm

Beitrag von koch »

Bisher steht nur Code in ButtonOk_OnClickSkript, ich habe meinen Vorschlag (SELECT * FROM V_BSL WHERE BSM_MASKENKEY)
direkt in die q2 'SQL String' geschrieben. Das Detailband selbst 'OnBeforePrint' ist leer.

Code: Alles auswählen

Begin
	// Letzte Änderung am 10.02.2010 WK
	DebugOn := True;
  MyQuery := frmData.Universal;
  MyQuery.SQL.text := 'SELECT A.MASKENKEY AS "Pers.Nr.", A.NAME AS "Name", A.ID ' +
											'FROM V_BSMALLE A ' + 
                      'ORDER BY MASKENKEY';
  MyQuery.open();

  //bOK := UniversalAuflist('Maskenauswahl');
  bOK := UniversalAuflist(LB_Mitarbeiter.caption);
  sPersNr := AsInteger(MyQuery.FieldByName('MASKENKEY'));
  sName := AsString(MyQuery.FieldByName('Name'));
  
 	if (bOK) then
 	 begin
 	   sPersNr := AsInteger(MyQuery.FieldByName('MASKENKEY'));
	   sName := AsString(MyQuery.FieldByName('Name'));
	   MASKEDIT_1.Text := sPersNr;
	   MASKEDIT_2.Text := sName;
	   
	 end;
  MyQuery.close();
  
  // sReportvariablen belegen Bsp.: sReportvariablen  := '"String='+myString+'"'; 
  sReportvariablen  := '"PersNr='+MASKEDIT_1.Text+'",'+
											 '"Name='+MASKEDIT_2.Text+'"';  											 
											 
	q_rep2.sql.text := 'SELECT * FROM V_BSL WHERE BSM_MASKENKEY = :sPersNr'; 
End;
Habe nun Ihren Vorschlag übernommen, mit dem gleichen Ergebnis. Der Ausdruck zeigt nur noch den Seitenkopf.
Die Bänder Hauptdaten und Detaildaten werden nicht angezeigt.

Report Aufbau:

Seitenkopf

Hauptdaten (q1)
Child = Unterformular1

Detaildaten (q2)
Child = Unterformular2


Vielen Dank für Ihre Mühe ...
SYN20
Beiträge: 95
Registriert: Do Aug 23, 2007 1:54 pm

Beitrag von SYN20 »

Hallo,

ihr Code leicht abgewandelt:

Code: Alles auswählen

Begin   
  // Letzte Änderung am 10.02.2010 WK
  DebugOn := True;
  MyQuery := frmData.Universal;
  MyQuery.SQL.text := 'SELECT A.MASKENKEY AS "Pers.Nr.", A.NAME AS "Name", A.ID ' +
                                 'FROM V_BSMALLE A ' +
                      'ORDER BY MASKENKEY';
  MyQuery.open();

  //bOK := UniversalAuflist('Maskenauswahl');
  bOK := UniversalAuflist(LB_Mitarbeiter.caption);
 
  if (bOK) then
  begin
    sPersNr := AsString(MyQuery.FieldByName('MASKENKEY'));
    sName := AsString(MyQuery.FieldByName('Name'));
    MASKEDIT_1.Text := sPersNr;
    MASKEDIT_2.Text := sName;      
  end;
  MyQuery.close();
 
  // sReportvariablen belegen Bsp.: sReportvariablen  := '"String='+myString+'"';
  sReportvariablen  := '"PersNr='+MASKEDIT_1.Text+'",'+
                       '"Name='+MASKEDIT_2.Text+'"';                                   
                                 
   q_rep2.Sql.Text := 'SELECT * FROM V_BSL WHERE F_LRTRIM(BSM_MASKENKEY) = :BSM_MASKENKEY';   
   q_rep2.ParamByName('BSM_MASKENKEY',sPersNr);
End; 
Gruß,
Syn20

PS: Sie brauchen den SQL.Text nicht im Ok-Button zu belegen, sondern können diesen auch direkt in den Eigenschaften der q_rep2 hinterlegen.
koch
Beiträge: 97
Registriert: Mo Dez 11, 2006 1:28 pm

Beitrag von koch »

Perfekt, genau das was ich wollte... :D
Vielen vielen Dank, und wieder etwas gelernt.
PS: Sie brauchen den SQL.Text nicht im Ok-Button zu belegen, sondern können diesen auch direkt in den Eigenschaften der q_rep2 hinterlegen.
Hab ich auch ausprobiert, funktioniert ebenfalls wunderbar, ist wahrscheinlich auch die bessere Variante,
da man direkt sehen kann was in der querie passiert und der Inhalt nicht von dem OK-Button Skript überschrieben wird.

Freundliche Grüße
Werner
Antworten