PDA

Vollständige Version anzeigen : Textdatei in tab einlesen (aktualisieren)


Erich290607
26.04.2011, 11:30
Hallo zusammen,

in meine DB lese ich eine Textdatei täglich ein.
Zuerst lösche ich alle Daten in der Tab und dann den kompletten Text der Datei in die entsprechenden Felder. Dabei ist meine ID mittlerweile auf 11016670 angestiegen, ist sicher auch kein Problem.
jetzt würde ich gerne die Textdatei nur mit den aktuellsten Daten anfügen
die ich jeden morgen beim öffnen der Anwendung automatisch aktualisieren lassen, sind aktuelle Daten in der Textdatei dann anfügen sonst Daten sind aktuell.

derzeit mache ich es so:
CurrentDb.Execute "Delete * From tblStoerungen" ' Tabelle leeren
DoCmd.TransferText acImportDelim, "ImportSB", _
"tblStoerungen", _
"D:\Schichtbuch\SB_Daten.txt", True über die Spezifikation halt

wie kann ich das anpassen, das nur der aktuelle Teil eingelesen bzw. angehängt wird.

dh. dies ist in der Tab (txt Datei) der letzte Eintrag
03.01.2007;06:00;1;6;15;148;4;5;1;8;1;Anforderung Referenzfahrt nach NIO;Referenzfahrt durchgeführt
morgen früh würden neue Daten drin stehen die jetzt angehängt werden müssten.

siehe Textdatei.

Arne Dieckmann
26.04.2011, 13:32
Definiere zunächst "aktuelle" Daten. Denkbar unter anderem sind:

a.) Sind das die Textzeilen mit Datumswert vom vorherigen Arbeitstag?
b.) Ist das immer eine bestimmte Zeilenanzahl?
c.) Ist es wirklich nur die letzte Zeile aus der Textdatei?

Ein Ansatz wäre:
- bei a.) und b.) weiterhin mit TransferText in eine temporäre Tabelle zu importieren und auf diese Tabelle eine Selektion durchzuführen, die wiederum angefügt wird. Oder per TransferText die Textdatei verknüpfen ...
- bei c.) Textdatei per Open öffnen, bis zur letzten Zeile wandern und dann die Zeile einlesen.

Erich290607
26.04.2011, 14:57
Hallo Arne,

Danke für deine Antwort.


a.) Sind das die Textzeilen mit Datumswert vom vorherigen Arbeitstag?
b.) Ist das immer eine bestimmte Zeilenanzahl?
c.) Ist es wirklich nur die letzte Zeile aus der Textdatei?


a.) ja, Textzeile mit Datumswert vom vorherigen Arbeitstag

dh. am 04.01.2007 bekomme ich die Daten vom 03.01.2007
es kann aber auch sein das die Daten erst später eingelesen werden
aufgrund von Urlaub / oder Krank
b.) Nein die Anzahl richtet sich nach den Ereignissen die da eingetragen
wurden, dh. es können 1- ? Zeilen sein
c.) Nein ich bekomme die Daten täglich und daher ist es nicht nur die letzte
Zeile, es kommt drauf an wieviele Ereignisse eingetragen wurden.

wie gehe ich da vor, evtl. ein Bsp. ? mit dem man experementieren könnte
und was passiert wenn User 2 sich gerade anmeldet? und durch User 1 die Daten (txt) einliest zwecks aktuellen Stand der DB

z.Z. ist es so das die Daten weg sind, und man Bspw. keine Auswertung mit Daten starten könnte.

wb_3001
26.04.2011, 15:30
Hallo Erich.
Der Vorschlag von Arne
--------
- bei a.) und b.) weiterhin mit TransferText in eine temporäre Tabelle zu importieren und auf diese Tabelle eine Selektion durchzuführen, die wiederum angefügt wird.
--------
ist höchst empfehlenswert. Du solltest ihn berücksichtigen.

Nícht ganz verstehe ich
-----------
und was passiert wenn User 2 sich gerade anmeldet? und durch User 1 die Daten (txt) einliest zwecks aktuellen Stand der DB
-----------
Handelt es sich bei der DB um eine FE-BE-Lösung? Wenn nicht dann schau unter http://www.donkarl.com?FAQ1.35.
Gibt es je User so eine Textdatei?
Sind darin die Userdaten enthalten?
Sind diese Userdaten in der empfangende Tabelle enthalten?

Ev. wäre es nötig, das Datenmodell der DB zu überdenken.

Was die ID betrifft gibt es eine Möglichkeit, diese ID zurückzusetzen. Ist allerdings nur sinnvoll, wenn diese ID nicht in einer anderen Tabelle verwendet wird. Wenn nicht dann schau unter http://www.donkarl.com?FAQ3.2.
Wolfgang

Erich290607
26.04.2011, 19:30
hallo und danke,


Handelt es sich bei der DB um eine FE-BE-Lösung?
Ja
Gibt es je User so eine Textdatei?
Nein
Sind darin die Userdaten enthalten?
Nein
Sind diese Userdaten in der empfangende Tabelle enthalten?
Nein

ebs17
26.04.2011, 21:02
Dabei ist meine ID mittlerweile auf 11016670 angestiegen, ist sicher auch kein Problem.
Der Wertebereich für Longzahlen reicht bis etwa 2,14 Mrd., da hast Du mit Deinen 11 Mio. noch etwas Luft.
dh. am 04.01.2007 bekomme ich die Daten vom 03.01.2007
es kann aber auch sein das die Daten erst später eingelesen werden
Das hieße für mich:
1) Ermittle in der Tabelle tblStoerungen den höchsten Datums-/Uhrzeitwert
2) Jetzt kann man aus der Texttabelle in die Zieltabelle alle Datensätze per Anfügeabfrage übertragen, wo Datums-/Uhrzeitwert größer als der eben ermittelte ist.
und was passiert wenn User 2 sich gerade anmeldet? und durch User 1 die Daten (txt) einliest zwecks aktuellen Stand der DB
Was soll da passieren? Eine Anfügeabfrage über +/- 30 Datensätze geht rasend schnell, garantiert schneller als die Eingabe eines Passwortes.
z.Z. ist es so das die Daten weg sind, und man Bspw. keine Auswertung mit Daten starten könnte
Da würde ich demjenigen auf die Finger klopfen, der die Daten wegnimmt - oder dem Entwickler, der das zulässt oder gar unterstützt.

Erich290607
27.04.2011, 07:48
Hallo Eberhard,

schön das du dich hier einklinkst, ich komme leider nur bis


1) Ermittle in der Tabelle tblStoerungen den höchsten Datums-/Uhrzeitwert
DMax("StörDatum", "tblStoerungen "),
2) Jetzt kann man aus der Texttabelle in die Zieltabelle alle Datensätze per Anfügeabfrage übertragen, wo Datums-/Uhrzeitwert größer als der eben ermittelte ist.


du kannst dir sicher denken, das ich den Punkt 2 noch nicht verstanden habe wie das denn nun geht?

Micha_DU
27.04.2011, 08:46
für die passende SQL ist der Abfrageeditor ganz hilfreich... hier die Anfügeabfrage erstellen, anschließend die SQL angucken. Mit ein bißchen Nachbearbeitung läßt die sich in der Regel ohne Probleme mit currentdb.execute einsetzen.

Erich290607
27.04.2011, 08:57
Ja, nur Eberhard schreibt

'aus der Texttabelle in die Zieltabelle alle Datensätze per Anfügeabfrage übertragen, wo Datums-/Uhrzeitwert größer als der eben ermittelte ist'

wenn ich also per Abfrage das höchste Datum ermittelt habe, und dann über Insert Into in tblStörung die Datensätze schreibe die > sind als das höchste Datum, ist nicht das Problem meine Frage ging dahin wie aus der Texttabelle

ebs17
27.04.2011, 09:04
Punkt 2 noch nicht verstanden
- Zieltabelle (tblStoerungen) hast Du. Nicht wahr?
- Mit Anfügeabfrage (INSERT INTO ...) kannst Du etwas anfangen?

Jetzt muss man sich nur noch die Textdatei (Texttabelle) gefügig machen, um sie als Quelltabelle für die Anfügeabfrage zu nutzen. Das gelingt über mehrere Wege:
-> Importieren der Textdatei (TransferText acImportDelim): Das ist ungünstig, weil man temporäre Daten erzeugt (Begünstigung Datenbankaufblähen)
-> Textdatei verknüpfen (TransferText acLinkDelim)
-> Textdatei in SQL-Anweisung inkl. der Verbindungsdaten erfassen, etwa so
SELECT *
FROM [Text;DSN=NameDerSpezifikation;FMT=Delimited;HDR=yes;IMEX=2;CharacterSet=850;DATA BASE=C:\temp\].datei01.txt
Diese Tabelle wäre jetzt noch zu filtern nach Datensätzen mit Stördatum >= dem ermittelten Max-Stördatum aus der Zieltabelle.

Damit hättest Du Quelle, Ziel, Weg und Filter.

Wie Du siehst, liefere ich kein Beispiel oder einen Code, mit dem "herumexperimentiert" werden kann. Wesentlicher finde ich es, dass man seine Aufgabe versteht (und beschreiben kann), diese in Teilaufgaben zerlegt, für diese Teilaufgaben Lösungen findet und das Ganze dann sinnig zusammensetzt.

Bezüglich automatisiertem Import gibt es selbstverständlich auch schon etliche Themen, zuletzt z.B. diesen: Acc2003 - TXT-Datei automatisiert importieren
Daraus kannst Du Dir zusätzliche Elemente entnehmen (Elemente, nicht großflächig kopieren).

Erich290607
27.04.2011, 09:19
Hallo Eberhard,

Danke, da kann ich etwas mit anfangen.

werde mich da heute abend mal dransetzen und probieren bis es so funktioniert wie ich es mir vorstelle.

Danke!

Erich290607
28.04.2011, 08:22
Frage, warum bekomme ich hier 'D:\Schichtbuch\' ist kein zulässiger Pfad

