NL Computer Forum

Maak het zelf => Programmeren => Topic gestart door: jvdpeet † op 25 februari 2010, 01:23:04

Titel: Error "Unknown"
Bericht door: jvdpeet † op 25 februari 2010, 01:23:04
Ik gebruik het volgende stukje code in Form_Load van het hoofdformulier:
'Verwijderen oude logbestanden.
MyPath = frmInvestor.ext(App.Path) & "LOG\"
MyFile = Dir(MyPath & "*.*")
Dim filename As String
filename = MyPath & MyFile
Do While MyFile <> ""
    Aanroep2 = "ControleKoersBestanden"
    If Left$(MyFile, 8) <> BerekendeDatum And Left$(Right$(MyFile, 7), 3) = "LOG" Then
        If MyFile <> "master.fqr" Then
            Kill filename
        End If
    Else
        Aanroep2 = ""
        CloseFile (filename)
    End If
Loop
Wanneer dit stukje code wordt uitgevoerd, krijg ik de fout "Unknown". Wat is er fout aan deze code?
 
Titel: Re: Error "Unknown"
Bericht door: Michel Uphoff op 25 februari 2010, 19:46:30
Dag Jan,
 
Je voert dit uit tijdens het Form_Load event, mogelijk levert frmInvestor.ext(App.Path) & "LOG\" dan een lege waarde op.
Heb je de debugger al eens aangezet en de waarden van de variabelen die je gebruikt gecontroleerd op hun inhoud?
 
Met een muisklik een breakpoint aanzetten bij de eerste regel van de code en het programma starten. Bij het breakpoint aangekomen met F8 stap voor stap door de code wandelen. Mbv. View > Locals de van toepassing zijnde variabelen controleren op inhoud. Je zou de fout zo snel moeten kunnen vinden.
Titel: Re: Error "Unknown"
Bericht door: Peter op 25 februari 2010, 22:27:05
Hoi Jan,

Citaat
Wat is er fout aan deze code?
Een opmerking vooraf, plaats programma-code tussen coderegels, zie de knop # boven de berichten-editor. Dat voorkomt code-verminking in dit forum, zie de smiley in je 1e bericht.

Deze code komt in een oneindige lus terecht, afhankelijk van hoe de error-afhandeling gebeurt.

Uitgaande van de commentaarregel wil je 1 of meerdere logbestanden wissen.
Als MyFile een bestandsnaam is in de syntax yyyyyyyyLOGzzzz wordt geprobeerd het bestand te wissen. (yyyyyyyy = BerekendeDatum, zzzz kan vanalles zijn)
Als MyFile iets anders is wordt CloseFile (filename) aangeroepen, geen idee wat daar gebeurt.
In beide gevallen wordt daarna bovenstaande opnieuw doorlopen met dezelfde waarde voor MyFile.

Wat wil je precies bereiken?


groeten, Peter
Titel: Re: Error "Unknown"
Bericht door: jvdpeet † op 26 februari 2010, 11:46:30
Als ik de code met F8 doorloop gaat de If goed, pas als hij in de Elsetak komt krijg ik na CloseFile, dus in MyFile = Dir, de foutmelding. Als ik mij goed herinner was het foutnummer 18.
BerekendeDatum kan alleen maar de datum van vandaag bevatten en is hiervoor berekend. Dat logbestand mag namelijk niet verwijderd worden, alleen de oude logbestanden moeten verwijderd worden om te voorkomen dat de map LOG een hoeveelheid waardeloze bestanden bevat.
De CloseFile dient om het logbestand van vandaag (= BerekendeDatum) te sluiten en er verder niets mee te doen.
Is het misschien zo dat dit bestand niet geopend is? Dat lijkt mij onlogisch, omdat alleen gekken kan worden of aan de IF-voorwaarden voldaan is als het bestand geopend is, of praat ik nu onzin?
Titel: Re: Error "Unknown"
Bericht door: Michel Uphoff op 26 februari 2010, 13:08:11
Dag Jan,
 
Met het opvragen van een lijst van bestanden, noch met een kill opdracht worden bestanden geopend. Dus hoef je ze ook niet te sluiten.
 
Ik begrijp dat je alle .log bestanden in een bepaalde map wilt deleten behalve degene met de datum van vandaag in de bestandsnaam?
 
Je zou dan ook het actuele log bestand tijdelijk kunnen renamen bijvoorbeeld in Berekendedatum.bak, en met kill *.log alles verwijderen, en daarna berekendedatum.bak hernoemen. Is een stuk korter en overzichtelijker.
 
