Einzelnen Beitrag anzeigen

Robert_G
(Gast)

n/a Beiträge
 
#25

Re: zeilen werden ignoriert...

  Alt 16. Mär 2004, 15:27
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 ( ) 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).
  Mit Zitat antworten Zitat