Newsgroup: it.comp.appl.access
Titolo: Contare record in file di testo

Ciao a tutti.
Ho l'esigenza di contare velocemente  i record presenti in un grosso file di 
testo.
ho utilizzato il seguente metodo, seguendo i consigli dati in un post di 
qualche tempo fa.
---------------------------------------------------------
Option Compare Database
Option Explicit
Private Declare Function SendMessage Lib "user32" _
   Alias "SendMessageA" _
  (ByVal hwnd As Long, _
   ByVal wMsg As Long, _
   ByVal wParam As Long, _
   lParam As Any) As Long
Private Declare Function apiGetFocus Lib "user32" _
        Alias "GetFocus" _
         () As Long
Private Const EM_GETLINECOUNT = &HBA
****
Function fhWnd(ctl As Control) As Long
    On Error Resume Next
    ctl.SetFocus
    If Err Then
        fhWnd = 0
    Else
        fhWnd = apiGetFocus
    End If
    On Error GoTo 0
End Function
****
Private Sub Tasto_Click()
 Dim fno As Integer
    Dim fname As String
    Dim cnt As Integer
    Dim lineCount As Long
    Dim hwndCtl As Long
    On Local Error Resume Next
    'load the file into the textbox
    fname = "c:\testo.txt"
    fno = FreeFile    <- questo l'ho aggiunto io altrimenti la casella di 
testo non si riempiva
    Open fname For Input As #fno
        Me!Text1 = Input$(LOF(fno), fno)
    Close #fno
    hwndCtl = fhWnd(Me!Text1)
   'get/show the number of lines in the edit control
    lineCount = SendMessage(hwndCtl, EM_GETLINECOUNT, ByVal 0&, 0&)
    MsgBox "Numero linee = " & Format$(lineCount, "##,###")
end sub
------------------------------------------------------------------------------------------------------------
la casella di testo non si riempiva e ci sono riuscito aggiungendo la riga:
fno=FreeFile
il punto è che linecount è sempre = 0
Utilizzo Access 2002
Qualcuno ha qualche consiglio per venirne fuori?
Grazie 1000
Roberto 

"santommaso" <santo...@Calendario.net> ha scritto nel messaggio news:f6t1r3$9kp$1...@nnrp.ngi.it...

(ci provo)
Se il file è sempre 1 e lo chiudi non hai bisogno della funzione FreeFile:
...
    Open fname For Input As #1
        Me!Text1 = Input$(LOF(1), 1)
    Close #1
...
Ciao.
-- 
Sergio MAZZA 

 Roberto
Presumo di essere l'artefice di questa roba... almeno l'ho ritrovata
in un 3D mio...!
Il problema potrebbe essere relativo al fatto che la TextBox non ha
generato il Redraw... e questo lo verifichi semplicemente provando a
verificare la proprietà Value della stessa.
Se ti viene restituito NULL è come se fosse vuota, e necessita di un
INVIO dopo l'incollamento dell'ultima riga...
A quel punto spezza in 2 la routine per fare il Test, il Conteggio lo
fai eseguire su CLICK di un Button, il semplice spostamento del Focus
dovrebbe mettere tutto a posto... poi se ci avessi preso invii un
SendKeys con invio.... prima della chiamata
a SendMessage...
@Alex

a SendMessage...
si si, è proprio farina del tuo sacco :-)
la casella di testo è piena e correttamente visualizzata.
il problema sta nel conteggio. il risultato è 0
Ciao e  Grazie
Roberto


E' possibile possa dipendere dalle dimensioni del file...
Hai provato con un file Piccolo...?
Se con il file piccolo funziona, significa che questo metodo(almeno in
VBA) ha problemi, ed allora conviene usarne un'altro.
@Alex

VBA) ha problemi, ed allora conviene usarne un'altro.
il file utilizzato per le prove ha solo 10 righe. Quindi non è una questione 
di file.
Magari ho sbagliato qualche cosa io... ma mi pare di avere seguito 
esattamente i consigli.
Esistono altri metodi che permettano un veloce conteggio?
Ciao
Roberto 

"santommaso" <santo...@Calendario.net> ha scritto nel messaggio
news:f702j4$g10$1...@nnrp.ngi.it...

Mandami il Demo, se non funziona ti allego un'alternativa.
-- 
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.sitocomune.com/
http://www.alessandrobaraldi.it
---------------------------------------------------------------------------

> Mandami il Demo, se non funziona ti allego un'alternativa.
te l'ho inviato, grazie!!!! 


Il Codice API non funziona con Access, evidentemente la Classe TextBox di
Access è insensibile
al messaggio EM_GETLINECOUNT, quindi FALLITO.
Puoi provare con questo codice che mi pare anche molto comprensibile, usa
FileSystemObject:
Sub ContaLinee(Percorso As String)
    Dim j As Variant
    Dim Fso As Object
    Dim FIn As Object
    Dim fname As String
    Set Fso = CreateObject("Scripting.FileSystemObject")
    ' verifico che il file di input esista
    If Fso.FileExists(Percorso) Then
        Set FIn = Fso.OpenTextFile(Percorso, 1, False, 0)
        j = FIn.ReadAll()
        j = FIn.Line
        FIn.Close
        MsgBox "FSO: lines: " & CStr(j)
    End If
    Set Fso=Nothing
    Set FIn=nothing
End Sub
Private Sub Comando4_Click()
    Call ContaLinee(CurrentProject.Path & "\test.txt")
End Sub


 Puoi provare con questo codice che mi pare anche molto comprensibile, usa
[CUT]
Ok, il codice nuovo funziona bene.
Carico file con circa 100.000 record e il conteggio non mi è sembrato 
velocissimo, ma va farò ulteriori prove.
Grazie, sei sempre gentilissimo.
Roberto