Je moet er wel zeker van zijn dat er altijd een berekendedatum.log is. Is dat niet zo, dan zal je daar eerst op moeten testen of een on error resume next statement opnemen. Verder levert app.path het pad naar de applicatie op zonder de "\". In jouw code zie ik die "\" niet. De inhoud van de variable MyPath is inderdaad wat je bedoelt? Als ik het goed zie levert mypath in jouw geval namenlijk X:\applicatiepadLOG\ op ipv X:\applicatiepad\LOG\
 
Kwestie van inhoud van de variabelen tijdens het debuggen even controleren als aangegeven.
 
Titel: Re: Error "Unknown"
Bericht door: Peter op 26 februari 2010, 20:15:08
Hoi Jan,

Citaat
Als ik de code met F8 doorloop gaat de If goed, pas als hij in de Elsetak komt krijg ik na CloseFile, dus in MyFile = Dir, de foutmelding.
MyFile = Dir zie ik nergens in bericht #1. Vergeten te kopiëren?. In dit geval is dat een belangrijke regel.

Wanneer wordt dit opruimen doorlopen? Na een muisklik, bij programma-start of op bepaalde tijden, er vanuit gaande dat je programma 24 uur per dag draait.

Citaat
De CloseFile dient om het logbestand van vandaag (= BerekendeDatum) te sluiten en er verder niets mee te doen.
Die logica kan ik niet volgen, Je zegt eerder dat het logbestand van vandaag niet gewist mag worden, maar je sluit het bestand wel. Dat roept verwarring op en onlogische code.

Hieronder een voorbeeld sub die de logbestanden wist:

Sub RemoveLogFiles()
'Verwijderen oude logbestanden behalve van 'BerekendeDatum'.
Dim MyPath$, MyFile$
Dim etxt$, filename$

On Error GoTo errhandle

   Aanroep2 = "ControleKoersBestanden"
   MyPath = ext(App.Path) & "LOG\"
   MyFile = Dir(MyPath & "*.*")
   Do While MyFile <> ""
       If Left$(MyFile, 8) <> BerekendeDatum And Left$(Right$(MyFile, 7), 3) = "LOG" Then
          Kill MyPath & MyFile
       End If
       MyFile = Dir
   Loop
   Aanroep2 = ""

errexit:
   Exit Sub
   
errhandle:
   etxt = Err.Number & ":" & Err.Description & " in RemoveLogFiles."
   MsgBox etxt
   Resume errexit
End Sub


groeten, Peter
Titel: Re: Error "Unknown"
Bericht door: Peter op 26 februari 2010, 20:18:07
Hoi Michel,

Citaat
Verder levert app.path het pad naar de applicatie op zonder de "\". In jouw code zie ik die "\" niet.
Daarvoor zorgt waarschijnlijk de zelfgemaakte functie ext in formulier frmInvestor.


Peter
Titel: Re: Error "Unknown"
Bericht door: Michel Uphoff op 26 februari 2010, 20:59:49
Hoi Peter,
 
Citaat
zelfgemaakte functie ext
Zou kunnen, kan ik niet controleren. De opruimfunctie wordt gestart bij het load event van het main form, dus de actuele log zal hoogstwaarschijnlijk niet in gebruik zijn.
 
Overigens zou ik er voor gekozen hebben de actuele logfile even te stallen en met kill *.log de boel op te ruimen. Kan in een paar regeltjes code, iets in de geest van:
 
name App.Path & "\LOG\" & Vandaag & ".log" as App.Path & "\LOG\" & Vandaag & ".bak"
Kill App.Path & "\LOG\*.log"
name App.Path & "LOG\" & Vandaag & ".bak" as App.Path & "\LOG\" & Vandaag & ".log"
Titel: Re: Error "Unknown"
Bericht door: Peter op 26 februari 2010, 23:42:04
Citaat
Overigens zou ik er voor gekozen hebben de actuele logfile even te stallen en met kill *.log de boel op te ruimen.
Tja, in bericht #3 gaf ik al aan dat de bestandsnamen waarschjnlijk niet eindigen met de extensie ".log". De hoofdletters "LOG" staan ergens in de naam, mogelijk ook in de extensie maar dat is niet bekent.

Afhankelijk van waar en hoe de opruimactie gestart wordt zijn er inderdaad diverse mogelijkheden.


groeten, Peter
Titel: Re: Error "Unknown"
Bericht door: Michel Uphoff op 27 februari 2010, 00:13:04
Hoi Peter,
 