SELECT * FROM [Text;DSN=strEreigniss;FMT=Delimited;HDR=yes;IMEX=2; CharacterSet=850;DATABASE= D:\Schichtbuch\].SB_Daten.txt WHERE Daten.StoerZeitM > 0


mein kompletter Versuch, eine Textdatei anzufügen


'Datenfelder (1 Zeile) Textdatei -----------------------------
'StörDatum;
'Eintragszeit;
'SchichtartID_F;
'Halle;
'MaschinenID_F;
'Arbeitsfolge;
'BereichID_F;
'StoerZeitM;
'Häufigkeit;
'MitarbeiterID_F;
'DS_ID;
'Stoergrund;
'BemerkungMaßnahme
'--------------------------------------------------------------
Dim strSQL As String, dbs As DAO.Database, rst As DAO.Recordset
Dim strsq As String
Dim tmp As Long
Dim IngTmp As Long
Dim db As DAO.Database
Set db = CurrentDb
Dim sPfad As String 'Pfadangabe Textdatei
Dim strEreigniss As String 'Spezifikationsname

sPfad = "D:\Schichtbuch\"
strEreigniss = ""

'Daten aus Textdatei anfügen ----------------------------------
strSQL = "SELECT * " & _
" FROM [Text;DSN=strEreigniss;FMT=Delimited;HDR=yes;IMEX=2;CharacterSet=850;DATABASE= D:\Schichtbuch\].SB_Daten.txt"

'//
'strSQL = "SELECT Daten.StörDatum, Daten.StoerZeitM, Daten.Stoergrund, * " & _
"FROM tblStoerungen AS Daten "


'---------------------------------------------
'Kriterium setzen für das --------
'wegschreiben in tblTEMP --------
'---------------------------------------------

'strSQL = strSQL & " WHERE Daten.StoerZeitM > 0"

'//ArtMeldebestand AND BestAnforderung= 0"

Debug.Print strSQL

Set rst = CurrentDb.OpenRecordset(strSQL)



Do Until rst.EOF = True

'---------------------------------------------
'Die so ausgewählten Daten ---
'in tblTEMP wegschreiben, ---
'dort werden die Daten weiterverarbeitet ---
'---------------------------------------------


db.Execute "INSERT INTO tblTEMP (Tag, Fehlzeit, Ereigniss)" & _
" VALUES(" & "'" & rst("StörDatum") & "'" & _
", " & rst("StoerZeitM") & _
", '" & Nz(rst("Stoergrund"), Null) & "')"




rst.MoveNext

Debug.Print rst!Stoergrund
Loop

rst.Close
Set rst = Nothing

Josef P.
28.04.2011, 08:26
Frage, warum bekomme ich hier 'D:\Schichtbuch\' ist kein zulässiger Pfad
Falls diese Meldung kommt, wird das Verzeichnis nicht vorhanden sein.
Falls ' D:\Schichtbuch\' ist kein zulässiger Pfad kommt, ist das Leerzeichen bei <code>...DATABASE= D:\Schichtbuch\]</code> nicht richtig.

mfg
Josef

Erich290607
28.04.2011, 09:30
Danke Josef,

doch hakt es bei mir noch mit der Insert Into 'Anweisung'
Daten werden in tblTEMP geschrieben (nachher soll es ja die tblStoerung sein)

'Daten aus Textdatei anfügen ----------------------------------
strSQL = "SELECT * " & _
" FROM [Text;DSN=txtDaten;FMT=Delimited;HDR=yes;IMEX=2;CharacterSet=850;DATABASE=D:\Schi chtbuch\].SB_Daten.txt " & _
" WHERE StoerZeitM > 0 "



Debug.Print strSQL

Set rst = CurrentDb.OpenRecordset(strSQL)

Do Until rst.EOF = True

'---------------------------------------------
'Die so ausgewählten Daten ---
'in tblTEMP wegschreiben, ---
'dort werden die Daten weiterverarbeitet ---
'---------------------------------------------


db.Execute "INSERT INTO tblTEMP (Tag, Fehlzeit, Ereigniss)" & _
" VALUES(" & "'" & rst("StörDatum") & "'" & _
", " & rst("StoerZeitM") & _
", '" & rst("Stoergrund") & "')"




rst.MoveNext

Loop

rst.Close
Set rst = Nothing


hier gibt es Probleme mit Bspw. wenn User so "Störung Ini's Nabengreifer"in die Tabelle schreibt kommt bei mir Syntaxfehler (fehlender Operator) in Abfrageausdruck "Störung Ini's Nabengreifer"

", '" & rst("Stoergrund") & "')"

Josef P.
28.04.2011, 09:35
Hallo!
hier gibt es Probleme mit Bspw. wenn User so "Störung Ini's Nabengreifer"in die Tabelle schreibt kommt bei mir Syntaxfehler (fehlender Operator) in Abfrageausdruck "Störung Ini's Nabengreifer"
Wenn du dir die fertige SQL-Anweisung ansiehst, solltest du den Fehler erkennen. Was man machen muss, wenn in der zusammengesetzten SQL-Anweisung Text durch ' begrenzt ist und im angefügten Text noch einmal ein ' vorkommen kann, hast du bestimmt schon x-Mal in diesem Forum gelesen.

