![]() |
zeilen werden ignoriert...
morgen zusammen...
habe (mal wieder) ein problem !!! an und für sich nichts neues...aber diesmal irgnoriert delphi einfach zeilen in meinem quelltext ohne das ich weiß warum...er überließt sie einfach...ohne das diese zeilen auskommentiert sind... und das andere problem was ich habe ist das er nicht in die datenbank schreibt !!!!
Delphi-Quellcode:
ich hoffe ihr könnt mir wieder helfen... :oops:
procedure TForm1.cb_takeClick(Sender: TObject);
Var versflid, SetStr : String; ProcessedRecs, i, SetCount : Integer; SetVals : Array Of String; Begin {If (tb_Bearbeiter.Text = '') Then ShowMessage('Bitte was eintragen.');} // Wenn SetStr beschrieben wurde -> baue UPDATE-Statement... If SetStr <> '' Then Begin With ADOQuery1 Do Begin SQL.Text := 'Update dbo_VFL_VERZ_TEMP t' + #10 + 'Set ' + SetStr + #10 + 'WHERE t.Bearbeiter = :i_Versuch'; Prepared := True; // Werte der Paramter :i_F(1 - ...) For i := 0 To pred(SetCount) Do Parameters.ParamByName('i_F' + IntToStr(i)).Value := SetVals[i]; // Hier Parameters.ParamByName('i_Versuch').Value := TB_Bearbeiter.Text; // Ausführen ExecSQL; End; ///////diese kommenden zeilen ignoriert delphi einfach/////////// label27.Caption := tb_Bearbeiter.Text; label28.Caption:=tb_nr_dez.Text; label29.Caption:=tb_nr_abt.Text; label30.Caption:=tb_x_coord.Text; label31.Caption:=tb_y_coord.Text; label32.Caption:=tb_struktur.Text; label33.Caption:=tb_id.Text; label34.Caption:=tb_begr.Text; label35.Caption:=tb_partner.Text; label36.Caption:=tb_beginn.Text; label37.Caption:=tb_end.Text; label38.Caption:=tb_status.Text; label39.Caption:=tb_ziel.Text; label40.Caption:=tb_meth.Text; label41.Caption:=tb_beschr.Text; label42.Caption:=tb_param.Text; label43.Caption:=tb_flbz.Text; label44.Caption:=tb_baumart.Text; label45.Caption:=tb_standort.Text; label46.Caption:=tb_humus.Text; label47.Caption:=tb_fl.Text; label48.Caption:=tb_bestgr.Text; label49.Caption:=tb_lfn.Text; label50.Caption:=tb_land.Text; label51.Caption:=tb_ea.Text; tb_Bearbeiter.Clear; tb_nr_dez.Clear; tb_nr_abt.Clear; tb_x_coord.Clear; tb_y_coord.Clear; tb_struktur.Clear; tb_id.Clear; tb_begr.Clear; tb_partner.Clear; tb_beginn.Clear; tb_end.Clear; tb_ea.Clear; tb_status.Clear; tb_ziel.Clear; tb_meth.Clear; tb_beschr.Clear; tb_param.Clear; tb_flbz.Clear; tb_baumart.Clear; tb_standort.Clear; tb_humus.Clear; tb_fl.Clear; tb_bestgr.Clear; tb_lfn.Clear; tb_land.Clear; End; End; |
Re: zeilen werden ignoriert...
So etwas ähnliches hatte ich auch schon einmal. Da wollte ich einer Integer-Variable einen Wert zuweisen, etwa so:
[delpih] Zahl := 4; [/delphi] Eine ganz normale und richtige Anweisung. Wollte Delphi nicht. Wurde einfach übersprungen. Später habe ich es dann so versucht:
Delphi-Quellcode:
So hat er's gemacht. Aber dann bin ich beruhigt, dass so etwas auch anderen Leuten passiert. :)
var StrZahl: String;
IntZahl: Integer; ... StrZahl := '4'; IntZahl := StrToInt(StrZahl); |
Re: zeilen werden ignoriert...
hat leider auch nicht so funktioniert...
er ignoriert es immernoch.... und in die datenbank schreibt er es auch nicht !!! *heul* |
Re: zeilen werden ignoriert...
setze einen Break-point an die erste "ignorierte" Zeile und schaue mal ob dort reingesprungen wird und was danach passiert.
Vielleicht wird das Ganze zum bleistift durch einen Event handler wieder geändert. |
Re: zeilen werden ignoriert...
also irgendwie ist es wie verhext...er läuft garnicht rein in die komplette anweisung nicht !!!! habe den haltepunkt auch am anfang gesetzt und er kommt garnicht rein...
|
Re: zeilen werden ignoriert...
Hallo,
schau Dir mal dir mal Deinen Source ganz genau an und sage wann und wo SetStr einen Wert zugewiesen bekommt.
Delphi-Quellcode:
Wenn Du diese Frage beantwortet hast, hast ganz bestimmt Dein Problem gelöst.
procedure TForm1.cb_takeClick(Sender: TObject);
Var versflid, SetStr : String; ProcessedRecs, i, SetCount : Integer; SetVals : Array Of String; Begin {If (tb_Bearbeiter.Text = '') Then ShowMessage('Bitte was eintragen.');} // Wenn SetStr beschrieben wurde -> baue UPDATE-Statement... If SetStr <> '' Then |
Re: zeilen werden ignoriert...
:wall: da hatte ich wohl Tomaten auf den augen :mrgreen:
|
Re: zeilen werden ignoriert...
ok...alles schön und gut...aberwenn ich das mache bekomm ich eine fehlermeldung !!! und zwar diese...
[i]Im Projekt daten.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 00404117C in Modul 'Daten.exe' Schreiben von Adresse 00000000'. prozess angehalten. |
Re: zeilen werden ignoriert...
Hallo Sulustaner2004,
bist Du Dir sicher, dass diese Abfrage so gewollt ist:
Delphi-Quellcode:
SetStr ist doch eine lokale Variable, die nur innerhalb der Methode cb_takeClick bekannt ist. Und ich sehe nicht, dass Du irgendwo in deiser Methode StStr einen Wert zuweist. Das heißt, alles was nch dem if kommt, wird nie abgearbeitet!
If SetStr <> '' Then
|
Re: zeilen werden ignoriert...
Liste der Anhänge anzeigen (Anzahl: 2)
also ich habe jetzt auch dieser variablen einen wert zugewiesen...
deswegen habe ich ja die fehlermeldung !!! in einer anderen form funktioniert es ja auch !!!! |
Re: zeilen werden ignoriert...
Zitat:
Wenn SetStr einen Wert enthält wird der Code ja auch ausgeführt. Jetzt kannst Du über einen Breakpoint und schrittweise ausführen des Programms herausbekommen an welcher Stelle die SV auftritt. Ich vermute mal an dieser Stelle
Delphi-Quellcode:
Der SQL Ausdruck enthält keinen Parameter, der mit i_F beginnt.
For i := 0 To pred(SetCount) Do
Parameters.ParamByName('i_F' + IntToStr(i)).Value := SetVals[i] |
Re: zeilen werden ignoriert...
Du hast mal wieder was kopiert, ohne dir den Rest anzuschauen...
@Jens Ich glaube es knallt bei "...Value := SetVals[i];" dort wird auf einen Eintrag im Array zugegriffen, den es noch nicht gibt! Das muss passieren bevor du weiter machst (Sonst gibt's eine ziemlich schräges UPDATE-Statement :mrgreen: ).
Delphi-Quellcode:
SetCount := 0;
// Arraylänge auf ANzahl der TEdits SetLength(SetVals, CompNames.Count); For i := 0 To pred(CompNames.Count) Do Begin With FindComponent(CompNames[i]) As TEdit Do If Text <> '' Then Begin // Wenn Edit <> '' -> Wert in den Array & Spalte kommt mit in die SET-Clause... SetVals[SetCount] := Text; SetStr := SetStr + ',' + #10 + ' ' + Fieldnames[i] + ' = :' + 'i_F' + IntToStr(SetCount); inc(SetCount); End; End; // Entferne erstes Komma & Leerzeichen SetStr := Copy(SetStr, 10, Length(SetStr)); |
Re: zeilen werden ignoriert...
nein...er springt an dieser stelle mit der meldung raus...
Delphi-Quellcode:
...
SetStr := SetStr + ',' + #10 + ' ' + Fieldnames[i] + ' = :' + 'i_F' + IntToStr(SetCount); ... |
Re: zeilen werden ignoriert...
Dann hast du nicht zu jedem Eintrag in CompNames einen zu Fieldnames hinzugefügt...
|
Re: zeilen werden ignoriert...
wie meinst du das ???
du meinst jedes feld eingetragen unter comp und fieldnames ??? das habe ich getan !!!! |
Re: zeilen werden ignoriert...
Ich meinte, dass du zu jeder Zeile von CompNames auch eine in FieldNames brauchst.
Dadurch kennt die Schleife die passende Spalte zu jedem Edit. Ich habe mir gerade deine UNIT gesaugt -> Du legst vor der Schleife die Länge des Arrays nicht fest -> Es knallt also eine Zeile früher. SetCount muss unbedingt vor der Schleife auf 0 gestzt werden genau wie Die Länge des Arrays der Anzahl von CompNames entsprechen muss.
Delphi-Quellcode:
Ansonsten befindet sich SetCount hier außerhalb des Arrays.
SetCount := 0;
// Arraylänge auf ANzahl der TEdits SetLength(SetVals, CompNames.Count);
Delphi-Quellcode:
SetVals[SetCount] := Text;
|
Re: zeilen werden ignoriert...
ok...soweit so gut...das klappt jetzt ja auch...aber warum speichert er es denn nicht ab ??? das versteh ich nicht !!! :wall:
|
Re: zeilen werden ignoriert...
Zeige mal Das UPDATE-Statement, das von zusammengebaut & abgesetzt wird (das schaffst du am einfachsten so wie Sharky es in deinem anderen Thread beschrieben hatte)
|
Re: zeilen werden ignoriert...
also das ist es wenn du das meintest....
Delphi-Quellcode:
... With ADOQuery1 Do Begin SQL.Text := 'Update dbo_VFL_VERZ_TEMP t' + #10 + 'Set ' + SetStr + #10 + 'WHERE t.Bearbeiter = :i_Versuch'; Prepared := True; // Werte der Paramter :i_F(1 - ...) For i := 0 To pred(SetCount) Do Parameters.ParamByName('i_F' + IntToStr(i)).Value := SetVals[i]; // Hier Parameters.ParamByName('i_Versuch').Value := TB_Bearbeiter.Text; // Ausführen ExecSQL; ... |
Re: zeilen werden ignoriert...
Zeihe ein Memo auf dein Form, kommentiere ExecSQL aus und schreibe SQL.Text in das Memo anstatt ExecSQL aufzurufen.
Delphi-Quellcode:
Den Text kannst du dann kopieren und hier posten (mit SQL-tags bitte)
// Ausführen
// ExecSQL; Memo1.Text := Sql.Text; |
Re: zeilen werden ignoriert...
ok...das was das memo angezeigt hat ist das...
SQL-Code:
Update dbo_VFL_VERZ_TEMP t
Set Bearbeiter = :i_F0 |
Re: zeilen werden ignoriert...
Vielleicht musst du die Transaktion abschließen.
Delphi-Quellcode:
p.s.: Findest du es richtig, das Feld TB_Bearbeiter auch zu ändern?
ADOQuery1.Connection.CommitTrans;
Außerdem wird nur ein Update auf bestehende Einträge ausgeführt. Es werden keine neuen hinzugefügt. |
Re: zeilen werden ignoriert...
ja, das feld bearbeiter soll auch geändert werden...
weil es eben immer sein kann das ein neuer bearbeiter hinzukommt...und der sollte dann unten angefügt werden !!!! |
Re: zeilen werden ignoriert...
so...mit dem abschlißen der query klappt das nicht !!!
dann bekomme ich ne fehlermeldung !!! |
Re: zeilen werden ignoriert...
Wenn auch noch Werte eingefügt werden sollen falls es zu dem Bearbeiter keine Einträge gibt dann probiere das mal.
Da ich hier weder deine Datenbank habe noch den DB-Server zum Testen missbrauchen möchte ( :wink: ) kann ich dir nicht versichern, dass es einwandfrei läuft. Ich habe eine Menge kommentiert und keine neuen Variablen hinzugefügt, deshalb müsstest du den Code für dich anpassen können. Ganz wichtig: Du musst Bearbeiter aus CompNames & FieldNames entfernen!!!
Delphi-Quellcode:
Teste den Code noch ein paar mal mit dem Memo und auskommentiertem ExecSQL. Und poste den generierten Code (diesmal mehr als ein Edit beschreiben).
Var
SetStr : String; ProcessedRecs, i, SetCount : Integer; SetVals : Array Of String; Begin If (tb_Bearbeiter.Text = '') Then ShowMessage('Bitte was eintragen.'); SetCount := 0; // Arraylänge auf Anzahl der TEdits SetLength(SetVals, CompNames.Count); With ADOQuery1 Do Begin // Gibt es Einträge zu diesem Bearbeiter? SQL.Text := 'SELECT Count(*) t' + #10 + 'FROM dbo_VFL_VERZ_TEMP t' + #10 + 'WHERE t.Bearbeiter = :i_Bearbeiter'; Prepared := True; Parameters.ParamByName('i_Bearbeiter').Value := TB_Bearbeiter.Text; // Ausführen Open; If Eof Or (Fields[0].AsInteger = 0) Then ProcessedRecs := 0 Else ProcessedRecs := Fields[0].AsInteger; SetStr := ''; For i := 0 To pred(CompNames.Count) Do Begin With FindComponent(CompNames[i]) As TEdit Do If Text <> '' Then Begin // Wenn Edit <> '' -> Wert in den Array & Spalte kommt mit in die SET-Clause... SetVals[SetCount] := Text; // Einträge > 0 UPDATE sonst INSERT If ProcessedRecs > 0 Then SetStr := SetStr + ',' + #10 + ' ' + Fieldnames[i] + ' = :i_F' + IntToStr(SetCount) Else SetStr := SetStr + ',' + #10 + ' ' + Fieldnames[i]; inc(SetCount); End; End; // Wenn ein INSERT benötigt wird, dann muss hier noch die Liste mit Parametern stehen If ProcessedRecs > 0 Then Begin // Bearbeiter muss auf jeden Fall eingefügt werden SetStr := 'INSERT INTO dbo_VFL_VERZ_TEMP t' + #10 + ' (Bearbeiter ' + SetStr + ')' + #10 + 'VALUES ( :i_Bearbeiter' + #10; // Fülle die Value liste mit Parametern (für jeden geänderten Wert For i := 0 To pred(SetCount) Do SetStr := SetStr + ',' + #10 + ':i_F' + IntToStr(i); SetStr := SetStr + ')' // Das INSERT-Statement sollte dann so aussehen... //INSERT INTO dbo_VFL_VERZ_TEMP t // (Bearbeiter // ,Feld1 // ,Feld2 // ...) //VALUES ( :i_Bearbeiter, // ,:i_F1 // ,:i_F2 // ... ) End Else SetStr := 'UPDATE dbo_VFL_VERZ_TEMP t' + #10 + 'SET ' + Copy(SetStr, 10, Length(SetStr)) + #10 + 'WHERE t.Bearbeiter = :i_Bearbeiter'; // Das UPDATE-Statement sollte dann so aussehen... //UPDATE dbo_VFL_VERZ_TEMP t //SET Feld1 = :i_F1 // ,Feld2 = :i_F2 // ... //WHERE t.Bearbeiter = :i_Bearbeiter // Wenn SetCount > 0 -> Führe Abfrage aus... If Setcount > 0 Then Begin SQL.Text := SetStr; Prepared := True; Parameters.ParamByName('i_Bearbeiter').Value := TB_Bearbeiter.Text; // Werte der Paramter :i_F(1 - ...) For i := 0 To pred(SetCount) Do Parameters.ParamByName('i_F' + IntToStr(i)).Value := SetVals[i]; // Ausführen ExecSQL; End; End; label27.Caption := tb_Bearbeiter.Text; //.... tb_land.Clear; End; |
Re: zeilen werden ignoriert...
ok..danke dir erstmal...das werde ich morgen machen...bin ja kurz vor feierabend !!! :-)
hast mir auf jedenfall sehr sehr geholfen !!!! |
Re: zeilen werden ignoriert...
Feierabend bei Tageslicht :?: :evil:
Was bist denn du für ein Programmierer? :stupid: |
Re: zeilen werden ignoriert...
bin einer der im praktikum ist !!! :-) aber hast ja recht...ich mache zuhause noch weiter... :-)
und außerdem einer der beim öffentlichen dienst arbeitet !!! :lol: |
Re: zeilen werden ignoriert...
guten morgen....
habe eben deinen text getestet..... aber um etwas zu posten (von einer fehlermeldung mal abgesehen) bin ich nicht gekommen...er sagt irgendetwas von einem fehlen operator um abfrage ausdruck
Delphi-Quellcode:
habe gesucht aber keinen fehlenden operator gefunden...With ADOQuery1 Do Begin // Gibt es Einträge zu diesem Bearbeiter? SQL.Text := 'SELECT Count(*) t' + #10 + //diese zeile bekomme ich als fehlermeldung zurück 'FROM dbo_VFL_VERZ_TEMP t' + #10 + 'WHERE t.Bearbeiter = :i_Bearbeiter'; Prepared := True; Parameters.ParamByName('i_Bearbeiter').Value := TB_Bearbeiter.Text; außerdem durchläuft er die sql anweisung nicht einmal... er geht zu sql.text und springt dann sofort zu prepared := true; |
Re: zeilen werden ignoriert...
"SQL.Text" bis zum ";" ist doch auch nur eine Code-Zeile.
Hast du ExecSQL auskommentiert und "Memo1.Text := ADOQuery1.SQL.Text" reingetippt? Es wäre mööglich, das ich etwas vergessen habe und im SQL-Statement ein Komma zuviel/zuwenig auftacht. Poste mal den generierten Code. Oder bockt er schon bei der Count(*)-Abfrage? |
Re: zeilen werden ignoriert...
ja, er bockt schon bei der count(*) abfrage...er kommt nichtmal bis zum execsql
|
Re: zeilen werden ignoriert...
Kann nicht anders als meinen Senf dazuzugeben. :warn:
Der Topic war mal "Zeilen werden ignoriert". Dann hat sich schnell rausgestellt, daß nicht Zeilen ignoriert werden, sondern x andere Fehler im Code waren (sind). Also wär's vielleicht keine schlechte Idee, einen neuen Thread aufzumachen. Jemand hat dazu gepostet: Zitat:
Roderich |
Re: zeilen werden ignoriert...
also ich muss sagen das diese zeilen am anfang wirklich ignoriert wurden...und es lag aber auch daran das es bestimmte quellcodezeilen nicht gab !!!
|
Re: zeilen werden ignoriert...
die Zeilen wurden also *nicht* ignoriert.
sie wurden nicht ausgeführt, weil im Programm vorher eine Exception auftrat. Roderich |
Re: zeilen werden ignoriert...
nein...eben nicht !!!
ich konnte den button anklicken wie ich wollte... er hat den quellcode einfach nicht akzeptiert !!! für ihn war er einfach nicht da !!! ich bekam weder eine fehlermeldung noch sonst irgendwas... |
Re: zeilen werden ignoriert...
@Roderich
:oops: Sorry hast natürlich recht @Sulustaner Mach mal 'nen neuen Thread auf (Ich weiß warum er beim Count(*) bockt -> Antwort im neuen Tread :wink: ) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz