Entwickler-Ecke
Datenbanken - Probelme mit Datein in Datenbanken
foxy - Mo 20.01.03 11:43
Titel: Probelme mit Datein in Datenbanken
Boa als langsam bin ich am verzweifeln wer hätte gedacht das DB's so kompliziert sind :wink:
naja zu meiner Frage also :
Also ich hab in meiner Datenbank einmal eine Spalte für Bilder(Graphic) und einmal für alle anderen Datein(blob), so
1. Frag wie kann ich sagen, wenn ich einen neuen Datensatz mache, dieser fertig editiert ist, dann mit einem opendialog eine datei in ein DBlistbox einfüge, das wenn ich dann auf meinen Navigator drücke, das dann auch der Inhalt der Listbox eingefügt wird ?
2. Ich habe folgenden Code
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.DBGrid1DblClick(Sender: TObject); begin if FileExists(Table1.FieldbyName('BMP').AsString) then Begin Form4.Show; end else If FileExists(Table1.FieldByName('Datei').AsString) then Begin GetExe(ExtractFileExt(OpenDialog1.FileName)); end; end; |
so der überprüft, ob eine Datei vorhanden ist in den Feldern klar iss an diesem code was falsch, oder mach ich was falsch beim einlagern????
weil er erkennt nich das eine Datei existiert... bitte um hilfe :(
hansa - Mo 20.01.03 13:21
Hi,
jetzt geht das schon wieder los. Wie kann man nur innerhalb von 14 Minuten eine Frage zu einem Problem 2mal unterschiedlich stellen und in 2 verschiedenen Foren schreiben :?!?:
Hier steht schon eine Antwort von mir, die Dir aber nicht viel helfen wird. Das habe ich vor dem hier gesehen. Auch für alle, die wissen wollen, was der vorhat :
Ich mache jetzt Mittag, in 10 Min. wirst Du sowieso nicht fertig.
http://www.delphipraxis.net/viewtopic.php?t=2605
Gruß
Hansa
foxy - Mo 20.01.03 13:24
hansa ich poste das in 2 foren 1. weils dringend ist, 2. weil ich unterschiedliche anregungen erhalte und somit vielleicht das besser auswählen kann ....
hansa - Mo 20.01.03 13:38
Hi,
das da gibts doch nicht :hair: , nun gut Du hast es so gewollt. Dann kriegst Du eben hier die Antwort, auf die Frage von der Antwort sonstwo. Und damit zum Schluß keine Antwort mehr kommt, weil keiner mehr durchblickt. Und ich bin erst heute abend wieder da. Außerdem wird das mir langsam zu blöd. Die DB soll doch nur den Filename speichern oder nicht? Anhand dieses Namens mußt Du diese Grafik dann doch wohl mit LoadFromFile oder so erst laden, um sie zu sehen. Jetzt würde ich gerne noch etwas nachsehen, aber scrollen kann ich nicht, weil Dein ausführlicherer Quelltext woanders steht. 8) Also kann ich Dir nicht mehr schreiben, bin jetzt vorerst weg.
Gruß
Hansa
foxy - Mo 20.01.03 14:09
:( ich komm immer noch nich weiter
hansa - Mo 20.01.03 19:50
Hi foxy,
kein Wunder. 1 + 1 ist in diesem Fall eben nicht 2 sondern nur ca. 1,6 im Minutentakt nur 1.3 Du kriegst nur Teilantworten, die Dir nicht weiterhelfen. Also : willst Du nun das Bild selber in der DB haben, oder den Dateinamen ? Mit den Blob-Feldern, das war schon der richtige Ansatz, aber da gibt es schon Varianten.
Gruß
Hansa
foxy - Di 21.01.03 09:05
das ist mir relativ egal .... würde gerne mal beide Methoden austesten, einmal mit dem Pfad der Datei, weil ich die sowiso in einem Ordner Spreichere,
2. mal versuchen die komplette Datei, da ich aber nich weis wieviel resourcen das kostet würde ich gerne mal beide ausprobieren, nur ich komm wirklich nicht weiter gestern schon google durchforstet.... tut durchgeschat da iss alles wunderbar erklärt, wie man Db's aufbaut aber sehr wenig mit datein, unn das was da iss das hilft mir ehrlichgesagt nicht sehr weiter, weil ich mich mit DB noch nich so viel befasst habe, das hier iss meine erste DB ... von daher :cry:
hansa - Di 21.01.03 09:18
Hi,
Da steht ziemlich genau drin, was Du machen mußt:
http://www.dclp-faq.de/q/q-db-blob.html
Um es vorwegzunehmen : Speichere nur den Pfad ! Was machst Du jetzt wieder mit Google ? Wahrscheinlich auch nur Hichhack. :mrgreen: Ich habe Blob und Datenbank eingegeben und schon hatte ich diesen Artikel an erster Stelle.
Gruß
Hansa
foxy - Di 21.01.03 09:39
da müsste ich ja mit mysql arbeiten :( unn noch schlimer php .... boa muss ich mich ma durchackern
hansa - Di 21.01.03 09:51
Wieso MySQL? Lasse das My weg und dann siehst Du was Du brauchst! Wenn Du sowieso noch keine DB gemacht hast, dann fang lieber gleich richtig an. Also ich verwende Interbase.
Gruß
Hansa
foxy - Di 21.01.03 09:56
Vorteile <-> NAchteile??
Interbase sind das nich andere Befehle??
ausserdem hab ich ja die DB fast fertig :( also fhelt eben nur noch das ... boa ich verzweifele bald der eine sagt jaja nimm SQL der andere nene Paradox iss scho ok du nu Interbase .... *ausflipp* .... *meinen_cheff_tothau*
nene iss nur so das ich scho relativ weit bin und nich alles umodeln will weil ich nun komplett anderen DatenbankTyp verwende
hansa - Di 21.01.03 10:45
Typisch ! 8) Woanders lese ich gerade, daß Du Dich entschlossen hast, nur den Dateinamen zu verwenden. Ja dann mach das doch so und Basta. Das geht auch mit Paradox. Brauchst Du aber irgendwann mal ein Netztwerk, dann nimm SQL und lass die Finger von Anfang an von Paradox. Da wäre unter anderem Interbase geeignet. Natürlich kannst Du auch Oracle verwenden. Kapiert :?: :mrgreen:
Gruß
Hansa
foxy - Di 21.01.03 11:03
japp thx für deine hilfe .... war grad in puase ;) .... ja netzwerk mach ich mir immoment noch keine gedanken ... aber wenns soweit iss werd ich wohl wieder ne topic eröffnen ;)
ja ich verwende nur den pfad, den speichere ich doch nur als string ab oder?? unn dann öffne ich den per doppelklick.... hoffe mal das funzt alles so wie ich das vorhabe wenn nich suche ich ma weiter oder poste fleissig
thx bis denne
hansa - Di 21.01.03 11:29
so ungefähr mußt Du das machen :
Quelltext
1: 2: 3: 4: 5:
| procedure TLiefStamm.DBEdit14DblClick(Sender: TObject); begin WaveAbspielen ('\WINNT\Media\Utopia Windows starten.WAV'); ShellExecute(0, 'open',PChar('http://'+DBEdit14.Text) , nil, nil, SW_SHOW); end; |
hier habe ich ein DBeditFeld. In dieses kann die Internet-Adresse (in diesem Beispiel von einem Lieferanten) eingegeben werden. Will der User dessen Seite besuchen braucht er nur auf die Adresse doppelt zu clicken und schon startet der Browser mit dieser Seite. Da das meist ein paar Sek. dauert kriegt er noch ein kleines Liedchen vorgespielt, damit er merkt das was passiert.
Wahrscheinlich brauchst Du nicht mal das ShellExecute für ein externes Programm, in Delphi gibt es bestimmt so was wie LoadBMPfromFile für Deine Bildchen. Weiß aber nichts genaues. Wenn Du brav bist und Dich schickst hilft Dir da bestimmt jemand anderes. :mrgreen: Du must Dir ein geeignetes Event suchen, wie ich hier z.B. einen DoubleClick. OnExit wäre ja wohl nix. Wenn Du noch Fragen hierzu hast, dann stelle sie aber jetzt hier, ich schreib den Text nämlich nicht noch in 10 Foren.
Gruß
Hansa
P.S.: Hier noch der Code für das Liedchen, das ist doch eher mit dem zu vergleichen, was Du mit dem Bild machen mußt:
Quelltext
1: 2: 3: 4: 5: 6:
| PROCEDURE WaveAbspielen (DateiName : string); VAR flag : byte; BEGIN flag:=SND_ASYNC; sndPlaySound(PChar (DateiName), Flag); END; |
foxy - Di 21.01.03 11:59
ich rbauch die Dblclick Prozedure , weil der Pfad in nem DBgrid gespeichert iss unn ich will das machen, wenn man auf die zeile doppelklick macht das eben dann diese datei geöffnet wird. Bin aber schon nahe an der Lösung :lol: ... es öffnet sich schonma der winexplorer ;)
kiwicht - Mo 10.02.03 13:14
hiho...
erstmal eins, wenn du blobs nicht unbedingt brauchst, dann lass die finger weg, so wie ich ;)
denn was soll es dir bringen, wenn du die bilder komplett in deiner db speicherst, wenn du sie sowieso irgendwo auf platte hast?
so, und jetzt gibts noch ne schöne quer-zurück-chaos-verknüpfung, weil ich ein ähnliches prob hatte, hoffe das hilft dir weiter...
http://www.delphi-forum.de/viewtopic.php?t=6994&highlight=
mfg
kiwicht
foxy - Mo 10.02.03 13:24
hui :D
die iss aber alt :D
ich hab das schon lange gelöst, indem ich in meinen Datensatz eben nur den Pfad gespeichert habe und dann diese datei mit Hilfe von ShellExecute aufgerufen habe .... aber eins macht mir noch zu denken 2 oder z.b. 10 dateien in einem datensatz d.h. da müsste ich ja ein array machen :?
hansa - Mo 10.02.03 13:50
| foxy hat folgendes geschrieben: |
| .... aber eins macht mir noch zu denken 2 oder z.b. 10 dateien in einem datensatz d.h. da müsste ich ja ein array machen :? |
Was willst Du denn damit ?
Quelltext
1:
| Ein Array [1..10] of filename |
So was in der Art und was willst Du damit bezwecken ? haha, wird das wieder toll. :rofl: Bevor Du mit dem Unfug anfängst empfehle ich Dir das hier zu lesen :
http://www.delphi-forum.de/viewtopic.php?t=4379&highlight= :hair:
Gruß
Hansa
foxy - Mo 10.02.03 14:06
hui :rofl:
das war aber lang ... da ich eigentlich nicht schlau daraus geworden bin ;) ... nnur soviel verstanden das es unnötig ist ein array zu machen :D
hast du das nun irgendwie gelöst, oder verwendest du einfach mehrere Spalten??
hansa - Mo 10.02.03 14:32
| foxy hat folgendes geschrieben: |
das war aber lang ... oder verwendest du einfach mehrere Spalten?? |
Von wegen lang hier gings los :
"SQL und Arrays", nicht zu verwechseln mit "Arrays und SQL" 8)
@Admin: der Beitrag ist einfach nicht mehr zu finden. Heute morgen habe ich ihn noch gesehen.
Ja ich verwende mehrere Spalten, das hat mir eingebrockt, daß ich an einer Stelle statt 4 ARRAY [1..12] dann 48 Einzelfelder hab. Das ist aber im Grunde nur ein Schönheitsfehler. Aus 2 Gründen benutze ich die Einzelfelder, obwohl es mit Arrays schon geht, aber es bringt nichts.
1. Programm hatte ich sowieso schon auf Einzelfelder umgestellt (never change a rznning System)
2. Entscheidend war letztlich folgende Überlegung : an die DB werden sowieso Strings übergeben. Angenommen ich brauche den Umsatz vom Januar. Das wäre dann im select als umsatz[1] bei Arrays einzubauen, so baue ich umsatz1 ein. Um das ganze etwas zu vereinfachen, habe ich eine Funktion gebastelt :
Quelltext
1: 2: 3: 4:
| FUNCTION SelectFeld (Feldname : string;m : MonatsZahl) : string; BEGIN SelectFeld := Feldname+IntToStr (m); END; |
Das wars dann schon.
Gruß
Hansa
foxy - Mo 10.02.03 14:38
joa ich will das eben nur mit dateien machen.... also wenn ich sage
die firma xxx hat mir 10 angebote geschickt diese will ich dann natürlich in einem datensatz behalten ... dann mache ich denke ich einfach ne abfrage wieviel datein der jenige in den datensatz einlagern will und create dann schnell so viele neue spalten .... das ist denke ich die einfachste methode ... nur hoffe das geht bei IB so einfach wie bei paradox ;)
hansa - Mo 10.02.03 15:08
So ganz klar ist Dir das anscheinend noch nicht. 8) Angenommen die Fa. hat die Nr. 5. und Du willst alle Angebote sehen. Dann sieht das eben ungefähr so aus :
Quelltext
1:
| DM.DS.SelectSql.Text := 'SELECT * FROM ANGEBOTE WHERE LIEFNR = 5'; |
Ob das ein Angebot oder 100 sind, spielt keine Rolle. Willst Du diese z.B. in einem Grid sehen, legst Du noch ein DBgrid auf dein Form und noch eine Datasource. Das alles schön artig miteinander verbinden und dann bist Du schon fertig.
| Zitat: |
| wieviel datein der jenige in den datensatz einlagern will und create dann schnell so viele neue spalten .... |
foxy, was willst Du denn da mit Spalten :?: In jeder
Zeile steht ein Angebot ! Da es sich wahrscheinlich um Deine Bildchen handelt wird es eine Spalte mit dem Dateinamen des Bildes geben. Also ich würde da ein Hint auf die Spalte setzen "Doppelclicken um Bild anzuzeigen" Das OnDblClick auf die entsprechende Zelle würde ich dann dazu benutzen, LoadFromFile und das ganze drumrum durchzuführen.
Du denkst noch etwas zu statisch. Eine DB lebt aber :mrgreen: , die sieht jeden Tag anders aus. Im Netzwerk sogar laufend.
Gruß
Hansa
foxy - Mo 10.02.03 15:24
hmm ich glaube du hast recht .... ich muss mir das ganze wohl mal wirklich überlegen wie ich das genau machen will .....
ich gebe dir bescheit wenn ich soweit bin und eine lösung habe :D
kiwicht - Mo 10.02.03 15:38
wenn ich dazu auch noch mal was sagen darf...
vor einem ähnlichem problem stand ich vor geraumer zeit auch, das ich zu jeder firma noch beliebig viele dateien verknüpfen wollte...
schließlich hab ich mich für eine extra datenbank entschieden, in der ersten die verknüpfungen zu den dateien stehen, und zweitens, logisch, die firmencode´s um alles entsprechend zu zuordnen...
ich muss sagen, das mit den arrays, was ich ganz nebenbei auch nicht wirklich verstehe, ist für mich der pure overkill, oder?!?
mfg
kiwicht
ps: hab ich jetzt das thema verfehlt? hab grad n mulmiges gefühl... :shock:
foxy - Mo 10.02.03 15:43
hehe :rofl: hammer
| Kiwich hat folgendes geschrieben: |
ich muss sagen, das mit den arrays, was ich ganz nebenbei auch nicht wirklich verstehe, ist für mich der pure overkill, oder?!?
|
hehe geile aussage :D:D so gehs mir auch fast
und du hast das thema voll getroffen das mit der 2. db ist ga nich mal so schlecht ... wie hast du denn das genau zu geordnet
Firma1 ----> datensatz1 in andere DB?
datensatz1 ----> Spalte1 = datei1 ??????
hansa - Mo 10.02.03 16:10
foxy, ich glaube Du mußt Dir das ganze von Anfang an neu überlegen. Du bewegst Dich sonst im Kreis. Die 2. DB nützt Dir nichts, dann bist Du wieder ganz am Anfang und mußt wieder mit der Blob - Problematik anfangen. Für die Arrays gilt ähnliches. Höre auf mich und lasse vorerst die Finger von beidem. Wette, daß ohne diese Sachen Dein Programm doppelt so schnell fertig ist und genauso gut funktioniert.
| kiwicht hat folgendes geschrieben: |
ich muss sagen, das mit den arrays, was ich ganz nebenbei auch nicht wirklich verstehe, ist für mich der pure overkill, oder?!?
|
Ein Array ist so ziemlich das einfachste was es gibt. Nur eben nicht bei Interbase mit Delphi. Aber ich sehe gerade, in der OH ist es viel zu kompliziert beschrieben. Na gut, für die Newbies (in welchem Zeitraum ist man das eigentlich so gewöhnlich?):
angenommen ich will die Umsätze eines ganzen Jahres auswerten und diese liegen in einem
Quelltext
1:
| var Umsatz : Array [1..12] of real; |
nun will ich z.B. nur den Umsatz vom Juli. So komme ich dann dran :
Quelltext
1: 2:
| var JuliUmsatz : real; JuliUmsatz := Umsatz [7]; |
statt der 7 kann ich auch eine Variable verwenden, die dürfte dann in diesem Bsp. nur eine ganze Zahl zwischen 1 und 12 sein.
Gruß
Hansa
foxy - Mo 10.02.03 16:15
lol für die Nuubies :D hehe der Hansa ;)
emm ja wie gesagt ich überleg mir das ma genauer .... ja array fällt ganz weg das iss schon klar .... nnur mit der anderen DB das überleg ich mir noch .... aber dennoch thx euch beiden :rofl:
kiwicht - Mo 10.02.03 17:41
auch von mir ein dickes :LOL: ... und ích gestehe hiermit ein, bin seit einem halben jahr aktiver delphi-coder... und lass mich gerne noch als nubee betiteln... ich stehe dazu...
und zum thema:
nunja, was arrays ansich sind, ist mir schon bewusst, auch wie man sie verwendet, aber ich komme jetzt auf den ersten blick nicht mit arrays in db-feldern klar. zumal ja eine datenbank ansich auch ein (drei-dimensionaler) array, aber im gegensatz zum array leichter zu handhaben ist!
also wozu den umweg über einen array gehen, wenns nicht auch einfacher klappt... aber wie gesagt, so sehe ich das, meine meinung... ;)
jetzt noch mal zum problem:
ich hab also meine primary-datenbank, in der die kunden gespeichert sind, inklusive diverser daten, und eine secondary-datenbank, mit den verknüpfungen zu bildern etc.
will ich eine neue verknüpfung zufügen, realisiere ich das so:
filelink ist das entsprechende Feld in der secondary-DB
aktFirmencode ist ein String, entsprechend des aktuellen Datensatzes
firmencode heisst das "verweisende" Feld in der sec. und der primary DB
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| aktFirmencode := primDB.DataField[Kundencode]
INSERT INTO secDB Firmencode VALUES firmencode
aktFileLink := OpenDialog(Filename) //USER SUCHT SICH NE DATEI AUS
UPDATE secDB SET filelink = aktFileLink WHERE firmencode = aktFirmencode |
und zum anzeigen nutzte ich ganz einfach ein weiters DBGrid, was ich aber um seine optischen Hauptmerkmale wie irgendwelche Linien und Tabellenköpfe beschneide, da ich ja nur eine Spalte und ein DB-Feld verwende.
Navigiert also der User durch meine Primary-DB, aktualisiere ich das 2. DB-Grid, was ja auf meine Secondary-DB verweist ungefähr so:
Quelltext
1:
| SELECT * FROM secDB WHERE firmencode LIKE primDB.FieldValues[Firmencode] |
mein Code ist an der stelle erstmal nur schematisch, da ich den richtigen jetzt nicht zur hand habe, aber ich hoffe du weist was ich meine...
in diesem Sinne.
mfg
kiwicht
ps:
so sieht dann die primary-db aus:
id firmencode text
1 xxx bla bla
2 yyy schmarn
3 zzz juhu
und das ist die secondary-db:
id firmencode filelink
1 xxx
http://www.fwp-cs.de
2 xxx nimda.exe
3 xxx totheroots.jpg
4 yyy dumb.jpg
5 yyy readme.txt
foxy - Di 11.02.03 09:12
joa also wenn ich soweit bin dann werd ich ma da ranhauen .... ich kuck ma was die beste lösung ist
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!