Problem mit Listenfeld
Moderator: Moderatoren
Problem mit Listenfeld
hallo zusammen!
habe folgendes problem:
mit hilfe eines makros können aus einer datenbank firmen und anschließend die zu einer bestimmten firma gehörenden kontaktpersonen ausgewählt werden (mit hilfe von listenfeldern), was auch ohne probleme funktioniert. nun sollen die ausgewählten daten (firmen und dazugehörige kontaktperson) in einer anderen tabelle gespeichert werden, jedoch nicht mit ihren namen, sondern ihren id´s, die ihnen natürlich vorher in den tabellen zugewiesen wurden.
hier liegt nun das problem: habe die id´s mit dem select-sql-befehl mit ausgelesen, aber wie kann ich die id zu einer firma herauslesen, die ich vorher in einem listenfeld ausgewählt habe?
hier mal mein bisheriger code:
Sub DialogStart
Dim objDatabaseContext As Object
Dim objDataSource As Object
Dim objConnection As Object
Dim objConnection1 As Object
Dim objInteractionHandler as Object
Dim objStatement As Object
Dim objStatement1 As Object
Dim objResultSet As Object
Dim objResultSet1 As Object
Dim i As integer
Dim j As integer
Dim lstListe As Object
Dim lstListe1 As Object
Dim intPos As Integer
Dim intPos1 As Integer
Dim strFirma As String
i = 1
j = 1
objDatabaseContext = _
createUnoService("com.sun.star.sdb.DatabaseContext")
objDataSource = objDatabaseContext.getByName("Linux4")
If Not objDataSource.IsPasswordRequired Then
objConnection = objDataSource.GetConnection("","")
Else
objInteractionHandler = _
createUnoService("com.sun.star.sdb.InteractionHandler")
objConnection = _
objDataSource.ConnectWithCompletion(objInteractionHandler)
End If
objConnection1 = _
objDataSource.ConnectWithCompletion(objInteractionHandler)
objStatement1 = objConnection1.createStatement()
objResultSet1 = _
objStatement1.executeQuery("Select `NA1`, `ID` FROM `Daten`.`Firmen` `Firmen` Order By `NA1` Asc")
DialogLibraries.LoadLibrary("Standard")
Dlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
Dlg.Title = "Personenauswahl"
If Not IsNull(objResultSet1) Then
While objResultSet1.next
Dlg.getControl("ListBox2").addItem(objResultSet1.getString(1),j)
j = j+1
Wend
End If
Dlg.Execute()
lstListe = Dlg.getControl("ListBox2")
intPos = lstListe.selectedItemPos
If intPos > -1 Then
strFirma = lstListe.selectedItem(1)
MsgBox "Sie haben " & strFirma & intID & " ausgewählt!"
End If
objStatement = objConnection.createStatement()
objResultSet = _
objStatement.executeQuery("SELECT `Personen`.`Name` FROM `Daten`.`Firmen` `Firmen`, `Daten`.`Personen` `Personen` WHERE ( `Firmen`.`ID` = `Personen`.`Arb` ) AND ( ( `Firmen`.`NA1` = '" & strFirma & "') ) ORDER BY `Personen`.`Name` ASC")
If Not IsNull(objResultSet) Then
While objResultSet.next
Dlg.getControl("ListBox1").addItem(objResultSet.getString(1),i)
i = i+1
Wend
End If
Dlg.Execute()
lstListe1 = Dlg.getControl("ListBox1")
intPos1 = lstListe1.selectedItemPos
If intPos1 > -1 Then
strPerson = lstListe1.selectedItem
MsgBox "Sie haben als Kontaktperson der Firma " & strFirma & Chr(13) & strPerson & " ausgewählt!"
End If
REM objConnection2 = _
REM objDataSource.ConnectWithCompletion(objInteractionHandler)
REM objStatement2 = objConnection2.createStatement()
REM objResultSet2 = _
REM objStatement2.executeUpdate("INSERT INTO `Daten`.`Testangebeote` (`Firma`, `Person`) VALUES ('2', '3')")
objResultset.Close()
objResultset1.Close()
objStatement.Close()
objConnection.Close()
End Sub
bin auch nur mako- und basic-neuling, habe mir dieses programm mit hilfe eines buches zurechtgesucht. leider steht da zu meinem beschriebenen problem nix drin.
hoffe mir kann jemand von euch helfen!
gruß
Jens
habe folgendes problem:
mit hilfe eines makros können aus einer datenbank firmen und anschließend die zu einer bestimmten firma gehörenden kontaktpersonen ausgewählt werden (mit hilfe von listenfeldern), was auch ohne probleme funktioniert. nun sollen die ausgewählten daten (firmen und dazugehörige kontaktperson) in einer anderen tabelle gespeichert werden, jedoch nicht mit ihren namen, sondern ihren id´s, die ihnen natürlich vorher in den tabellen zugewiesen wurden.
hier liegt nun das problem: habe die id´s mit dem select-sql-befehl mit ausgelesen, aber wie kann ich die id zu einer firma herauslesen, die ich vorher in einem listenfeld ausgewählt habe?
hier mal mein bisheriger code:
Sub DialogStart
Dim objDatabaseContext As Object
Dim objDataSource As Object
Dim objConnection As Object
Dim objConnection1 As Object
Dim objInteractionHandler as Object
Dim objStatement As Object
Dim objStatement1 As Object
Dim objResultSet As Object
Dim objResultSet1 As Object
Dim i As integer
Dim j As integer
Dim lstListe As Object
Dim lstListe1 As Object
Dim intPos As Integer
Dim intPos1 As Integer
Dim strFirma As String
i = 1
j = 1
objDatabaseContext = _
createUnoService("com.sun.star.sdb.DatabaseContext")
objDataSource = objDatabaseContext.getByName("Linux4")
If Not objDataSource.IsPasswordRequired Then
objConnection = objDataSource.GetConnection("","")
Else
objInteractionHandler = _
createUnoService("com.sun.star.sdb.InteractionHandler")
objConnection = _
objDataSource.ConnectWithCompletion(objInteractionHandler)
End If
objConnection1 = _
objDataSource.ConnectWithCompletion(objInteractionHandler)
objStatement1 = objConnection1.createStatement()
objResultSet1 = _
objStatement1.executeQuery("Select `NA1`, `ID` FROM `Daten`.`Firmen` `Firmen` Order By `NA1` Asc")
DialogLibraries.LoadLibrary("Standard")
Dlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
Dlg.Title = "Personenauswahl"
If Not IsNull(objResultSet1) Then
While objResultSet1.next
Dlg.getControl("ListBox2").addItem(objResultSet1.getString(1),j)
j = j+1
Wend
End If
Dlg.Execute()
lstListe = Dlg.getControl("ListBox2")
intPos = lstListe.selectedItemPos
If intPos > -1 Then
strFirma = lstListe.selectedItem(1)
MsgBox "Sie haben " & strFirma & intID & " ausgewählt!"
End If
objStatement = objConnection.createStatement()
objResultSet = _
objStatement.executeQuery("SELECT `Personen`.`Name` FROM `Daten`.`Firmen` `Firmen`, `Daten`.`Personen` `Personen` WHERE ( `Firmen`.`ID` = `Personen`.`Arb` ) AND ( ( `Firmen`.`NA1` = '" & strFirma & "') ) ORDER BY `Personen`.`Name` ASC")
If Not IsNull(objResultSet) Then
While objResultSet.next
Dlg.getControl("ListBox1").addItem(objResultSet.getString(1),i)
i = i+1
Wend
End If
Dlg.Execute()
lstListe1 = Dlg.getControl("ListBox1")
intPos1 = lstListe1.selectedItemPos
If intPos1 > -1 Then
strPerson = lstListe1.selectedItem
MsgBox "Sie haben als Kontaktperson der Firma " & strFirma & Chr(13) & strPerson & " ausgewählt!"
End If
REM objConnection2 = _
REM objDataSource.ConnectWithCompletion(objInteractionHandler)
REM objStatement2 = objConnection2.createStatement()
REM objResultSet2 = _
REM objStatement2.executeUpdate("INSERT INTO `Daten`.`Testangebeote` (`Firma`, `Person`) VALUES ('2', '3')")
objResultset.Close()
objResultset1.Close()
objStatement.Close()
objConnection.Close()
End Sub
bin auch nur mako- und basic-neuling, habe mir dieses programm mit hilfe eines buches zurechtgesucht. leider steht da zu meinem beschriebenen problem nix drin.
hoffe mir kann jemand von euch helfen!
gruß
Jens
Hey Jens,
Da zwischen muss dein Auslesen. Dein result-Set besteht aus einem Array mit jeweils zwei elementen - der Fimar und der ID. Du musst also die richtige Zeile des Resultsets finden - dann hast du deine ID - vorausgesetzt, der Name der Firma ist auch eindeutig!
Z.B.:
Da müsstest du aber noch ein paar Prüfkriterien einbauen und Fehler abfangen.
So, jetzt bleibt natürlich die Frage, ob du damit tatsächlich etwas anfangen kannst?
Viele Grüße
Thomas
Doch. Aber das ist ja richtige Arbeit. Ewig langer Code-Post, und - ich denke, du weisst gar nicht so genau, was du da machst. Wo soll man denn da ansetzen?weiß denn wirklich niemand rat?
Code: Alles auswählen
lstListe = Dlg.getControl("ListBox2")
intPos = lstListe.selectedItemPos
If intPos > -1 Then
strFirma = lstListe.selectedItem(1)
MsgBox "Sie haben " & strFirma & intID & " ausgewählt!"
End If
Z.B.:
Code: Alles auswählen
flag = true
do while objResultSet1.next
if objResultSet1.getString(1)=lstListe.selectedItem(1) then
intID = objResultSet1.getInt(2)
exit do
loop
So, jetzt bleibt natürlich die Frage, ob du damit tatsächlich etwas anfangen kannst?
Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
hallo thomas!
vielen dank für deine hilfe und dafür, dass du dich mal durch den code durchgewühlt hast!
hab den code mal eingebaut und einen kleinen fehler berichtigt (muss end if anstatt end do heißen); doch leider nimmt intID keine werte an; hatte mir die variable in einer messagebox anzeigen lassen, sie besitz aber immer den wert 0. wenn ich in das listenfeld mit getString(2) auslese, bekomme ich auch die korrekten ID´s, daran liegt es also nicht.
hast du vielleicht noch ne idee?
hast recht: 100%-ig versteh ich net alles im detail, aber der codeaufbau im allgemeinen ist mir schon klar.
gruß
jens
vielen dank für deine hilfe und dafür, dass du dich mal durch den code durchgewühlt hast!
hab den code mal eingebaut und einen kleinen fehler berichtigt (muss end if anstatt end do heißen); doch leider nimmt intID keine werte an; hatte mir die variable in einer messagebox anzeigen lassen, sie besitz aber immer den wert 0. wenn ich in das listenfeld mit getString(2) auslese, bekomme ich auch die korrekten ID´s, daran liegt es also nicht.
hast du vielleicht noch ne idee?
hast recht: 100%-ig versteh ich net alles im detail, aber der codeaufbau im allgemeinen ist mir schon klar.

gruß
jens
habe jetzt mal was anderes versucht und folgendes segment eingefügt:
objConnection3 = _
objDataSource.ConnectWithCompletion(objInteractionHandler)
objStatement3 = objConnection3.createStatement()
objResultSet3 = _
objStatement3.executeQuery("SELECT `ID` FROM `Daten`.`Firmen` `Firmen` WHERE ( ( `NA1` = '" & strFirma & "' ) )")
msgBox objResultSet3.getInt(1) ********
doch leider bringt er mir da in der reihe mit den sternchen folgenden fehler:
Basic Laufzeitfehler. Es ist eine Exception aufgetreten Type:com.sun.star.sdbc.SQLException Message:[Microsoft][ODBC Driver Manager] Ungültiger Cursorstatus
das attribut ID ist in der Datenbank übrigens mit integer auto increment deklariert worden; den sql-befehl habe ich so aus openoffice kopiert und mit der variable modifiziert.
weiß jetzt auch net, warum dieser fehler erscheint
gruß
objConnection3 = _
objDataSource.ConnectWithCompletion(objInteractionHandler)
objStatement3 = objConnection3.createStatement()
objResultSet3 = _
objStatement3.executeQuery("SELECT `ID` FROM `Daten`.`Firmen` `Firmen` WHERE ( ( `NA1` = '" & strFirma & "' ) )")
msgBox objResultSet3.getInt(1) ********
doch leider bringt er mir da in der reihe mit den sternchen folgenden fehler:
Basic Laufzeitfehler. Es ist eine Exception aufgetreten Type:com.sun.star.sdbc.SQLException Message:[Microsoft][ODBC Driver Manager] Ungültiger Cursorstatus
das attribut ID ist in der Datenbank übrigens mit integer auto increment deklariert worden; den sql-befehl habe ich so aus openoffice kopiert und mit der variable modifiziert.
weiß jetzt auch net, warum dieser fehler erscheint
gruß
Hallo Jens,
das ist das Problem, wenn man im "Trüben" stochert.
Es fehlte ein "end if" nach der Zeile "exit do". Die Zeile "exit do" ist notwendig, sonst könntest du eine Endlosschleife erhalten.
Wenn du aber diese mit "getString(2) " ausliesen kannst, sind das eben keine Zahlen sondern Strings - also Texte!
Dann musst du natürlich auch die Zeile
insofern ändern:
Denn sonst kommt da immer "0" raus.
Das bringt dir auch den Fehler im nächsten Code:
Auch hier wird versucht, eine Integer-Variable auszulesen, du hast aber einen wohl String dafür definiert .
Im Übrigen fehlt der Zugriff auf den ersten Array des Resultsets. Mit "objResultSet3" erhälst du das Objekt eines Resultsets, also quasi einer Tabelle mit Spalten und Zeilen. Pro Zeile ein Datensatz.
Jetzt musst du den Resultset-Zeiger erst mal auf einen speiellen Datensatz plazieren, bevor du mit .getIrgendetwas(Spalte) den Spaltenwert auslesen kannst.
Tia, du siehst, das sind alles Grundlagen - und kaum in einem kurzen Post zu vermitteln. Warum suchst du dir denn auch gleich so mit das komplizierteste der Basic-Programmierung raus, und das, um zu beginnen
Gruss
Thomas[/code]
das ist das Problem, wenn man im "Trüben" stochert.
OK, da ist wirklich ein Fehler drin. Aber nicht so, wie du den darstellst:einen kleinen fehler berichtigt (muss end if anstatt end do heißen)
Es fehlte ein "end if" nach der Zeile "exit do". Die Zeile "exit do" ist notwendig, sonst könntest du eine Endlosschleife erhalten.
Nun, ich ging davon aus, dass "intID" eine Zahl (Integer) sein soll und dass die auch so in der Datenbank steht.nimmt intID keine werte an
Wenn du aber diese mit "getString(2) " ausliesen kannst, sind das eben keine Zahlen sondern Strings - also Texte!
Dann musst du natürlich auch die Zeile
Code: Alles auswählen
intID = objResultSet1.getInt(2)
Code: Alles auswählen
intID = objResultSet1.getString(2)
Das bringt dir auch den Fehler im nächsten Code:
Code: Alles auswählen
msgBox objResultSet3.getInt(1)
Im Übrigen fehlt der Zugriff auf den ersten Array des Resultsets. Mit "objResultSet3" erhälst du das Objekt eines Resultsets, also quasi einer Tabelle mit Spalten und Zeilen. Pro Zeile ein Datensatz.
Jetzt musst du den Resultset-Zeiger erst mal auf einen speiellen Datensatz plazieren, bevor du mit .getIrgendetwas(Spalte) den Spaltenwert auslesen kannst.
Tia, du siehst, das sind alles Grundlagen - und kaum in einem kurzen Post zu vermitteln. Warum suchst du dir denn auch gleich so mit das komplizierteste der Basic-Programmierung raus, und das, um zu beginnen

Gruss
Thomas[/code]
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
hallo thomas!
danke für die tipps, werde sie mal später versuchen umzusetzen.
mache momentan ein praktikum und da muss ich jetzt eben auch was an makros pfuschen, was ich mir vorher auch net aussuchen konnte.
mit solchen problemstellungen hätte ich auch sonst net angefangen; aber mit dem im trüben fischen hast du schon recht; mir bleibt aber wie gesagt momentan auch nix anderes übrig.
werd mich da wohl durchkämpfen müssen.
schon mal danke für deine mühe und geduld... !
gruß
jens
danke für die tipps, werde sie mal später versuchen umzusetzen.
mache momentan ein praktikum und da muss ich jetzt eben auch was an makros pfuschen, was ich mir vorher auch net aussuchen konnte.

mit solchen problemstellungen hätte ich auch sonst net angefangen; aber mit dem im trüben fischen hast du schon recht; mir bleibt aber wie gesagt momentan auch nix anderes übrig.
werd mich da wohl durchkämpfen müssen.
schon mal danke für deine mühe und geduld... !
gruß
jens