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 » Sa 27. Mai 2017, 05:54

Hallo 4tionov,
ich werde mal nachdenken und meine Probleme vorläufig selber zu lösen versuchen.
Bis dann.
Liebe Grüße

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

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » Sa 27. Mai 2017, 12:59

Hallo 4tionov,
ich habe lange probiert, aber es geht nicht.

Ich habe zwar einige Funktionen in cAdrSuchen gestellt (Darunter die Funktion "Private Function Adr_Find() as string") und die Form-Feldnamen auf die Objekt-Feldnamen umgestellt.
Aber ich kann diese Funktion (Adr_Find) nicht aufrufen.
FirstTest002-0.0.1.tar.gz
(29.36 KiB) 106-mal heruntergeladen
In CAdrSuchen benötige ich kein "Edit()" und kein "Save()" , wie im adressbeispiel beschrieben, es soll nur einen SQL-String zusammenstellen und zurück liefern.

Liebe Grüße

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

Re: Allgemeiner Codecheck

Beitrag von tionov » Sa 27. Mai 2017, 15:12

Hallo vb6oldie,

Form FMain ruft fAdrSuchen auf. Dort kann ich beliebiges eingeben, wenn ich aber auf Suchen drücke, schließt sich das Form, der Code springt zurück zu FMain, da wird Me.Close aufgerufen und damit schließt sich das Programm.

Wenn du ein Programm schreiben wolltest, das sich nach Klick auf "Suchen" schließt, dann ist dir das doch gelungen ... ;-)

Nö, Spaß beiseite, in fAdrSuchen:
gambas code
Public Sub Button1_Click() 'Suchen
  'zusamenstellen des sSQL-Strings aufrufen

  Dim adr As New CAdrSuchen

  sSQL = adr.Adr_Find()

  hFile = Open sFilePath For Write Create ' Die Exportdatei wird stets neu angelegt
  Write #hFile, sSQL
  Close #hFile

  Me.Close

End
und in CAdrSuchen muss Adr_Find() Public sein! gambas code
Public Function Adr_Find() As String
Und statt den SQL in einen Log zuschreiben, könntest du auch einfach das schreiben:
gambas code
Debug sSQL
Dann siehst du das SQL auch.
Alles Gute,

4tionov

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

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » Sa 27. Mai 2017, 15:51

Hallo 4tionov,
es hat also nur daran gelegen, dass es eines neuen (abgeleiteten) Objektes bedurfte?
Das die Funktion Public sein soll habe ich mir beim ausprobieren schon gedacht.

Das mit der Datei, in die ich den SQL-String schreibe, dient dazu später nachvollziehen zu können, was der Benutzer eingegeben hat, wenn er ein falsches Ergebnis erhält und nicht dem Debuggen. Aber es soll nicht als fortlaufendes Log dienen.
Das mit dem schließen des Programms ist nur eine Hilfe beim testen, damit ich nicht dauernd auch noch das Programm manuell beenden muss.

So, und nach dem das nun funktioniert, soll es eine weitere Form (fAdrListe) geben, in der mit dem sSQL-String die Datenbank bemüht wird.
Nach dem Aufruf an die DB soll es (später mal die Entscheidung geben, was angezeigt wird oder ob abgebrochen wird).
Doch in der Testphase sollen die Daten in einem Gridview angezeigt werden (in der selben Form: fAdrListe).
Ist das korrekt, wenn ich von einer Form zur nächsten springe, ohne jeweils wieder zur aufrufenden Form zurückzukehren und erst von da die nächste Form aufzurufen?
Übergebe ich den SQL-String an die nächste Form mit "_New"? In dieser Form werde kein eigenes Objekt haben. Da es hier nur das Grid zu füllen gilt.

Liebe Grüße

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

Re: Allgemeiner Codecheck

Beitrag von tionov » Sa 27. Mai 2017, 17:34

vb6oldie hat geschrieben:
Sa 27. Mai 2017, 15:51
es hat also nur daran gelegen, dass es eines neuen (abgeleiteten) Objektes bedurfte?
Ja, und natürlich, dass die aufzurufende Funktion Public ist.

Zur Nomenklatur:

Du hast eine Klasse (cAdrSuchen) erstellt, sie ist die Bauanleitung für ein Objekt. Das Objekt wird mit New erstellt und einer Objektvariablen gleichen Typs (adr) zugewiesen. Das Objekt kapselt Werte und stellt sie über Properties zur Verfügung, und es kapselt Methoden und stellt diese zur Verfügung. Die Methoden, Variablen und Properties des Objektes können über die Objektvariable aufgerufen werden.

Ok? Dann ist das jetzt Stand Deines Wissens.
Das mit der Datei, in die ich den SQL-String schreibe, dient dazu später nachvollziehen zu können, was der Benutzer eingegeben hat, wenn er ein falsches Ergebnis erhält und nicht dem Debuggen. Aber es soll nicht als fortlaufendes Log dienen.
Das mit dem schließen des Programms ist nur eine Hilfe beim testen, damit ich nicht dauernd auch noch das Programm manuell beenden muss.
Ok, klar.
So, und nach dem das nun funktioniert, soll es eine weitere Form (fAdrListe) geben, in der mit dem sSQL-String die Datenbank bemüht wird.
Nach dem Aufruf an die DB soll es (später mal die Entscheidung geben, was angezeigt wird oder ob abgebrochen wird).
Doch in der Testphase sollen die Daten in einem Gridview angezeigt werden (in der selben Form: fAdrListe).
Im Moment sehe ich noch ein Verständnisproblem bei Dir. Du denkst noch nicht objektorientiert.

cAdrSuchen hat eigentlich den falschen Namen. Warum?

Suchen soll nämlich das Form fAdrSuchen, und wenn dieses das einzige Ding ist, mit dem gesucht werden soll (aka der SQL-String erstellt werden soll), dann sollte speziell diese Funktionalität auch dort (in fAdrSuchen) gekapselt werden (jedes Form ist eine Klasse!). fAdrSuchen könnte also nur eine Property fAdrSuchen.SQL as String haben und fertig. Wenn die leer ist, hat es nichts erstellt.

Und cAdrSuchen müsste eigentlich CAdresse heißen, weil diese Klasse dient dazu, die einzelnen Variablen der Adresse zu speichern (und später dazu, diese oder eventuell auch viele Adressen zu verwalten).
Ist das korrekt, wenn ich von einer Form zur nächsten springe, ohne jeweils wieder zur aufrufenden Form zurückzukehren und erst von da die nächste Form aufzurufen?
Übergebe ich den SQL-String an die nächste Form mit "_New"? In dieser Form werde kein eigenes Objekt haben. Da es hier nur das Grid zu füllen gilt.
Da denkst du noch nicht in Objekten.

Stelle dir vor: Dein Hauptprogramm bietet "Adresse suchen" an. Beim Klick auf "Adresse suchen" erstellt dein Hauptprogramm ein neues Adressobjekt und ruft dort die Methode Suchen auf. Das Adressobjekt zeigt dann das Suchformular und fragt aufgrund der Eingaben die DB ab. Ist nur eine Adresse gefunden worden, lädt es diese gleich (mir dem berühmten SQL-String). Findet es mehrere, zeigt es eine Liste und bietet diese zur Auswahl. Hat sich der Benutzer für eine Adresse entschieden, ist Suchen beendet und das Adressobjekt gefüllt.

Nun kann das Hauptform die Adresse anzeigen. Dazu verwendet es die Methode "Text" des Adressobjektes, die die Adresse als Textstring ausgibt.

