Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DBImage-Felder leeren, nicht löschen (https://www.delphipraxis.net/138790-dbimage-felder-leeren-nicht-loeschen.html)

Spargeltarzan 17. Aug 2009 18:13


DBImage-Felder leeren, nicht löschen
 
Hallo zusammen

Ich hab ein Problem: Mit Bildern Gefüllte TDBImage-Felder sollten geleert werden. Ich möchte nicht den gesamten Datensatz mit Delete mittels Navigator löschen. Also nur ein Art "Clear". Hat jemand eine Idee ? Ich komm einfach nicht drauf.
Delphi 2.0
Besten Dank für Eure Beiträge.

Gruss
Spargeltarzan

mkinzler 17. Aug 2009 18:14

Re: DBImage-Felder leeren, nicht löschen
 
Am Besten Datenbankfeld auf NULL setzen bzw
Delphi-Quellcode:
Field.Clear;

Spargeltarzan 17. Aug 2009 21:39

Re: DBImage-Felder leeren, nicht löschen
 
Danke für den Hint.

Hab's folgendermassen versucht:

table1.edit;
dbimage1.field.clear;

ergibt eine Fehlermeldung: BLOB not opened.

Nochmals ausgeführt ergabs die Fehlermeldung: Record locked by another user

MFG
Spargeltarzan

mkinzler 17. Aug 2009 21:41

Re: DBImage-Felder leeren, nicht löschen
 
Wende es mal direkt auf das Feld in der Datenbank an.

Spargeltarzan 17. Aug 2009 22:36

Re: DBImage-Felder leeren, nicht löschen
 
Wie meintest Du das, auf die Datenbank anwenden ?
Ich habs so versucht:
Delphi-Quellcode:
table1.edit;
//dbimage1.field.clear;
table1.FieldByName('Holzbild').AsString := '';
Dies ergab dann wieder die gleiche Fehlermeldung: locked.

Gruss
Spargeltarzan

[edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit]

mkinzler 18. Aug 2009 05:37

Re: DBImage-Felder leeren, nicht löschen
 
Delphi-Quellcode:
table1.FieldByName('Holzbild').Clear;
oder
Delphi-Quellcode:
table1.FieldByName('Holzbild').Value := NULL;

Spargeltarzan 18. Aug 2009 23:36

Re: DBImage-Felder leeren, nicht löschen
 
Hallo

Besten Dank für Deine Vorschläge, aber alle beide gingen nicht. Es gab jedes mal die Fehlermeldung: Record locked, used by another user.
Mein Quelltext:
Delphi-Quellcode:
begin
table1.edit;
  //dbimage1.field.clear;
  //table1.FieldByName('Holzbild').CanModify;
  table1.FieldByName('Holzbild').Value := NULL;
  //table1.FieldByName('Holzbild').Clear;
end;
Hab alle Möglichkeiten durchgespielt, ohne Erfolg.

Gruss
Spargeltarzan

[edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit]

Spargeltarzan 19. Aug 2009 03:31

Re: DBImage-Felder leeren, nicht löschen
 
Hallo

Bei Eingabe:

table1.edit;
dbimage1.field.clear;

gabs die Fehlermeldng: BLOB not opened.

Was muss ich tun um BLOB zu öffnen ?

Gruss
Spargeltarzan

Spargeltarzan 19. Aug 2009 03:39

Re: DBImage-Felder leeren, nicht löschen
 
Hab noch folgendes probiert:

Delphi-Quellcode:
begin
table1.active:=false;
table1.active:=true;
table1.edit;
try
  Table1.Open;
except
  on EDataBaseError do dbimage1.field.clear;{ The dataset could not be opened }
end;
ohne Erfolg, hab jetzt einfach keine Fehlermeldung, aber das Feld wurde nicht geleert.

Gruss
Spargeltarzan

[edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit]

Spargeltarzan 19. Aug 2009 20:27

Re: DBImage-Felder leeren, nicht löschen
 
Kann es sein, dass die DB im Programm offen ist und benützt wird ? Ich bekomm die Fehlermeldung: Record locked, DB used by another user (Bei Anwendung von : table1.FieldByName('Holzbild').Value := NULL - zum leeren des Feldes.

Ich verwende verschiedene TTable's mit derselben DB in anderen Units. Sind diese denn offen ?

Kann mir jemand weiterhelfen, dass ich diese Fehlermeldung (Locked) nicht mehr kekomme ?

Gruss

Spargeltarzan

mkinzler 19. Aug 2009 21:30

Re: DBImage-Felder leeren, nicht löschen
 
Verweisen die anderen Tables auf die selbe Datenbanktablle?

hoika 19. Aug 2009 22:07

Re: DBImage-Felder leeren, nicht löschen
 
Hallo,

vergiss das blöde TTable.
Nimm eine Query.

Query.SQL.Add('Update Table1 Set Blob_Field=NULL Where Id=5');
Query.ExecSQL;

Id=5 ist jetzt mal geraten ;)


Heiko

Spargeltarzan 20. Aug 2009 03:51

Re: DBImage-Felder leeren, nicht löschen
 
An mkinzler:

Ja die Tables weisen auf dieselbe Datenbank.

Spargeltarzan 20. Aug 2009 04:07

Re: DBImage-Felder leeren, nicht löschen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wie geht das mit Query ?

Id=5 ? was ist das ?

Ich kenn mich mit query nicht gut aus. Meine Basisdatenbank besteht aus ca. 950 Datensätzen. Ich hab ein Input-Blatt, wo ich Bilder absave. Ich möchte einfach die Bilder aus der Datenbank entfernen, ohne den gesamten Datensatz (z.B.) Nr.567 zu löschen. Ich navigiere mit dem DBNavigator durch die Datenbank und zeige die BLOB-Felder dann mit DBImage an. Ich möchte einfach bei allen 6 Bildern ein Button setzen, der mir das Bild leert (nicht löscht). Ich hab ein Screenshot des Inputs zur Verständisklärung beigefügt.

Gruss
Spargeltarzan

mkinzler 20. Aug 2009 05:34

Re: DBImage-Felder leeren, nicht löschen
 
Sollen die Bilder nur am Bildschirm geleert werden oder auch aus der DB entfernt?

hoika 20. Aug 2009 07:27

Re: DBImage-Felder leeren, nicht löschen
 
Hallo,

Id ist der Primär-Schlüssel der Tabelle.
Irgendwie muss die Query ja wissen, was sie leeren soll.

Nehmen wir mal an, Table1 ist mit dem DataSet verbunden.

Delphi-Quellcode:
var
  Query: TQuery;
begin
  Query:= TQuery.Create(NIL);
  try
    with Query do
    begin
      SQL.Clear;
      SQL.Add('Update Table1 Set Blob_Field=NULL Where Id=:Id');
      ParamByName('Id').AsInteger:= Table1.FieldByName('Id').AsInteger;
      ExecSQL;
    end;
  finally
    Query.Free;
  end;
 
 // ev. das hier noch
  Table1.Refresh;

end;

Heiko

Spargeltarzan 21. Aug 2009 04:31

Re: DBImage-Felder leeren, nicht löschen
 
Vom Bildschirm und aus der DB, aber der Datensatz sollte nicht gelöscht werden (wie mit Delete vom Navigator).

Methode: Table1.ClearFields
Also igendwie kann ich diese Standardanweisung zum leeren (löschen) nicht anwenden, weil die Datenbank irgendwo in Gebrauch ist (daher die Meldung: Record locked, db used by another user). Ich habe viele Tables in Gebrauch, muss ich alle Tables auf active:=false setzen ? Das wäre aber nicht gut, denn ich habe viele Units und dann müsste ich bei jedem Aufruf die Eigenschaft active auf true stellen.

DeddyH 21. Aug 2009 12:08

Re: DBImage-Felder leeren, nicht löschen
 
Nur so eine Idee:
Delphi-Quellcode:
DBImage.Datasource := nil;

hoika 21. Aug 2009 12:38

Re: DBImage-Felder leeren, nicht löschen
 
Hallo,

1. was ist mit meiner Query ?

2. Schreibe dir eine Methode OpenTable, die jede unit aufruft.
Dein Code ist ene schönes Bsp. wie amn es nicht macht ;)
OK, habe ich früher auch so gemacht.

