Autor Beitrag
Computerhasser
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Do 07.10.04 14:53 
Hallo,
ich bin gerade dabei, ein kleines Prg zu schreiben, welches DS von einer Paradox-Tabelle in eine Interbase- Tabelle kopiert und in die Paradox-Tabelle reinschreibt, welche DS kopiert wurden. Prg steht eigentlich, hab aber folgendes Problem:

Wenn ich in die Filter-Eigenschaft der Quell_Query (geaendert = 1) eingebe und diesen dann aktiviere und dann alle DS mit dem "geaendert"-Wert 1 kopieren will, kopiert das Prg nur jeden zweiten Datensatz, das den "geaendert"-Wert 1 hat.

Ich vermute dass das Problem darin liegt, dass wenn die Quell_Query nur DS mit dem geaendert-Wert "1" anzeigt, und in dem Moment, indem ich diesen Wert im DS auf "0" ändere, der Datensatz nicht mehr in der Query drin ist, da auf diesem aber der Zeiger drauf stand, der Zeiger dann automatisch einen DS weiter springt, und ich dann auch noch extra mit "Quell_Query.Next" sage, dass er nochmal eins weiterrutschen soll.

Wenn ich die Quell_Query.Filter-Eigenschaft auf false setze funktioniert das Kopieren einwandfrei.

Ist nur eine Vermutung, dass es daran liegt, und ich habe auch keine Ahnung, wie ich es anders machen sollte. :twisted: Kann mir da vielleicht jemand weiterhelfen?


ausblenden Kopierprozedur für einzelnen Datensatz
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure TMain_Form.Copy_ButtonClick(Sender: TObject);

begin
Ziel_Query.Sql.Text := 'select * from Table1 where (Feld1 = :PaFeld1)';
Ziel_Query.Params.ParamValues['PaFeld1'] := Quell_Query['Feld1']; 
Ziel_Query.Open;

if (Ziel_Query.RecordCount = 0) then 
begin
     Ziel_Table.Append; //Einfügemodus
     Ziel_Table['Feld1'] := Quell_Query['Feld1']; 
     Ziel_Table['Feld2'] := Quell_Query['Feld2'];
     Ziel_Table.Post;
     Quell_Query.Edit;
     Quell_Query['geaendert'] := 0;
     Quell_Query.Post;
end
else
begin
     Ziel_Query.Edit; //Update-Modus
     Ziel_Query['Feld2'] := Quell_Query['Feld2'];
     Ziel_Query.Post;
     Quell_Query.Edit;
     Quell_Query['geaendert'] := 0;
     Quell_Query.Post;
end;
end;



Das ganze dann in einer Schleife verpackt kopiert es alle DS aus einer Tabelle:


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
begin
Quell_Query.First; 
repeat
     Copy_ButtonClick (Sender); 
     if (Quell_Query.EOF = false) then
     begin
          Quell_Query.Next; //
     end;
until (Quell_Query.EOF = true);
end;




Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt.


Zuletzt bearbeitet von Computerhasser am Do 07.10.04 15:28, insgesamt 1-mal bearbeitet
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 07.10.04 15:26 
Lauf die Query doch erst komplett durch und mache hinterher ein update auf die Tabelle. Das SQL-Statement lautet dann ungefähr so:
ausblenden Quelltext
1:
2:
3:
update <Tabellenname>
set <Feldname> = 0
where <Feldname> = 1

das ganze packst du in eine Query und machst ein ExecSQL.

Dürfte auch erheblich schneller als deine Variante sein.
Computerhasser Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Do 07.10.04 15:41 
Danke für den Tip, an so etwas habe ich auch schon gedacht, allerdings ist das Prg etwas komplexer, und zwar in der Form, dass die Zieltabelle nicht bei allen DS erlaubt, dass sie aktualisiert werden. Der geaendert-Wert darf also nur auf 0 gesetzt werden, wenn er auch wirklich aktualisiert worden ist.
Wenn ich neue DS einfüge, ist das ja kein Problem, weil die immer in die Ziel-DS aufgenommen werden. Aber bevor bestehende DS aktualisiert werden, läufts dann auf eine if-else Abfrage hinaus. Innerhalb der bestehenden Ziel-Tabelle gibt es nämlich noch eine Spalte, welche entscheidet, ob ein bestehender DS verändert werden darf oder nicht.