Das würde im FmMain ganz einfach so aussehen (bei einem Klick auf den Menüpunkt MnAdresseSuchen):
gambas code
Public Sub MnAdresseSuchen_Click()

  Dim Adr As New CAdresse

  Adr.Suche()
  Me.TxtAdresse.Text = Adr.Text

End
Die Funktionalität Suchen und als String Anzeigen ist vollständig von CAdresse gekapselt. Dein Hauptprogramm weiß gar nichts davon, es gibt nicht irgendwelche Sql-Strings weiter, es ruft nicht irgendwelche Forms auf. Das kann z.B. CAdresse intern so machen.

Ok?

Und jetzt zeige ich Dir noch einen Vorteil dieser Konstruktion.

Die Idee, SQL-Strings zu bauen und intern rumzuschieben, ist nicht so sonderlich glücklich. Später wirst du vielleicht mal drauf kommen und du kommst auf die Idee, das es ẃesentlich intelligenter ist, wenn fAdrSuchen stattdessen ein Result liefert und CAdresse das intern verarbeitet. Und du wirst deinen Code dahingehend umbauen. Aber dein restliches Programm musst du deshalb nicht ändern! Es kann weiter so bleiben wie es vorher war.

Das müsste jetzt eigentlich für ein paar Tage nachdenken, nachvollziehen etc. reichen, oder?
Alles Gute,

4tionov

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

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » Sa 27. Mai 2017, 19:03

Hallo 4tionov,
wenn ich dich richtig verstanden habe ruft FMain mit "Adr.Suche()" das Objekt auf, das jetzt "CAdresse" heißen soll.

Die Form "fAdrSuchen" hat die Property

Code: Alles auswählen

Property fAdrSuchen.SQL as String
, so weit denke ich, verstehe ich das.
Das Objekt ruft die Form fAdrSuchen auf und die übergibt die Werte der TextBoxen etc. nach CAdresse (mit der Funktion Eingabe_Change).

Weiterhin soll das Objekt die Entscheidung treffen was mit der DB-Ausgabe geschehen soll (Abbrechen, Anzeigen in einer Edit-Form, Anzeigen in einer GridView). Mit "select case res.count", case 0/case 1/case else ist das ganz gut machbar.
Die verschiedenen Aufrufe für die einzelnen Formen sehen vermutlich so aus: adr.fAdrListe() und adr.fAdr() [oder nur fAdrListe() und fAdr()] mit der automatischen Übergabe der DB-Werte.

Ich weiß nicht was

Code: Alles auswählen

Me.TxtAdresse.Text = Adr.Text
bedeutet ?
Bei der Gelegenheit: Wie ermittle ich die adrno der gewählte Zeile im Grid wenn ich irgendwo in die Zeile klicke(oder muss ich Doppelklicken)?

Hoffentlich kann ich das alles realisieren, ich weiß meistens nicht welche Befehle ich wo einsetzen muss, damit es klappt.
Ich verstehe zwar (meistens) die Übersicht, aber im Detail steckt wie immer der Teufel.

Liebe Grüße

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

Re: Allgemeiner Codecheck

Beitrag von tionov » Sa 27. Mai 2017, 21:56

Hallo 4tionov,
wenn ich dich richtig verstanden habe ruft FMain mit "Adr.Suche()" das Objekt auf, das jetzt "CAdresse" heißen soll.
Ja. Genauer das Objekt, das aus der Klasse CAdresse erstellt worden ist. Ich nenne das jetzt das Adressobjekt. Weil wir haben ja auch noch andere Objekte.
Die Form "fAdrSuchen" hat die Property

Code: Alles auswählen

Property fAdrSuchen.SQL as String
, so weit denke ich, verstehe ich das.
Das Objekt ruft die Form fAdrSuchen auf und die übergibt die Werte der TextBoxen etc. nach CAdresse (mit der Funktion Eingabe_Change).
Das war aus dem Beispiel. Aber du wolltest doch einen SQLstring bauen, nicht? Dann müsste das Adressobjekt das Form fAdrSuchen anzeigen und jenes baut den SQLString.

