| |
VB.NET - FortgeschritteneDokument auswaehlen und speichern mit OpenFileDialog | | | Autor: ERBRU | Datum: 14.10.18 14:02 |
| habe eine tabelle in der zu einer ausgewählten Row in eine Tabelle "Ablagedokumente" gespeichert werden soll.
Tabelle Ablagedokumente:
ID = Autowert (eindeutiger Wert Int32)
Dokument = String (Name des Dokumentes Auswahl)
Dokumentenart = String (Anlage: Angebot, Lieferschein, Kostenvoranschlag etc.) Zuweisung
abgelegtam = DateTime (Datum an dem Dokument abgelegt wurde)
Ablagedetails = (ID Int32 aus Fremdtabelle, die ausgewaehlte Datarow) kann ein oder mehr Dokumente haben.
nun möchte ich ein Dokument auswaehlen und speichern in einen Ordner?
also aus der Quelle kopieren in einen ZielOrdner speichern Dateiname in Tabelle ablegen, DGV auflisten.
Danke euch, hoffe habt verstanden was ich möchte? | |
Re: Dokument auswaehlen und speichern mit OpenFileDialog | | | Autor: ERBRU | Datum: 15.10.18 13:25 |
| OK kann ich verstehen, habe das mal so probiert.
erhalte die Info: Der Pfad hat ein ungültiges Format.
möchte nur den Dateiname speichern!
Private Sub btn_Neues_Dokument_Click(sender As Object, e As EventArgs) _
Handles btn_Neues_Dokument.Click
BSAblagedokumente.AddNew()
End Sub
Private Sub btn_Dokument_Hinzufuegen_Click(sender As Object, e As _
EventArgs) Handles btn_Dokument_Hinzufuegen.Click
Kopiere_Datei(OFD_Starten)
End Sub
'Datei holen
Private Function OFD_Starten() As String
Using ofd As New OpenFileDialog
With ofd
.InitialDirectory = Environment.CurrentDirectory
.Filter = "Alle Dateien| *.*"
.FileName = ""
.CheckFileExists = True
.CheckPathExists = True
Dim dlgResult As DialogResult = ofd.ShowDialog()
If dlgResult = Windows.Forms.DialogResult.OK Then
Return IO.Path.GetFullPath(ofd.FileName)
End If
Return Nothing
End With
End Using
End Function
'Datei kopieren
Private Function Kopiere_Datei(ByVal FileName As String)
Try
Me.Cursor = Cursors.WaitCursor
Dim Ordner_Ziel = get_Dokumente_Ablage_Ordner(CInt( _
tbIDDatarow_Ablagedetails.Text))
Dim fi_Quelle As New FileInfo(IO.Path.GetFileNameWithoutExtension( _
ofd.FileName))
Dim fi_Ziel As New FileInfo(IO.Path.Combine(Ordner_Ziel, _
IO.Path.GetFileNameWithoutExtension(ofd.FileName)))
DokumentTextBox.Text = FileName
'falls Ordner gelöscht wurde, Ordner erstellen
create_Dokumente_Ablage_Ordner(CInt(tbIDDatarow_Ablagedetails.Text))
fi_Quelle.CopyTo(fi_Ziel.FullName, True)
'IO.File.Copy(FileName, String.Concat(Ordner_Ziel,
' IO.Path.DirectorySeparatorChar, IO.Path.GetFileName(FileName)))
'Speichern
Me.Validate()
BSAblagedokumente.EndEdit()
dict_BS_Pos.Clear()
dict_BS_Pos.Add(BSAblagedokumente, BSAblagedokumente.Position)
mod_Saver.SaveDataset(Me.AblageDB, dict_BS_Pos, _
AblagedokumenteTableAdapter.Adapter)
AblagedokumenteDataGridView.Refresh()
'speichern beendet
Me.Cursor = Cursors.Default
Catch ex As Exception
MessageBox.Show(ex.Message.ToString)
End Try
End Function
#Region "Dokumente Ordner prüfen/erstellen"
Private Function get_Dokumente_Ablage_Ordner(ByVal AblageID As Integer) As _
String
Return IO.Path.Combine(Ordner_Dokumente_Ablage, AblageID.ToString)
End Function
Private Function create_Dokumente_Ablage_Ordner(ByVal AblageID As Integer) _
As Boolean
Dim pfad_Gesamt As String = IO.Path.Combine(Ordner_Dokumente_Ablage, _
AblageID.ToString)
If Not IO.Directory.Exists(pfad_Gesamt) Then _
IO.Directory.CreateDirectory(pfad_Gesamt)
Return True
End Function | |
Re: Dokument auswaehlen und speichern mit OpenFileDialog | | | Autor: ERBRU | Datum: 15.10.18 15:16 |
| Zusatz Info:
Beitrag wurde zuletzt am 15.10.18 um 15:20:31 editiert. | |
Re: Dokument auswaehlen und speichern mit OpenFileDialog | | | Autor: Franki | Datum: 16.10.18 00:04 |
| Hallo
Zitat: | | OK kann ich verstehen, habe das mal so probiert.
erhalte die Info: Der Pfad hat ein ungültiges Format. | |
Um das zu kontrollieren, kannst du dir doch den Pfad/Ordner/Verzeichnis vorher mal irgendwie ausgeben lassen und kontrollieren, ob es den auch wirklich gibt bzw. ob dein Programm da überhaupt Schreibberechtigung hat.
Zitat: | |
möchte nur den Dateiname speichern!
| |
Eine Datei alleine kann man nur innerhalb eines Dateisystems speichern. Dazu gehört nun mal der komplette Pfad damait das Betriebssystem die Datei auch speichern bzw. wieder finden kann. Stell dir mal vor du speicherst die Datei 4711.txt mehrfach irgendwo ohne Angebe wor genau sie gespeichert ist. Wie willst du sie dann später wieder finden.
Stell dir vor du speicherst in deinem Navi im Auto z.B. Hauptstrasse 10. Wie willst du später dorhin zurück finden? Hautpstrasse 10 gibt es zig mal in Deutschland, das würde genau so wenig funktionieren wie eine Datei ohne genau Ortsangabe im Dateisystem zu spreichern.
Gruß
Frank | |
Re: Dokument auswaehlen und speichern mit OpenFileDialog | | | Autor: Kuno60 | Datum: 16.10.18 01:53 |
| Hallo Franki,
es ist nicht falsch, in einer Datenbank nur den Dateinamen oder einen relativen Pfaden zu speichern. Mit IO.Path.Combine() kann man dann den vollständigen Pfad zusammen setzen.
Das wird in vielen Anwendungen verwendet, wenn der Benutzer selbst festlegen kann, in welchem Ordner das Programm Daten finden, oder Daten ablegen, soll. So kann man auch mal einen Ordner auf ein anderes Laufwerk kopieren, ohne dass es Probleme mit dem Pfad gibt.
Teilweise hat ERBRU das richtig gemacht, auch wenn ich in seinem Code nicht so richtig durchblicke... | |
Re: Dokument auswaehlen und speichern mit OpenFileDialog | | | Autor: ERBRU | Datum: 16.10.18 06:41 |
| OK, das soll der Speicherort der Datei sein
Quelle: OFD Openfiledialog ?
Ziel: "..\Ablagearchiv\IDAblagedetails"
Datei wählen und speichern, zuvor noch zuweisen Angebot, Lieferschein etc.
IDAblagedetails ist ein Integer (Ordner) der die Datei bekommt.
So finde ich die Datei auch im Ablagearchiv wieder | |
Re: Dokument auswaehlen und speichern mit OpenFileDialog | | | Autor: ERBRU | Datum: 16.10.18 13:10 |
| Hallo zusammen,
das check ich nicht wie ich es anfange komme ich so nicht ans Ziel.
https://picload.org/view/dcdcrwri/anhang_speichern_2.png.html
per DragDrop funktioniert das.
Doch hier nun soll der user eine Datei auswählen können und die in den Ordner
kopieren (ablegen)
'Datei kopieren
Private Function Kopiere_Datei(ByVal FileName As String)
Dim _overwrite As Boolean = False
Dim AblageID As Integer
AblageID = CInt(AblagedetailsIDTextBox.Text)
DokumentTextBox.Text = FileName
Me.Cursor = Cursors.WaitCursor
Try
Dim Ordner_Ziel = get_Dokumente_Ablage_Ordner(AblageID)
Dim fi_Quelle As New FileInfo(IO.Path.GetFileNameWithoutExtension( _
ofd.FileName))
Dim fi_Ziel As New FileInfo(IO.Path.Combine(Ordner_Ziel, _
IO.Path.GetFileNameWithoutExtension(ofd.FileName)))
If fi_Ziel.Exists Then
Dim Abfrage_Result As DialogResult = MessageBox.Show( _
String.Concat("Eine Datei mit diesem Namen ist bereits" & _
"vorhanden: ", fi_Ziel.Name, Environment.NewLine, "Die" & _
"vorhandene Datei überschreiben?"), _
"Sicherheits-Abfrage", _
MessageBoxButtons.YesNo, MessageBoxIcon.Question, _
MessageBoxDefaultButton.Button2)
If Abfrage_Result = System.Windows.Forms.DialogResult.No Then
Return False
ElseIf Abfrage_Result = System.Windows.Forms.DialogResult.Yes _
Then
_overwrite = True
End If
End If
'falls Ordner gelöscht wurde, Ordner erstellen
create_Dokumente_Ablage_Ordner(AblageID)
fi_Quelle.CopyTo(fi_Ziel.FullName, True)
Dim Dokument As AblageDB.AblagedokumenteRow
If _overwrite = True Then
'Datensatz suchen, der überschrieben werden soll
Dim DS = From Eintrag In BS_Ablagedokumente_Liste
Where Eintrag.Dokument.ToLower = fi_Ziel.Name.ToLower
Select Eintrag
If DS.Count = 0 Then Return False
Dim BSpos = BS_Ablagedokumente_Liste.ToList.IndexOf(DS.First)
Dokument = BS_Ablagedokumente_TypRow(BSpos)
Dokument.Dokument = fi_Ziel.Name
Else
'Speichern
Me.Validate()
BSAblagedokumente.EndEdit()
dict_BS_Pos.Clear()
dict_BS_Pos.Add(BSAblagedokumente, BSAblagedokumente.Position)
mod_Saver.SaveDataset(Me.AblageDB, dict_BS_Pos, _
AblagedokumenteTableAdapter.Adapter)
AblagedokumenteDataGridView.Refresh()
End If
'speichern beendet
Me.Cursor = Cursors.Default
Catch ex As Exception
MessageBox.Show(ex.Message.ToString)
End Try
End Function | |
Re: Dokument auswaehlen und speichern mit OpenFileDialog | | | Autor: effeff | Datum: 16.10.18 14:36 |
| Du lässt Dir die Dateinamen ohne Extension ausgeben und willst dann diese Angabe als Fullname nehmen?
ofd soll ein OpenFileDialog sein?
Du willst doch sicherlich nicht den Dateinamen ohne Extension haben, sondern den simplen Dateinamen ohne Pfad, oder? Also
Dim SimpleFileName As String=System.IO.Path.GetFileName(Dateiname) EALA FREYA FRESENA | |
Re: Dokument auswaehlen und speichern mit OpenFileDialog | | | Autor: ERBRU | Datum: 16.10.18 15:22 |
| Hallo und Danke,
ofd soll ein OpenFileDialog sein? Ja
Du willst doch sicherlich nicht den Dateinamen ohne Extension haben, sondern den simplen Dateinamen ohne Pfad, oder? Ja.
die Datei soll ja dann in den Ordner kopiert werden
ich muss nun schauen was ich mit deiner Zeile anfangen soll? (Dateiname) ?
damit es nun auch mal funktioniert. seit 4h kein Erfolg | |
Re: Dokument auswaehlen und speichern mit OpenFileDialog | | | Autor: effeff | Datum: 16.10.18 18:16 |
| Okay, damit das für Dich verständlicher wird:
Dim SimpleFileName As String=System.IO.Path.GetFileName(ofd.FileName) Und jetzt reicht es eigentlich schon, Quelle und Ziel als String zu deklarieren und mit "System.IO.File.Copy(Quelle, Ziel) zu kopieren:
Dim Quelldatei As String=ofd.FileName
Dim Zieldatei As String=System.IO.Path.Combine(Ordner_Ziel, SimpleFileName)
System.Io.File.Copy(Quelldatei, Zieldatei) EALA FREYA FRESENA | |
Re: Dokument auswaehlen und speichern mit OpenFileDialog | | | Autor: ERBRU | Datum: 16.10.18 20:28 |
| nee leider nicht, leerer Dateiname
vieleicht hat ManfredX eine Idee? | |
Re: Dokument auswaehlen und speichern mit OpenFileDialog | | | Autor: Kuno60 | Datum: 16.10.18 21:04 |
| Hallo ERBRU,
wieso hast du in der Funktion "Kopiere_Datei" ofd verwendet?
Du übergibst doch den Dateinamen per Argument und ofd ist doch nur in der Function OFD_Starten() deklariert.
Interessant ist auch, String in String umwandeln:
MessageBox.Show(ex.Message.ToString) Hab ich wieder was gelernt
So könnte es funktionieren:
Private Sub btn_Dokument_Hinzufügen_Click(sender As Object, e As EventArgs) _
Handles btn_Dokument_Hinzufügen.Click
Kopiere_Datei(OFD_Starten)
End Sub
'Datei auswählen
Private Function OFD_Starten() As String
Using ofd As New OpenFileDialog
With ofd
.InitialDirectory = Environment.CurrentDirectory
.Filter = "Alle Dateien| *.*"
.FileName = ""
.CheckFileExists = True
.CheckPathExists = True
If .ShowDialog() = DialogResult.OK Then
Return .FileName
End If
End With
End Using
Return Nothing
End Function
'Datei kopieren
Private Function Kopiere_Datei(FileName As String) As Boolean
If String.IsNullOrWhiteSpace(FileName) Then Return False
Dim _overwrite As Boolean = False
Dim AblageID = CInt(AblagedetailsIDTextBox.Text)
DokumentTextBox.Text = FileName
Me.Cursor = Cursors.WaitCursor
Try
Dim Ordner_Ziel = get_Dokumente_Ablage_Ordner(AblageID)
Dim fi_Quelle As New IO.FileInfo(FileName)
Dim fi_Ziel As New IO.FileInfo(IO.Path.Combine(Ordner_Ziel, _
fi_Quelle.Name))
If fi_Ziel.Exists Then
Dim Abfrage_Result As DialogResult = MessageBox.Show( _
String.Concat("Eine Datei mit diesem Namen ist bereits" & _
"vorhanden: ", fi_Ziel.Name, Environment.NewLine, "Die" & _
"vorhandene Datei überschreiben?"), _
"Sicherheits-Abfrage", _
MessageBoxButtons.YesNo, MessageBoxIcon.Question, _
MessageBoxDefaultButton.Button2)
If Abfrage_Result = System.Windows.Forms.DialogResult.No Then
Return False
ElseIf Abfrage_Result = System.Windows.Forms.DialogResult.Yes Then
_overwrite = True
End If
End If
'falls Ordner gelöscht wurde, Ordner erstellen
create_Dokumente_Ablage_Ordner(AblageID)
fi_Quelle.CopyTo(fi_Ziel.FullName, True)
'...
Me.Cursor = Cursors.Default
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Function
Beitrag wurde zuletzt am 16.10.18 um 21:08:43 editiert. | |
Re: Dokument auswaehlen und speichern mit OpenFileDialog | | | Autor: effeff | Datum: 17.10.18 10:27 |
| Himmelarschundzwirn...
WELCHER Dateiname ist leer? Lass Dir doch nicht alle Informationen einzeln aus der Nase ziehen sondern beschreibe einfach, wo zum Teufel Du Probleme hast!
Lass Dir doch per Messagebox z. B. Deine Variableninhalte ausgeben, damit Du genau beschreiben kannst, wo es hakt!
EALA FREYA FRESENA | |
Re: Dokument auswaehlen und speichern mit OpenFileDialog | | | Autor: ERBRU | Datum: 17.10.18 20:10 |
| Danke, ich melde mich spaeter noch mal
muss wirklich sauberer arbeiten.
im Prinzip funktioniert es ja, wie KUNO geschrieben hat
ich muss mal schauen warum er nichts in meine Tabelle schreibt. Speichert nicht mehr obwohl erst mal alles OK aussieht im Einzelschritt wird alles abgefahren, der Datensatz wird jedoch nicht hinzugefšgt-
wie gesagt ich melde mich ausfšhrlicher dazu, muss man doch hinkriegen.
Danke | |
Re: Dokument auswaehlen und speichern mit OpenFileDialog | | | Autor: Franki | Datum: 18.10.18 01:15 |
| Hallo Kuno,
natürlich ist das richtig was du da beschreibst.
Ich hatte das aber so verstanden, dass letztendlich nichts im Dateisystem gespeichert werden kann wegen des ungültigen Pfads. Dass dieser aus Dateiname in der DB und sonstigen Informationen zusammengebaut wird habe ich wohl überlesen.
Aber deswegen ja mein Hinweis sich alles per z.B. Messagebox Schritt für Schritt ausgeben zu lassen.
Und ganz wichtig ist auch eine Fehlerbehandlung bzw. diese auszuwerten. Denn der Speichervorgang kann trotz physikalisch (zusammengebautem) Pfad daran scheitern, dass keine Schreibberechtigung vorhanden ist, nicht genügend Platz auf dem Datentraeger vorhanden ist usw. usw.
Ich würde das Problem versuchen darauf zu reduzieren, ob es am DB Teil liegt oder am Speichervorgang selbst.
Gruß
Frank | |
Re: Dokument auswaehlen und speichern mit OpenFileDialog | | | Autor: ERBRU | Datum: 18.10.18 18:43 |
| erst mal soweit passt es nun endlich, auch wird gespeichert dort lag das Problem.
genaueres spćter, da muss noch etwas optimiert werden.
PS habe alles noch mal gemacht die Form fšr die Dokumente schritt fšr schritt. So bin ich auf das "Speicher Problem" gesto'en | |
Re: Dokument auswaehlen und speichern mit OpenFileDialog | | | Autor: Franki | Datum: 19.10.18 01:32 |
| Hallo,
da sieht man mal wieder wie gut akriebische Analyse Schritt für Schritt zur Lösung führen kann.
So etwas ist aber eigentlich grundlegendes Handwerkszeug eines Programmierers, egal ob als Hoppy oder gewerblich.
Es wäre schön, wenn du Feedback geben würdest was zur Problemlösung letztendlich gefürht hat und wie du auf die Lösung gekommen bist. Das würde mit Sicherheit auch anderen Lesern hier helfen.
Gruß
Frank | |
Re: Dokument auswaehlen und speichern mit OpenFileDialog | | | Autor: ERBRU | Datum: 19.10.18 06:24 |
| Na Ja, die Lösung bei mir war eben die Bindingsource die ich bedingt durch die 2Form nicht speichern konnte erst wenn ich die geschlossen habe wurde der Datensatz hinzugefügt, geändert. das Dokument wurde schon vor dem Datensatz Zugriff gespeichert, danach habe ich ein Dialog Result OK gesetzt 2Form geschlossen und alles Gut.
Nachteil dabei ist das man die Form erneut aufrufen muss um weitere Dokumente zu speichern
aber ich weiß nicht ob das wirklich die Lösung ist. Funktioniert nur für neues Dokument Überschreiben eines vorhandenen Dokuments will noch nicht funktionieren, das sollte man prüfen sonst legt man zu jedem Vorgang die gleichen Dokumente ab.den Code dazu habe ich weiter unten mal angehängt.Evtl. muss ich in dem Fall auch ein Dialog Result OK geben? Form schließen.
'2Form aufrufen
Using frm As New frmAblagedokumente
With frm
.BSAblagedokumente.DataSource = AblageDB
.IDDatarowAblagedetail.Text = CInt( _
BS_Ablagedetails_TypRow.ID).ToString
.tbVorgangDatarow_Ablagedetails.Text = Convert.ToString( _
BS_Ablagedetails_TypRow.Vorgang)
.tberfasstamDatarow_Ablagedetails.Text = Convert.ToDateTime( _
BS_Ablagedetails_TypRow.Erfasstam).ToShortDateString
.ShowInTaskbar = True
.BringToFront()
.TopMost = False ' True
.ShowDialog(Me)
If .DialogResult = Windows.Forms.DialogResult.OK Then
Me.Cursor = Cursors.WaitCursor
Update_Abfrage(Tabellenname.Ablagedokumente)
'speichern
Me.Validate()
BSAblagedokumente.EndEdit()
dict_BS_Pos.Clear()
dict_BS_Pos.Add(BSAblagedokumente, _
BSAblagedokumente.Position)
mod_Saver.SaveDataset(Me.AblageDB, dict_BS_Pos, _
AblagedokumenteTableAdapter.Adapter)
Me.Cursor = Cursors.Default
MessageBox.Show("Speicher Vorgang abgeschlossen", "Speicher" & _
"Vorgang", MessageBoxButtons.OK, _
MessageBoxIcon.Information)
Me.Show()
End If
End With
End Using 'Überschreiben wenn Dokument vorhanden
'falls Ordner gelöscht wurde, Ordner erstellen
create_Dokumente_Ablage_Ordner(AblageID)
fi_Quelle.CopyTo(fi_Ziel.FullName, True)
Dim Dokument As AblageDB.AblagedokumenteRow
If _overwrite = True Then
'Datensatz suchen, der überschrieben werden soll
Dim DS = From Eintrag In BSAblagedokumente_Liste
Where Eintrag.Dokument.ToLower = fi_Ziel.Name.ToLower
Select Eintrag
If DS.Count = 0 Then Return False
Dim BSpos = BSAblagedokumente_Liste.ToList.IndexOf(DS.First)
Dokument = BSAblagedokumente_TypRow(BSpos) 'hier geht es dann
' nicht weiter
Dokument.Dokument = fi_Ziel.Name
Else
BSAblagedokumente.AddNew() | |
Re: Dokument auswaehlen und speichern mit OpenFileDialog | | | Autor: Franki | Datum: 20.10.18 01:28 |
| Hallo,
grundsätzlich ist es notwendig dem eigenene Programm auch die Zeit zu geben die es braucht um Befehle zu verarbeiten wenn man eine Rückmeldung erhalten möchte ob das geklappt hat oder nicht. Oft ist es so, dass der Programmcode schneller abgearbeitet wird als Windows / eine Datenbank usw. das macht.#
Ich kann dir bei dem konkreten Problem zwar nicht helfen, abre ich spreche aus Erfahrung:
Immer prüfen, immer warten, immer kontrollieren. Nur wenn alles erledigt ist, dann weiter im Programmcode.
Das theoretzische Ergebnis weicht oft vom realen Ergebnis ab. Das war immer schon so wenm es sich um Datenbanken, Netzwerkverbindungen, Ergebnissse vom Webserver, Abarbeitungen von serverseitigen Scripts usw. handelt. DAs wird auch immer so sein. Ganz zu schweigen von Download / Uplaoad Features der eigenen Software.
Wenn die Dauer kalkulierbar ist dann eine Warteschleife, bzw. angemessenen Zeitraum verwenden. Ansonsten Rückmeldungen / Fehlermeldungen auswerten wenn sie eintreffen.
Gruß
Frank | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats März 2024 Dieter OtterUTF-8 Konvertierung von Dateien und StringsVB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. sevZIP40 Pro DLL
Zippen und Unzippen wie die Profis!
Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Weitere Infos
|