Allgemeiner Codecheck

Alle Fragen zur Programmierung, die nicht in die speziellen Themen passen
vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » So 21. Mai 2017, 15:43

Hallo 4tionov,
das ist natürlich richtig, der Connect sollte nur einmal stattfinden.

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

Re: Allgemeiner Codecheck

Beitrag von tionov » So 21. Mai 2017, 17:42

vb6oldie hat geschrieben:
So 21. Mai 2017, 15:41
Es erscheint der Fehler: "Unbekannter Bezeichner: Open" in der Open-Zeile.
Was habe ich nun schon wieder falsch gemacht?
$Con.Open()

Sorry, da habe ich wohl was falsch geschrieben. Open ist eine eigene Methode in meinem Modul (das Du nicht kennst), die noch zusätzlich paar andere Sachen macht. Man soll halt nie nur Copypasten ...
Alles Gute,

4tionov

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » Mo 22. Mai 2017, 06:25

Hallo 4tionov,
jetzt bin ich einige Zeilen weiter.
Ich habe in FMain den Statement "mMain.$Connect.Exec(..." zu "mMain.$Con.Exec(...." geändert, und bekomme nun in mMain folgenden Fehler bei Error.Propagate:
Cannot open database: Can't connnect to local MySQL server through socket ’/var/run/mysqld/mysqld.sock' (2) in mMain:24

Mit phpmyadmin kann ich jedoch zugreifen.

Ich habe ein paar Daten über die DB gesammelt:
Bildschirmfoto vom 2017-05-22 07-15-00.png
Bildschirmfoto vom 2017-05-22 07-15-00.png (21.12 KiB) 4649 mal betrachtet
Vielleicht ist der Socket-Pfad in gambas anzupassen?

Liebe Grüße

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

Re: Allgemeiner Codecheck

Beitrag von tionov » Mo 22. Mai 2017, 07:41

Etwas Suche bei Google:

http://gambas.8142.n7.nabble.com/MySQL- ... 20074.html

Da es hier:
http://gambaswiki.org/wiki/howto/database
und hier :
http://gambaswiki.org/wiki/comp/gb.db/_connection/host

nicht steht, müssen wir es in die Dokumentation schreiben, wenn es funktioniert. Kannst du das testen?
Alles Gute,

4tionov

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » Mo 22. Mai 2017, 10:08

Hallo 4tionov,
ich habe versucht die Befehlsfolge, wie sie in "B.5.2.2 Can't connect to [local] MySQL server" beschrieben ist zu befolgen, es kommt der gleiche Fehler wie in meinem Programm.
Bildschirmfoto vom 2017-05-22 10-35-48.png
Bildschirmfoto vom 2017-05-22 10-35-48.png (23.29 KiB) 4646 mal betrachtet
Anscheinend läuft mysqld nicht, die Datei steht allerdings in einem anderen Verzeichnis und heißt leicht anders (mysql.sock).
Das Verzeichnis "/opt/lampp/var/run" ist leer.
Bildschirmfoto vom 2017-05-22 10-52-50.png
Bildschirmfoto vom 2017-05-22 10-52-50.png (44.92 KiB) 4646 mal betrachtet
Bildschirmfoto vom 2017-05-22 10-47-50.png
Bildschirmfoto vom 2017-05-22 10-47-50.png (15.59 KiB) 4646 mal betrachtet
Leider sind meine Englisch-Kenntnisse etwas beschränkt, so das ich nicht alles wirklich verstehen kann, was da so beschrieben wird.

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

Re: Allgemeiner Codecheck

Beitrag von tionov » Mo 22. Mai 2017, 11:35

Benoît schreibt in etwa:

Bei der Connection gib für "host" den Pfad zur Socket-Datei ein, wenn Gambas ein "/" am Beginn des hostnamens sieht, nimmt es an, dass es eine lokale Connection ist und verwendet den Socket.
Alles Gute,

4tionov

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » Mo 22. Mai 2017, 12:42

Hallo 4tionov,
wieder bin ich etwas weiter.
Ich habe als Host folgendes eingegeben: "$Con.Host = "/opt/lampp/var/mysql/mysql.sock" "

Jetzt bleibt es in FMain in der Zeile mMain.Con() mit dem Fehler stehen: "keine Funktion in FMain".
Hier sollte es die Property starten.

Liebe Grüße

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

Re: Allgemeiner Codecheck

Beitrag von tionov » Mo 22. Mai 2017, 13:54

So weit reicht meine Glaskugel nicht. Der Fehler heißt wohl, dass diese Funktion in FMain nicht existiert. Gambas bleib an der Stelle stehen und zeigt Dir die Zeile (wenn du kein Catch hast). Bau dir ein kleines Projekt, das nur(!) die Connection zur DB aufmacht. Und wenn du da nicht mehr weiter kommst, dann poste es hier.
Alles Gute,

4tionov

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » Mo 22. Mai 2017, 14:46

Hallo 4tionov,
ich habe hier das gewünschte Programm erstellt.
ConnTest-0.0.1.tar.gz
(11.65 KiB) 117-mal heruntergeladen
Die Datenbank ist von apachefriends/Download XAMPP, Version 5.6.30 / PHP 5.6.30, die erste Version für Ubuntu/Linux, falls ihr keine solche Datenbank zur Verfügung habt.

Als Tabelle genügt irgendeine tabelle mit mindestens einem datensatz, Die Angaben in der Property sin entsprechend anzupassen.

Viel Glück beim testen.

Liebe Grüße

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

Re: Allgemeiner Codecheck

Beitrag von tionov » Mo 22. Mai 2017, 15:38

So ist es richtig:
gambas code
Public Sub Form_Open()

  Dim res As Result
  Dim qry As String

  'mMain.Con() ' Run the Procedure to connect
  'FMain.Visible = True
  qry = "SELECT * FROM adr where adrno = 1 order by adrno desc;"
  res = mMain.Con.Exec(qry)

End
Du wolltest auf die private(!) Variable $Con von mMain zugreifen. Das geht nicht, extra. Sie hält die Connection und die nur lesbare Property Con liefert sie aus (oder sorgt dafür, dass die Connection aufgebaut wird, wenn $Con nicht bereits geöffnet ist).

Nun kannst du von überall her aus deinem Programm auf die Datenbank zugreifen, und zwar mit
gambas code
Dim res as result 

res = mMain.Con.Exec("Irgendeine-SQL-Query, die ein Ergebnis als Result liefert")
oder
gambas code
mMain.Con.Exec("Irgendeine-SQL-Query, die nur etwas ausführt, z.b. ein Delete")
Ist das genial, oder nicht? ;-)
Alles Gute,

4tionov

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » Mo 22. Mai 2017, 18:42

Hallo 4tionov,
ja, so habe ich mir das vorgestellt.

Eine Frage:
Ich habe die Formen fAdrSuchen, fAdrListe und fAdr.
in fAdrSuchen stelle ich den Select-Script zusammen und rufe damit die DB auf.
Je nach Ergebnis:
* bei 0 Sätzen gehe ich zurück an den Aufrufer.
* bei 1 Satz gehe ich zu fAdr ( zum Anzeigen in TextBoxen etc.).
* und bei mehr als einem Satz gehe ich zu fAdrListe und zeige das Ergebnis als GridView an.
Wie übermittle ich das Resultat zur Form fAdrListe?
Public Sub Form_Open(res als Result) (in fAdrList) geht nicht, muss ich vielleicht ein Objekt daraus machen?
Wenn ja, wie geht das?

Liebe Grüße

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

Re: Allgemeiner Codecheck

Beitrag von tionov » Di 23. Mai 2017, 06:54

vb6oldie hat geschrieben:
Mo 22. Mai 2017, 18:42
Wie übermittle ich das Resultat zur Form fAdrListe?
Public Sub Form_Open(res als Result) (in fAdrList) geht nicht, muss ich vielleicht ein Objekt daraus machen?
Wenn ja, wie geht das?
Ein Form ist eine spezielle Klasse, die von Form erbt. Durch die Elternklasse sind die Signaturen der Methoden (z,B. Public Sub Form_Open()) festgelegt und nicht zu ändern. Du kannst einem Form etwas übergeben, indem du in dem Form eine beschreibbare Property definierst, und das, was du übergeben möchtest, in Property_write verarbeitest. Du kannst auch etwas per _new() übergeben.