Danach kann das Adressobjekt den SQLstring verwenden, um die Adresse(n) aus der DB zu holen und in den eigenen Variablen speichern. Oder es kann ein Auswahlliste anbieten.
Weiterhin soll das Objekt die Entscheidung treffen was mit der DB-Ausgabe geschehen soll (Abbrechen, Anzeigen in einer Edit-Form, Anzeigen in einer GridView). Mit "select case res.count", case 0/case 1/case else ist das ganz gut machbar.
Das Adressobjekt trifft die Entscheidung. Unter Umständen fragt es nach. Da kann man nun alles zaubern, was mit Code möglich ist.
Die verschiedenen Aufrufe für die einzelnen Formen sehen vermutlich so aus: adr.fAdrListe() und adr.fAdr() [oder nur fAdrListe() und fAdr()] mit der automatischen Übergabe der DB-Werte.
Exakt. Das Adressobjekt hält selbst intern das Result. Übergibt dieses (oder sich selbst – Du kennt den Trick) jeweils an die Forms, Und es stellt die Forms als Properties Verfügung.

Ich würde die Properties nur anders nennen. adr.Form und adr.ListForm z.B.

Es könnte auch adr.Count zur Verfügung stellen, sodass das Hauptform entscheiden kann, will ich die Liste sehen (adr.Count > 1) oder die eine Adresse?
Ich weiß nicht was

Code: Alles auswählen

Me.TxtAdresse.Text = Adr.Text
bedeutet ?
Nur ein Beispiel. Ich implizierte damit, dass das Hauptform ein Steuerelement "TxtAdresse" hat, und das zeigt dann die Adresse (als Text) an.
Bei der Gelegenheit: Wie ermittle ich die adrno der gewählte Zeile im Grid wenn ich irgendwo in die Zeile klicke(oder muss ich Doppelklicken)?
Ich mach das immer so, dass ich im Grid die erste Spalte damit fülle und die Breite der ersten Spalte auf 0 setze. Das ist flexibel, hat aber auch Nachteile. Alternativ kann man ein Array mit den Nummern füllen und das im Grid in der (Achtung!) Property "Tag" speichern. Das ist Variant und da kann man alles speichern, was man will. Dann nimmt man einfach den Wert in dem Array mit dem Index Grid.Row und hat die Nummer.
Hoffentlich kann ich das alles realisieren, ich weiß meistens nicht welche Befehle ich wo einsetzen muss, damit es klappt.
Ich verstehe zwar (meistens) die Übersicht, aber im Detail steckt wie immer der Teufel.
Das wird schon. Du fängst an, zu verstehen. irgendwann macht es mal Klick und ab dem Moment kannst du mit Gambas robuste Riesenprogramm schreiben, so leicht wie einen Brief. :-)

Wenn Du das mit der Objektorientierung mal verstanden hast, dann kommen anschließend Design Patterns :-)
Alles Gute,

4tionov

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

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » So 28. Mai 2017, 12:55

Hallo 4tionov,
ich versuche deine Tipps umzusetzen.
Ich habe hier die Main mit dem Aufruf der CAdresse:

Code: Alles auswählen

Public Sub Menu22_Click() 'A-Suchen
  Dim adr As New CAdresse
  adr.Suche()
End
weiters habe ich hier die CAdresse:

Code: Alles auswählen

Property adrno As Integer
Private $adrno As Integer
.....mit allen Propertys wie ich sie in fAdrSuchen benötige
dann weiter in der CAdresse:

Code: Alles auswählen

Public Sub Suche() As Boolean
  Dim cancel As Boolean = True
  Dim fm As New FAdrSuchen
  fm. 		<= was muss ich hier angeben, damit es die Form aufruft???
  			fAdrSuchen geht nicht, CAdresse geht nicht, Adr_Find geht nicht
  fm.Persistent = True
  fm.ShowModal
  fm.Persistent = False
  fm.close
  Return cancel
