Seite 1 von 1

Werte aus Tabelle in andere Tabelle kopieren

Verfasst: Mo 27. Feb 2017, 20:02
von rene
Hallo zusammen

Makro-Anfänger-Fragen:
In einem Formular habe ich zwei Tabellen dargestellt. Eine mit DokumentPositionen, die andere mit Artikeln.
Nun will ich Werte von Artikeln in die DokumentPositionen schreiben lassen (via Makro) - als neue Einträge.
Wie setze ich Variablen für die beiden Tabellen?
Wie spreche ich die Felder in den Tabellen an?

Dies meine kläglichen Gehversuche:

Code: Alles auswählen

Dim aID%
Dim aName$
Dim aPreis&
Dim aBeschreibung$

Sub ArtikelAlsPosition
	aForm = ThisDatabaseDocument.FormDocuments.getByName("Artikel")
	pForm = ThisDatabaseDocument.FormDocuments.getByName("DokumentPosition")

	aID = aForm.getbyname("ID")
	aName = aForm.getbyname("Name")
	aPreis = aForm.getbyname("Preis")
	aBeschreibung = aForm.getbyname("Beschreibung")
	...
End Sub
Anstelle der "..." sollte jetzt natürlich, meiner Vorstellung entsprechend, die Eröffnung eines neuen Datensatzes erfolgen, mit dem Beschreiben der entsprechenden Felder. Speichern, eventuell ein Refresh der Tabelle wenn nötig.. und fertig. So meine erste Vorstellung. :)
Ist es auch möglich, als erweiterte Frage, mehrere mit [Ctrl] markierte Datensätze (Artikel), als neue Einträge zu übertragen/kopieren?

So, jetzt sende ich das einfach mal los.. mit einem kleinen Schamgefühl über diese für Euch Gurus wohl peinlichen Einsteigerfragen. :roll:

Gruss
René

Re: Werte aus Tabelle in andere Tabelle kopieren

Verfasst: Mo 27. Feb 2017, 21:47
von RobertG
Hallo Rene,

mit

Code: Alles auswählen

nName = aForm.findColumn("Name")
sName = aForm.getString(nName)
liest Du den Wert eines Feldes aus.
mit

Code: Alles auswählen

nName = pForm.findColumn("Name")
pForm.updateString(nName,sName)
fügst Du den Wert in das andere Formular ein.

Alternativ:

Code: Alles auswählen

aForm.getbyname("ID").CurrentValue
liefert den Inhalt des Feldes "ID".

Code: Alles auswählen

bForm.getbyname("bID").BoundField.UpdateInt(aForm.getbyname("ID").CurrentValue)
liest Du aus dem Feld von aForm den Wert aus und fügst ihn in bForm ein.

Natürlich musst Du zum Schluss noch abspeichern.

Das war jetzt natürlich die Kurzversion. Ansonsten schau einfach einmal im Handbuch nach. Grundsätzlich gilt: Duplizieren von Daten so weit wie möglich vermeiden.

Gruß

Robert

Re: Werte aus Tabelle in andere Tabelle kopieren

Verfasst: Di 28. Feb 2017, 12:24
von rene
DANKE Robert,

so erhalte ich schrittweise mehr Einblick in die Makrowelt.
Doch ich erhalte folgende Meldung von der Ersten Makrozeile:
BASIC-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten
Type: com.sun.star.container.NoSuchElementException
Message: Artikel.

Code: Alles auswählen

Dim aID%
Dim aName$
Dim aPreis&
Dim aBeschreibung$

Sub ArtikelAlsPosition

	aForm = ThisDatabaseDocument.FormDocuments.getByName("Artikel")
	bForm = ThisDatabaseDocument.FormDocuments.getByName("DokumentPosition")

	bForm.getbyname("bID").BoundField.UpdateInt(aForm.getbyname("ID").CurrentValue)
	bForm.getbyname("bName").BoundField.UpdateInt(aForm.getbyname("Name").CurrentValue)
	bForm.getbyname("bPreis").BoundField.UpdateInt(aForm.getbyname("Preis").CurrentValue)
	bForm.getbyname("bBeschreibung").BoundField.UpdateInt(aForm.getbyname("Beschreibung").CurrentValue)

End Sub
Ich weiss nicht welcher Name mit "Artikel" angesprochen wird. Die Tabelle heisst "Artikel", im Formular-Navigator habe ich das eingebundene Formular ebenfalls "Artikel" benannt, wie auch das Tabellen-Steuerelement. Ich interpretiere wohl die Meldung falsch.

Formular-Navigation-Hierarchie:
Tabelle: Dokument
Untertabelle: DokumentPosition
Unteruntertabelle: Artikel*

