11. Oktober 2010 11:03
Ich befinde mich in der Anlagenbuchhaltung.
Eine Frage habe ich im Zusammenhang einer Erstellung eines Reports. Im report habe ich ein DataItem Fixed Asset. Wie komme ich an die Daten aus der Tabelle FA Depreciation Book?
Bei dem Get Befehl habe ich immer ein Problem. Ich habe an den Get Befehl sämtliche Schlüsselfelder angehangen und vieles probiert aber es funktioniert einfach nicht. Was mache ich falsche? was muss ich stattdessen schreiben.
Zuletzt geändert von misterelektro1981 am 12. Oktober 2010 10:36, insgesamt 1-mal geändert.
12. Oktober 2010 08:51
Vielleicht habe ich mich seltsam ausgedrückt.
In dem Report habe ich einige Daten aus der Tabelle Fixed Asset. Nun benötige ich aus der Tabelle FA Depreciation Book einige Daten. Diese Daten würde ich über einen GET Befehl holen, dies klaapt jedoch nicht. Gibt es dafür einen Grund?
Mein Ansatz:
Globale Variable (FADep) des Typ Records auf FA Depreciation Book
Dann im On After Get Record Trigger des Data Item Fixed Asset folgendes geschrieben:
FADep.GET(FADep."FA No.", FADep."Depreciation Book Code");
In den Klammern stehen die Schlüsselfelder, aber es erscheint beim ausführen des Reports immer eine Fehlermeldung:
=> Die ANlagen-AfA Buch existiert nicht. Identifizierte Felder und Werte: Anlagennr.='',Afa Buchcode=''
Was mache ich falsch?
12. Oktober 2010 08:58
Du versuchst ein get mit den PK-Feldern der Variable, die das Get durchführen soll. Da kann doch nichts Sinnvolles bei heraus kommen. Entweder ist die Variable gefüllt: dann findet sie sich bestenfalls selbst, falls der Datensatz existiert. Oder sie ist nicht gefüllt: die Fehlermeldung kennst du ja schon.
12. Oktober 2010 09:00
Das war einer von vielen Ansätzen, aber immer bekomme ich eine Fehlermdleung. Was muss ich denn stattdessen machen?
12. Oktober 2010 09:05
Wie hängen die Daten denn zusammen?
12. Oktober 2010 09:13
Ich habe mal ein Bild angehehangen, indem der Aufbau, so denke ich, ersichtlich wird.
In dem Fixed Asset Body (1) aoll das Anlagendatum aus der Tabelle FA Depreciation Book stehen.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
12. Oktober 2010 09:21
Wenn ich mir das im Cronus ansehe, können pro Anlage doch mehrere Bücher verwaltet werden? Und ein Feld "Anlagedatum" hat die Tabelle 5612 auch nicht. Höchstens ein Anschaffungsdatum.
12. Oktober 2010 09:29
Sorry das Feld meinte ich auch. Wie komme ich denn jetzt daran, du machst es spannend
12. Oktober 2010 09:40
Die Verknüpfung erfolgt von der Nr. in der Tabelle 5600 auf das Feld Anlagennr. der Tabelle 5612, wenn ich das richtig sehe. Falls es also nur ein Anlagenbuch gibt, dann mit SetRange auf dieses Feld und Findfirst.
12. Oktober 2010 09:58
Da ich, wie du gemerkt hast, kein Programmierer bin und diesen Befehl noch nicht benutzt habe. Ich versuche es mal zu übersetzten.
- Code:
Datum.SETRANGE("Acquisition Date");
if findfirst then
currreport.showoutput;
Jetzt kann ich den Report starten, aber das Datumsfeld bleibt leer.
12. Oktober 2010 10:08
Och komm, wir haben sowas Ähnliches mal mit Boolfeld, einem Button und anhängenden Dokumenten durchgekaut
Also: du hast Fixed Asset mit einer Nummer. Du suchst das (erstbeste) FA Depreciation Book, in dessen Feld "FA No." diese Nummer drin steht. Das schreibt man auf Navisionisch in etwa so:
- Code:
"FA Depreciation Book".SetRange("FA No.","Fixed Asset"."No.");
if "FA Depreciation Book".findfirst then
DeinDatum := "FA Depreciation Book"."Acquisition Date";
12. Oktober 2010 10:12
misterelektro1981 hat geschrieben:Da ich, wie du gemerkt hast, kein Programmierer bin und diesen Befehl noch nicht benutzt habe. Ich versuche es mal zu übersetzten.
- Code:
Datum.SETRANGE("Acquisition Date");
if findfirst then
currreport.showoutput;
Jetzt kann ich den Report starten, aber das Datumsfeld bleibt leer.
Allg. gilt:
RecordVariable.SETRANGE("Feldname 1", 'Wert');
IF RecordVariable.FINDFIRST THEN BEGIN
REPEAT
Variable 4711 := Wert0815;
RecordVariable.Feldname2 := WeißDerGeierWas;
MODIFY;
UNTIL RecordVariable.NEXT = 0;
END;
begin/end sind optional, hier zur besseren Übersichtlichkeit gesetzt.
12. Oktober 2010 10:17
Och komm, wir haben sowas Ähnliches mal mit Boolfeld, einem Button und anhängenden Dokumenten durchgekaut
Also: du hast Fixed Asset mit einer Nummer. Du suchst das (erstbeste) FA Depreciation Book, in dessen Feld "FA No." diese Nummer drin steht. Das schreibt man auf Navisionisch in etwa so:
- Code:
"FA Depreciation Book".SetRange("FA No.","Fixed Asset"."No.");
if "FA Depreciation Book".findfirst then
DeinDatum := "FA Depreciation Book"."Acquisition Date";
12. Oktober 2010 10:18
Lord_British hat geschrieben:Allg. gilt:
RecordVariable.SETRANGE("Feldname 1", 'Wert');
IF RecordVariable.FINDFIRST THEN BEGIN
Ebenso allgemein gilt, dass man bei repeat-until ein findset verwendet
12. Oktober 2010 10:22
@ McClane
Damals hieß es in unserer Schulung, wir würden für unsere Zwecke an alle Infos mit dem Get Befehl kommen, desshalb bin ich darauf auch so fest gefahren.
Ich stelle mich wirklich nicht an, aber es ist schon länger her, das ich einige sehr kleine Sachen in NAV gemacht habe. Es hat ja mal wieder geklappt, danke.
@ beide: Danke für die allgemeine Beschreibung
12. Oktober 2010 10:48
Eine Frage habe ich doch noch zu:
McClane hat geschrieben:Och komm, wir haben sowas Ähnliches mal mit Boolfeld, einem Button und anhängenden Dokumenten durchgekaut
Also: du hast Fixed Asset mit einer Nummer. Du suchst das (erstbeste) FA Depreciation Book, in dessen Feld "FA No." diese Nummer drin steht. Das schreibt man auf Navisionisch in etwa so:
- Code:
"FA Depreciation Book".SetRange("FA No.","Fixed Asset"."No.");
if "FA Depreciation Book".findfirst then
DeinDatum := "FA Depreciation Book"."Acquisition Date";
Ich kann ja nun sämtliche Felder der Tabelle 5612 in den Report auf das DataItem der Tabelle 5600 bauen oder ich nehme DeinDatum was nun mit dem Anschaffungsdatum gefüllt ist. Wozu benötige ich denn die letzte Zeile des Codes? Würde man diese Beziehung nicht auich anders hinbekommen?
Zuletzt geändert von misterelektro1981 am 12. Oktober 2010 10:50, insgesamt 1-mal geändert.
12. Oktober 2010 10:50
McClane hat geschrieben:Lord_British hat geschrieben:Allg. gilt:
RecordVariable.SETRANGE("Feldname 1", 'Wert');
IF RecordVariable.FINDFIRST THEN BEGIN
Ebenso allgemein gilt, dass man bei repeat-until ein findset verwendet
FIND('-') geht alternativ auch und funktioniert zudem auch in älteren Versionen!
- Code:
IF RecordVariable.FIND('-') THEN
REPEAT
UNTIL RecordVariable.NEXT=0;
mfg,
winfy
12. Oktober 2010 11:11
misterelektro1981 hat geschrieben:Ich kann ja nun sämtliche Felder der Tabelle 5612 in den Report auf das DataItem der Tabelle 5600 bauen oder ich nehme DeinDatum was nun mit dem Anschaffungsdatum gefüllt ist. Wozu benötige ich denn die letzte Zeile des Codes? Würde man diese Beziehung nicht auich anders hinbekommen?
Die letzte Zeile war nur zur Verdeutlichung, wozu das findfirst gut ist. Klar kannst du auf den ganzen Datensatz zugreifen, falls einer gefunden wurde, und die Variable DeinDatum brauchst du auch nicht.
12. Oktober 2010 12:07
McClane hat geschrieben:Lord_British hat geschrieben:Allg. gilt:
RecordVariable.SETRANGE("Feldname 1", 'Wert');
IF RecordVariable.FINDFIRST THEN BEGIN
Ebenso allgemein gilt, dass man bei repeat-until ein findset verwendet
FINDSET ist IIRC dasselbe wie FINDFIRST oder etwa nicht?
12. Oktober 2010 12:19
Wie der Name schon sagt, soll findfirst nur den ersten Datensatz, findset aber alle finden.
Bei korrekten Schlüsseln gibt es in der Performance kaum Unterschiede, insofern ist es dann - was die Leistung angeht - egal, was man benutzt, auch wenn man danach eine Schleife über alle Datensätze macht.
Laut Style Guide ist aber findset bei einer Schleife das Richtige. Suche ich den ersten oder letzten Datensatz, ist es Findfirst/Findlast. So beschreibt es ja auch die Hilfe.
Besser nachvollziehbar ist der Code dann obendrein.
12. Oktober 2010 15:52
Lord_British hat geschrieben:FINDSET ist IIRC dasselbe wie FINDFIRST oder etwa nicht?
FINDFIRST ist aber IMHO eine schlechtere Wahl in Schleifen.
FIND('-') und FINDSET konkurrieren in dieser Hinsicht schon mehr, wobei es bei großen Datensätzen kaum Performanceunterschiede gibt.
Hier ein ganz anschaulicher Vergleich von Waldo/Stryk bezüglich der SQL Umsetzung dieser Anfragen.
http://dynamicsuser.net/blogs/waldo/archive/2008/02/01/what-impact-does-my-c-al-have-on-sql.aspxIch persönlich würde allerdings im Gegensatz zum obigen Verfasser Find('-') bevorzugen, da es IMHO im Zusammenspiel von Performance und Kompatibiltät zu Vorgängerversionen für mich die bessere Wahl ist. Die Performance ist bei großen Datenmengen ja nahezu gleich.
mfg,
winfy
16. Oktober 2010 00:10
winfy hat geschrieben:Die Performance ist bei großen Datenmengen ja nahezu gleich.
Dann vergleich mal die Performance zwischen findfirst und find('-'), wenn du wirklich nur den ersten Datensatz brauchst und grad keinen passenden Schlüssel hast ...
17. Oktober 2010 10:54
McClane hat geschrieben:winfy hat geschrieben:Die Performance ist bei großen Datenmengen ja nahezu gleich.
Dann vergleich mal die Performance zwischen findfirst und find('-'), wenn du wirklich nur den ersten Datensatz brauchst und grad keinen passenden Schlüssel hast ...
Das würde ich auch nie bestreiten.
Es ging bei dieser Aussage auch nicht um FINDFIRST sondern um FIND('-') und FINDSET.
winfy hat geschrieben:FINDFIRST ist aber IMHO eine schlechtere Wahl in Schleifen.
Für FINDFIRST braucht man keine Schleife.
mfg,
winfy
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.