mfg
Josef

Erich290607
28.04.2011, 10:58
Hallo Josef,

Danke, hattest recht hatte mir den Code noch mals angeschaut. Mittlerweile
bin ich soweit denke ich, er liest die Textdatei aus. Nur bei jedem Click
fügt er mir 4 Datensätze an.

Ist mein Code noch nicht soweit für das Original? was muss noch zur Sicherheit passieren?


Sub test()
'--------------------------------------------------------------
Dim strSQL As String, dbs As DAO.Database, rst As DAO.Recordset
Dim strsq As String
Dim tmp As Long
Dim IngTmp As Long
Dim db As DAO.Database
Set db = CurrentDb
Dim sPfad As String 'Pfadangabe Textdatei
Dim strTag As String

strTag = DMax("StörDatum", "tblStoerungen")

sPfad = "D:\Schichtbuch\"


'Daten aus Textdatei anfügen ----------------------------------
strSQL = "SELECT * " & _
" FROM [Text;DSN=txtDaten;FMT=Delimited;HDR=yes;IMEX=2;CharacterSet=850;DATABASE=D:\Schi chtbuch\].SB_Daten.txt " & _
" WHERE StörDatum >=" & fcDatSQL(strTag)



Debug.Print strSQL
Debug.Print strTag

Set rst = CurrentDb.OpenRecordset(strSQL)

Do Until rst.EOF = True

'---------------------------------------------
'Die so ausgewählten Daten ---
'in tblTEMP wegschreiben, ---
'dort werden die Daten weiterverarbeitet ---
'---------------------------------------------
'StörDatum; ---------------- 1
'Eintragszeit; ---------------- 2
'SchichtartID_F; ---------------- 3
'Halle; ---------------- 4
'MaschinenID_F; ---------------- 5
'Arbeitsfolge; ---------------- 6
'BereichID_F; ---------------- 7
'StoerZeitM; ---------------- 8
'Häufigkeit; ---------------- 9
'MitarbeiterID_F; ---------------- 10
'DS_ID; ---------------- 11
'Stoergrund; ---------------- 12
'BemerkungMaßnahme ---------------- 13
'---------------------------------------------
db.Execute "INSERT INTO tblStoerungen (StörDatum, Eintragszeit, SchichtartID_F, MStandort, MaschinenID_F, ArbeitsfolgeID_F, BereichID_F, StoerZeitM, Häufigkeit, MitarbeiterID_F, DS_ID, Stoergrund, BemerkungMaßnahme) " & _
" VALUES(" & "'" & rst("StörDatum") & "'" & _
", '" & Nz(rst("Eintragszeit"), "") & "'" & _
", " & Nz(rst("SchichtartID_F"), 0) & _
", " & Nz(rst("Halle"), 0) & _
", " & Nz(rst("MaschinenID_F"), 0) & _
", " & Nz(rst("Arbeitsfolge"), 0) & _
", " & Nz(rst("BereichID_F"), 0) & _
", " & Nz(rst("StoerZeitM"), 0) & _
", " & Nz(rst("Häufigkeit"), 0) & _
", " & Nz(rst("MitarbeiterID_F"), 0) & _
", " & Nz(rst("DS_ID"), 0) & _
", '" & Nz(rst("Stoergrund"), "") & "'" & _
", '" & Nz(rst("BemerkungMaßnahme"), "") & "'" & ")"

rst.MoveNext

Loop

rst.Close
Set rst = Nothing

Josef P.
28.04.2011, 11:27
Hallo!

hatte mir den Code noch mals angeschaut.
Die Problemumgehung bei ' im angefügten Text (z. B. über <code>Nz(rst("BemerkungMaßnahme"), "")</code>) sehe ich aber trotzdem nicht im neuen Code.

mfg
Josef

Erich290607
28.04.2011, 12:05
doch, habe ich gemacht

'" & Nz(rst("BemerkungMaßnahme"), "") & "'"


PS wie kann ich das automatisieren, bzw. prüfen das die Daten bereits aktuell sind und die Datensätze nicht doppelt eingelesen werden?

wenn ich die txt Datei heute bekomme, sollen die aktuellen Daten > Max Datum tblStoerungen angefügt werden

Arne Dieckmann
28.04.2011, 17:02
sollen die aktuellen Daten > Max Datum tblStoerungen angefügt werden
Dann frage hier:
" WHERE StörDatum >=" & fcDatSQL(strTag)
anders ab.

Erich290607
28.04.2011, 18:18
Hallo Arne,

Danke, habe schon wieder ein neues Problem, was in meiner Test DB funktioniert
funktioniert nun in der BE Version nicht mehr?

keine Meldung

Arne Dieckmann
28.04.2011, 19:41
Dann spekuliere ich mal:
Falls Schlüsselverletzungen o.ä. bei db.execute autreten, wirst du das so nicht herausbekommen - dafür gibt es den Parameter dbFailOnError
Ansonsten empfehle ich Debug.Print, um herauszufinden, warum keine Inserts vorgenommen werden.

