Konvertieren von Excel und Ascii Daten in verschiedene Formate

      Hi Rene,

      also bei mir klappt es unter allen Testadressen, wir hatten das schon mal, liegt zum Glück nicht mehr an uns :)
      Der Autor ist in den besprochenen Werten zumeist selbst investiert. Traden auf eigene Gefahr, Signale sind aktuell großteils experimentell zwecks Challenge "In 30 Tagen zur Trading Strategie".
      Plane deinen Trade, trade deinen Plan!
      If it´s not a HELL YES, it´s a NO!
      Hallo Jens!

      Nachdem ich einige Zeit mit einem anderen Projekt beschäftigt war, wollte ich nun am Datenimport weiter arbeiten. Die Funktionen waren alle so weit fertig, dass ich bereits die Ausgabedatei erzeugen konnte. Nun plötzlich kamen an den seltsamsten Stellen Fehlermeldungen.
      Ich entdeck´te einen aktivierten Active X Verweis und habe ihn entfernt. Trotzdem kommt nun bei jedem Versuch das Programm laufen zu lassen

      "Ungültiges Argument" Danach stürzt Access ab. Sogar bei der Funktion Extras - Dienstprogramme - Komprimierung

      stürzt das programm ab. Ich bin nun reichlich ratlos!

      Woran könnte das Verhalten liegen? Ich habe keine Idee!
      8) --- sonnige Grüße -> von Rene --- 8)

      Rene Rose online
      Problem gelöst! :)

      aber ich habe ein nächstes, wo ich den Fehler nicht finde:

      In folgender prozedur wird unter Angabe eines Pfades der Importvorgang gestartet. Das Programm liest die Dateinamen und wenn alle Kürzel stimmen werden die Daten importiert! Manchmal bekomme ich allerdings einen merkwürdigen Laufzeitfehler. Es wird gemeldet, das die Datenbank das Objekt

      index_fdax_ ..... nicht finden kann. Den Dateinamen aus dieser Fehlermeldung kann Access allerdings nur kennen, wenn dieser vorhar an Hand der Pfadangabe ausgelesen wurde, was ja logischerweise nur geht, wenn dort die Datei mit diesem Namen vorhanden ist! Irgendwie sehr merkwürdig!

      Vielleicht hat jemand einen Hinweis??
      8) --- sonnige Grüße -> von Rene --- 8)

      Rene Rose online
      Nun taucht doch ein Problem auf, bei dem ich einfach nicht weiterkomme. Ich möchte die Tabellenliste der offenen Datenbank überprüfen, ob eine Tabelle mit bestimmten Namen bereits existiert. leider finde ich keine funktionierende Lösung. Die folgende Routine wird zwar durchlaufen, funktioniert aber nicht, da in der folgenden Routine, die die neue Tabelle erzeugt dann ein Laufzeitfehler "Tabelle besteht bereits" generiert wird.


      Frag: Wie durchsuche ich die TableDefs Auflistung nach einem gegebenen Namen??


      Quellcode

      1. 'Prüfen, ob Tabelle bereits vorhanden ist
      2. Sub CheckTables(TableName, TableFlag)
      3. Dim db As Database, tdList As TableDefs, i As Variant
      4. Dim td As TableDef
      5. Set db = CurrentDb
      6. Set tdList = db.TableDefs
      7. For Each td In tdList
      8. If td.Name = TableName Then
      9. MsgBox "Tabelle ist bereits vorhanden"
      10. TableFlag = 1
      11. End If
      12. Next td
      13. End Sub
      8) --- sonnige Grüße -> von Rene --- 8)

      Rene Rose online
      und ich habe auch ein fertiges Ergebnis:

      auf Knopfdruck werden alle Dateien in einem Ordner in eine Tabelle importiert, dann wird die Ausgabedatei erzeugt! Zwischendurch wird geprüft ob die Dateien alle das selbe Underlying enthalten!


      Damit kann ich schon gut arbeiten!

      Ich denke, jetzt habe ich erst mal keine Fragen mehr!

      Vielen Dank füpr die Unterstützung!!! Bei Fragen zu Equilla bitte an meine Mail Adresse schreiben!
      8) --- sonnige Grüße -> von Rene --- 8)

      Rene Rose online
      Hallo Jens!

      Danke für Deine Ausarbeitung. Transfertext war, was ich gesucht habe. Ich wollte das schon einzeln mit String Schnipseleien machen. Morgen teste ich das neu gelernte!

      Zu Deinem problem: Das geht ganz einfach, Du (ich helfe Dir) schreibst einen zweiten Indikazor, der den KCH darstellt. Die Angabe für Periode und ATR übergibst Du aus dem ersten Indikator mittels zweier globaler Variablen. Am besten, Du schickst mir mal einen Arbeitsbereich, ich mache das dann fertig und Du siehst wie es geht!


      PS: die Mailbenachrichtigung für diesen Thread funktioniert leider immer noch nicht!!!!
      8) --- sonnige Grüße -> von Rene --- 8)

      Rene Rose online
      Hallo Rene,

      prima, daß du schon so weit gekommen bist!
      Zum Abarbeiten einer Reihe von Dateien mal ein Codebeispiel aus der Access-Hilfe:

      Quellcode

      1. Sub FileFind()
      2. 'Beispiel aus VBA-Hilfe unter Execute-Methode (FileSearch-Objekt)
      3. Dim i As Integer, fs As Object
      4. Set fs = Application.FileSearch
      5. With fs
      6. .LookIn = "e:\temp"
      7. .FileName = "*.pdf"
      8. If .Execute() > 0 Then
      9. MsgBox "There were " & .FoundFiles.Count & _
      10. " file(s) found."
      11. For i = 1 To .FoundFiles.Count
      12. MsgBox .FoundFiles(i)
      13. Next i
      14. Else
      15. MsgBox "There were no files found."
      16. End If
      17. End With
      18. End Sub


      Dies müsstest du jetzt kombinieren mit dem eigentlichen Textimport mit der TransferText-Methode, bei der dann die bereits vorhandene Importspezifikation angegeben wird. Details und ein (simples) Beispiel findest du in der VBA-Hilfe unter " TransferText-Methode".

      ... wo wir hier gerade beieinander sind, ich habe momentan ein TSe-Problem:
      Ich habe einen Indikator erstellt, der Daten aus der Funktion KeltnerChannel(...) benutzt. Das Resultat wird als Subchart angezeigt - soweit ok. Nun möchte ich im Hauptchart den dazugehörigen KCH darstellen, d.h. dieser soll dieselben Parameter verwenden wie die Funktion in meinem Indikator. Bislang muß ich Periode, Faktor etc. sowohl für den Chart als auch für den Indikator separat angeben. Kann man das in einem Aufwasch erledigen?

      Gruss, Jens
      Hallo Jens!

      Ich hatte nun endlich mal wieder Zeit, an meiner Formatierung zu arbeiten! Bin immer wieder überrascht, wie einfach es doch geht, weil die Gemeinsamkeiten zu Equilla sehr groß sind.

      TradeSize lässt sich mit Format nicht bearbeiten. Das Programm macht eine 5 STellige Zahl daraus. Aber ich habe das Problem mit einige Stringoperationen gelöst. Ich stelle den Code nachher hier rein.
      Inzwischen wird auch der Header der alten Times and Sales Listen an den Anfang der erzeugten Datei gesetzt! Dieser ist wichtig, weil der TC daraus die Spaltenbezeichnung ausliest.

      Das nächste Ziel ist die Benennung des Dateinamens nach dem Symbol, dessen Tickdaten formatiert werden. Danach möchte ich noch erreichen, dass alle .csv dateien die im Eingangsordner liegen automatisch bearbeitet werden! Die VB Hilfe in Access ist wirklich gut!

      Wenn ich ein fertiges Skript habe, kann ich das gerne mal reinstellen!

      Danke schon mal für Deine Tatkräftige Unterstützung!
      8) --- sonnige Grüße -> von Rene --- 8)

      Rene Rose online
      Hallo Jens!

      Ich bin noch da! Aber nicht mehr lange....

      Habe inzwischen mit meinen Equillakenntnissen einiges erreichen könne. Dazu kommen jetzt wertvolle Anregungen aus Deinem Positing. Nach meinem Urlaub werde ich das einarbeiten.

      Mir ist es bisher gelungen, das alte Format der Times and Sales Listen zu immitieren. Ein Erfolg. Mit Deinen Hinweisen werde ich das deutlich verbessern können. Ist schon witzig, wie ähnlich sich die Programmiersprachen sind.

      Das Problem mit Trade_Size habe ich gelöst, jedoch nicht versstanden. will ich Trade_Size direkt ausgeben kommt ein fehler. Speichere ich den Wert in einer Variable vom Typ Valid geht alles glatt!

      bsi demnächst!!!!

      Vielen Dank und trotz der schlechten Wetteraussichten:
      8) --- sonnige Grüße -> von Rene --- 8)

      Rene Rose online
      Hallo Rene,

      falls ich dich noch vor der Abreise erwische, wünsche ich euch herrliche Tage an der Ostsee, falls nicht, hoffe ich, ihr hattet solche! :)
      Ich habe deine Ausgabe bearbeitet und hoffe, es passt jetzt.

      Quellcode

      1. Print #1, rs!Product_ID + Space(3);
      2. Print #1, Format(rs!EXP_MONTH, "00") + " " + Format(rs!EXP_YEAR, "00") + " ";
      3. Print #1, Space(4) + "0" + " " + "0" + " ";
      4. Print #1, Format(rs!Year, "0000") + " " + Format(rs!Month, "00") + " " + Format(rs!Day, "00") + " ";
      5. Print #1, Format(rs!Hour, "00") + " " + Format(rs!Minute, "00") + " " + Format(rs!Second, "00") + " " + Format(rs!CENTISECOND, "00") + " ";
      6. 'Variante1: Dezimalkomma, führende Nullen
      7. Print #1, Format(rs!MATCH_PRICE, "0.00") + " " + Format(rs!TRADE_SIZE, "000")
      8. 'Variante2: Dezimalpunkt, führende Leerzeichen
      9. Print #1, Replace(Format(rs!MATCH_PRICE, "0.00"), ",", ".") + " " + Right(Space(3) + Format(rs!TRADE_SIZE, "0"), 3)



      Zu den einzelnen Problemen:
      1. Space() oder Leerzeichen " " oder "x": bei Kombination mit Feldern vom Typ Numerisch (letzte Zeile) muß erst die Zahl in Text umgewandelt werden (z.B. mittels Format-Fkt.), bevor die Strings verkettet werden können.
      2. Dezimalstellen in der Format-Fkt. mit "0.00" angeben. Verwendet wird das Dezimalzeichen lt. Gebietsschema (bei uns in der Regel das Komma). Deshalb eine Variante mit Ersetzung des Kommas durch Punkt.
      3. rechtsbündige Ausgabe des Umsatzes mit führenden Nullen auch wieder mit Format-Fkt "000" oder mit Leerzeichen (Lösung ist vielleicht nicht schön, aber sie funktioniert). Ich weiß jetzt nur nicht, wieviele Stellen man hier spendieren muß, damit auch große Umsätze immer reinpassen.

      btw: wenn diese Ausgabe in eine Textdatei klappt, könntest du eigentlich auch gleich eine Ausgabe in das neue Format hinkriegen!?

      Gruss, Jens
      Hallo Jens!

      Hier ist der Code:

      Quellcode

      1. Sub GenOutput()
      2. 'erzeugt csv-Datei aus Tabelle Datenimport
      3. Dim db As Database, rs As Recordset
      4. Set db = CurrentDb
      5. Set rs = db.OpenRecordset("Bund01")
      6. Open "c:\temp\eurex.csv" For Output As #1
      7. rs.MoveFirst
      8. Do Until rs.EOF = True
      9. Print #1, rs!Product_ID + "xxx";
      10. Print #1, Format(rs!EXP_MONTH, "00") + "x" + Format(rs!EXP_YEAR, "00") + "x";
      11. Print #1, "xxxx" + "0" + "x" + "0" + "x";
      12. Print #1, Format(rs!Year, "0000") + "x" + Format(rs!Month, "00") + "x" + Format(rs!Day, "00") + "x";
      13. Print #1, Format(rs!Hour, "00") + "x" + Format(rs!Minute, "00") + "x" + Format(rs!Second, "00") + "x" + Format(rs!CENTISECOND, "00") + "x";
      14. Print #1, rs!MATCH_PRICE + "x" + rs!TRADE_SIZE
      15. rs.MoveNext
      16. Loop
      17. Close #1
      18. End Sub


      Ich habe mir vorgenommen, die beiden offebeb Fraen, nämlich Dezimalstellen und Rechtsanschlag der Volumenangeb nach meinem Urlaub mit meinen einfachen Mittelkn zu lösen. Programmiersprachen sind sich oft sehr ähnlich. Also werde ich wohl mit einigen if then Abfragen zu Recht kommen.

      Ab morgen bin ich an der Ostsee mit meiner Süßen, komme am Mittwoch aber zurück, Kurzurlaub also!

      Bis dahin alles GUte und vielen Dank!!!
      8) --- sonnige Grüße -> von Rene --- 8)

      Rene Rose online
      Hallo Jens!

      Ich habe mich mal mit den print Anweisungen beschäftigt. Da ich mit der Space Funktion nicht klar komme habe ich statt Leerzeichen xxx eingefügt. Dies nur zum Test. Ich versuche mal folgendes Format und zwar exakt hinzubekommen:

      DTB contract time and sales sheet
      S511

      contract(s): year: month: day:

      pro- t ex ex v date match
      duct y mt yr strke s year mt dy hr mn sc cs price size
      ---- - -- -- ----- - ---- -- -- -- -- -- -- -------- -------
      BUND 12 90 0 0 1990 11 23 07 59 33 00 83.23 11
      BUND 12 90 0 0 1990 11 23 08 00 06 00 83.23 9
      BUND 12 90 0 0 1990 11 23 08 00 43 00 83.23 5
      BUND 12 90 0 0 1990 11 23 08 01 57 00 83.20 25
      BUND 12 90 0 0 1990 11 23 08 03 36 00 83.17 10
      BUND 12 90 0 0 1990 11 23 08 05 24 00 83.17 5
      BUND 12 90 0 0 1990 11 23 08 06 07 00 83.18 10
      BUND 12 90 0 0 1990 11 23 08 06 41 00 83.18 75

      Das sind die alten Times und Sales Listen. Wenn ich in einem Texteditor die x gegen Leerzeichen getauscht habe, sieht mein Ergebnis schon ganz gut aus.

      Problem1: Wie erzwinge ich zwei Nachkommastellen?? In den neuen Eurexdateien fehlen leider beide Nachkommastellen, zb.b Bund 119 glatt oder eine Nachkommastelle z.B. Bund 118.4 statt 118.40

      Problem zwei: im nachfolgenden Code funktioniert alles bis auf die allerletzte Ausgabe "Trade_Size" hier wird eine Fehler "Tapen unverträglich" genmeldet. Ich habe keine Ahunjg was das bedeutet. Die Spalte ist vom Typ Zahl, so wie einige andere Spalten auch, bei denen kein Fehler gemeldet wird. Wenn ich die Ausgabe von "Trade_Size" lösche, funktioniert das Programm

      Problem3: Die Umsätze, Spalte ganz rechts müssen rechts angeschlagen sein, also mit der letzten Ziffer alle übereinander stehen. Ich habe auch hier keinen PLa wie ich das schaffe soll.

      Falls die probleme lösbar sind, kann ich frohe Kunde tun:

      Ich habe ein Programm, welches dieses Format und zwar penibel genau bis aufs letzte Leerzeichen liest, die Kontrakte isoliert, OHCL komprimiert und Endloskontrakte zusammenfügt. Alles Funktionen, die ich sonst noch selbst entwickeln müsste!!


      Nun beschäftige ich mich trotzdem noch mit dem Erzeugen von Tabellen und Spalten!
      8) --- sonnige Grüße -> von Rene --- 8)

      Rene Rose online
      Du steigst ja wirklich schnell in die Tiefen von Access-VBA hinab!

      Ich habe selbst mit CreateQueryDef noch nicht gearbeitet, aber mal schnell in die Hilfe geschaut.
      Die Felder, die diese Abfrage verwendet, ergeben sich aus der SQL-Anweisung im 2. Parameter der CreateQueryDef-Methode, also z.B.
      "SELECT Product_Id, Exp_Month, Exp_Year FROM Datenimport"
      Dies sind die gleichen Felder, die du auch im Abfrageassistenten eingibst. Soweit ich weiß, kannst du in einer Abfrage (Query) z.B. die Feldtypen oder -längen nicht ändern, denn diese sind ja durch die zugrundeliegende Tabelle definiert.

      Mit der Methode Append kannst du z.B. der Field-Auflistung einer Tabelle ein neues Feld hinzufügen, das läuft dann im Prinzip so:

      Quellcode

      1. Dim db As Database, td As TableDef, fld1 As Field
      2. Set db = CurrentDb
      3. Set td = db.CreateTableDef("Test")
      4. Set fld1 = td.CreateField("Nachname", dbText, 50)
      5. td.Fields.Append fld1
      6. db.TableDefs.Append td


      also zur aktuellen Datenbank (db) eine neue Tabellendefinition erstellen (td) und dieser ein neues Feld (fld1) hinzufügen. Dann die neue Tabellendefinition der Liste aller Tabellendefinitionen hinzufügen (letzte Zeile).

      Das ganze läuft absolut objektorientiert, deswegen musst du ständig wissen, auf welches Objekt sich welche Methode anwenden läßt oder welche Eigenschaften es hat. Ich fand das zu Anfang einen grausigen Berg, der sich vor mir auftürmte und wollte schon manchmal verzweifeln. Geholfen haben mir ein Buch - damals über A97-Programmierung - die wirklich gute Hilfe in Access-VBA (gib da z.B. mal createquerydef oder createfield oder append ... ein! Die Beispiele liefern gute Anregungen) und auch oft eine Google-Suche.

      Also weiterhin viel Spass und wenn noch Fragen auftauchen, poste einfach.

      Schönen Abend,
      Jens