Inderdaad zou het ook om een filenaam in de vorm *.*LOGxxxx  of *LOGxxxx kunnen gaan, dan wordt het wat lastiger maar misschien is er ook dan met eenvoudige wildcards uit te komen. Jan zal ons dan moeten voorzien van de opbouw van de logbestand namen.
Titel: Re: Error "Unknown"
Bericht door: jvdpeet † op 27 februari 2010, 02:10:51
Michel en Peter,
De opbouw van de naam van de logbestanden is bijv. voor vandaag 20100226LOG.prn.
Titel: Re: Error "Unknown"
Bericht door: jvdpeet † op 27 februari 2010, 02:22:11
Hoi Peter,
De regel CloseFile had ik al weg gehaald, maar of de foutmelding nu verdwenen is  weet ik nog niet omdat ik het (zie Freeze van VB6.0) nog niet kan testen.
Citaat:
"Op een legale manier is het niet te downloaden"
Overigens: mogelijk ben ik erin geslaagd een originele box van Visual Studio 6.0 te kopen. Ik heb vandaag bericht ontvangen van de douane dat het wordt ingeklaard. Zodra ik het binnen heb en heb gecontroleerd zal ik het melden. Een verklaring van echtheid en legaliteit heb ik al binnen.
Titel: Re: Error "Unknown"
Bericht door: Michel Uphoff op 27 februari 2010, 13:36:47
Dag Jan,
 
Citaat
20100226LOG.prn
Als (op het actuele bestand na) alle .prn bestanden weg mogen, dan kan je dus eenvoudig na het tijdelijk hernoemen van het actuele bestand alle prn bestanden wissen.
Zijn er andere .prn bestandjes die niet weg mogen dan zou je het via kill *LOG.prn op kunnen lossen.
Omdat  het bij een load event van het main form gebeurt waardoor de actuele log niet in gebruik kan zijn en er ook niets erstigs kan gebeuren als het actuele prn of de te wissen prn bestanden niet bestaan kan je in dit geval met een quick and dirty on error resume next voor deze sub als foutafvang af, bijvoorbeeld:
 
sub (WisLogs)
on error resume next
name App.Path & "\LOG\" & Vandaag & "LOG.prn" as App.Path & "\LOG\" & Vandaag & "LOG.bak"
Kill App.Path & "\LOG\*LOG.prn"
name App.Path & "\LOG\" & Vandaag & "LOG.bak" as App.Path & "\LOG\" & Vandaag & "LOG.prn"

end Sub
 
Titel: Re: Error "Unknown"
Bericht door: jvdpeet † op 6 maart 2010, 00:47:49
Peter,
De hierboven door jou gegeven code geeft bij mij dezelfde fout "Unknown".
Michel,
Het bestand dat niet verwijderd moet worden een andere suffix geven, de overige bestanden verwijderen en het renamed bestand weer zijn oude naam terug geven lijkt te helpen. Wel moet er wat extra code aan besteed worden voor de verschillende voorkomende situaties. Het hangt er namelijk van af wanneer je het programma start en wat er op dat moment in de map LOG staat. 
Overigens, beide bedankt voor de gegeven respons.
Titel: Re: Error "Unknown"
Bericht door: Peter op 6 maart 2010, 01:17:45
Hoi Jan,

Citaat
door jou gegeven code geeft bij mij dezelfde fout "Unknown".
OK, vervang de Sub RemoveLogFiles() door de code hieronder. Er zijn wat meldingen toegevoegd om te achterhalen wanneer die melding "Unknown" nu verschijnt. In welke volgorde zie je de teksten verschijnen en waartussen komt dan de melding "Unknown."?
Kun je van die melding eens een screenshot maken en hier posten? Ik ben zeer benieuwd.


Sub RemoveLogFiles()
'Verwijderen oude logbestanden behalve van 'BerekendeDatum'.
Dim MyPath$, MyFile$
Dim etxt$, filename$

On Error GoTo errhandle

   MsgBox "RemoveLogFiles Start"
   Aanroep2 = "ControleKoersBestanden"
   MyPath = ext(App.Path) & "LOG\"
   MyFile = Dir(MyPath & "*.*")
   Do While MyFile <> ""
       If Left$(MyFile, 8) <> BerekendeDatum And Left$(Right$(MyFile, 7), 3) = "LOG" Then
          Kill MyPath & MyFile
       End If
       MyFile = Dir
   Loop
   Aanroep2 = ""
   MsgBox "RemoveLogFiles Klaar"

errexit:
   MsgBox "RemoveLogFiles Einde"
   Exit Sub
   
errhandle:
   etxt = Err.Number & ":" & Err.Description & " in RemoveLogFiles."
   MsgBox etxt
   Resume errexit
End Sub


Peter
Titel: Re: Error "Unknown"
Bericht door: jvdpeet † op 7 maart 2010, 12:24:42
Hoi Peter,
Deze code werkt inderdaad: de fout is weg.
Wederom bedankt voor je advies.
Ik heb echter nog een vraag. De logbestandscode die ik in mijn programma gebruik is nogal summier. Ken je code die uitgebreider is en meer informatie geeft, zoals API-code welke meer foutinformatie geeft?
Titel: Re: Error "Unknown"
Bericht door: jvdpeet † op 7 maart 2010, 12:28:23
Hoi Michel,
De code voor het verwijderen van oude logbestanden die je me gegeven hebt werkt prima.
Ik heb nu twee oplossingen die beide werken: die van jou en die van Peter.
Hartelijk dank voor de assistentie.
Titel: Re: Error "Unknown"
Bericht door: Peter op 7 maart 2010, 13:14:52
Citaat
Deze code werkt inderdaad: de fout is weg.
Dat is mooi, maarre... Welke heb je nu gebruikt, die in bericht #5 of die in bericht #14 ?

Citaat
De logbestandscode die ik in mijn programma gebruik is nogal summier. Ken je code die uitgebreider is en meer informatie geeft, zoals API-code welke meer foutinformatie geeft?
Wil je meer informatie loggen als er iets mis is? Zoja, dan zul je die informatie erbij moeten zetten, bijv. variabele-waardes of fictieve regelnummers toevoegen. API-foutcode is alleen van belang als je daadwerkelijk met een API-call bezig was.


Peter
Titel: Re: Error "Unknown"
Bericht door: jvdpeet † op 7 maart 2010, 15:06:18
Peter,
Ik heb de laatste code gebruikt, dus 15.
Titel: Re: Error "Unknown"
Bericht door: Peter op 7 maart 2010, 15:40:38
Citaat
Ik heb de laatste code gebruikt, dus 15.
En met de code uit bericht #5 krijg je de melding "Unknown" ?
Vreemde zaak, het enige verschil is dat er 3 MsgBox() calls toegevoegd zijn.
Maar goed, als het werkt, afblijven.


Peter
Titel: Re: Error "Unknown"
Bericht door: Michel Uphoff op 7 maart 2010, 16:42:56
Hoi Peter,
 
Citaat
Vreemde zaak, het enige verschil is dat er 3 MsgBox() calls toegevoegd zijn
Timingprobleem? Ik heb het ook wel gehad dat om niet begrepen reden een foutmelding alleen verdwenen als ik een korte vertraging invoegde.
Titel: Re: Error "Unknown"
Bericht door: Peter op 7 maart 2010, 19:29:00
Citaat
Timingprobleem?
Als het een timingprobleem is, is dat beter op te lossen door een wachttijd in te bouwen of een DoEvents() call ipv nu met een MsgBox() die je weg moet klikken.
In dit geval worden de MsgBox() calls vooraf en achteraf getoond. In de opruimactie voor de logbestanden hebben ze geen invloed.

Een nauwkeurige analyse is alleen te maken als we de gehele Form_Load() code kunnen zien.


Peter

Titel: Re: Error "Unknown"
Bericht door: Michel Uphoff op 7 maart 2010, 20:21:48
Citaat
Als het een timingprobleem is, is dat beter op te lossen door een wachttijd in te bouwen of een DoEvents() call ipv nu met een MsgBox() die je weg moet klikken.
Ja natuurlijk, ik zie het al voor me <G>.
Het was meer een opmerking in de zin van: Als een MsgBox het probleem oplost dan zal het wel een timing probleem zijn.
 
Overigens, op DoEvents ben ik zo dol niet, omdat dat vaak Cpu onvriendelijk is zeker als je lange wachtlussen hebt. Ik gebruik voor wat langere pauzes al jaren een kleine module die ik een keer van het internet geplukt heb en die de cpu onmeetbaar belast. Wait.bas. Eenvoudig aan te roepen met bijv. Wait (10) (pauzeer voortgang vb code met 1 seconde).
 
Zal hem aan dit berichtje hangen, even de extensie .txt terugzetten naar .bas om het weer een module te laten zijn. Kan er handig zijn voor lezers die een goede pauzemodule willen.
Titel: Re: Error "Unknown"
Bericht door: Peter op 7 maart 2010, 21:03:13
Citaat
Overigens, op DoEvents ben ik zo dol niet, omdat dat vaak Cpu onvriendelijk is zeker als je lange wachtlussen hebt.
Een enkele DoEvents verhelpt soms kleine timingsproblemen of schermverversingen.
Voor langere wachttijden in het idd niet geschikt. Ik gebruik dan een timerloop, een timer-control of de API Sleep, afhankelijk van de situatie.


Peter
Titel: Re: Error "Unknown"
Bericht door: jvdpeet † op 8 maart 2010, 19:24:46
Hoi Peter,
Je verwondert je erover dat de laatste code, die op een paar messageboxen na identiek is aan de eerder gegeven code, wel werkt en de eerder gegeven code niet, maar het is toch echt waar. Als ik de messages op tekst zet krijg ik de fout wel en als code niet. Dus de vertraging werkt wel degelijk.  De fout "Unkown"  en de fout "Disk or network error" hadden dus dezelfde achtergrond, namelijk het nog niet bekend zijn van de paden. Omdat het steeds wegklikken van de messageboxen hinderlijk is komt de vertragingscode van Michel ook van pas om dat probleem op te lossen.
 
 
Titel: Re: Error "Unknown"
Bericht door: Peter op 8 maart 2010, 21:07:36
Citaat
Als ik de messages op tekst zet krijg ik de fout wel en als code niet.
Kun je nog eens proberen wat er gebeurt als je alleen de 1e MsgBox inschakelt, of alleen de laatste.

Citaat
De fout "Unkown"  en de fout "Disk or network error" hadden dus dezelfde achtergrond, namelijk het nog niet bekend zijn van de paden.
Het niet bekent zijn van paden heeft mijn inziens niets met timing te maken maar met een verkeerde volgorde van programma-code uitvoeren.


Peter
Titel: Re: Error "Unknown"
Bericht door: jvdpeet † op 9 maart 2010, 01:11:30
Peter,
Als ik alleen de eerste of alleen de laatste inschakel is de fout weer terug.
Als alle msg's zijn ingeschakeld en er zit geen bestand in map LOG, dan is de fout er ook.
Titel: Re: Error "Unknown"
Bericht door: Peter op 9 maart 2010, 19:34:25
Citaat
Als alle msg's zijn ingeschakeld en er zit geen bestand in map LOG, dan is de fout er ook.
Hmm, dit lijkt dan weer niet op een timingprobleem.
Vervang eens de regel
   MyFile = Dir(MyPath & "*.*")
door
   MyFile = Dir(MyPath & "*.*", vbArchive)
Maakt dat verschil?


Peter
Titel: Re: Error "Unknown"
Bericht door: jvdpeet † op 9 maart 2010, 21:05:02
Peter,
Nu krijg ik weer error "Unknown".
Wat zou dat vbArchive moeten doen? Ik ken deze variabele niet.
Titel: Re: Error "Unknown"
Bericht door: Peter op 9 maart 2010, 22:37:54
Citaat
Wat zou dat vbArchive moeten doen?
Daarmee worden alleen bestanden doorlopen waarvan het Archive-bit gezet is. Het Archive-bit van een bestand wordt automatisch gezet als een wijziging in dit bestand plaatsvind.

Mogen we de volledige code van de functie EXT() zien?


Peter
Titel: Re: Error "Unknown"
Bericht door: jvdpeet † op 10 maart 2010, 01:09:03
Hoi Peter,
Natuurlijk mag je die zien: hier is de code tussen << >>
<<  Public Function ext(pad As String) As String
Select Case Right(pad, 1)
Case "\"
    ext = pad
Case Else
    ext = pad & Chr(92)
End Select
End Function >>
Titel: Re: Error "Unknown"
Bericht door: Peter op 10 maart 2010, 20:33:41
Hoi Jan,

OK, dat kan de fout ook niet verklaren.

PS, Waarom heb je voor Select Case... gekozen? M.i. is If ... Then ... Else ... beter leesbaar.


groeten, Peter
Titel: Re: Error "Unknown"
Bericht door: jvdpeet † op 11 maart 2010, 01:06:02
Hoi Peter,
Inderdaad is If . . .  Then . . .  Else beter leesbaar, maar ik heb deze code indertijd van jou overgenomen. Dit was toen het bij mij scheef liep met of zonder / in het applicatiepad en je mij voordeed hoe ik problemen daarmee kon voorkomen.
Titel: Re: Error "Unknown"
Bericht door: Peter op 11 maart 2010, 20:53:42
Citaat
Dit was toen het bij mij scheef liep met of zonder / in het applicatiepad en je mij voordeed hoe ik problemen daarmee kon voorkomen.
Oh, dat is al ff geleden dan.


Peter