Micha_DU
28.04.2011, 19:42
was in meiner Test DB funktioniert
funktioniert nun in der BE Version nicht mehr?

und was funktioniert da nicht? Was ist deine BE Version?

Erich290607
29.04.2011, 05:33
Hallo Micha,

Nein an der version lag es nicht.

Arne, hatte schon richtig erkannt bzw. getippt.

Schlüsselverletzungen waren die Ursache, bzw. falsche Elemente in Insert Into
Anweisung, mit On Error hatte ich die Meldung blockiert.

Danke euch!

Frage:

ist nun der Code Sauber, wie wenn keine Daten vorhanden sind dh. die DB als leer weitergegeben wird?

'--------------------------------------------------------------
Dim strSQL As String, dbs As DAO.Database, rst As DAO.Recordset
Dim db As DAO.Database
Dim strTag As String
Dim SB_Importieren As String
SB_Importieren = "ImportSB"
Dim strStoergrund As String
Dim strBemerkung As String

'Datum der letzten Aktualisierung ermitteln
strTag = DMax("StörDatum", "tblStoerungen")
'Frage Datentabelle aktualisieren
If MsgBox("Heute ist der: " & Date & vbCrLf & _
"---------------" & vbCrLf & _
"letzte Aktualisierung am: " & strTag & vbCrLf & _
"Datenbank aktualisieren ", vbQuestion + vbYesNo, "Datenbank") = vbYes Then

'Daten aus Textdatei anfügen ----------------------------------
strSQL = "SELECT *" & _
" FROM [Text;DSN=ImportSB;FMT=Delimited;HDR=yes;IMEX=2;CharacterSet=850;DATABASE=D:\100_ Projekte\SB_TPM\].SB_Daten.txt " & _
" WHERE StörDatum >" & fcDatSQL(strTag)

Set rst = CurrentDb.OpenRecordset(strSQL)
Set db = CurrentDb

Do Until rst.EOF = True

'On Error Resume Next
strStoergrund = Nz(rst!stoergrund, Null)
strBemerkung = Nz(rst!BemerkungMaßnahme, Null)

db.Execute "INSERT INTO tblStoerungen (StörDatum, Eintragszeit, SchichtartID_F, MStandort, MaschinenID_F, ArbeitsfolgeID_F, BereichID_F, StoerZeitM, Häufigkeit, MitarbeiterID_F, DS_ID, Stoergrund, BemerkungMaßnahme) " & _
" VALUES(" & "'" & rst("StörDatum") & "'" & _
", '" & Nz(rst("Eintragszeit"), "") & "'" & _
", " & Nz(rst("SchichtartID_F"), 0) & _
", " & Nz(rst("MStandort"), 0) & _
", " & Nz(rst("MaschinenID_F"), 0) & _
", " & Nz(rst("ArbeitsfolgeID_F"), 0) & _
", " & Nz(rst("BereichID_F"), 0) & _
", " & Nz(rst("StoerZeitM"), 0) & _
", " & Nz(rst("Häufigkeit"), 0) & _
", " & Nz(rst("MitarbeiterID_F"), 0) & _
", " & Nz(rst("DS_ID"), 0) & _
", '" & Nz(strStoergrund, Null) & "'" & _
", '" & Nz(strBemerkung, Null) & "'" & ")"


Debug.Print rst!StörDatum & " ]" & strStoergrund & "/" & strBemerkung

rst.MoveNext

Loop

rst.Close
Set rst = Nothing



Else

MsgBox "Datenbank wurde am " & " :" & strTag & "", vbInformation, "TPM-Schichtbuch"

End If

Toast78
29.04.2011, 06:00
Da fehlt ein dbFailOnError bei der Execute-Anweisung. Und wenn mich nicht alles täuscht ist ö unter SQL ein Sonderzeichen. Insofern sollte StörDatum beim db.Execute in eckige Klammern "[]" eingeschlossen werden.

Micha_DU
29.04.2011, 06:02
@Erich:
Macht der Code das was er soll? Wenn ja, scheint doch alles in Ordnung zu sein. Über die Weitergabe der DB kannst doch nur du allein entscheiden... zumal ja nicht nur der gezeigte Code hier enthalten sein wird.

Scorefun
29.04.2011, 08:23
das hier dürfte auch irgendwann schief gehen...

dim strStoergrund as string
...
...
strStoergrund = Nz(rst!stoergrund, Null)

