Makro: Datenbankabfrage in Feldbefehle schreiben

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

gerhard.muellner
*
Beiträge: 10
Registriert: Mi, 06.04.2011 23:27

Makro: Datenbankabfrage in Feldbefehle schreiben

Beitrag von gerhard.muellner »

Nach einigen Versuchen ist es mir zwar gelungen das Ergebnis einer Datenbankabfrage ist die Datenbank-Feldbefehle eines Textdokument zu schreiben.
da aber sehr viele Felder aus der Datenbank in das Textdokument übernommen werden müssen (mehrfach Verwendungen der Feldbefehle muß möglich sein) , dauert das sehr lange (geschachtelte Schleifen).
Früher unter StartOffice5.1(2) war das einfach mit Selection.DataUpdateFields

kennt jemand eine schnellere Lösung?

Code: Alles auswählen

sub Test4
  Dim myDataBaseContext as Object
  Dim myStatement as Object
  Dim ResultSet as Object
  Dim oTxt as Object
  Dim oFeld as Object
  Dim i as integer
  Dim s as string

  myDataBaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
  myStatement = myDataBaseContext.getByName("Adreßbuch").getConnection("","").createStatement()
  ResultSet=myStatement.executeQuery("SELECT * FROM Adressen WHERE FIRMA = 'Test1'")  
  if not IsNull(ResultSet) then
	ResultSet.next      ' nur den ersten Datensatz verwenden
'	while ResultSet.next ' alle gefundene Datensaetze verwenden
	  for i=1 to ResultSet.Columns.Count
		oTxt=thiscomponent.getTextFields().createEnumeration()
		while oTxt.hasmoreElements()
		  oFeld=oTxt.nextElement
		  if ofeld.supportsService("com.sun.star.text.TextField.Database") then
			if ResultSet.Columns.ElementNames(i-1)=ofeld.Textfieldmaster.DataColumnName then
			  oFeld.Content=ResultSet.getString(i)
			endif
		  endif
		wend
	  next i
'	wend ' alle gefundene Datensaetze verwenden
  endif
  msgbox "Fertig"
end sub
Dateianhänge
Test.odt
Demo Writerdatei
(10.38 KiB) 143-mal heruntergeladen
Adressen.ods
Demo Adressdatei (aus einer DBASE Datei erstellt)
(9.77 KiB) 144-mal heruntergeladen
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Makro: Datenbankabfrage in Feldbefehle schreiben

Beitrag von F3K Total »

Hi,
ich kenne StartOffice5.1 nicht .
In OpenOffice gibt es die Datenquellenansicht für registrierte Datenbanken.
Mit F4 oder Ansicht/Datenquellen öffnest du sie.
Wählst Du eine Zeile, gibt es "Daten in Felder", was vermutlich deiner gewünschten Funktionalität "Selection.DataUpdateFields" entspricht.
Klappt mit deiner Adressdatei nicht, weil die Spaltenköpfe nicht mit den Feldnamen im Textdokument übereinstimmen, z.B.
steht in Adressen FIRMA,C,95 während das Feld in der Textdatei schlicht FIRMA heißt.
F4.png
F4.png (24.38 KiB) 3176 mal betrachtet
Gruß R
gerhard.muellner
*
Beiträge: 10
Registriert: Mi, 06.04.2011 23:27

Re: Makro: Datenbankabfrage in Feldbefehle schreiben

Beitrag von gerhard.muellner »

das mit den Datenbankköpfen ist vermutlich durch das umwandeln der DBASE datei entstanden (da ich hier keine DBASE dateien anhängen darf)
das mit F4 und "Daten in Felder" ist mir natürlich bekannt.
ich suche einen basic Makro der automatisch das Ergebnis der Datenbank Abfrage in die Feldbefehle der Writer Datei einfügt. (etwa so wie "Daten in Felder" nur halt als basic Makro)
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Makro: Datenbankabfrage in Feldbefehle schreiben

Beitrag von F3K Total »

Hi,
gezippte DBase-Daten kannst Du schon anhängen.
Und eine weitere Info ist wichtig: Was genau willst Du erreichen ?
Einen Auszug aus der Datenbank für genau eine Firma?
Wo wählst du sie aus?
R

EDIT: Hier werden zwei andere Methoden gezeigt
EDIT2: Crossposting ohne Referenz ist unhöflich!
gerhard.muellner
*
Beiträge: 10
Registriert: Mi, 06.04.2011 23:27