*Artikel funktioniert als eine Art Hilfstabelle, um Artikelinformationen in die Dokument-Positionen zu kopieren.

Die Schaltfläche mit dem Makro habe ich bereits auf allen Ebenen versucht. Wo mache ich meine Überlegungsfehler?

Gruss
René

Re: Werte aus Tabelle in andere Tabelle kopieren

Verfasst: Di 28. Feb 2017, 21:09
von RobertG
Hallo Rene,

ich habe mir Deinen Code nicht so genau angesehen, aber mit

Code: Alles auswählen

aForm = ThisDatabaseDocument.FormDocuments.getByName("Artikel")
hast Du das gesamte Formular "Artikel", das so in der Datenbank stehen muss, also den Namen im Formularcontainer haben muss wie auch Abfragen und Tabellen einen Namen haben. Da bist Du nicht auf der Ebene, auf der sich der Formularnavigator eines Formulars bewegt.

Du meinst aber nicht das Dokument, sondern die Formulare, die zusammen auf einer Seite liegen, so etwas wie Hauptformular und Unterformular oder Formular und Nebenformular. Du kannst beide nebeneinander im Formularnavigator sehen.

Code: Alles auswählen

aForm = thisComponent.Drawpage.Forms.getByName("Artikel")
bringt Dich zu dem Formular.

Wenn Du nur etwas innerhalb eines Formulars machen willst, dann kannst Du auch den Button zum Auslösen zur Ermittlung des Formulars nutzen:

Code: Alles auswählen

SUB ArtikelAlsPosition(oEvent AS OBJECT)
aForm = oEvent.Source.Model.Parent
...
END SUB
Liegt der Button im Formular "Artikel", dann hast Du so das Formular direkt angesprochen.
oEvent > auslösendes Ereignis
Source > woher(Klick auf Button)
Model > der Button selbst
Parent > das Formular, in dem der Button liegt.
... und jetzt noch ein Parent drangehängt, dann bist Du noch eine Ebene höher und kannst von dort auf
getByName("DokumentPosition")
zugreifen.

Teste also ruhig einmal. Die Sache mit dem auslösenden Ereignis hat seine Vorteile besonders dann, wenn Du nur etwas innerhalb eines Formulars erledigen musst und der Name Dir egal sein kann.

Gruß

Robert

Re: Werte aus Tabelle in andere Tabelle kopieren

Verfasst: Mi 1. Mär 2017, 13:12
von rene
Salut Robert

Meine Versuche scheitern an meinem mangelnden Basiswissen zu Makros. Daher wende ich jetzt eine Zeit auf, um die Handbücher dazu durch zuarbeiten. Ansonsten stehe ich hier immer mit Fragen, die wohl nur in einem grösseren Rahmen und mit nötigem Basiswissen beantwortet werden können. Du hast mich angeschupst mich einzulesen, Danke dafür.

Hier mein aktueller Code der auf der Zeile "pForm.getByName("ArtNr")..." mit einer Fehlermeldung stoppt:

Code: Alles auswählen

Sub ArtikelAlsPosition

	Dim aForm as Object
	Dim pForm as Object

	aForm = thisComponent.Drawpage.Forms.getByName("Artikel")
	pForm = thisComponent.Drawpage.Forms.getByName("Dokument").getByName("DokumentPosition")
	pForm.moveToInsertRow()
	pForm.getByName("ArtNr").BoundField.UpdateInt(aForm.getByName("ID").CurrentValue)
	pForm.getByName("Name").BoundField.UpdateString(aForm.getByName("Name").CurrentValue)
	pForm.getByName("Preis").BoundField.updateDouble(aForm.getByName("Preis").CurrentValue)
	pForm.getByName("Beschreibung").BoundField.UpdateString(aForm.getByName("Beschreibung").CurrentValue)
	pForm.InsertRow()

End Sub
BASIC-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten
Type: com.sun.star.container.NoSuchElementException
Message: .
So mach ich mich nun einmal ran an die Unterlagen! ;)

Danke Robert.
René

Re: Werte aus Tabelle in andere Tabelle kopieren

Verfasst: Mi 1. Mär 2017, 15:46
von RobertG
Hallo Rene,

es handelt sich aber schon um ein gemeinsames Formulardokument? In dem Formulardokument müsste es jetzt nebeneinander die Formulare "Artikel" und "Dokument" geben. "DokumentPosition" ist ein Unterformular von "Dokument", korrekt?

Eventuell postest Du hier einmal ein Beispiel ohne Daten, aus dem hervorgeht, wo die Meldung NoSuchElement herkommt. Es scheint, dass irgendeins der Elemente, die Du aufrufst, so nicht bekannt ist.

Gruß

Robert