Base -> Makro -> Formular -> Tabellenkontrollfeld

Hallo *,

ich möchte für Base ein Makro erstellen, das in einem Tabellenkontrollfeld in einem Formular u.a. folgenden zwei Aufgaben durchführen soll:
1) Nummer des letzten Datensatzes einer Tabelle auslesen.
2) Befehl "Neuer Datensatz" ausführen.

Ich finde nicht die dazu nötigen Befehle bzw. Methoden. Kann jemand diese hier posten?

LO: LibreOffice 3.4.4 OOO340m1 (Build:402)
OS: Windows 7 Prof 64 Bit

Gruß

Jochen

Hallo Jochen

Hallo *,

ich möchte für Base ein Makro erstellen, das in einem Tabellenkontrollfeld in einem Formular u.a. folgenden zwei Aufgaben durchführen soll:
1) Nummer des letzten Datensatzes einer Tabelle auslesen.
2) Befehl "Neuer Datensatz" ausführen.

ich bin mir zwar nicht ganz sicher was du genau willst, aber vielleicht hilft dir ja das hier:
(muss direckt aus dem Formular ausgeführt werden)

Sub Formular_Manipolation
Dim oform As Object
Dim aData(1) As variant
Dim nAnzahl As Long ,i%

' Nummer des Formulars(0) und Name des Tabellenkontrollfeldes ("MainForm_Grid") bitte anpassen !!
oform=thiscomponent.drawpage.forms(0).getByName("MainForm_Grid")

'anzahl der einträge
nAnzahl = oform.getRowSet.RowCount
MsgBox "Das Formular hat " & nAnzahl & " Datensätze."
'gehe zu letzten Reihe mit einträgen
oform.getRowSet.Last
'hole den inhalt des letzten eintrags in ein Array(nur Datum und Text)
Redim aData( oform.Count -1)
   for i=0 to oform.Count -1
     If oform.getByIndex(i).DataFieldProperty = "Date" Then
      aData(i) = oform.getByIndex(i).Date
     else
       aData(i)= oform.getByIndex(i).Text
     end if
     MsgBox "Letzter Datensatz Spalte" & i+1 & " Lautet: " & Chr(10) & aData(i)
   next

'Neuer eintrag(gehe zu letzten Reihe)
oform.getRowSet.moveToInsertRow(false)

end sub

Gruß Frieder

Hallo Jochen

ich möchte für Base ein Makro erstellen, das in einem Tabellenkontrollfeld in einem Formular u.a. folgenden zwei Aufgaben durchführen soll:
1) Nummer des letzten Datensatzes einer Tabelle auslesen.
2) Befehl "Neuer Datensatz" ausführen.

Habe das Makro noch erweitert, damit der Fokus danach auch auf dem Tabellenkontrollfeld ist,
und du somit direkt hineinschreiben kannst.

Hier der Code:
(muss direkt aus dem Formular ausgeführt werden)

Sub Formular_Manipolation
Dim oform As Object
Dim aData(1) As variant
Dim nAnzahl As Long ,i%

' Nummer des Formulars(0) und Name des Tabellenkontrollfeldes ("MainForm_Grid") bitte anpassen !!
oform=thiscomponent.drawpage.forms(0).getByName("MainForm_Grid")
'anzahl der einträge
nAnzahl = oform.getRowSet.RowCount
MsgBox "Das Formular hat " & nAnzahl & " Datensätze."
'gehe zu letzten Reihe mit einträgen
oform.getRowSet.Last
'hole den inhalt des letzten eintrags in ein Array(nur Datum und Text)
Redim aData( oform.Count -1)
   for i=0 to oform.Count -1
     If oform.getByIndex(i).DataFieldProperty = "Date" Then
      aData(i) = oform.getByIndex(i).Date
     else
       aData(i)= oform.getByIndex(i).Text
     end if
     MsgBox "Letzter Datensatz Spalte" & i+1 & " Lautet: " & Chr(10) & aData(i)
   next

'Neuer Eintrag(gehe zu letzten Reihe)
oform.getRowSet.moveToInsertRow(false)
'Fokus setzen, damit mann direckt hineinschreiben kann.
thiscomponent.CurrentController.getControl(oform).setFocus
end sub

Gruß Frieder

Hallo Frieder

oform.getRowSet.moveToInsertRow(false)
'Fokus setzen, damit mann direckt hineinschreiben kann.
thiscomponent.CurrentController.getControl(oform).setFocus
end sub

Vielen Dank für Deinen Code-Vorschlag. Dieser hat mir schon weitergeholfen. Allerdings habe ich jetzt noch das Problem, dass ich in das "Feld", in dem der Fokus gesetzt worden ist, per Makro kein Inhalt (z.B. einen Text) schreiben kann. Gibt es dafür eine Lösung?

Gruß

Jochen

Hallo Jochen

Hallo Frieder

oform.getRowSet.moveToInsertRow(false)
'Fokus setzen, damit mann direckt hineinschreiben kann.
thiscomponent.CurrentController.getControl(oform).setFocus
end sub

Vielen Dank für Deinen Code-Vorschlag. Dieser hat mir schon weitergeholfen. Allerdings habe ich jetzt noch das Problem, dass ich in das "Feld", in dem der Fokus gesetzt worden ist, per Makro kein Inhalt (z.B. einen Text) schreiben kann. Gibt es dafür eine Lösung?

Ich habe grundsätzlich eine Methode gefunden, mit der das geht.
Allerdings scheint sie nicht 100%ig zu funktionieren.
Ich weiß nicht , ob das ein Bug ist, oder ob ich etwas falsch mache.

Aber hier die Methode:
'Das Tabellenkontrollfeld ansprechen
oform=thiscomponent.drawpage.forms(0).getByName("MainForm_Grid")

oform.getRowSet.moveToInsertRow 'in die neue Zeile gehen
field=oform.getByIndex(1) '2. Spalte auswählen
field.Text="rrrr" 'Text setzen
field.commit 'Text in die Datenbank übernehmen.

oControll= thiscomponent.CurrentController.getControl(oform)
oControll.SetCurrentColumnPosition(2) ' Cursor in die 2. Spalte setzen
oControll.setFocus ' Fokus setzen

Gruß Frieder

Hallo Frieder,

Ich habe grundsätzlich eine Methode gefunden, mit der das geht.
Allerdings scheint sie nicht 100%ig zu funktionieren.
Ich weiß nicht , ob das ein Bug ist, oder ob ich etwas falsch mache.

Aber hier die Methode:
'Das Tabellenkontrollfeld ansprechen
oform=thiscomponent.drawpage.forms(0).getByName("MainForm_Grid")

oform.getRowSet.moveToInsertRow 'in die neue Zeile gehen
field=oform.getByIndex(1) '2. Spalte auswählen

vielleicht
field.updateString("rrrrrrrrrrr")
oform.updateRow() (geht natürlich nicht in einer neuen Zeile, hier dann
oform.insertRow()

field.Text="rrrr" 'Text setzen
field.commit 'Text in die
Datenbank übernehmen.

oControll= thiscomponent.CurrentController.getControl(oform)
oControll.SetCurrentColumnPosition(2) ' Cursor in die 2. Spalte
setzen
oControll.setFocus '
Fokus setzen

Gruß Frieder

Gruß

Robert

Hallo Frieder, Robert,

ich habe das Makro zum Laufen gebracht. Knackpunkt war die Reihenfolge der Makro-Sequenzen.

sub Probe
  dim oTable1, ofild, oControll
  oTable1 = thisComponent.drawpage.forms(0).getByName("MainForm_Nachname")
  If oTable1.getRowSet.RowCount =0 Then Exit Sub
'Die folgende Reihenfolge der Zeilen muss unbedingt einghalten werden
  oTable1.getRowSet.Last
  oControll = thiscomponent.CurrentController.getControl(oTable1)
  oControll.SetCurrentColumnPosition(1)
  thiscomponent.CurrentController.getControl(oTable1).setFocus
  sNameID = oTable1.getByIndex(1).Text
  oTable1.getRowSet.moveToInsertRow
' Ende der Reihenfolge, die unbedingt eingehalten werden muss
  ofild=oTable1.getByIndex(1)
  ofild.Text= sNameID
  ofild.commit
  oControll.SetCurrentColumnPosition(4)
end sub

Vielen Dank für Eure Hilfe.

Gruß

Jochen