Seite 5 von 6

Verfasst: 10.10.2008 12:21
von Palandt
1. SUPERGEIL !!!!!!!!!!!!!!!!!!!!!!!!!! Muss ich dafür die neueste Version von Comate runterladen, oder geht das auch so?

2. Ich wollte es erst nen neues Thema aufmachen, aber da du hier grad rumschwirrst, schreib ich mein - diesmal nicht ganz so schlimmes Maleur - mal hier rein, da du bislang am besten mit meinem Programm vertraut bist und dies hier wohl relativ früh lesen wirst, zudem puste ich damit das Forum nicht unnötig mit neuen Themen auf:

Komischerweise steigt antiproportional zur Komplexität der zu bewältigenden Aufgaben auch meine Fehlerfrequenz, mit anderen Worten: Bei den billigsten Dinger, schleichen sich die dicksten Hühner ein: Ich hab in meinem Programm eine Funktion, die es ermöglicht Datensätze zu löschen. Meine Tabellen in meiner Datenbank sind - wie du eventuell noch weisst - nach folgendem Schema aufgebaut:

FragenID INT, Frage STRING, AntwortID STRING, Thema STRING, HL INT, Link STRING.

Beim Löschen wird der Datensatz entfernt, es entsteht aber innerhalb der FragenID - Nummerierung eine Lücke. Beispiel: Lösche ich zwischen FragenID = 7 und Fragen ID = 9 den Datensatz mit der FragenID = 8 dann lautet die Nummerierung 1, 2, 3 ,4 , 5, 6, 7, 9, 10 .... Um das anschließend wieder zu korrigieren, habe ich in VB eine simple Prozedur geschrieben, die nach dem Löschvorgang die Datensätze neu nummeriert:

Code: Alles auswählen

ACHTUNG VB - CODE!

Public Sub Durchnummerieren()
    Dim iMax, in As Integer
    
    iMax = RS1.RecordCount ;RS1 ist ein Objekt von Typ Recordset
    RS1.MoveFirst
    
    For  in = 1 To iMax
        RS1.Fields("FragenID") =in
        RS1.Update
        If RS1.EOF Then Exit For
        RS1.MoveNext
    Next in
End Sub
Dies wollte ich nun auch mit PB realsieren. Da ich auch einige HTML - Links als Antworten hab (keine Angst Kiffi, das RTF-Feld funktioniert noch :) ; die hatte ich schon immer drin, da ich beispielsweise per HTML auch PDF-Dateien aufrufen kann, die dann als Antwort fungieren), konnte ich in der SQL-Abfrage nach dem WHERE nicht immer AntwortID als Identifikator nutzen, da dieses Feld aus dem eben genannten Grund nicht immer einen Wert enthielt (Bei HTML Seiten erhielt HL, der sonst den Wert Null hatte, den Wert 1, und Link enthielt den Link (welch Wunder :) ) und AntwortID war infolgedessen leer, da ja keine Textantwort existierte, sondern ein Link, der eine HTML Seite aufrief). Mein erster Versuch in PB lautete daher:

Code: Alles auswählen

Procedure Durchnummerieren ()
in = 0
SSQLTemp = "SELECT * FROM " + sProjektname
If DatabaseQuery(#DB_QM, sSQLTemp)
	FirstDatabaseRow(#DB_QM)	
	While NextDatabaseRow(#DB_QM)  
    	in = in + 1
		sTempAntwortID = ""
                sTempFrage = ""
		sTempAntwortID = GetDatabaseString(#DB_QM,2)
		sTempFrage = GetDatabaseString(#DB_QM,1)
		
		If sTempAntwortID <> ""
			sSQLUpdate = "UPDATE " + sProjektname + " SET FragenID = " + Str (in) + " WHERE AntwortID = '" +sTempAntwortID +"' "   
	    	If Not DatabaseUpdate (#DB_QM, sSQLUpdate)
	    		Error ("Fehler beim Durchnummerieren!")
	    	EndIf
	    Else
	    	sSQLUpdate = "UPDATE " + sProjektname + " SET FragenID = " + Str (in) + " WHERE Frage = '" +sTempFrage +"' "   
	    	If Not DatabaseUpdate (#DB_QM, sSQLUpdate)
	    		Error ("Fehler beim Durchnummerieren!")
	    	EndIf
	    
	    EndIf
	    
    	
    Wend
    
EndIf


EndProcedure
Ich kann auch nicht Frage alleine als Identifikator nutzen, da sich manche Fragen gleichen.

Dann habe ich aber in meinem SQL-Manager (ein Prog zur Editierung der Datenbank) gesehen, dass es rowid gibt, einen Wert der die Position des Datensatzes wiedergibt. Mithin lautete mein 2. Versuch:

Code: Alles auswählen

Procedure Durchnummerieren ()
in = 0
SSQLTemp = "SELECT * FROM " + sProjektname
If DatabaseQuery(#DB_QM, sSQLTemp)
	FirstDatabaseRow(#DB_QM)	
	While NextDatabaseRow(#DB_QM)  
    	in = in + 1
		sSQLUpdate = "UPDATE " + sProjektname + " SET FragenID = " + Str (in) + " WHERE rowid = " + Str(in)   
	    	If Not DatabaseUpdate (#DB_QM, sSQLUpdate)
	    		Error ("Fehler beim Durchnummerieren!")
	    	EndIf
    Wend
    
EndIf


EndProcedure
In beiden Fällen (Versuch 1 und Versuch 2) - ich habs mit dem Debugger und der Beobachtungsfunktion überprüft - durchläuft das Programm jedoch nur einmal die WHILE - WEND - Schleife, obgleich mindestens 10 Datensätze in meinem Testprojekt existieren. Es tritt also keine Fehlermeldung auf - was auch korrekt ist, da ja kein Fehler bei der Datenbankoperation selbst entsteht. Die Datenbankanbindung ist fehlerfrei, und ich bin mir ziemlich sicher, dass kein Tippfehler im Programm ist :). Wär super, wenn du mir auch diesmal wieder aus der Patsche helfen könntest....*Bud ist schon bestellt*....Kein Witz jetzt, wenn das Prog fertig ist, werde ich auf jeden Fall deinen Namen erwähnen - das ist sicher !!!

Wenn jetzt also das Scrollproblem und dieses hier behoben sind, dann gehe ich heute feiern! Sonst lief alles nämlich richtig genial und die restlichen Funktionen ließen sich zum Teil um einiges schneller proggen als erwartet, da manches in PB - man glaubt es kaum - schneller zu verwirklichen ist als mit VB, insbesondere Datenbank-Geschichten, und das trotz ADO...einzige Ausnahme: siehe oben...:)

Vielen Dank im Voraus!

//EDIT: Frage 1 hat sich erübrigt, hab eben gelesen, dass dieses Programmiergenie beim Hinweis auf ein neues Update tatsächlich mein Beispiel gewählt hat um seine neue Funktion vorzustellen, ich fühl mich grad so, als hätte ich Picasso nen Motiv geliefert...:)

Verfasst: 10.10.2008 12:31
von HeX0R
Habe zwar noch nie mit Datenbanken gearbeitet, aber welchen Sinn hat denn

Code: Alles auswählen

FirstDatabaseRow(#DB_QM)
?

Verfasst: 10.10.2008 12:35
von Palandt
Du hast Recht Hexor, vermutlich keinen, aber ich habs einfach mal reingenommen, nachdem die Schleife nur einmal durchlaufen wurde. Bei VB ist es ja erforderlich RS1. Movefirst. Manchmal - das wirst du als Progger wissen - sind die Lösungen eines Problems trivial und folgen nicht immer der eigenen Logik...:)

Verfasst: 10.10.2008 13:41
von Kiffi
Palandt hat geschrieben:sondern lediglich die 3 Dateien (COMate, COMate_Residents, VariantHelper_Include) der Version 4.2 gegen die der Version 4.3
es gibt 2 Versionen von COMate. Einmal die für PB 4.2 und einmal die für
PB 4.3. Die Versionsnummern beziehen sich also nicht auf COMate, sondern
auf Deine verwendete PB-Version.

Demzufolge ist das hier für Dich korrekt:
http://www.purecoder.net/comate_pb4-2.zip

Grüße ... Kiffi

P.S.: Mach für Dein aktuelles DB-Problem lieber einen neuen Thread auf,
weil's hier einfach thematisch nicht reinpasst.

Verfasst: 10.10.2008 13:44
von Palandt
Ich Vollidiot habs schon bemerkt mit der PB-Version (deswegen auch gleich Posting gelöscht!), man seid bloß froh, wenn ich später mal kein Richter werde, ich bin so dämlich, ich würd im Zivilprozess einen ins Gefägnis schicken (und das nicht wegen Unterhaltsschulden oder zur Erzwingung der Abgabe der eidestattlichen Versicherung)......HILFEEE!

//EDIT: Ok, wegen des DB-Problems scheinst du auf Anhieb auch keine Lösung zu erspähen, dann probier ich nachher noch Weile alleine herum, vielleicht mach ich dann nochmal nen Thread auf...vielleicht finde ich den Fehler aber auch alleine.

//EDIT2: Dass ich gerade hier etwas reingeschrieben hab ist - ehrlich zugegeben - auch zum Teil der Befürchtung geschuldet, ständig mit neu aufgemachten Threads meine Null-Ahnung zur Schau zu stellen und damit den Eindruck zu erwecken, wegen jedem Fliegenschiss um Hilfe zu krakelen - obwohl ich ja genau das mache. Aber bis auf die Versionsverwechslung von Comate, bin ich echt jemand, der zuerst - unter Heranziehung der Hilfe - alleine testet, dann im Forum nach gleichgelagerten Postings sucht, um dann erst hier etwas reinzuschreiben. Aber auch ich werde nach ein paar Monaten meine Anfängerphase überwunden haben, und dann bleiben euch und insbesondere Kiffi so geniale Fragen erspart, wie die nach der Funktionsfähigkeit nicht existenter Prozeduren wie "SafeFile"....;)

PS: SCROLLBALKEN funzen einwandfrei, supergenial!!!!

Verfasst: 10.10.2008 21:28
von Kiffi
Palandt hat geschrieben://EDIT: Ok, wegen des DB-Problems scheinst du auf Anhieb auch keine Lösung zu erspähen
nee, Dein Fehler ist mir sofort aufgefallen. Ich könnte Dir auch auf Anhieb
eine Lösung vorschlagen aber viel lieber würde ich Dir die korrekte (oder
sagen wir mal: geläufigere) Verwendung von Datenbank-IDs erläutern. Aus
diesem Grund auch mein Vorschlag, einen neuen Thread zu eröffnen.

Grüße ... Kiffi

Verfasst: 10.10.2008 21:43
von Palandt
Kiffi, bei allem Respekt, du sagst mir gerade, du hättest den Fehler gesehen, aber anstatt ihn mal eben hier reinzuposten, verlangst du von mir, alles zu kopieren um es als neuen Thread verpackt erneut zu posten. Also für erzieherische Maßnahmen bin ich nun echt etwas zu alt. Was hat das denn jetzt für einen Sinn? Das Forum wäre dann mit der doppelten von mir diesbezüglich fabrizierten Textmenge belastet und anschließend schreibst du mir dann die Antwort rein, die du mir auch jetzt hättest schreiben können ohne dass ich einen neuen Thread aufmache. Ich dachte, dein Tipp hätte seine Ursache darin, dass andere Leute auf ihn aufmerksam werden. Also Kiffi, da muss ich ehrlich sagen, das kann ich nicht so nachvollziehen.

Verfasst: 10.10.2008 21:47
von ts-soft
Es geht darum, das wenn später jemand ähnliche Probleme mit
Datenbank-IDs hat, wird dieser bei seiner Suche niemals unter RTF-...
suchen.
Neues Thema, neuer Thread, ansonsten wird das Board tatsächlich unnötig
belastet :wink:

Verfasst: 10.10.2008 22:31
von Palandt
Ich ahne eh schon, wo des Pudels Kern begraben zu sein scheint, ich rufe innerhalb der WHILE - Schleife, die bei Auskommentierung des Inhalts fehlerfrei läuft - also nicht nur einmal, erneut die Datenbank über dieselbe Konstante innerhalb des Update - Befehls an.

Morgen, wenn ich wieder ganz fit bin (hab heut mit meinem Bruderherz einige Pilsetten zur Brust genommen :) ), dann werd ich dieselbe Abfrage über eine neue Konstante #DB_QM2 laufen lassen, vielleicht klappts dann.

Wenns dann immer noch nicht geht, kann ich immer noch nen neues Posting verfassen.

Verfasst: 11.10.2008 00:39
von Kiffi
<OT>

Herrje, Palandt, jetzt fühl Dich mal nicht gleich so auf den Schlips getreten. :roll:

wie Thomas schon erwähnte: Datenbankfragen haben in einem Thread
über RTF-Probleme nichts zu suchen und sollten in einem separaten
Diskussionsfaden beantwortet werden. Denn wer später mal ähnliche
Schwierigkeiten mit einer Datenbank hat, wird hier wohl kaum
reinschauen.

Dennoch (damit die liebe Seele Ruhe findet) hier der Hinweis,
warum Dein Code nicht funktioniert:

DatabaseQuery() liefert ein Resultset (= eine Anzahl von Datensätzen,
die auf den Query zutreffen) zurück, welches Du mittels While
NextDatabaseRow() durchlaufen kannst. Das hast Du insofern schon gut
erkannt. Wenn Du aber innerhalb dieser Schleife ein DatabaseUpdate()
ausführst, so wird dieses Resultset verworfen und Du springst prompt aus
der Schleife, weil das While NextDatabaseRow() keine weitere Zeile mehr
liefert.

Die Problemlösung lautet also, zwei Schleifen nacheinander laufen zu
lassen: In der ersten (DatabaseQuery()) sammelst Du die benötigten
Informationen (beispielsweise in einer LinkedList oder einem Array). In
einer zweiten Schleife durchläufst Du dann die LinkedList oder das Array
und fütterst DatabaseUpdate() mit den darin enthaltenen Informationen.

Nun sei Dir jedoch noch verraten, dass Dein Code -- auch wenn er
korrigiert worden ist -- performancelastig und fehleranfällig ist.

Und das ist auch der Hauptgrund gewesen, warum ich um einen neuen
Thread gebeten hatte, in dem ich Dir hätte erklären können, warum dem
so ist (das ist IMO nicht mit einem Beitrag erledigt).

Wenn Du wissen willst, wie man es besser machen kann, dann schau Dir
mal im nächstbesten DB-Tutorial das Kapitel über Primärschlüssel
(primary key) und Fremdschlüssel (foreign key) an.

BTW: #DB_QM2 ist eine ganz schlechte Idee!

</OT>

Grüße ... Kiffi