Die TTable darf nur an genau einer Stelle stehen,
z.B. in einer Datenklasse.
Jede weitere Unit hat diese Klasse zu benutzen.


Heiko

Spargeltarzan 21. Aug 2009 15:37

Re: DBImage-Felder leeren, nicht löschen
 
An Heiko

Ja ich weiss, ich hätte ein Daten-Modul einbinden sollen, mit einer Table und einer Datasource. Aber das ist jetzt zu spät. Wie meinst du das: eine Methode OpenTable schreiben ? Ich kappier gar nichts mehr.

Gruss
Spargeltarzan

Spargeltarzan 21. Aug 2009 15:45

Re: DBImage-Felder leeren, nicht löschen
 
Mit dem Befehl:

DBImage1.Datasource := nil;

erhalte ich zwar keine Fehlermeldung, aber es löst nicht mein Problem. Trotzdem Danke

Gruss
Spargeltarzan

Spargeltarzan 21. Aug 2009 15:49

Re: DBImage-Felder leeren, nicht löschen
 
Nochmals zu Deiner Query:

Delphi-Quellcode:
var
  Query: TQuery;
begin
  Query:= TQuery.Create(NIL);
  try
    with Query do
    begin
      SQL.Clear;
      SQL.Add('Update Table1 Set Blob_Field=NULL Where Id=:Id');
      ParamByName('Id').AsInteger:= Table1.FieldByName('Id').AsInteger;
      ExecSQL;
    end;
  finally
    Query.Free;
  end;

// ev. das hier noch
  Table1.Refresh;

end;
Ich hab überhaupt keine Erfahrung mit dieser VCL-Unit. Ich sortiere immer über Sekundärindices (Paradox-DB).
Geht viel schneller, aber das ist ja nicht das Problem: Ich möchte einfach z.B. von datensatz Nr. 567 das Imagefeld : Holzbild leeren, ohne den Datensatz zu löschen.
Was ist mit Where Id:=Id ? Id scheint der Feldname zu sein. Aber wie komme ich zu Datensatz Nr. 567 ?

Gruss
Spargeltarzan

[edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:52 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