Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi zeilen werden ignoriert... (https://www.delphipraxis.net/18223-zeilen-werden-ignoriert.html)

Sulustaner2004 16. Mär 2004 10:24


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:
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;
ich hoffe ihr könnt mir wieder helfen... :oops:

Cuchulainn 16. Mär 2004 10:38

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:
var StrZahl: String;
    IntZahl: Integer;

...

StrZahl := '4';
IntZahl := StrToInt(StrZahl);
So hat er's gemacht. Aber dann bin ich beruhigt, dass so etwas auch anderen Leuten passiert. :)

Sulustaner2004 16. Mär 2004 10:52

Re: zeilen werden ignoriert...
 
hat leider auch nicht so funktioniert...
er ignoriert es immernoch....
und in die datenbank schreibt er es auch nicht !!! *heul*

Robert_G 16. Mär 2004 10:55

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.

Sulustaner2004 16. Mär 2004 11:13

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...

Jens Schumann 16. Mär 2004 11:16

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:
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
Wenn Du diese Frage beantwortet hast, hast ganz bestimmt Dein Problem gelöst.

Robert_G 16. Mär 2004 11:17

Re: zeilen werden ignoriert...
 
:wall: da hatte ich wohl Tomaten auf den augen :mrgreen:

Sulustaner2004 16. Mär 2004 11:26

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.

r_kerber 16. Mär 2004 11:45

Re: zeilen werden ignoriert...
 
Hallo Sulustaner2004,

bist Du Dir sicher, dass diese Abfrage so gewollt ist:
Delphi-Quellcode:
If SetStr <> '' Then
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!

Sulustaner2004 16. Mär 2004 11:54

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 !!!!

Jens Schumann 16. Mär 2004 11:54

Re: zeilen werden ignoriert...
 
Zitat:

Zitat von Sulustaner2004
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.

Wenn Du was machst?
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:
      For i := 0 To pred(SetCount) Do
        Parameters.ParamByName('i_F' + IntToStr(i)).Value := SetVals[i]
Der SQL Ausdruck enthält keinen Parameter, der mit i_F beginnt.

Robert_G 16. Mär 2004 11:59

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));

Sulustaner2004 16. Mär 2004 11:59

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);
...

Robert_G 16. Mär 2004 12:03

Re: zeilen werden ignoriert...
 
Dann hast du nicht zu jedem Eintrag in CompNames einen zu Fieldnames hinzugefügt...

Sulustaner2004 16. Mär 2004 12:09

Re: zeilen werden ignoriert...
 
wie meinst du das ???
du meinst jedes feld eingetragen unter comp und fieldnames ??? das habe ich getan !!!!

Robert_G 16. Mär 2004 12:12

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:
  SetCount := 0;
  // Arraylänge auf ANzahl der TEdits
  SetLength(SetVals, CompNames.Count);
Ansonsten befindet sich SetCount hier außerhalb des Arrays.
Delphi-Quellcode:
SetVals[SetCount] := Text;

Sulustaner2004 16. Mär 2004 12:19

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:

Robert_G 16. Mär 2004 12:39

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)

Sulustaner2004 16. Mär 2004 12:47

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;

...

Robert_G 16. Mär 2004 12:50

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:
// Ausführen
// ExecSQL;
 Memo1.Text := Sql.Text;
Den Text kannst du dann kopieren und hier posten (mit SQL-tags bitte)

Sulustaner2004 16. Mär 2004 12:58

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

Robert_G 16. Mär 2004 13:39

Re: zeilen werden ignoriert...
 
Vielleicht musst du die Transaktion abschließen.
Delphi-Quellcode:
ADOQuery1.Connection.CommitTrans;
p.s.: Findest du es richtig, das Feld TB_Bearbeiter auch zu ändern?
Außerdem wird nur ein Update auf bestehende Einträge ausgeführt. Es werden keine neuen hinzugefügt.

Sulustaner2004 16. Mär 2004 13:41

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 !!!!

Sulustaner2004 16. Mär 2004 13:59

Re: zeilen werden ignoriert...
 
so...mit dem abschlißen der query klappt das nicht !!!
dann bekomme ich ne fehlermeldung !!!

Robert_G 16. Mär 2004 14:27

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:
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;
Teste den Code noch ein paar mal mit dem Memo und auskommentiertem ExecSQL. Und poste den generierten Code (diesmal mehr als ein Edit beschreiben).

Sulustaner2004 16. Mär 2004 14:40

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 !!!!

Robert_G 16. Mär 2004 14:44

Re: zeilen werden ignoriert...
 
Feierabend bei Tageslicht :?: :evil:
Was bist denn du für ein Programmierer? :stupid:

Sulustaner2004 16. Mär 2004 14:46

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:

Sulustaner2004 17. Mär 2004 07:33

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:

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;
habe gesucht aber keinen fehlenden operator gefunden...
außerdem durchläuft er die sql anweisung nicht einmal...
er geht zu sql.text und springt dann sofort zu prepared := true;

Robert_G 17. Mär 2004 07:55

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?

Sulustaner2004 17. Mär 2004 08:11

Re: zeilen werden ignoriert...
 
ja, er bockt schon bei der count(*) abfrage...er kommt nichtmal bis zum execsql

roderich 17. Mär 2004 08:41

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:

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:

Source:

var StrZahl: String;
IntZahl: Integer;

...

StrZahl := '4';
IntZahl := StrToInt(StrZahl);



So hat er's gemacht. Aber dann bin ich beruhigt, dass so etwas auch anderen Leuten passiert.
sorry, aber halte das ich für komplett abstrus. Da waren wohl eher Compiler-Schalter gesetzt "Keine Debug-Info" bzw. "Optimierung" oder es war nach Editieren noch nicht wieder neu compiliert.

Roderich

Sulustaner2004 17. Mär 2004 08:45

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 !!!

roderich 17. Mär 2004 08:53

Re: zeilen werden ignoriert...
 
die Zeilen wurden also *nicht* ignoriert.
sie wurden nicht ausgeführt, weil im Programm vorher eine Exception auftrat.

Roderich

Sulustaner2004 17. Mär 2004 08:55

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...

Robert_G 17. Mär 2004 09:18

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 16:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz