[GELÖST] results bearbeiten

Spezielle Fragen zu PostgreSQL, MySQL, SQLite, SQL ...
Antworten
swissgamba
Foriker
Beiträge: 45
Registriert: Mo 15. Sep 2014, 11:59
Kontaktdaten:

[GELÖST] results bearbeiten

Beitrag von swissgamba » Mo 15. Sep 2014, 17:47

Hallo, ich bin Neue hier, aber hab ein wenig erfahrung mit VBA und Access. Ich habe in MS world viel mit Recordsets gearbeitet.
Frage

möchte ganz einfach wissen wie mann eine ergebenisse von Results zufügt, löscht usw. in combination mit MySQL tabelle. Wer möchte mir Code beispiele posten hier? Bis jetzt habe ich viel probiert aber finde nicht was ich brauche.
iche habe auch mit Databrowser und datasource gearbeitet aber wenn ich der Databrowser mit ein Filter öffne, kann ich nicht mehr zufügen oder löschen...also möchte ich es mir Result versuchen.

Vielen dank, Frank
Zuletzt geändert von swissgamba am Mo 29. Dez 2014, 11:39, insgesamt 1-mal geändert.

Benutzeravatar
4tionov
Site Admin
Beiträge: 100
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: results bearbeiten

Beitrag von 4tionov » Mo 15. Sep 2014, 18:24

swissgamba hat geschrieben:Hallo, ich bin Neue hier, aber hab ein wenig erfahrung mit VBA und Access. Ich habe in MS world viel mit Recordsets gearbeitet.
Frage

möchte ganz einfach wissen wie mann eine ergebenisse von Results zufügt, löscht usw. in combination mit MySQL tabelle. Wer möchte mir Code beispiele posten hier? Bis jetzt habe ich viel probiert aber finde nicht was ich brauche.
iche habe auch mit Databrowser und datasource gearbeitet aber wenn ich der Databrowser mit ein Filter öffne, kann ich nicht mehr zufügen oder löschen...also möchte ich es mir Result versuchen.


Ein Result ist das Ergebnis einer Abfrage, es entspricht einem View in einer SQL DB. Views lassen sich nicht ändern (auch wenn es in "magic" Access" doch zu gehen scheint – mit teilweise gravierenden Nachteilen).

Um das Result zu ändern, änderst du also einfach die Daten in der DB und holst das Result neu:

gambas code
'Unter der Voraussetzung, dass die Connection schon in "con" definiert ist

Dim qry As String
dim qryins as string
Dim res As Result

'Das result abfragen
qry = "select keyword from tbkeyword;"
res = con.Exec(qry)

'Nun Hinzufügen (analog vorgehen für UPDATE und DELETE)
qryins = "insert into tbkeyword (keyword) values ('" & "Neues Keyword" & "');"
con.exec(qryins)

'Result wieder neu abfragen
res = con.Exec(qry)
'Jetzt hat man res mit geänderten Daten ...


Code ist ungetestet.

Ich habe jetzt nur mal das prinzip hingeschrieben. Die Funktionalität für Anzeigen, Hinzufügen, Ändern, Löschen machst du natürlich sinnvollerweise in separate Funktionen.

Wie du das Result in einen DataBrowser reinkriegst, musst du selber wissen. Ich habe mit dem DataBrowser noch nicht gearbeitet, der hat mir schon zu viel "Magic". ;-)
Alles Gute,

4tionov

swissgamba
Foriker
Beiträge: 45
Registriert: Mo 15. Sep 2014, 11:59
Kontaktdaten:

Re: results bearbeiten

Beitrag von swissgamba » Di 16. Sep 2014, 20:22

@4tionov
Danke für deiner Antwort. Es funktioniert. Aberrrr, jetzt habe ich das problem das dataview.refresh nicht funtioniert habe deiner code auch mit gridview versucht und auch diese macht kein update. Bin noch immer am suchen im internet....

tux_
Moderator
Beiträge: 941
Registriert: Di 11. Nov 2008, 20:05
Kontaktdaten:

Re: results bearbeiten

Beitrag von tux_ » Di 16. Sep 2014, 22:13

Was bedeutet "nicht funktioniert"? Tut es nichts? Gibt es einen Fehler? Macht es Daten kaputt? Schmeiszt es den Drucker an?

Am besten, du machst ein Projektarchiv fuer uns fertig (Project -> Make -> Source archive). Dann koennen wir die Dinge mit eigenen Augen sehen.
Achtung: Es passiert, dass ich einen frisch geschrieben Beitrag innerhalb von 10 Minuten noch 3-4 Mal aendere!

Benutzeravatar
4tionov
Site Admin
Beiträge: 100
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: results bearbeiten

Beitrag von 4tionov » Mi 17. Sep 2014, 06:01

swissgamba hat geschrieben:@4tionov
Danke für deiner Antwort. Es funktioniert. Aberrrr, jetzt habe ich das problem das dataview.refresh nicht funtioniert habe deiner code auch mit gridview versucht und auch diese macht kein update. Bin noch immer am suchen im internet....


Refresh zeichnet das Control neu. Das bringt dir gar nichts, denn es holt nicht die Daten:
http://gambaswiki.org/wiki/comp/gb.qt4/control/refresh

Du hast doch hoffentlich dein Control mit einer Funktion gefüllt? Dann einfach die Funktion wieder aufrufen. Wenn du das stattdessen in Form_Open gemacht hast, dann den entsprechenden Code in eine Funktion ausgliedern und die sowohl von Form_Open als auch an den Stelle aufrufen, an der du die Daten geändert hast. Und wenn es nicht funktioniert, such nicht so arg lange, sondern frag gleich.

Ich hänge Dir jetzt exemplarisch mal eine Klasse namens "DegSQLTableView" an, mit der ich bei mir primitive Tabellen per SQL aufbaue. Als Beispiel:

gambas code
' Gambas class file

'' SQL TableView, zeigt eine Tabelle als Ergebnis
'' einer SQL-Abfrage.
''
'' Usage:
''
'' Dim qry As String
'' TbNews = New DegSQLTableView(PanelNews) As "TbNews"
'' qry = "SELECT * FROM tbweb_site_news order by pknachricht desc;"
'' TbNews.addColumn("pknachricht",, 0)
'' TbNews.addColumn("nachricht",, 0)
'' TbNews.addColumn("datum",, 100, "dd mm yyyy")
'' TbNews.addColumn("titel",, 30)
'' TbNews.SetDBQuery (dbs.Deg, qry)
'' TbNews.show ()

Inherits TableView

Public Records As Result

Private Querystring As String
Private gridname As String
Private Con As Connection
Private Cols As New Collection

Public Sub _new()

Me.Header = TableView.Horizontal
Me.Mode = Select.Single

End

Public Sub Show()
'Füllt das TableView und zeigt es an

Dim i As Integer
Dim R As Integer
Dim C As Integer
Dim StrFormat As String
Dim Value As Variant
Dim Col As Collection

Me.Name = gridname

Me.Columns.Count = cols.Count

i = 0
'Spaltendefinitionen
For Each Col In Cols

'Titel
If Col["Title"] Then
Me.Columns[i].Title = Col["Title"]
Else
Me.Columns[i].Title = cols.Key
Endif

'Width
If Col["Width"] > 0 Then
Me.Columns[i].Width = Col["Width"]
Else
Me.Columns[i].Width = 0
Endif

i += 1
Next

'Rows und Spalten mit Daten füllen
For Each Records
R = Records.Index
Me.Rows.count = (R + 1)
C = 0

For Each Col In cols
value = Records[cols.key]
'Format zuweisen

If Col["Format"] Then
strFormat = Col["Format"]
value = Format(value, strFormat)
Endif

Me[R, C].text = value
C += 1
Next

Next

Me.Visible = True
Me.Parent.Show
Catch
degError.Handler

End

Public Sub AddColumn(StrName As String, Optional StrTitle As String, Optional IntWidth As Integer, Optional strFormat As String)

Dim Col As New Collection

If intWidth = Null Then intWidth = 0
Col.Add(IntWidth, "Width")
Col.Add(StrTitle, "Title")
Col.add(strFormat, "Format")
Cols.Add(col, StrName)

End

Public Sub SetDBQuery(DB As Connection, Qstring As String)

Querystring = Qstring
Con = DB
Connect

End

Private Sub Connect()

Records = Con.Exec(Querystring)

End


Wenn ich damit eine Tabelle anzeige kann ich also im Code SetDBQuery(con, qry) und show() aufrufen und kriege die Tabelle mit neuen Daten angezeigt.
Alles Gute,

4tionov

swissgamba
Foriker
Beiträge: 45
Registriert: Mo 15. Sep 2014, 11:59
Kontaktdaten:

Re: results bearbeiten

Beitrag von swissgamba » Mi 17. Sep 2014, 14:49

@ 4toinov:
vielleicht nicht eine schöne programmierung, aber habe selber gesternabend auch erfolgreich eine lösung gefunden:

Code: Alles auswählen

' Gambas class file

Public databaseConnection As New Connection
Public resultData As Result

Public Sub Form_Open()

  ' Set database connection properties
  databaseConnection.Type = "mysql"
  databaseConnection.Host = "localhost"
  databaseConnection.Name = "Goresfacilities"
  databaseConnection.Login = "root"
  databaseConnection.Port = "3306"
  ' Open the connection
  Try databaseConnection.Open()
  If Error Then
    Message.Info("<b>Could not open database connection</b><hr>Error:<br>" & Error.Text)
    Return
  End If
  Fill
  End
Public Sub Fill()
    Dim c As Integer
  ' Get the data in a table.
  resultData = databaseConnection.Edit("Tblleistungen")
  ' Set the number of GridView columns
  GridViewData.Header = True
  GridViewData.Columns.Count = resultData.Fields.Count
  If GridViewData.Rows.Count <> 0 Then
      GridViewData.Clear
  Endif
  ' Fill in column headers from field names
  For c = 0 To resultData.Fields.Count - 1
    GridViewData.Columns[c].Text = resultData.Fields[c].Name
  Next
  ' Set the number of data rows
  GridViewData.Rows.Count = resultData.Count
  Me.Center

Catch
  Message.Info("<b>Select database records error</b><hr>Error:<br>" & Error.Text)
End

Public Sub Form_Close()
  ' Make sure we close the database connection
  ' We use TRY so if there is an error we still
  ' quit the application
  Try databaseConnection.Close()
End

Public Sub GridViewData_Data(Row As Integer, Column As Integer)
  resultData.MoveTo(Row)
  GridViewData.Data.Text = resultData[Column]
End

Public Sub Button1_Click()

    Dim qry As String
    Dim qryins As String
    Dim res As Result
    Dim row As Integer = GridViewData.Rows.Count
   
    'Das result abfragen
    qry = "select * from Tblleistungen"
    res = databaseConnection.Exec(qry)
     
    'Nun Hinzufügen (analog vorgehen für UPDATE und DELETE)
    qryins = "insert into Tblleistungen (VertragID,leistungenID, Stunden) values( '" & TextBox1.Text & "',  '" & TextBox2.Text & "', '" & TextBox3.Text & "')"
    databaseConnection.exec(qryins)
    'textboxen leeren
    TextBox1.text = ""
    TextBox2.text = ""
    TextBox3.text = ""
    'erneut gridview füllen
    Fill
End


Aber es functioniert und der Datagrid wird mit der neue daten gefüllt. Ich werde dein beitrag auch mal versuchen, vielen dank für deiner Antwort.

Benutzeravatar
4tionov
Site Admin
Beiträge: 100
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: results bearbeiten

Beitrag von 4tionov » Mi 17. Sep 2014, 15:18

Cool, du bist praktisch auf die selbe Idee gekommen. Wenn du nun noch die Connection in ein Modul (das Modul heißt bei uns "Dbs") auslagerst, so :

gambas code
' Gambas module file

'' Statische dB-Connections, werden hier ein einziges Mal erstellt.

'' DB Db1
Public Db1 As New Connection

Public Sub _init()

startconnections

End

'' startconnections() startet die Connection aller genutzen DB
Private Sub startconnections()

'Datenbank Db1
If Not Db1.Opened Then
'Debug "Open connection to db Db1"
Db1.Type = "postgresql"
Db1.Host = Settings["Db1/Host", ""]
Db1.Name = Settings["Db1/Datenbank", ""]
Db1.Login = Settings["Db1/User", ""]
Db1.Password = Settings["Db1/Password", ""]
Db1.Open()
Endif

Catch
UnserEigenerErrorhandler

End


Dann kannst du die Connection programmweit wiederverwenden, immer wenn du sie brauchst, schreibst du:

gambas code
dim con as Connection
con = Dbs.Db1


Du kannst dann mit dem Modul auch 50 verschiedene Datenbanken öffnen, wenn du möchtest und die DB-Connections immer wiederverwenden. Das Modul ist ein Singleton, es stellt sicher, dass pro DB in deinem Programm nur eine Connection existiert.
Alles Gute,

4tionov

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast