| Autor |
Beitrag |
Computerhasser
Hält's aus hier
Beiträge: 13
|
Verfasst: 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.  Kann mir da vielleicht jemand weiterhelfen?
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; 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; 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:
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 Christian S.: Delphi-Tags hinzugefügt.
Zuletzt bearbeitet von Computerhasser am Do 07.10.04 15:28, insgesamt 1-mal bearbeitet
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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:
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 
Hält's aus hier
Beiträge: 13
|
Verfasst: 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.
| 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:
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
      
Beiträge: 119
Windows2000, WindowsXP
D5 Prof
|
Verfasst: Do 07.10.04 15:51
Hallo Computerhasser,
unterschlagen hast Du? Schäm Dich!!
Ich hätte da ne Lösung für faule  ...
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 
|
|
Computerhasser 
Hält's aus hier
Beiträge: 13
|
Verfasst: 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 ...
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  |
|
|
OlliWausD
      
Beiträge: 212
Win 2000/XP
Delphi 5 Professional - Interbase/Firebird
|
Verfasst: 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  )
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 
Hält's aus hier
Beiträge: 13
|
Verfasst: 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 )
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 
Hält's aus hier
Beiträge: 13
|
Verfasst: 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 ...
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  |
|
|
|