Re: Makro: Datenbankabfrage in Feldbefehle schreiben

Beitrag von gerhard.muellner »

F3K Total hat geschrieben:Hi,
gezippte DBase-Daten kannst Du schon anhängen.
Und eine weitere Info ist wichtig: Was genau willst Du erreichen ?
Einen Auszug aus der Datenbank für genau eine Firma?
Wo wählst du sie aus?
R

EDIT: Hier werden zwei andere Methoden gezeigt
EDIT2: Crossposting ohne Referenz ist unhöflich!
oh... Entschuldigung für das Crossposting!!

Beim ersten Dokument wird mit F4 und "Daten in Felder" eine Datei erstellt. z.b. ein Lieferschein.
Um nun aus dem Lieferschein automatisch z.b. eine Rechnung machen zu können, frage ich erneut in der Datenbank mit den Firmendaten z.b. Kundennummer etc. an, um diese dann in das neue Dokument automatisch einzufügen. Ich möchte nicht noch einmal mit F4 und "Daten in Felder" erneut die Firma suchen müssen.
Da zuvor einige andere Makros die neue Datei erstellen, hilft mir die Technik von "MailMerge" nicht weiter.
wie gesagt: das oben gezeigte vereinfachte Makro funktioniert auch soweit, nur ist es einfach zu langsam (geschachtelte Schleife)
ich suche eine Lösung, die dem im Bespiel entsprechenden "Selection.DataUpdateFields("Adreßbuch","Adressen","SELECT * FROM Adressen WHERE FIRMA = 'Test1'",1)" aus StartOffice5.1(2) entspricht, also die Datenbankabfrage ausführt und mit dem Ergenis alle Feldbefehle des bereits offenen Writer-Dokument befüllt. (Wie wenn man von Hand "Daten in Felder" anklickt)
Dateianhänge
Adressen.zip
DBase Datei gezippt (habe ich mit dem Assistenten zum Office als Adressbuch hinzugefügt)
(1.69 KiB) 133-mal heruntergeladen
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Makro: Datenbankabfrage in Feldbefehle schreiben

Beitrag von F3K Total »

Hi,
im englischen Forum habe ich diesen Beitrag dazu gefunden.
Damit läuft dein Code rappzap durch, denn mit hasbyname und folgendem getbyname wird die entsprechende Tabellenspalte direkt angesprochen. So kannst du auf deine i-Schleife verzichten hast also nur einen Durchlauf statt 186.

Code: Alles auswählen

sub Test4
    Dim myDataBaseContext as Object
    Dim myStatement as Object
    Dim ResultSet as Object
    Dim oTxt as Object
    Dim oFeld as Object
    Dim i as integer
    Dim s as string
    myDataBaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
    myStatement = myDataBaseContext.getByName("Adressen").getConnection("","").createStatement()
    ResultSet = myStatement.executeQuery("SELECT * FROM Adressen WHERE FIRMA = 'Test2'")
    if ResultSet.next then' nur den ersten Datensatz verwenden
        oTxt = thiscomponent.getTextFields().createEnumeration()
        while oTxt.hasmoreElements()
          oFeld = oTxt.nextElement
          if ofeld.supportsService("com.sun.star.text.TextField.Database") then
            sfieldname = ofeld.Textfieldmaster.DataColumnName
            If ResultSet.Columns.hasByName(sfieldName) then
            s$ = ResultSet.Columns.getByName(sfieldName).String 'Get desired presentation string.
            ofeld.CurrentPresentation = s$ 'Set the presentation.
           endif
          endif
        wend
        msgbox "Fertig"
    else
        msgbox "Abbruch, Fehler"
    endif
end sub
Gruß R
gerhard.muellner
*
Beiträge: 10
Registriert: Mi, 06.04.2011 23:27

Re: Makro: Datenbankabfrage in Feldbefehle schreiben

Beitrag von gerhard.muellner »

F3K Total hat geschrieben:Hi,
im englischen Forum habe ich diesen Beitrag dazu gefunden.
Damit läuft dein Code rappzap durch, denn mit hasbyname und folgendem getbyname wird die entsprechende Tabellenspalte direkt angesprochen. So kannst du auf deine i-Schleife verzichten hast also nur einen Durchlauf statt 186.

Gruß R
Super!! das ist eine Lösung.

Vielen Dank für die rasche Hilfe.
Antworten