n:m beziehung in Base und Comboboxproblem

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

massioo
*
Beiträge: 13
Registriert: Mo, 08.02.2010 10:29

n:m beziehung in Base und Comboboxproblem

Beitrag von massioo »

Mahlzeit !


Ich bin ein Base / Basic Neuling und versuche einen Datenbankdesign, mit Base-formulare, umzusetzen. Leider bin ich dabei auf einige Grenzen gestoßen z.b n:m beziehungen usw.

Ich will eine Firma ,mit der dazu gehörigen PLZ und Ort, in ein Formular ausgeben. Nach der Normalisierung kam ich zum folgenden Datenbank-entwurf. Es gibt mehre Firmen in einen Ort und ein Ort kann mehre PLZ haben. Also hab ich in Mysql 4 Tabellen erstellt. Eine ist tbl_firmen die zweite ist tbl_Plz , die dritte tbl_Ort und die vierte tbl_plzort, um die n:m Beziehung zwischen Ort und Firma aufzulösen. In tbl_plzort sind die IDs der PLz und des Ortes gegenübergestellt. In tbl_Firmen ist die ID von tbl_plzort hinterlegt. soweit so gut^^.

Ich habe dann in Base eine Abfrage erstellt :

Code: Alles auswählen

SELECT `firma`.`Firmenname`, `firma`.`Straße`, `firma`.`Hausnummer`, `firma`.`Internetauftritt`, `ort`.`Ort`, `ort`.`Land`, `plz`.`plz` FROM `tbl_firmen` AS `firma` INNER JOIN `tbl_plzort` AS `po` ON `firma`.`ID_plzort_FK` = `po`.`ID_plzort` INNER JOIN `tbl_plz` AS `plz` ON `po`.`ID_plz_FK` = `plz`.`ID_plz` INNER JOIN `tbl_ort` AS `ort` ON `ort`.`ID_ort` = `po`.`ID_ort_FK`
Und dann habe ich ein Formular basierend auf der Abfrage erstellt.
Mein Problem:

1. Jetzt wird mir zwar die Firma der Ort und die Plz angezeigt aber ich kann denn Ort mit der dazugehörigen PLz nicht ändern !
Ich weiss das da nur Basic helfen kann (vermute ich jetzt mal) Aber weiss nicht wo und wie ich anfangen muss

Ein weiteres Problem:
Ich habe dann einfach mal versucht mir den Ort und den dazugehörigen PLZs anzuzeigen. Als
Beispiel habe ich Berlin mit den PLz 10023 und 13068.
Habe das mit ein Subformular erstmal gelöst. Diese Lösung erschien mir aber sehr unpraktikabel und nach etwas stöbern in diesen Forum habe ich dann ein Makro erstellt das mir die Postleitzahlen in einer Listenbox anzeigt. Hier das Makro

Code: Alles auswählen

Sub sql_where_in_listbox
  dim oForm as object 
  dim oList as object
  Dim new_sql(0) As string

  oForm=thiscomponent.drawpage.forms
  

' <cond> ist der Wert vom Hauptformular, der als Bedingung in der WHERE clause des Listenfeld-SQLs benutzt wird:
  cond=oForm.getByName("Ort").getByName("fmtID_ort").getCurrentValue
  
  if isEmpty( cond ) then  cond = "null"   
  oList=oForm.getByName("Ort").getByname("ListBox")
  CurrentController.getControl(oList)
' SQL statement für das Listenfeld
  new_sql(0) = "Select tbl_plz.plz from tbl_plzort inner join tbl_plz ON tbl_plz.ID_plz = tbl_plzort.Id_plz_FK where id_ort_FK =" & cond 

  oList.Listsource = new_sql     'ValueItemList(new_sql)
end sub
Danke hier erstmal an das Forummitglied, klappt einwandfrei ! :D Jetzt würde ich das gern mit einer Combobox ersetzen also hab ich in die Zeile oList=oForm.getByName("Ort").getByname("ComboBox") geänndert. (Natürlich auch die ComboBox im Formular vorher erstellt.) Es funktioniert aber nicht! Ich weiß auch nicht so ganz warum(bin leider nur Laie). Er bringt mir ein Fehler in der Zeile : oList.Listsource = new_sql mit den Dialog Basic Laufzeitfehler : Objektvariable nicht belegt.

Ich hoffe ihr schreckt nicht vor den langen Text hier ab :? Ich würde mich freuen wenn ihr mir helfen könnt.

gruß Massi...

p.s ich habe Openoffice 3.1 installiert mit xTray tool
massioo
*
Beiträge: 13
Registriert: Mo, 08.02.2010 10:29

Re: n:m beziehung in Base und Comboboxproblem

Beitrag von massioo »

Hmm anscheinend weiß das hier wohl keiner, na gut ich bin derweil ein schritt näher gekommen mit der "combobox" (eigentlich müsste das ins Basic Java bereich gepostet werden sry dafür)

nun hier mein Code falls jemand auch sowas sucht

Code: Alles auswählen

Sub sql_where_in_Combobox
  dim oForm as object 
  dim oList as object
  Dim new_sql(0)

  oForm= thiscomponent.drawpage.forms
  

' <cond> ist der Wert vom Hauptformular, der als Bedingung in der WHERE clause des Listenfeld-SQLs benutzt wird:
  cond=oForm.getByName("Ort").getByName("fmtID_ort").getCurrentValue
  
  if isEmpty( cond ) then  cond = "null" 
   
  oList=oForm.getByName("Ort").getByName("Combofeld")
  
  'prüfen ob listenfeld nach datensatzwechsel auf Standard gesetzt ist
  if olist.text <> "" then
  oList.text = ""
  end if
  
' SQL statement für das Listenfeld
  new_sql(0) = "SELECT.....FROM....where....= "& cond 

  oList.Listsource = new_sql(0)     

end sub
Das Problem lag wohl darin das beim zu weisen der Listenquelle die variable ohne (0) geschrieben worden ist (oList.Listsource = new_sql(0))
keine ahnung warum es so sein muss aber so klappt es. Mit dank nochmal an ManfredU :D
Antworten