End
wie die cAdresse die Form aufruft,
und alle setters/getters.
Und schliesslich die fAdrSuchen:

Code: Alles auswählen

Property Read Flag As Boolean
Private $Flag As Boolean
Public Function Adr_Find() As String
  Dim adr As CAdresse		<= richtig???
  Dim sHelp, sSQL As String	<= sSQL muß dann hier nicht definiert werden sondern kommt von der CAdresse und heißt $sSQL
  $Flag = False
  '0 = adrno      ValueBox1
  '1 = name       TextBox1
  ....
den Flag benötige ich intern für eine der Funktionen, die von Adr_Find aufgerufen wird.
Benötige ich eine Property in CAdresse für den SQL-String, ich denke JA.
Dann fällt die Entscheidung was gemacht werden soll, Aufruf der GridForm oder der AnsichtsForm die ist zugleich die Editform für den Record oder der Abbruch und zurück zur MainForm.
Leider bin ich mir immer noch nicht sicher, wie die Syntax eines Objekts, der Aufruf von Formen etc. genau auszusehen hat.
Ich bin auch noch viel zu sehr mit dem Spaghetti von VB6 vertraut.

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 29. Mai 2017, 06:34

Hallo vb6oldie,

ich habe nun leider nicht mehr so viel Zeit, der Job ruft.

1 und 2 sind ok.

In 3 hast du den Aufruf des Forms schon enthalten, in fm.ShowModal. "fm." also raus.

Ich mache einen Sprung, das mit dem SQL-String weiterreichen ist (wahrscheinlich) nicht gut. Am besten liefert FAdrSuchen also ein Result, es sähe also in CAdresse so aus:
gambas code

	fm.Persistent = True 'bleibt nach dem Schließen unsichtbar, wird nicht wirklich geschlossen
	fm.ShowModal 'Modal anzeigen, der Benutzer kann nun suchen

   ' Nun hat der Benutzer das Form geschlossen, es ist aber noch persistent
   ' CAdresse kan sich das Result abholen:
	$Res = fm.DbResult 'FAdrSuchen  liefert in der Property DbResult (As Result) das Result
	fm.Persistent = False 'Persistenz ausschalten, damit es wirklich geschlossen werden kann
	fm.close ' Schließen

FAdrSuchen baut selbst nach Eingaben des Benutzers den SQL-String, ruft das Datenbank-Ergebnis ab, und bietet das Result in der Property Read DbResult. Hier findet im Endeffekt die DB-Abfrage statt.

$Res (As Result) ist eine private Variable von cAdresse, nun kann cAdresse entscheiden (je nach $Res.Count), ob es eine Liste oder eine einzelne Adresse anzeigen muss etc.

CAdresse benötigt das Result normalerweise nur intern, und kann es an andere Forms (z.B. FAdrListe) beim Aufruf weiterreichen, die können das dann anzeigen. Für Aufruf von Forms bitte meine Beispiele beachten.

Noch was. Ich habe den Eindruck, dass du öfter Breakpoints setzen und mit dem Debugger durch den Code steppen solltest. Dann könntest du dir schon viele Fragen selbst beantworten.

Und jetzt muss ich arbeiten.
Alles Gute,

4tionov

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

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » Mo 29. Mai 2017, 15:50

Hallo 4tionov,
ich habe immer noch Schwierigkeiten beim Erstellen der gegenseitigen Aufrufe CAdresse <=> fAdrSuchen.
Hier die Form fAdrSuchen:

Code: Alles auswählen

' Gambas class file
Property Adresse As CAdresse
Private $Adresse As CAdresse
Private Flag As Boolean
Private $Started As Boolean
Private Sub Adr_Find()
  Dim sHelp, sSQL As String
  Flag = False
  With $Adresse
    Select Case True
      Case .adrno > 0     'adrno  <=== hier bleibt es hängen
        sSQL = F00(.adrno)
      Case .selno > 0     'selno
........
plus diese Funktionen:

Code: Alles auswählen

Private Function Adresse_Read() As CAdresse
  Return CAdresse
End
Private Sub Adresse_Write(Value As CAdresse)
  $Adresse = Value
  With $Adresse
    ValueBox1.Value = .adrno
    TextBox1.Text = .name
.....
    ValueBox6.value = .faktno
    TextBox9.Text = .bezugmail
    $Started = True
  End With
End
Public Function Eingabe_Change()
  'stellt alle Buttons, etc. in die $Adresse-Variablen
  If $Started Then
    With $Adresse
      .adrno = ValueBox1.Value
      .name = TextBox1.Text
......
      .faktno = ValueBox6.Value
      .bezugmail = TextBox9.Text
    End With
  End If
  Adr_Find()
End
Die Code habe ich zusammen gestaucht, damit sie nicht zu viel Platz beanspruchen.
Und hier der Ausschnitt aus der CAdresse:

Code: Alles auswählen

....
Property bezugmail As String
Private $bezugmail As String
Property sSQL As String
Private $sSQL As String
Property Res As Result
Private $Res As Result
Public Sub Suche() As Boolean
  Dim fm As New FAdrSuchen
  fm.Persistent = True 'bleibt nach dem Schließen unsichtbar, wird nicht wirklich geschlossen
  fm.ShowModal 'Modal anzeigen, der Benutzer kann nun suchen
  ' Nun hat der Benutzer das Form geschlossen, es ist aber noch persistent
  ' CAdresse kann sich das Result abholen:
  $Res = fm.DbResult 'FAdrSuchen  liefert in der Property Res (As Result) das Result
  fm.Persistent = False 'Persistenz ausschalten, damit es wirklich geschlossen werden kann
  fm.close ' Schließen
End
Das Programm bleibt nun bei der angezeigten Stelle hängen mit der Meldung: "Null Objekt in fAdrSuchen", was vielleicht bedeutet, dass es keine Verbindung zur CAdresse hat, obwohl ich zu CAdrese eine Verbindung mit property aufgebaut habe.

Wie baue ich das Programm am besten auf:
In fAdrSuchen erstelle ich den SQL-String, den benutze ich gleich zum Erstellen des Results.
Den SQl-String benötige ich dann nicht mehr.
In CAdressse,da, wo jetzt steht: $Res = fm.DbResult kann ich dann mit $Res.Count die Anzahl der gelieferten Sätze ermitteln.
damit entscheide ich welche Form aufgerufen wird, das alles in cAdresse.

Ich benutze sowieso Haltepunkte und gehe Schrittweise durchs Programm, aber viele male bleibt es stehen ohne eine Fehlermeldung.
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 29. Mai 2017, 16:40

Gambas bleibt nicht einfach stehen, sondern zeigt dir die Stelle, wo Mist ist, und es nicht mehr weiter kommt.

Null Object heißt, da ist nichts drin, es gibt kein Objekt. Normalerweise kannst du beim Debuggen z.B. auf $Adresse einen Doppelklick machen, dann zeigt dir die die IDE das Objekt mit all seinen Properties als Grid an. Oder bei einem String zeigt es seinen Inhalt. Ah ok, du kannst also (hier noch) nicht debuggen.

Hast Du in CAdresse dem FAdrSuchen die Adresse übergeben?
gambas code
dim fm as new FAdrSuchen
fm.Adresse = Me
Vielleicht ist auch .adrno Null. Kann ich hier nicht entscheiden.
Alles Gute,

4tionov

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

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » Mo 29. Mai 2017, 19:44

Hallo 4tionov,
ich bin nun etwas weiter. Die "fm.Adresse = Me" habe ich wieder eingefügt, du hast früher geschrieben, es soll raus.
In fAdrSuchen, nach der SQL-String-Erstellung:

