vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

In diesem Forum haben Sie die Möglichkeit Kommentare, Fragen und Verbesserungsvorschläge zu den im vb@rchiv gelisteten Tipps und Workshops zu posten.

Hinweis:
Ein neues Thema kann immer nur über die jeweilige Tipps & Tricks bzw. Workshop Seite eröffnet werden!

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fragen zu Tipps & Tricks und Workshops im vb@rchiv
Tipp 1942: Datei-Download via API-Funktion ohne Cache-Verwendung 
Autor: alfred46
 Tipp anzeigenDatum: 12.02.14 10:25

Liebe Leser,

als neues Forumsmitglied bitte ich um Eure Hilfe.
Meine Problematik ist folgende:
Meine Excel-VBA Anwendung schaut beim Start (Workbook_Open) in einem lokalen Ordner nach und prüft alle enthaltenen Dateien auf ein neues Update. Eine solche Updatedatei beginnt mit einem Zeitstempel (z.B. 201402110943-BestellverwaltungUpdate.xlsm). Ist dieser jüngeren Datums als der in der Anwendung gespeicherte Zeitstempel [UpdDatei], wird dem Benutzer das Update angeboten. Wenn es ausgeführt wird, wird der aktuelle Zeitstempel gespeichert, so dass beim Neustart der Anwendung ein Update nicht mehr angeboten wird bis ein neueres Update vorliegt.
Bisher habe ich den (wenigen) Anwendern die Updatedatei per mail zugeschickt. Sie mussten diese in einen festgelegten Ordner [BLZFILE] (den die Anwendung findet) abspeichern.
Nun möchte ich die Datei in eine Amazoncloud laden und dort freigeben.

Mit dem Tipp 1942 konnte ich die Datei reibungslos herunterladen und im Zielordner speichern (im Code hat der Debugger (Excel2010) die Zeile "Screen.MousePointer = vbHourglass" angemeckert, ich habe sie auskommentiert). Allerdings muss ich den Namen der Datei angeben.

Gibt es einen Code, der nacheinander aus dem Cloudverzeichnis die Dateinamen ausliest?
Ich könnte dann jeden Dateinamen prüfen, ob es ein neues Update ist und erst dann herunterladen, wenn dies zutrifft.

Für die lokale Lösung habe ich folgenden Code

 
    Dim fs As Object, fVerz As Object, fDatei As Object, l%
    Dim fdateien As Object, strDat$, strDat2$, Ztest As Boolean
    Dim letztesUpdate, upd As Boolean, AktUpDatei$
    Dim Pfad$
 
 
    upd = False
    Set fs = CreateObject("scripting.FileSystemObject")
    strDat = [BLZFILE].Value        'Pfad, in dem die Updatedateien liegen
    l = Len(strDat)
    strDat = Left(strDat, l - 8)    'schneidet Datei weg
    strDatUP = strDat
    Set fVerz = fs.getFolder(strDat)
    Set fdateien = fVerz.Files
    letztesUpdate = [UpdDatei].Value  'hier ist der Zeitstempel des letzten 
    ' Updates hinterlegt
    letztesUpdate = str(letztesUpdate)
    letztesUpdate = Trim(letztesUpdate) 'Umwandlung in Stringkette
    For Each fDatei In fdateien
        If InStr(fDatei, "") > 0 Then   'liest nacheinander Dateien ein
            strDat = fDatei.Name
            strDat2 = Left(strDat, 12)  'schneidet nach 12 Zeichen ab
            Ztest = IsNumeric(strDat2)  'testet, ob Zahlen
            If Ztest = True Then
                strDat2 = CDbl(strDat2)
                If letztesUpdate < strDat2 Then upd = True: Adminkennung = Mid( _
                  strDat, 13, 1):                 AktUpDatei = fDatei 'es wurde 
                ' ein neues Update gefunden
            End If
        End If
    Next fDatei
    'wenn upd auf True steht, wurde ein neues Update gefunden
(die Adminkennung dient dazu, das Update ohne Meldungsboxen durchzuführen)

Ich erbitte hier Eure Hilfe, da ich mit dem Internethandling mittels VBA keine Erfahrung habe.

LG alfred46
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datei-Download via API-Funktion ohne Cache-Verwendung 
Autor: Franki
Datum: 13.02.14 01:29

Hallo Alfred,

aus einem Verzeichnis (egal ob lokal oder Cloud) alle Dateien auslesen ist gar nicht nötig. Du kennst ja die Dateinamen der Updates. Mal simpel mit Ziffern statt Zeitstempel.

Upd0001, Upd0002, Upd0003 usw. lauten die Dateinamen der Updates.

Intern hat der User ja beim letzten Update gespeichert welches das war (Upd0002 z.B)

Jetz nimmst du eine Datei z.B. UpdateStand.txt in die du bei jedem neuen Update die Versionsnummer schreibst. Anhand dieser einen Datei prüfst du ob der User auf dem aktuellen Stand ist oder nicht.

Falls nicht, gibt es zwei Varianten.

1. Der User braucht nur das neueste Update, dann hast du ja schon den Dateinamen. Dann brauchst du in der Cloud auch immer nur das neueste Update und die Textdatei.

2. Der User braucht nacheinander alle Updates die er noch nicht hat, dann bildest du die Differenz zwischen höchster Version aus der Textdatei und lokaler Version und gehst die Downloads dann in einer Schleife durch. Auch hier sind die Dateinamen ja logisch. (Ist bei BLZ Daten aber eher nicht notwendig)

Über den Zeitstempel zu arbeiten kann auch schief gehen aus den verschiedensten Gründen. (Habe hier grade wieder eine Kiste stehen wo Windows Update nicht funktioniert weil die BIOS Batterie leer ist und das Datum bei jedem Einschalten immer auf 01.01.2009 steht.

Gruß
Frank



Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datei-Download via API-Funktion ohne Cache-Verwendung 
Autor: alfred46
Datum: 13.02.14 08:32

Hallo Frank,

danke erst mal, dass Du Gehirnschmalz für mein Problem geopfert hast.

Ich versuch mal mit meinen Worten Deine Idee zu wiederholen:

In der Bestellverwaltung ist der Name des zuletzt ausgeführten Updates gespeichert. (z.B. Upd0002)
Beim Start der Bestellverwaltung lädt diese aus der Cloud die Textdatei (bei Dir UpdateStand.txt) herunter, liest den Inhalt in eine Variable und vergleicht diese mit dem abgespeicherten Inhalt.

Fall 1:
gespeicherter Name = Inhalt Textdatei :> kein Update nötig

Fall 2:
Inhalt Textdatei > gespeicherter Name :> die Updatedatei, die um 1 größer ist als die gespeicherte wird heruntergeladen und ausgeführt.

Da nach dem Update die Datei ohnehin neu aufgefufen wird, erfogt der Test erneut und es könnte dann Fall 1 oder 2 auftreten. Fall 2 solange, bis das neueste Update eingespielt ist.

Habe ich das richtig wiedergegeben?
Der Gedanke ist genial und ich werde ihn programmtechnisch umsetzen. Vielleicht kommt dann noch das eine oder andere Umsetzungsproblem.

Erst mal vielen Dank, Frank

LG
alfred (Wolfgang)
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datei-Download via API-Funktion ohne Cache-Verwendung 
Autor: Franki
Datum: 14.02.14 00:54

Hallo Wolfgang,

hast du richtig verstanden, aber:

Zitat:


Fall 2:
Inhalt Textdatei &gt; gespeicherter Name :&gt; die
Updatedatei, die um 1 größer ist als die gespeicherte wird
heruntergeladen und ausgeführt.

Da nach dem Update die Datei ohnehin neu aufgefufen wird,
erfogt der Test erneut und es könnte dann Fall 1 oder 2
auftreten. Fall 2 solange, bis das neueste Update eingespielt
ist.


Dieser Weg ist aber nur dann notwendig wenn der User wirklich alle Updates der Reihe nach braucht und keines übersprungen werden darf.

Beispiel: User hat Update 2, es gibt jetzt Update 4. Reicht es wenn er Update 4 installiert, oder muss er zuerst 3 und dann 4 installieren? Wenn letzteres der Fall ist, kannst du es so machen, wenn er nur die 4 braucht, kannst du dir den mehrfachen Aufruf der Textdatei sparen.

Gruß
Frank







Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datei-Download via API-Funktion ohne Cache-Verwendung 
Autor: alfred46
Datum: 15.02.14 17:34

Hallo Franki,

habe das gestern und heute programmiert und es geht!
Jedoch nicht mit der Amazoncloude: Dort kann man keine Dateien mit dem bereitgestellten Link herunterladen. Mit dem Anbieter DriveOnWeb klappt es aber.
Du hast recht: es muss stets nur das neueste Update eingespielt werden. Deshalb habe ich Fall 2 dahingehend strukturiert.

Danke nochmal für Deine Hinweise, die mir geholfen haben.

LG
alfred
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datei-Download via API-Funktion ohne Cache-Verwendung 
Autor: Franki
Datum: 16.02.14 00:38

Hallo Wolfgang,

freut mich, dass ich dir helfen konnte.

Zum Thema Cloud bzw. den Anbietern in diesem Bereich kann ich nichts sagen, da mir das aus Sicherheitsgründen für gewerbliche Anwendungen noch suspekt ist.

Natürlich gibt es für meine Anwendungen entsprechenden Webspace (von mir oder den Kunden), aber da komme ich mit ASP und/oder PHP zurecht so dass sich die Notwendigkeit einen Cloudanbieters nutzen zu müssen gar nicht erst stellt.

Ok, das ist auch im Web, Sicherheitsrisiken bestehen auch da, aber man hat eine Risikostufe weniger und auch bessere Möglichkeiten bei der Programmierung.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datei-Download via API-Funktion ohne Cache-Verwendung 
Autor: alfred46
Datum: 26.02.14 13:18

Liebe Leser,

ich möchte Euch nochmals um Hilfe bitten:
Das hier beschrieben Problem ist mit Franki's Hilfe gelöst.

Ich möchte nun aber gerne wissen, wer und wie oft auf die Dateien zugegriffen hat.
Deshalb habe ich eine leere Textdatei "Web.log" in den Cloudordner gestellt. Die Datei ist freigegeben und bekommt vom Cloudanbieter einen Link (soetwa: https://************.log)

Wenn eine Anwendung startet, lädt sie die Web.log runter, es werden Aktivitäten hineingeschrieben und anschließend soll sie wieder hochgeladen werden und die Datei im Cloudordner ersetzen.
Dabei wird kein neuer Link vergeben, das habe ich schon ausprobiert.

Über FTP-Upload habe ich einiges gefunden, aber ich weiss nicht, ob das das Richtige ist.

Deshalb bitte ich um Hilfe.

Gruß alfred46
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datei-Download via API-Funktion ohne Cache-Verwendung 
Autor: Franki
Datum: 26.02.14 23:27

Hallo alfred46
Zitat:


Ich möchte nun aber gerne wissen, wer und wie oft auf die Dateien zugegriffen hat.

Also so etwas wie ein Zugriffszähler oder Downloadzähler?
Dafür bietet eigentlich jeder Webhoster entweder eine Onlinestatistik oder Zugriff auf die Logfiles des Servers an. Da braucht man selbst nichts zu machen. (Ok mit dem wer geht so einfach dann nicht)

Zitat:


Deshalb habe ich eine leere Textdatei "Web.log" in den Cloudordner gestellt.

Wenn eine Anwendung startet, lädt sie die Web.log runter, es werden Aktivitäten hineingeschrieben und anschließend soll sie wieder hochgeladen werden und die Datei im Cloudordner ersetzen.


Diese Möglichkeit ist nicht tauglich für Multiuserbetrieb.
Beispiel: User 1 startet sein Programm, kurz danach startet User 2 dein Programm, beide laden die Datei runter noch ist sie identisch.

User 2 ist schneller aus welchen Gründen auch immer (schnellerer Rechner, schnellere Internetverbindung z.B.) und hat seine Datei wieder hoch geladen. Danach kommt der Upload von User 1 und er überschreibt die Datei von User 2, du bekommst also von den Aktivitäten von User 2 nie etwas mit in der log Datei.

Zitat:


Dabei wird kein neuer Link vergeben, das habe ich schon ausprobiert.

Klar der Dateiname und der Speicherort ist ja identisch.

Zitat:


Über FTP-Upload habe ich einiges gefunden, aber ich weiss nicht, ob das das Richtige ist.


Download/Upload ist nicht sinnvoll. Aber da es dir ja um Updates geht, möchtest du wahrscheinlich wissen wie viele User deine Updates installiert haben. Also baue doch in dein Programm eine kleine Routine ein die nach dem Erststart der neuen Version den Inhalt des Zählers um 1 erhöht. Das kannst du per "verstecktem" Aufruf einer ASP/PHP Seite viel einfacher machen. Oder auch in eine Datei fortlaufend schreiben und somit protokollieren "wer" geschrieben hat.

Aber beachte bitte den Datenschutz, du solltest / mußt den User darüber informieren, dass Daten an dich automatisch gesendet werden.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um einen neuen Beitrag schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel