Newsgroup: it.comp.lang.visual-basic
Titolo: il solito bibliotecario principiante...

Ho scoperto 
http://www.murialdo.it/it_lang_vb/
e che c'e' grande disponibilita' tra i programmatori:
un nome per tutti, Maurizio Borelli che vorrei
ringraziare, anche senza adulare ;-) 
Detto questo, passo ad una richiesta di soluzione,
sperando di non abusare.
In biblioteca lavoriamo con una classificazione
decimale detta Dewey (un numero Dewey puo' essere
questo ad esempio: 960.3). Abbiamo una lista di oltre
20 mila record dalla quale ricavare una tabella di 10
record, accorpando tutti i numeri per centinaia (cosi'
960.3 ricadrebbe nel range 900-999). Credo che
concettualmente non sia difficile: su carta ho scritto
qualcosa.
classe = 100
i = 1
d =1
se Ai<100
allora
Bd = Ai + Bd
i=i + 1
altrimenti
classe = classe + 100
d = d + 1
End If
Ammesso come vada bene, provo e provo ma conoscendo
praticamente niente Visual Basic (ma prometto di
studiare...) il programma non gira.
Grazie e ciao a tutti.Fabio
(leggo il ng da 
mailgate.org
: visto che i messaggi
memorizzati non sono molti, se rispondete dopo
venerdi' pomeriggio, scrivetemi al mio indirizzo)
fza...@yahoo.it
______________________________________________________________________
Do You Yahoo!?
Il tuo indirizzo gratis e per sempre @
yahoo.it
 su 
http://mail.yahoo.it
-- 
Posted from 
web9607.mail.yahoo.com
 [216.136.129.186] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 wrote in message
news:2000121410271...@web9607.mail.yahoo.com...


 record, accorpando tutti i numeri per centinaia (cosi'
qualcosa come:
dim j as byte
for j = 0 to 9
    numero = select count(*) from tabellona _
        where left(tabellona.cdd, 1) = cstr(j)
next
(se vuoi la sintassi precisa ho bisogno di sapere com'e' fatta la tabellona.
intanto, se guardi l'help di count in sql ti fai un'idea).
cioe': per raggrupparli per classe puoi basarti sul primo carattere della
classe (0,1,2...).
lo stesso giochino puoi farlo per le decine e le centinaia, pero' j devi
dichiararlo come integer (byte tiene 0-255).
ciao, a.


 (leggo il ng da 
mailgate.org
: visto che i messaggi memorizzati non sono
molti, se rispondete dopo venerdi' pomeriggio, scrivetemi al mio indirizzo)
Manco morto. >:-|
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

Se non sbaglio, così da errore. Nel tuo stesso esempio, int (tra l'altro è nome
non valido) varrà 10 (oltre la dim dell'array).
Io direi (uso i al posto di int):
i = int(val (str) / 100)
tbl(i) = tbl(i) + 1
se è vero, come presumo, che str non possa avere più di tre caratteri a sx del
punto.
Cao, Giorgio.


 se è vero, come presumo, che str non possa avere più di tre caratteri a sx
del punto.
No, il problema e` un altro. Quel codice non era *vero* codice ma una bozza
per dare un'idea dell'algoritmo. Ora ho scritto il codice, ho corretto la
divisione per 100 in una divisione intera, ho usato i dati di esempio che il
maledetto (*) bibliotecario ha disseminato per il ng ed il risultato sembra
essere proprio quello richiesto da Fabio.
Nota pero` che i dati di input reali non sono quelli del mio codice ma
stringhe del tipo:
    9
    94
    944
    945
    945.4
    945.41
    945.42
giusto per rifarci all'esempio di pal.
Option Explicit
Public Sub Main( _
)
  Dim strCodes(0 To 17) As String
  Dim intTable(0 To 9)  As Integer
  Dim intIndex          As Integer
  Dim strCode           As String
  Dim lngItem           As Long
  strCodes(0) = 45
  strCodes(1) = 56
  strCodes(2) = 78
  strCodes(3) = 99
  strCodes(4) = 100
  strCodes(5) = 101
  strCodes(6) = 189
  strCodes(7) = 199
  strCodes(8) = 201
  strCodes(9) = 205
  strCodes(10) = 288
  strCodes(11) = 901
  strCodes(12) = 909
  strCodes(13) = 914
  strCodes(14) = 945
  strCodes(15) = 979
  strCodes(16) = 989
  strCodes(17) = 999
  For lngItem = LBound(strCodes) To UBound(strCodes)
    intIndex _
      = Left$( _
            strCodes(lngItem) _
          , InStr(strCodes(lngItem) & ".", ".") - 1) _
          \ 100
    intTable(intIndex) = intTable(intIndex) + 1
  Next
  For lngItem = LBound(intTable) To UBound(intTable)
    Debug.Print lngItem, intTable(lngItem)
  Next
End Sub
(*) x Fabio Zauli: invece di aprire sempre nuovi thread non potresti
attaccare le tue repliche a quello gia` aperto? Cosi` non dovresti nemmeno
sforzarti di inventare ogni volta nuovi subj... ;-)))


   strCodes(17) = 999
DUBBIO! Ma i dati sono nel formato che dice pal o in quello che dice
Fabio?... Non intendo come *si scrivono* i decimali Dewey, ma come *sono
scritti* nel file.


Beh, se il tuo era metalinguaggio, hai ragione tu, ma allora non dire "ho
*corretto* la divisione".
Una cosa però proprio non mi piace. Se strCode e' String io avrei scritto
qualcosa come
strCodes(0) = "45"
e se intIndex e' Integer allora male s'accoppia con Left$. Io continuerei a
scrivere
intIndex = Int(Val(strCodes(lngItem)) / 100)
Ciao, Giorgio.
Maurizio Borrelli ha scritto:


 scritti* nel file.
(ps -- in fondo cfr un test reale. ho pensato di provarci).
e' il motivo per cui gli ho chiesto la struttura della tabella.
faccio un esempio da una tabella (parziale) della cdd che ho sottomano:
oltre alle 10 classi (0-9) ci sono delle suddivisioni, che servono a
collocare il libro con piu' precisione. es. di suddivisioni geografiche:
4 europa
45 italia
      -45 3 VENETO -- Italia nord-orientale
      -45 31 Venezia
      -45 32 Padova
      -45 33 Rovigo
      -45 34 Verona
      -45 35 Vicenza
      -45 36 Treviso
      -45 37 Belluno
      -45 38 TRENTINO - ALTO ADIGE
      -45 383 Bolzano
      -45 385 Trento
      -45 39 FRIULI - VENEZIA GIULIA
      -45 391 Udine
      -45 392 Gorizia
      -45 33 Trieste
      -45 34 Pordenone
      -45 4 EMILIA-ROMAGNA -- SAN MARINO
      -45 41 Bologna
      -45 42 Modena
      -45 43 Reggio Emilia
      -45 44 Parma
      -45 45 Ferrara
      -45 46 Piacenza
      -45 47 Ravenna
      -45 48 Forli
      -45 49 SAN MARINO
esempio di una (sotto)classe (700 sono le arti) con un po' di suddivisioni.
      741 DISEGNO
      741.01 Disegno - Filosofia e teoria
      741.09 Disegno - Storia e geografia
      741.092 Disegno - Artisti
      741.2 Disegno - Tecniche, attrezzature, materiali
      741.5 Disegno - Vignette, caricature, fumetti
      741.6 Disegno - Progettazione grafica, illustrazione e arte
commerciale
      741.64 Disegno - Libri, copertine di libri
      741.64 Libri - Illustrazione
      741.65 Disegno - Riviste e giornali
      741.67 Disegno - Pubblicita e manifesti
      741.68 Disegno - Calendari, cartoline, biglietti d'auguri e
commerciali
      741.7 Disegno - Silhouette
      741.9 Disegno - Raccolte (indipendentemente dal luogo)
      741.93-99 Disegno - Raccolte di singoli artisti (Tavola 2)
      741.945 Disegno - Raccolte di artisti italiani
      741.945 4 Disegno - Raccolte di artisti emiliani
      741.945 42 Disegno - Raccolte di artisti modenesi
      742 Prospettiva
      743 Disegno per soggetto
in sostanza: se il campo non e' un banale alfanumerico, la vedo muy male...
nb: a parte alcune suddivisioni alla borges, che per tua delizia ti elenco
sotto, come metodo di classificazione _e_ ordinamento fisico non e' male. ha
alcuni problemini, derivanti in genere dal fatto che e' nata e cresciuta
negli usa: i suonatori di ukulele delle hawaii hanno un loro numerino, la
torre di pisa direi di no :)
ecco, qui sotto ci manca solo la voce per i libri miniati con pennello di
tasso...
      090 Manoscritti e libri rari
      091 Manoscritti
      092 Libri silografici
      093 Incunaboli (prima del 1501)
      094 Libri a stampa (fino al 1700, ed. pr., ...)
      095 Legatura (Storia del libro)
      095 Libri notevoli per la legatura
      096 Libri notevoli per le illustrazioni o i materiali
      097 Libri notevoli per la proprieta o l'origine
      098 Opere notevoli per il contenuto
      099 Libri notevoli per il formato