Code: Alles auswählen

        sSQL &= gb.newline & "order by a.adrno desc"

    End Select
			'Die Zeilenschaltungen sind nur für die Ausgabe relevant.
    hFile = Open sFilePath For Write Create ' Die Exportdatei wird stets neu angelegt
    Write #hFile, sSQL
    Close #hFile
	''die "\n" entfernen, damit die DB klarkommt:
    sSQL = Replace(sSQL, "\n", "") 				

    res = mConn.Con.Exec(sSQL) '<== hier ist der String bereinigt
	'("res as Result" ist eine private variable in fAdrSuchen)

  End With
  $Adresse.Res = res  '<= Versuch das Resultat in die CAdresse zu bekommen
	'("Res" bzw "$Res" ist eine Property in CAdresse)
End
Das Programm läuft noch in den mConn hinein und auch wieder (mit Werten) heraus.
Ich muss nur das Result nach CAdresse bekommen.

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 29. Mai 2017, 22:14

vb6oldie hat geschrieben:
Mo 29. Mai 2017, 19:44
Hallo 4tionov,
ich bin nun etwas weiter. Die "fm.Adresse = Me" habe ich wieder eingefügt, du hast früher geschrieben, es soll raus.
Da siehst du mal, was ich die ganze Zeit für Blödsinn schreibe ;-)

Aber echt, wirklich? Wo?
In fAdrSuchen, nach der SQL-String-Erstellung:

Code: Alles auswählen

        sSQL &= gb.newline & "order by a.adrno desc"

    End Select
			'Die Zeilenschaltungen sind nur für die Ausgabe relevant.
    hFile = Open sFilePath For Write Create ' Die Exportdatei wird stets neu angelegt
    Write #hFile, sSQL
    Close #hFile
	''die "\n" entfernen, damit die DB klarkommt:
    sSQL = Replace(sSQL, "\n", "") 				

    res = mConn.Con.Exec(sSQL) '<== hier ist der String bereinigt
	'("res as Result" ist eine private variable in fAdrSuchen)

  End With
  $Adresse.Res = res  '<= Versuch das Resultat in die CAdresse zu bekommen
	'("Res" bzw "$Res" ist eine Property in CAdresse)
End
Das Programm läuft noch in den mConn hinein und auch wieder (mit Werten) heraus.
Ich muss nur das Result nach CAdresse bekommen.
Aber da müsstet du doch jetzt so weit sein, das selbst lösen zu können. Überleg mal...
Alles Gute,

4tionov

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

Re: Allgemeiner Codecheck

Beitrag von vb6oldie » Di 30. Mai 2017, 07:15

Hallo 4tionov,
ich habe einiges überlegt und ausprobiert, aber ich finde den Fehler nicht!

Code: Alles auswählen

Public Sub Button1_Click()

  If $WurdeGeaendert = True Then
    Adr_Find() 'hier erstellt er den SQL_String und ruft damit die DB auf.
  Endif

End
In fAdrSuchen in der Sub Button1_Click führt er Adr_Find aus und kommt danach wieder hierher zurück, beim "End" hängt er sich auf, ohne einen Fehler anzuzeigen (er kehrt nicht nach CAdresse zurück).
In Adr_Find erstellt er das Result: DbResult = mConn.Con.Exec(sSQL)
In CAdresse habe ich dies: Public DbResult As Result codiert, oder sollte ich hier ein property codieren?
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 30. Mai 2017, 07:34

Nach Adr_Find() fehlt Me.Close
Sonst bleibt ewig das Suchform stehen und CAdresse wartet ewig, dass es schließt.

In CAdresse brauchst du keine Property für das Result und musst auch das Result nicht Public machen.
Stattdessen gibt du es in CAdresse weiter an Forms, die es nun anzeigen.
Alles Gute,

4tionov

Gesperrt

Wer ist online?

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