Felder zur Laufzeit füllen

Moderator: Moderatoren

Antworten
KlausL
UDF-Programmierer
UDF-Programmierer
Beiträge: 54
Registriert: Fr, 23. Okt 2009 11:38

Felder zur Laufzeit füllen

Beitrag von KlausL »

Hallo,

in meinem aktuellen Projekt muß ich mit LL12 Reports erstellen. Nun habe ich das folgende (eigentlich sehr triviale) Problem, während der Abarbeitung ein Feld immer wieder mit unterschiedlichen Werten zu füllen:

LlDefineFieldExt(hJob, "NAME_1", "Xyz", LL_TEXT, "")
.
.
.
Do While !Eof()
//--> hier muß ich das oben deklarierte Feld füllen

Leider stelle ich mich zu dumm an, wie muß ich die Wertzuweisung codieren; habe in den Unterlagen nichts gefunden, sicherlich mein Fehler.

Vielen Dank im Voraus,

Klaus
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Felder zur Laufzeit füllen

Beitrag von Tom »

LlDefineFieldExt(hJob, "NAME_1", <Wert in diesem Augenblick>, LL_TEXT, "")

Wenn Du mit Charset OEM arbeitest, sollte <Wert in diesem Augenblick> mit ConvToAnsiCp() verbunden sein.
Herzlich,
Tom
KlausL
UDF-Programmierer
UDF-Programmierer
Beiträge: 54
Registriert: Fr, 23. Okt 2009 11:38

Re: Felder zur Laufzeit füllen

Beitrag von KlausL »

Hallo,

wenn ich im Designer eine Datenzeile bearbeite (Tabelleninhalt, Karteireiter "Variablen und Funktionen"), werden mir alle Felder der aktuellen DBF sowie die LL-Variablen angeboten. Eigene Variablen allerdings, die ich im Designer unter "Benutzer-Variablen" angelegt habe und zur Lauf- bzw. Designzeit aus dem aufrufenden Quellcode via LlDefineFieldExt() mit Werten versorge, werden mir hier nicht angezeigt ?!

Konkret habe ich eigentlich folgendes Problem: Für eine Reportzeile benötige ich die Daten aus den beiden Tabellen "Verkaufsstatistik" und "Artikelstamm", als Foreign-Key in den Artikelstamm verwende ich die Indexdatei mit dem Schlüssel "Artikelnummer":

vksta->(DbSetRelation("artsta", {|| vksta->art_nr}, "vksta->art_nr", "art_nr", "VKSTA_ARTSTA", .T.))

Im Designer habe ich nur Zugriff auf die Tabelle in der aktuellen Workarea, also VKSTA.DBF. Ich schaffe es beim besten Willen nicht, zusätzlich auch auf die ARTSTA.DBF zuzugreifen, z. B. mit LlDbAddTable(). Deshalb mein Versuch, an die benötigten Felder aus ARTSTA.DBF über den Umweg als Variablen zuzugreifen.

Wer kann sich denken, welchen Fehler ich mache? Oder funktioniert ein Zugriff auf mehrere DBFs in der Version List& Label 12 generell nicht?
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Felder zur Laufzeit füllen

Beitrag von Tom »

Hallo, Klaus.

Die Benutzervariablen im Designer dienen anderen Zwecken, etwa für Zwischensummen oder auf andere Art erzeugten Ergebnissen, die sich aus Feldern ergeben.

Wahrscheinlich arbeitest Du mit etwas, das auf einem der Beispiele aus L&L basiert. Dort gibt es zwei sehr wesentliche Punkte, nämlich LlDefineFieldStart() und DefineData(). Ersteres eröffnet die Deklaration von Feldern (LlDefineField/DefineFieldExt - ist letztlich dasselbe, nur "Ext" ist typisiert), zweiteres ist eine Beispiel-UDF, die die Inhalte einer Tabelle publiziert, nämlich derjenigen, die beim Aufruf selektiert ist.

Vermutlich hast Du Deine Felddefinitionen versehentlich vor das LlDefineFieldStart() gesetzt, wodurch sie wirkungslos sind. Du musst nicht mit LlDbAddTable() und dem dahinterstehenden, ziemlich komplexen Mechanismus herumlavieren, um Felder aus zwei oder mehr Tabellen zu übergeben. Am einfachsten wäre es, das DefineData() mit anderen Parametern zu wiederholen, und zwar vor Aufruf des Designers und in der Druckschleife: Einmal für die Haupttabelle, dann für die andere. Du kannst natürlich auch, wie Du es versucht hast, einfach LlDefineFieldExt() für alle Felder aus der zweiten Tabelle auslösen (aber auch in der Druckschleife! Navigation nicht vergessen!), aber ein DefineData() mit zusätzlichen Arrays ist einfacher, solange es keine Feldnamensüberschneidungen gibt.

Wie gesagt, Du machst es vermutlich einfach nur an der falschen Stelle. Felder, die mit LlDefineFieldExt() vor dem Aufruf des Designers und nach LlDefineFieldStart() übermittelt wurden, sollten auch sichtbar sein. Was passiert, wenn Du den gewählten Feldnamen einfach eintippst?
Oder funktioniert ein Zugriff auf mehrere DBFs in der Version List& Label 12 generell nicht?
L&L sind DBFs egal, es hat keinen Kontakt zu ihnen. Schau Dir mal DefineData() an!
Herzlich,
Tom
KlausL
UDF-Programmierer
UDF-Programmierer
Beiträge: 54
Registriert: Fr, 23. Okt 2009 11:38

Re: Felder zur Laufzeit füllen

Beitrag von KlausL »

Hallo Tom,

Du hast natürlich recht, genau diesen Fehler habe ich gemacht. Funktioniert jetzt super!

Nochmals vielen Dank für Deine Bemühungen,

Klaus
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Felder zur Laufzeit füllen

Beitrag von Tom »

Schön! :)

Denk doch bitte an das [ERLEDIGT] im Threadtitel. :wink:
Herzlich,
Tom
Antworten