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