Beste Verbindung von Datenbank und Fenster

Anfängerfragen zum Programmieren mit PureBasic.
Wolfvater Loki
Beiträge: 52
Registriert: 22.05.2022 15:37

Beste Verbindung von Datenbank und Fenster

Beitrag von Wolfvater Loki »

Hallo PB-Team,

ich habe noch ein paar Probleme mit Datenbankabfragen. Ich habe die Idee mit einem zweiten Fenster eine Datenbankabfrage zu machen. Im folgenden Beispiel ist nur die Prozedur Station wichtig. Alles was beim Fenster nicht mit dieser Prozedur zusammenhängt ist nicht wichtig. Ich möchte eine ähnliche Prozedur wie die Station-Prozedur, nur soll eine ganze Tabelle aus der Datenbank abgefragt werden.

Code: Alles auswählen

Procedure.s Station()
  OpenWindow(110,0,0,500,500,"Bahnhof wählen ...",#PB_Window_ScreenCentered)
  TextGadget(111,10,10,100,20,"Bahnhof:")
  StringGadget(112,120,10,300,20,"")
  ListViewGadget(113,120,35,300,200)
  ButtonGadget(114,10,250,100,20,"Übernehmen")
  cla = 0
  Repeat
    eventa = WaitWindowEvent()
    If eventa = #PB_Event_Gadget
      Select EventGadget()
        Case 112
          If EventType() = #PB_EventType_Change And Len(GetGadgetText(112)) > 2
            ClearGadgetItems(113)
            sql$ = "SELECT DISTINCT stop_name FROM stops WHERE stop_name LIKE '%"+GetGadgetText(112)+"%';"
            If DatabaseQuery(0, sql$)
              While NextDatabaseRow(0)
                AddGadgetItem(113,-1,GetDatabaseString(0,0))
              Wend
            EndIf
          EndIf
        Case 113
          If GetGadgetState(113) > -1 And EventType() = #PB_EventType_LeftClick
            SetGadgetText(112,GetGadgetItemText(113,GetGadgetState(113)))
          EndIf
        Case 114
          cla = 1
          bhf$ = GetGadgetText(112)
      EndSelect
    EndIf
  Until cla = 1
  CloseWindow(110)
  ProcedureReturn bhf$
EndProcedure

OpenWindow(100,0,0,1000,600,"Fahrplan",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonGadget(101,10,570,100,20,"Fahrtverlauf...")
ButtonGadget(102,120,570,100,20,"Bahnhofstafel ...")
PanelGadget(103,10,10,980,550)
CloseGadgetList()
Repeat
  event = WaitWindowEvent()
  If event = #PB_Event_Gadget
    gadget = EventGadget()
    Select gadget
      Case 101
        tid$ = InputRequester("Trip ID","Bitte geben Sie eine Trip-ID ein.","")
        sql$ = "SELECT arrival_time, departure_time, stop_id FROM stop_times WHERE trip_id = "+tid$+" ORDER BY stop_sequence;"
        If DatabaseQuery(0, sql$)
          OpenGadgetList(103)
          AddGadgetItem(103,-1,tid$)
          fahrt + 1
          lig = 2000+10*fahrt
          ListIconGadget(lig,10,40,900,450,"Bahnhof",250,#PB_ListIcon_FullRowSelect)
          AddGadgetColumn(lig,1,"Ankunft",80)
          AddGadgetColumn(lig,2,"Abfahrt",80)
          ButtonGadget(lig+9,10,500,100,20,"Schließen")
          CloseGadgetList()
          While NextDatabaseRow(0)
            AddGadgetItem(lig,-1,Bahnhof(GetDatabaseString(0,2))+Chr(10)+Uhrzeit(GetDatabaseString(0,0))+Chr(10)+Uhrzeit(GetDatabaseString(0,1)))
          Wend
          SetGadgetItemText(lig,0,"",1)
          SetGadgetItemText(lig,CountGadgetItems(lig)-1,"",2)
        Else
          MessageRequester("Fehler","Fehlerhafte Dateneingabe",0)
        EndIf

      Case 102
        bhf$ = Station()
        sql$ = "SELECT stop_id FROM stops WHERE stop_name = '"+bhf$+"';'"
        bnr$ = ""
        If DatabaseQuery(0, sql$)
          While NextDatabaseRow(0)
            bnr$ = bnr$ + GetDatabaseString(0,0) + ","
          Wend         
          sqla$ = "SELECT s.trip_id, s.departure_time, s.stop_sequence, t.route_long_name, t.trip_end FROM stop_times AS s JOIN trips AS t ON s.trip_id = t.trip_id WHERE s.stop_id IN ("+Mid(bnr$,1,Len(bnr$)-1)+") ORDER BY s.departure_time;"
          If DatabaseQuery(0, sqla$)
            OpenGadgetList(103)
            AddGadgetItem(103,-1,bhf$)
            tafel + 1
            lig = 1000+10*tafel
            ListIconGadget(lig,10,40,900,450,"Abfahrt",80,#PB_ListIcon_FullRowSelect)
            AddGadgetColumn(lig,1,"Trip-ID",80)
            AddGadgetColumn(lig,2,"Linie",80)
            AddGadgetColumn(lig,3,"Richtung",250)
            ButtonGadget(lig+9,10,500,100,20,"Schließen")
            CloseGadgetList()
            While NextDatabaseRow(0)
              If Bahnhof(GetDatabaseString(0,4)) <> bhf$
                AddGadgetItem(lig,-1,Uhrzeit(GetDatabaseString(0,1))+Chr(10)+GetDatabaseString(0,0)+Chr(10)+GetDatabaseString(0,3)+Chr(10)+Bahnhof(GetDatabaseString(0,4)))
              EndIf
            Wend
          EndIf
        Else
          MessageRequester("Fehler","Fehler bei Dateneingabe",0)
        EndIf
        
      Case 1000 To 3000
        If gadget % 10 = 9
          RemoveGadgetItem(103,GetGadgetState(103))
        EndIf
 
    EndSelect
  EndIf

Until event = #PB_Event_CloseWindow

CloseDatabase(0)
End
Wie kann ich das am besten machen.
Wolfvater Loki
Er wünscht euch schöne Grüße.
Wolfvater Loki
Beiträge: 52
Registriert: 22.05.2022 15:37

Re: Beste Verbindung von Datenbank und Fenster

Beitrag von Wolfvater Loki »

Kurze Anmerkung: Ich habe es schonmal gerfragt, mit anderen Werten. Dies ist wichtig für mein Projekt. Das Projekt hat eine Stelle, wo sowas Anwendung findet.
Wolfvater Loki
Er wünscht euch schöne Grüße.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Beste Verbindung von Datenbank und Fenster

Beitrag von mk-soft »

So funktioniert das nicht.
Hier bei meine ich nicht das mit der Datenbank, sondern beim Aufbau und Verarbeitung von Event.

Im Programm sollte es immer nur ein Event Loop geben und somit immer nur ein WaitWindowEvent.
Hier solltest du zuerst anfangen eine Stabiles Programm zu erstellen und dann erst mit der Datenbank anfangen.

Template: Stabile Event Verarbeitung.

Code: Alles auswählen

;-TOP

#ProgramTitle = "Main Window"
#ProgramVersion = "v1.01.2"

Enumeration Windows
  #Main
EndEnumeration

Enumeration MenuBar
  #MainMenu
EndEnumeration

Enumeration MenuItems
  #MainMenuAbout
  #MainMenuExit
EndEnumeration

Enumeration Gadgets
  #MainList1
  #MainList2
  #MainSplitter
  #MainButtonAbfrage1
  #MainButtonAbfrage2
EndEnumeration

Enumeration StatusBar
  #MainStatusBar
EndEnumeration

; ----

Procedure DoEventAbfrage1()
  Protected tid$, sql$
  tid$ = InputRequester("Trip ID","Bitte geben Sie eine Trip-ID ein.","")
  If tid$
    sql$ = "SELECT arrival_time, departure_time, stop_id FROM stop_times WHERE trip_id = "+tid$+" ORDER BY stop_sequence"
    ;TODO
  EndIf
EndProcedure

Procedure DoEventAbfrage2()
  Protected sql$, where$
  ;TODO
  where$ = ""
  sql$ = "SELECT DISTINCT stop_name FROM stops WHERE stop_name LIKE '%" + where$ + "%';"
  ;TODO
EndProcedure

; ----

Procedure UpdateWindow()
  Protected dx, dy
  dx = WindowWidth(#Main)
  dy = WindowHeight(#Main) - StatusBarHeight(#MainStatusBar) - MenuHeight()
  ; Resize gadgets
  ResizeGadget(#MainSplitter, 5, 5, dx - 10, dy - 45)
  ResizeGadget(#MainButtonAbfrage1, 10, dy - 35, 120, 30)
  ResizeGadget(#MainButtonAbfrage2, dx - 130, dy - 35, 120, 30)
EndProcedure

Procedure Main()
  Protected dx, dy
  
  #MainStyle = #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget
  
  If OpenWindow(#Main, #PB_Ignore, #PB_Ignore, 800, 600, #ProgramTitle , #MainStyle)
    ; Menu
    CreateMenu(#MainMenu, WindowID(#Main))
    MenuTitle("&File")
    CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
      MenuItem(#PB_Menu_About, "")
    CompilerElse
      MenuItem(#MainMenuAbout, "About")
      MenuBar()
    CompilerEndIf
    
    MenuItem(#MainMenuExit, "E&xit")
    
    ; StatusBar
    CreateStatusBar(#MainStatusBar, WindowID(#Main))
    AddStatusBarField(#PB_Ignore)
    
    ; Gadgets
    dx = WindowWidth(#Main)
    dy = WindowHeight(#Main) - StatusBarHeight(#MainStatusBar) - MenuHeight()
    ListIconGadget(#MainList1, 0, 0, dx - 10, dy - 45, "ID", 100)
    ListIconGadget(#MainList2, 0, 0, dx - 10, dy - 45, "ID", 100)
    
    SplitterGadget(#MainSplitter, 5, 5, dx - 10, dy - 45, #MainList1, #MainList2)
    ButtonGadget(#MainButtonAbfrage1, 10, dy - 35, 120, 30, "Abfrage 1")
    ButtonGadget(#MainButtonAbfrage2, dx - 130, dy - 35, 120, 30, "Abfrage 2")
    
    ; Bind Events
    BindEvent(#PB_Event_SizeWindow, @UpdateWindow(), #Main)
    
    ; Event Loop
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          Select EventWindow()
            Case #Main
              Break
              
          EndSelect
          
        Case #PB_Event_Menu
          Select EventMenu()
            CompilerIf #PB_Compiler_OS = #PB_OS_MacOS   
              Case #PB_Menu_About
                PostEvent(#PB_Event_Menu, #Main, #MainMenuAbout)
                
              Case #PB_Menu_Preferences
                
              Case #PB_Menu_Quit
                PostEvent(#PB_Event_CloseWindow, #Main, #Null)
                
            CompilerEndIf
            
          Case #MainMenuAbout
            MessageRequester("About", #ProgramTitle + #LF$ + #ProgramVersion, #PB_MessageRequester_Info)
              
          Case #MainMenuExit
            PostEvent(#PB_Event_CloseWindow, #Main, #Null)
            
          EndSelect
          
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #MainButtonAbfrage1
              DoEventAbfrage1()
              
            Case #MainButtonAbfrage2
              DoEventAbfrage2()
              
          EndSelect
          
      EndSelect
    ForEver
    
  EndIf
  
EndProcedure : Main()
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Beste Verbindung von Datenbank und Fenster

Beitrag von Nino »

@Wolfvater Loki:
Dir fehlt noch das Grundverständnis für das Programmieren in PureBasic.
Bevor Du Dich mit Datenbank-Programmierung u.Ä. beschäftigst, solltest Du erstmal ein einfaches Programm wie dieses soweit verbessern, dass es einen Sinn ergibt und funktioniert.
Und nimm Dir mal die Zeit und lies in der PureBasic-Hilfe gründlich das Kapitel „Wir beginnen zu programmieren“.
Wolfvater Loki
Beiträge: 52
Registriert: 22.05.2022 15:37

Re: Beste Verbindung von Datenbank und Fenster

Beitrag von Wolfvater Loki »

Danke für euere Vorschläge.
Wolfvater Loki
Er wünscht euch schöne Grüße.
Antworten