Sorry, ich habe versucht, das Problem etwas vereinfacht darzustellen, aber dabei ein wesentliches Detail unterschlagen. :oops:


jasocul hat folgendes geschrieben:
Lauf die Query doch erst komplett durch und mache hinterher ein update auf die Tabelle. Das SQL-Statement lautet dann ungefähr so:
ausblenden Quelltext
1:
2:
3:
update <Tabellenname>
set <Feldname> = 0
where <Feldname> = 1

das ganze packst du in eine Query und machst ein ExecSQL.

Dürfte auch erheblich schneller als deine Variante sein.
greg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 119

Windows2000, WindowsXP
D5 Prof
BeitragVerfasst: Do 07.10.04 15:51 
Hallo Computerhasser,

unterschlagen hast Du? Schäm Dich!!

Ich hätte da ne Lösung für faule :wink: ...
Füge in der Quelltabelle noch eine Spalte 'uebertragen' ein. Die setzt Du dann nach dem Kopieren auf 1 und wenn Du durch bist machst Du das Update auf die Spalte 'geandert' mit einer Query, wie von Jasocul vorgeschlagen, wobei in der where Bedingung 'uebertragen' = 1 erfüllt sein muss.

Gruß
Gregor

PS. Hoffe ich hab mich klar ausgedrückt ... mich fiebert heute ein wenig :P
Computerhasser Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Do 07.10.04 16:21 
Hallo greg,
das hört sich gut an, würde wohl funktionieren, und eine Lösung für faule ist eigentlich genau das richtige für mich.
Eigentlich wollt ich ja so wenig wie möglich an den Tabellen verändern, aber da mir auch nichts besseres einfällt... Eine Lösung ists und ich werds wohl mal so einbauen.

Vielen Dank an euch beide, Jasocul und greg.

Und vielleicht gibt es ja noch andere Vorschläge???
greg hat folgendes geschrieben:
Hallo Computerhasser,

unterschlagen hast Du? Schäm Dich!!

Ich hätte da ne Lösung für faule :wink: ...
Füge in der Quelltabelle noch eine Spalte 'uebertragen' ein. Die setzt Du dann nach dem Kopieren auf 1 und wenn Du durch bist machst Du das Update auf die Spalte 'geandert' mit einer Query, wie von Jasocul vorgeschlagen, wobei in der where Bedingung 'uebertragen' = 1 erfüllt sein muss.

Gruß
Gregor

PS. Hoffe ich hab mich klar ausgedrückt ... mich fiebert heute ein wenig :P
OlliWausD
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 212

Win 2000/XP
Delphi 5 Professional - Interbase/Firebird
BeitragVerfasst: Do 07.10.04 17:09 
also entweder denkt ihr heut alle zu kompliziert, oder ich raffs heut nimmer

Wie is n des eigentlich:
Ist die Interbase-DB leer, und du willst alle daten einfach nur kopieren,
oder ist die interbase-DB schon mit DS versehen, die:
a) in der Paradox-DB ebenfalls enthalten sind (vielliecht etwas verändert)
b) in der Paradox-DB nicht vorhanden sind.

Ich würde dir mal folgendes vorschlagen (sicherlich ist ein Updatebefehl eleganter, aber, naja :) )

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
for i := 0 to Quell_Qry.recordcount-1 do 
begin
  if (existiert Datensatz in Interbasedb) = false then
  begin
    for j := 0 to Quell_Qry.fields[j] do
    begin
      ZielTabelle.insert;
      Zieltabelle.fields[j].asvariant := Quell_Qry.fields[j].asvariant;
      Quell_Qry.fieldbyname('SchonKopiert').assting := 'Ja';
    end;
  end
  else
  begin
    for k := 0 to Quell_Qry.fields[k] do
    begin
      if Quell_Qry.fields[k].fieldname <> 'Primärindexfeld' then
      begin
        Zieltabelle.fields[k].asvariant := Quell_Qry.fields[k].asvariant;
      end;
    end;
    Quell_Qry.fieldbyname('SchonKopiert').assting := 'Ja';
    ...
  end;