ho provato ora su un archivio vero. il campo cdd e' alfanum.
Option Explicit
Private Sub Command1_Click()
    Dim db As Database, rs As Recordset, j As Byte
    Set db = OpenDatabase("C:\vbprog\mca\MCA.mdb")
    Set rs = db.OpenRecordset("select count(*) from principali")
    Text1 = Text1 & "TOT -- " & rs.Fields(0) & vbCrLf
    For j = 0 To 9
        Set rs = db.OpenRecordset("select count(*) from principali where
left(cdd,1) = " & CStr(j))
        Text1 = Text1 & CStr(j) & " -- " & rs.Fields(0) & vbCrLf
    Next
End Sub
ci mette un paio di secondi:
TOT -- 3081
0 -- 168
1 -- 1
2 -- 18
3 -- 42
4 -- 2
5 -- 11
6 -- 24
7 -- 2475
8 -- 3
9 -- 332

 ecco, qui sotto ci manca solo la voce per i libri miniati con pennello di
tasso...
[...]

Troppo giusto. Ma vuoi mettere le piacevoli considerazioni algoritmiche che
si ponno fare sanza passare per un rdbms?...


 intIndex = Int(Val(strCodes(lngItem)) / 100)
Non sono d'accordo. Proprio per i motivi per cui concordavo con te sulla
questione precedente. Nell'assegnazione precedente, per risparmiare tempo,
facevo lavorare di piu` il processore. In questo caso, invece, io ho
realmente bisogno che vb converta una stringa in Integer. Visto che e`
capace di farlo da solo perche' devo io scrivere di piu`?