ebs17
29.04.2011, 08:43
Kleine Anmerkung (bezugnehmend auf #10): Mit Anfügeabfrage von einer Tabelle auf eine andere meinte ich nicht, die Quelltabelle erst in ein Recordset zu stecken und dann die Datensätze einzeln in die Zieltabelle zu schieben, sondern schon einen direkteren Weg.
Im konkreten Fall ist es vermutlich wegen der unerheblichen Datenmenge egal, in manchen anderen Fällen dann vielleicht nicht (Performance, viel Code - viele Möglichkeiten, Fehler einzubauen).

Toast78
29.04.2011, 08:59
das hier dürfte auch irgendwann schief gehen...
dim strStoergrund as string
...
...
strStoergrund = Nz(rst!stoergrund, Null)Uuuh! Nz-Funktion ad absurdum. :D Das hab ich auch noch nicht gesehen.

ebs17
29.04.2011, 09:03
Nz(rst!stoergrund, Null)
Ein Beispiel, wie man mit (viel) Aufwand nichts bewirken kann.

Josef P.
29.04.2011, 09:15
Hallo!

Möglicherweise liegt das Problem immer noch an
hier gibt es Probleme mit Bspw. wenn User so "Störung Ini's Nabengreifer"in die Tabelle schreibt kommt bei mir Syntaxfehler (fehlender Operator) in Abfrageausdruck "Störung Ini's Nabengreifer"

doch, habe ich gemacht
'" & Nz(rst("BemerkungMaßnahme"), "") & "'"

Das Problem lässt sich nämlich mit Nz nicht beheben.


Zum Ausprobieren:
dim strSQL as string
const TextWert as string = "Das is' ein Text"

strSQL = "insert into TestTabelle (Textfeld) Values ('" & TextWert & "')"
debug.Print strSQL
=>
insert into TestTabelle (Textfeld) Values ('Das is' ein Text')

Die SQL-Anweisung muss aber so aussehen:
insert into TestTabelle (Textfeld) Values ('Das is'' ein Text')

mfg
Josef

ebs17
29.04.2011, 09:32
... und zum weiteren Ausprobieren:
insert into TestTabelle (Textfeld) select Textfeld from QuellTabelle
Hier tritt das Hochkomma-Problem erst gar nicht auf.

Erich290607
29.04.2011, 10:47
Hallo zusammen,

Danke euch für die Hilfen und Hinweise zu dem Code, aber habe doch noch eine Bitte wer schreibt mir die Insert Into so um das es passen muss und ich keine Überraschungen damit bekomme.

habe es noch nicht ganz kapiert was ihr mir da sagen wollt.

db.Execute "INSERT INTO tblStoerungen (StörDatum, Eintragszeit, SchichtartID_F, " & _
"MStandort, MaschinenID_F, ArbeitsfolgeID_F, BereichID_F, " & _
"StoerZeitM, Häufigkeit, MitarbeiterID_F, DS_ID, Stoergrund, BemerkungMaßnahme) " & _
" VALUES(" & "'" & rst("StörDatum") & "'" & _
", '" & Nz(rst("Eintragszeit"), "") & "'" & _
", " & Nz(rst("SchichtartID_F"), 0) & _
", " & Nz(rst("MStandort"), 0) & _
", " & Nz(rst("MaschinenID_F"), 0) & _
", " & Nz(rst("ArbeitsfolgeID_F"), 0) & _
", " & Nz(rst("BereichID_F"), 0) & _
", " & Nz(rst("StoerZeitM"), 0) & _
", " & Nz(rst("Häufigkeit"), 0) & _
", " & Nz(rst("MitarbeiterID_F"), 0) & _
", " & Nz(rst("DS_ID"), 0) & _
", '" & Nz(strStoergrund, Null) & "'" & _
", '" & Nz(strBemerkung, Null) & "'" & ")"

Micha_DU
29.04.2011, 10:57
aus meiner Online-Hilfe zu NZ:
Sie können diese Funktion z. B. verwenden, um einen Wert Null in einen anderen Wert umzuwandeln und so zu verhindern, dass der Wert durch einen Ausdruck verbreitet wird.

Falls der Wert des Arguments Variant gleich Null ist, gibt die Nz-Funktion die Zahl Null oder eine leere Zeichenfolge zurück (gibt immer eine leere Zeichenfolge zurück, wenn sie in einem Abfrageausdruck verwendet wird), je nachdem, ob der Kontext anzeigt, dass der Wert eine Zahl oder eine Zeichenfolge sein soll. Wenn das optionale Argument WertWennNull angegeben ist, gibt die Nz-Funktion den durch dieses Argument festgelegten Wert zurück, wenn das Argument Variant den Wert Null hat. Bei Verwendung in einem Abfrageausdruck sollte die Nz-Funktion immer das Argument WertWennNull verwenden.

Wenn der Wert von Variant ungleich Null ist, gibt die Nz-Funktion den Wert von Variant zurück.

Die Nz-Funktion ist für Ausdrücke sinnvoll, die Werte Null enthalten können. Damit ein Ausdruck einen Wert liefert, der ungleich Null ist, auch wenn er einen Wert Null enthält, verwenden Sie die Nz-Funktion, um eine 0, eine leere Zeichenfolge oder einen benutzerdefinierten Rückgabewert zurückzugeben.



warum willst du NULL mit NULL ersetzen? Welchen Sinn macht das? Darauf ist nicht nur einmal hingewiesen worden...
Du solltest schon in der Lage sein, deine eigene Programmierung entsprechend anzupassen... es sei denn du hast es wirklich nicht verstanden.

Josef P.
29.04.2011, 11:02
@Micha:
<code>Nz(irgendwas, NULL)</code> ist zwar umsonst, spielt aber in diesem Fall keine Rolle, weil der Text per & verknüpft wird, was NULL implizit zu einem Leerstring konvertiert.
<code>x = ", '" & Nz(strStoergrund, Null) & "'"</code> ergibt, wenn strStoergrund NULL wäre:<code>", ''"</code>
Wobei strStoergrund möglicherweise gar nicht NULL sein kann, falls "str" auf eine Stringvariable hindeutet.

mfg
Josef

ebs17
29.04.2011, 11:15
habe es noch nicht ganz kapiert was ihr mir da sagen wollt
Meine Aussage/Frage wäre: Was hältst Du für sinnvoller, wenn Du eine Kiste Bier im Getränkestützpunkt kaufst und per Auto nach Hause bringen willst?
a) Die ganze Kiste ins Auto packen.
b) Die Flaschen einzeln (jede für sich) transportieren.
Wer Bandscheibenprobleme hat, kann die Aufgabenstellung auf eine Tüte Bonbons oder eine Tüte Mehl abwandeln.
(Antwort nicht vergessen!)
Für die Variante b) hast Du Dich derzeit entschieden.
Variante a) sieht etwa so aus (kein Recordset, keine Schleife, keine Null- und Hochkommaprobleme) - einfach eine Abfrage:
db.Execute "INSERT INTO tblStoerungen (StörDatum, Eintragszeit, SchichtartID_F, " & _
"MStandort, MaschinenID_F, ArbeitsfolgeID_F, BereichID_F, " & _
"StoerZeitM, Häufigkeit, MitarbeiterID_F, DS_ID, Stoergrund, " & _
"BemerkungMaßnahme) " & _
"SELECT StörDatum, Eintragszeit, SchichtartID_F, MStandort, " & _
"MaschinenID_F, ArbeitsfolgeID_F, BereichID_F, StoerZeitM, " & _
"Häufigkeit, MitarbeiterID_F, DS_ID, Stoergrund, BemerkungMaßnahme " & _
"FROM [Text;DSN=ImportSB;FMT=Delimited;HDR=yes;IMEX=2;CharacterSet=850;" & _
"DATABASE=D:\100_Projekte\SB_TPM\].SB_Daten.txt " & _
"WHERE StörDatum >" & fcDatSQL(strTag), dbFailOnError

Micha_DU
29.04.2011, 11:31
ergänzend zu Ebs:

c) Die Kiste vor Ort mit ein paar Freunden direkt leeren :-)

Erich290607
29.04.2011, 14:30
besonderes Danke an Eberhard, Super

und eigentlich ist es Antwort a)

desweiteren, als letztes ich verwende da es doch eine Weile dauert bis die daten angehängt werden diese Funktion bzw. Anweisung um dem User anzuzeigen das etwas passiert

docmd.Hourglass True
.....
docmd.hourglass False

wie kann man das über Progressbar realisieren oder in MsgBox "Die Aktualisierung hat, " 120 Sekunden " gedauert" .........................

dazu ein Beispiel Super

ebs17
29.04.2011, 15:06
Die Aktualisierung hat, " 120 Sekunden " gedauert
Im Ernst? Wieviel Datensätze fügst Du an, um 120.000 ms zu benötigen?

Für eine Anzahl im höheren 5-stelligen Bereich und darüber: Gibt es neben den Störfällen auch noch Gelegenheit zum Arbeiten?

Thomas Möller
29.04.2011, 16:35
Hallo Micha,

c) Die Kiste vor Ort mit ein paar Freunden direkt leeren :-)

ich stell mir gerade das Gesicht der Freunde vor, wenn man ersatzweise mit der Tüte Mehl Vorlieb nehmen mus. :D

SCNR

Thomas Möller
29.04.2011, 16:43
Hallo Erich,

wie kann man das über Progressbar realisieren

wenn Du Deine Aufgabe über die SQL-Variante umgesetzt hast, sehe ich kein Chance für eine Progressbar. Du bekommst (leider) keine Informationen darüber, wieviele DS bereits verarbeitet und wieviele noch zu verarbeiten sind. Diese Infos wäre aber für ein Progressbar notwendig.

oder in MsgBox "Die Aktualisierung hat, " 120 Sekunden " gedauert"

Das kannst Du umsetzen indem Du vor und nach der Ausführung der Aktualisierung die aktuelle Zeit in eine Variable speicherst. Am Ende bildest Du dann die Differenz und formatierst diese für die Ausgabe in der MsgBox entsprechend.

CU

Erich290607
30.04.2011, 14:07
Hallo Thomas,

meinst du so etwa?

bei mir kommt immer 0 bei raus, ich brauche es ziemlich genau


Dim Start As Date ' Variablen deklarieren.
Dim Ende As Date

Dim Msg


Start = Format(Now, "hh:nn:ss")

'................
'................


Ende = Format(Now, "hh:nn:ss")



Msg = "der Vorgang dauerte: " & DateDiff("s", Start, Ende)

MsgBox Msg

Maxel
30.04.2011, 14:44
Hallo Erich,

Du machst es mal wieder zu kompliziert; formatiert werden müssen die Zeiten nicht:
Private Sub Befehl0_Click()

Dim Start As Date, Ende As Date
Start = Now

'................
'................
Ende = Now

MsgBox "Der Vorgang dauerte " & DateDiff("s", Start, Ende) & " Sekunden", vbInformation, "Test"

End Sub
Wenn während Start und Ende genügend zu tun ist, kommen auch mehr als 0 Sekunden raus. ;)

Thomas Möller
30.04.2011, 14:44
Hallo Erich,

bei mir kommt immer 0 bei raus

auf meinem Rechner lieferte folgende Funktion als Ergebnis 4 Sekunden:

Dim i As Long
Dim Start As Date
Dim Ende As Date

Start = Now()

For i = 1 To 10000
DoEvents
Next i

Ende = Now

MsgBox Format(Ende - Start, "hh:mm:ss")


ich brauche es ziemlich genau

Bevor wir jetzt mit Kanonen auf Spatzen schließen: Was heißt für Dich "ziemlich genau". Reicht es, wenn Du das Ergebnis auf die Sekunde genau bekommst?

CU

Erich290607
30.04.2011, 15:37
Super Thomas,

das lesen der Textdatei dauerte bei mir 1 sekunde
auf dem Server bei uns bin ich gespannt was er da sagt

habe die msg umgebaut

MsgBox "Der Vorgang dauerte: " & vbCrLf & _
"--------------------------" & vbCrLf & _
Format(Ende - Start, "hh:mm:ss") & vbCrLf & _
"--------------------------", vbInformation, "TPM-Schichtbuch"

ich denke auf die Sekunde reicht aus

Erich290607
01.05.2011, 10:33
Hallo Maxel,

auch dir ein Dankeschön für diese Antwort, geht das auch in milisekunden
wenn unter 1 Sekunde gedauert hat, sagt die prozedur ja z.Z. 0 Sekunden

Arne Dieckmann
01.05.2011, 11:21
Mit Timer kommt man unter Windows weiter bzw. sieht man auch Sekundenbruchteile:

Dim i As Long
Dim Start As Single, Ende As Single

Start = Timer

For i = 1 To 10000
DoEvents
Next i

Ende = Timer

MsgBox Ende - Start

ebs17
01.05.2011, 11:34
Wenn man eine Formatierung ( <tt>DateDiff("s", ...</tt>/ <tt>Format(..., "hh:mm:ss")</tt> ) weglässt, geht das auch genauer, wenn man sich den Wertebereich von Double (Date) vor Augen hält: 4,94065645841247E-324 (unten positiv)
Was davon wirklich rückgebbar ist und vom Betrachter verstanden werden kann, wäre eine andere Frage.

Man sollte sich aber auch vor Augen halten, dass die Anzeige (+ Bestätigung) der benötigten Zeit länger dauern kann als die Abfrage selber. Wie wäre es da mit einer Progressbar für die MsgBox?

Erich290607
01.05.2011, 11:59
Das wars, und so kompliziert für mich :(

na Danke dir Arne, ich schließe das Thema

PS habe noch einiges experementiert bevor ich den Code in meine Originalen DB verwendet habe

z.Bsp. leere Datenbank usw.

das funktioniert nun soweit es soll

Danke an alle!

Erich290607
01.05.2011, 12:01
Wenn man eine Formatierung ( <tt>DateDiff("s", ...</tt>/ <tt>Format(..., "hh:mm:ss")</tt> ) weglässt, geht das auch genauer, wenn man sich den Wertebereich von Double (Date) vor Augen hält: 4,94065645841247E-324 (unten positiv)
Was davon wirklich rückgebbar ist und vom Betrachter verstanden werden kann, wäre eine andere Frage.

Man sollte sich aber auch vor Augen halten, das die Anzeige (+ Bestätigung) der benötigten Zeit länger dauern kann als die Abfrage selber. Wie wäre es da mit einer Progressbar für die MsgBox?

Progressbar für die MsgBox? noch nie gehört, wie geht denn das?

ebs17
01.05.2011, 12:13
Progressbar für die MsgBox
Ironie kann auch dann in Aussagen enthalten sein, wenn man das nicht großflächig kennzeichnet oder mit Smilies garniert.

Erich290607
01.05.2011, 13:35
:( ???

habe dich jetzt nicht verstanden

ebs17
01.05.2011, 13:48
Man sollte sich aber auch vor Augen halten, dass die Anzeige (+ Bestätigung) der benötigten Zeit länger dauern kann als die Abfrage selber.
Diesen Satz, der unmittelbar davor steht, hast Du aber verstanden?

Eine Progressbar dient doch in aller erster Linie dazu, einem Betrachter langlaufende Prozesse zu visualisieren und ihm dabei etwas die Zeit zu vertreiben durch eine sichtbare Aktion. Folgerichtig sollte man sich auf die langlaufenden Prozesse konzentrieren und nicht auf Momente (0 Sekunden).