end


nur mal so als denkanstoß. mehr is mir in den letzten 5 min der Arbeitszeit auch nicht mehr eingefallen :)

Ich meld mich morgen noch mal.

mfg

OlliW

_________________
Take it easy
Computerhasser Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Fr 08.10.04 10:05 
Hallo OlliW
es ist so, dass in der Interbase-DB schon DS vorhanden sind. Das Prg muss also erkennen, ob es in den Insert- oder Update-Modus gehen soll. Dies macht es mit Ziel_Query.RecordCount (basierend auf dem select mit den Parametern ) wenn der 0 ist, geht er in den insert, falls nicht 0, in den UpdateModus


OlliWausD hat folgendes geschrieben:
also entweder denkt ihr heut alle zu kompliziert, oder ich raffs heut nimmer

Wie is n des eigentlich:
Ist die Interbase-DB leer, und du willst alle daten einfach nur kopieren,
oder ist die interbase-DB schon mit DS versehen, die:
a) in der Paradox-DB ebenfalls enthalten sind (vielliecht etwas verändert)
b) in der Paradox-DB nicht vorhanden sind.

Ich würde dir mal folgendes vorschlagen (sicherlich ist ein Updatebefehl eleganter, aber, naja :) )

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
for i := 0 to Quell_Qry.recordcount-1 do 
begin
  if (existiert Datensatz in Interbasedb) = false then
  begin
    for j := 0 to Quell_Qry.fields[j] do
    begin
      ZielTabelle.insert;
      Zieltabelle.fields[j].asvariant := Quell_Qry.fields[j].asvariant;
      Quell_Qry.fieldbyname('SchonKopiert').assting := 'Ja';
    end;
  end
  else
  begin
    for k := 0 to Quell_Qry.fields[k] do
    begin
      if Quell_Qry.fields[k].fieldname <> 'Primärindexfeld' then
      begin
        Zieltabelle.fields[k].asvariant := Quell_Qry.fields[k].asvariant;
      end;
    end;
    Quell_Qry.fieldbyname('SchonKopiert').assting := 'Ja';
    ...
  end;
end


nur mal so als denkanstoß. mehr is mir in den letzten 5 min der Arbeitszeit auch nicht mehr eingefallen :)

Ich meld mich morgen noch mal.

mfg

OlliW
Computerhasser Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Fr 08.10.04 10:17 
Hallo,
also ich hab das jetzt gestern (bzw heut nacht) so mit der "uebertragen-Spalte und dem nachträglichen Update der geaendert-Spalte eingebaut und es funzt glaub einwandfrei. Die Lösung war zwar nicht gaaanz so faul wie gedacht, aber nachdem ich den eigentlichen Kopiervorgang noch in ne selbstdefinierte Prozedur steckte ging alles. Das Problem war nämlich, klar wenn alle DS kopiert, konnt ich wenn das Prg aus der Schleife rausgeht updaten. Was aber wenn ich nur die Prozedur zu einem DS kopieren aufrufe?? Wenn ich da hintenrein noch updaten würde, würde beim "alle DS kopieren" das Update ja wieder in der Schleife stehen... Wie auch immer, jetzt funktioniert es (hoffentlich!!!)


Vielen Dank an euch alle,

Und Greg, gute Besserung.
greg hat folgendes geschrieben:
Hallo Computerhasser,

unterschlagen hast Du? Schäm Dich!!

Ich hätte da ne Lösung für faule :wink: ...
Füge in der Quelltabelle noch eine Spalte 'uebertragen' ein. Die setzt Du dann nach dem Kopieren auf 1 und wenn Du durch bist machst Du das Update auf die Spalte 'geandert' mit einer Query, wie von Jasocul vorgeschlagen, wobei in der where Bedingung 'uebertragen' = 1 erfüllt sein muss.

Gruß
Gregor

PS. Hoffe ich hab mich klar ausgedrückt ... mich fiebert heute ein wenig :P