Wenn du ein Result übergeben möchtest, ist das aber in der Regel nicht besonders günstig. Etwas intelligenter wäre es, ein Form zu bauen, das eine Adresse selbstständig abfragen, anzeigen, bearbeiten lassen und speichern kann. Du übergibst nach dem Öffnen dem Form dann nur den PrimaryKey der Adresse in der Datenbank, den Rest kann das Form alleine erledigen:

Übergabe per _new
fmAdresse:
gambas code

Private $Pk As Long

Public Sub _new(PkAdresse As Long)
    'Aufruf Sub im Form

    $Pk = PkAdresse
    LadeDaten()

End

Sub LadeDaten()
    
    'Code zum Abruf von DB und Anzeigen
    
End
Code, um fmAdresse mit Adresse 1234 anzuzeigen gambas code
Dim fm as fmAdresse
fm = new fmAdresse(1234)
fm.Show

Übergabe per Property
fmAdresse:
gambas code
Property PkAdresse As Integer
Private $PkAdresse As Integer

Private Sub LadeDaten()
  
  'Baue query mit $PkAdresse, 
  'rufe Daten ab, 
  'zeige die Daten an
  
End


Private Function PkAdresse_Read() As Integer

    Return $PkAdresse

End

Private Sub PkAdresse_Write(Value As Integer)

     $PkAdresse = Value
     LadeDaten()

End
Code, um fmAdresse mit Adresse 1234 anzuzeigen gambas code
Dim fm as new fmAdresse
fm.PkAdresse = 1234
fm.Show
Bessere objektorientierte Programmstruktur

Das was ich Dir beschrieben habe, ist das Grundprinzip, wie man etwas an ein Form übergibt, das dann irgend etwas damit macht.

Für dein Problem wäre es aber noch besser, zuerst eine Klasse CAdresse zu bauen, die selbst die Daten der Adresse in Properties hält, und die die Public Methode Edit() anbietet, mit der sie ein Form anzeigt, mit dem die Adresse bearbeitet werden kann:

Klasse CAdresse
gambas code
' Gambas class file

'Klasse CAdresse

' -------------------------- Strings
Property Nachname As String
Private $Nachname As String

Property Strasse As String
Private $Strasse As String

Property Vorname As String
Private $Vorname As String

' -------------------------- Integers
Property PkAdresse As Integer
Private $PkAdresse As Integer

Public Sub Edit()

  Dim fm As New FmAdresse
  
  'fmAdresse hat eine Property Adresse As CAdresse
  'und 
  fm.Adresse = Me
  fm.Persistent = True
  fm.ShowModal
  If fm.WurdeGeaendert = True Then
    Save()
  Endif
  fm.Persistent = False
  fm.Close

End

Private Sub Save()
  
  'Speichere die Adresse in der DB
  
End

Private Sub Load()
  
  'Lade die Adresse in aus DB
  
End

' -------------------------- Getter/Setter Strings

Private Function Nachname_Read() As String

    Return $Nachname

End

Private Sub Nachname_Write(Value As String)

     $Nachname = Value

End

Private Function Strasse_Read() As String

    Return $Strasse

End

Private Sub Strasse_Write(Value As String)

     $Strasse = Value

End

Private Function Vorname_Read() As String

    Return $Vorname

End

Private Sub Vorname_Write(Value As String)

     $Vorname = Value

End

' -------------------------- Getter/Setter Integers

Private Function PkAdresse_Read() As Integer

    Return $PkAdresse

End

Private Sub PkAdresse_Write(Value As Integer)

     $PkAdresse = Value
    Load()


End

Alles Gute,

4tionov

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » Di 23. Mai 2017, 08:02

Hallo 4tionov,
ich habe letztens wohl noch nicht zu Ende gedacht.
Ich habe nun in der Form"fAdrSuchen" nur die Zusammenstellung des Select-Scriptes geplant ( was sehr aufwändig ist) im Moment steht nur ein fixer qry-Code hier (zum testen).
An die nächste Form "fAdrListe" übergebe ich nur den qry-script als String und frage damit die Datenbank ab.
Ich bekomme bereits das Ergebnis aus der Datenbank.
Ich kann auch den Header in der View anzeigen, aber keine Daten anzeigen.

Code: Alles auswählen

  GridView1.Header = 1
  GridView1.Columns.Count = res.Fields.Count
  GridView1.Columns[0].Width = 25
  GridView1.Columns[0].Resizable = False ' Die Feldbreite ID ist fix
  ' GridView-Spalten-Bezeichner ermitteln und eintragen
  For iSpaltenNummer = 0 To res.Fields.Count - 1
    GridView1.Columns[iSpaltenNummer].Title = res.Fields[iSpaltenNummer].Name
  Next ' Feldname
Was ist gemeint mit "Die Feldbreite ID ist fix"? Ich habe das auskommentiert, es ändert sich nichts.
Im Header benötige ich eine Möglichkeit, die Bezeichnungen der Spalten selber zu definieren, da die Bezeichnungen aus der DB nicht für Endbenutzer geeignet ist (bekomme ich hoffentlich hin).
Im Buch Seite 3.9.2 ist da anscheinend etwas daneben gelaufen.
Man benötigt zum Anzeigen von Daten 2 ineinander geschachtelte Schleifen, die 1. über die Zeilen und 2. über die Spalten geht.
Im Buch ist aber nur ein GridView_Data(....) angegeben, das aber nirgends aufgerufen wird!
Ich werde nun versuchen auch das noch hinzubekommen.
Wenn es nicht klappt, melde ich mich wider.

Liebe Grüße

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

Re: Allgemeiner Codecheck

Beitrag von tionov » Di 23. Mai 2017, 08:45

vb6oldie hat geschrieben:
Di 23. Mai 2017, 08:02
ich habe letztens wohl noch nicht zu Ende gedacht.
Ich habe nun in der Form"fAdrSuchen" nur die Zusammenstellung des Select-Scriptes geplant ( was sehr aufwändig ist) im Moment steht nur ein fixer qry-Code hier (zum testen).
An die nächste Form "fAdrListe" übergebe ich nur den qry-script als String und frage damit die Datenbank ab.
Das habe ich schon verstanden. Das (ob du nun ein Result oder einen Querystring übergibst ist egal) ist aber (extrem) schlechtes Design. So was hat man vielleicht früher mal mit VB 6 gemacht. Es ist unflexibel, nicht wiederverwendbar und führt zu sehr schlecht wartbarem Code.

Ich habe Dir oben jetzt lang und breit gezeigt, wie man das heute objektorientiert lösen kann, sodass man wartbaren Code bekommt und keinen Spaghettimist. Vielleicht magst du dich erst mal mit dem Posting beschäftigen? Wenn du verstehst, was ich sage, können wir uns weiter unterhalten. Aber wenn du nicht beachtest, was ich sage, und dich auch nicht mit den Beispielen beschäftigst, die ich dir zeige, dann sehe ich nicht, dass die Zeit, die ich investiere, auf fruchtbaren Boden fällt und dann musst du eben alleine weitersuchen.
Alles Gute,

4tionov

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » Di 23. Mai 2017, 08:47

Hallo 4tionov,
ich habe beides in etwa hinbekommen.
Mit der Anzeige im Grid bin ich noch nicht zufrieden.
Bildschirmfoto vom 2017-05-23 09-45-37.png
Bildschirmfoto vom 2017-05-23 09-45-37.png (25.49 KiB) 4635 mal betrachtet
Alle Spalten haben die gleiche Breite, es soll aber die Breite der Spalte nach der Breite des Spalten-Inhaltes aller Zeilen berechnet werden.
Wie kann ich das bewerkstellen?
Liebe Grüße

Gesperrt

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste