Newsgroup: it.comp.lang.visual-basic
Titolo: Problema con inserimento nuovi campi e colonne..

Salve a tutti
Il codice seguente dovrebbe leggere in sequenza da un file di testo delle
parole, controllare se nel database c'e' una colonna che si chiama come una
delle parole appena lette e nel caso gia' ci sia aggiungerci un campo con
dentro il testo di una variabile e nel caso contrario creare la colonna ed
aggiugere il campo. Per fare questo provo subito a creare la colonna e se
ricevo un'errore vuol dire che una colonna gia' esiste con quel nome. Il
problema sta nel fatto che mi vengono inseriti dei campi vuoti... Esempio:
al primo passaggio crea la colonna pippo e
ci aggiunge un campo all'inizio con dentro il testo della variabile, poi al
secondo passaggio crea la colonna pallo ci aggiunge un campo ma non
all'inizio ma mette un campo vuoto e poi quello nuovo e cosi' via, facendo
un struttura a scaletta...praticamente al quarto passaggio avro' 3 campi
vuoti e poi il campo con dentro il testo...
Dove sbaglio?
Ciao e grazie!
    Set Dbs = OpenDatabase("test.mdb")
    Do While Not EOF(1)   ' Ripete fino alla fine del file.
        Line Input #1, TextLine         ' Assegna la riga alla variabile.
                Dbs.Execute "ALTER TABLE a " & "ADD COLUMN [" & TextLine &
"] TEXT;" 'cerca subito di creare la colonna
                    If Err.Number = 3380 Then ' se c'e' l'errore allora la
colonna esiste e mette dentro i dati
                            Dbs.Execute "INSERT INTO a " & "(" & TextLine &
") VALUES " & "('" & Contenuto & "');"
                       Err.Clear 'pulisce l'errore
                    Else
                        Dbs.Execute "INSERT INTO a " & "(" & TextLine & ")
VALUES " & "('" & Contenuto & "');" 'la colonna non esisteva, cosi' l'ha
creata e adesso mette i dati
                    End If
   DoEvents
    Loop
Dbs.Close
--
World Wide Waste

 ") VALUES " & "('" & Contenuto & "');"
Qual e' lo scopo di INSERT INTO? Leggo nella guida in linea: "Aggiunge un
record ad una tabella. Questa operazione e' definita query di accodamento.".
Tu invece cosa vuoi fare, riscrivere sempre lo stesso record?
--
Ciao.
Maurizio

 Tu invece cosa vuoi fare, riscrivere sempre lo stesso record?
In effetti il tuo codice funziona: fa quello che deve. Il fatto e' che non
e' quello che vuoi tu. Non vorrei essere in errore... facci sapere se
l'interpretazione che ho dato alle tue parole e' corretta e se hai ancora
bisogno.
--
Ciao.
Maurizio

Dbs.Execute "INSERT INTO a " & "(" & TextLine & ") VALUES " & "('" & Contenuto
& "');"
il problema e' l'INSERT INTO: facendo cosi' inserisci tutte le volte un record
nuovo valorizzando solo la colonna 'TextLine' e lasciando a NULL tutte le altre;
dovresti invece, dopo aver eventualmente aggiornato la struttura,  fare un
'UPDATE a SET " & TextLine & "='" & Contenuto & "'".
Attenzione che facendo cosi' aggiorni TUTTI i record della tua tabella; se
invece ti interessa aggiornare solo un record specifico devi aggiungere una
condizione 'WHERE' al tuo comando che ti permetta di identificarlo univocamente.
Ciao
--
Luca Dormio
l...@sig-la.com
ldo...@tin.it

 > Tu invece cosa vuoi fare, riscrivere sempre lo stesso record?
Si ossia data una colonna...eemmm un campo ;)  aggiugere in essa una cella e
scriverci dentro il contenuto della variabile
insomma:
CAMPO_PIPPO
[ 1 cella piena   ]
[ 2 cella piena   ]
[cella vuota        ]  <-------e qiu' scrivo il contenuto della variabile
oppure:
CAMPO_PIPPO
[cella vuota        ]  <-------e qiu' scrivo il contenuto della variabile
Spero sia chiaro...
Grazie

 Spero sia chiaro...
Purtroppo si', 'stavolta, e dico purtroppo perche' non mi sembra una cosa,
senza offesa, 'da principianti'. Provo a riformulare: dato un file di testo
che in ogni sua riga contiene quello che chiameremo NomeDiCampo, tu vuoi
leggere sequenzialmente tale file e, per ogni NomeDiCampo, vuoi creare un
nuovo campo se gia' non esiste un campo con tale nome, quindi vuoi inserire
un dato costante nel primo record in cui il campo NomeDiCampo sia vuoto e
creare un nuovo record se in tutti i record esistenti il campo NomeDiCampo
e' pieno. Siccome tutto cio' ha una sua logica presumo che ci siamo.
A questo punto il problema e' che il codice che hai postato crea un nuovo
record comunque, mentre quello di Luca Dormio... beh, l'ha gia' spiegato
molto bene lui cosa fa.
Considera questo:
1. Leggi un NomeDiCampo dal file, se il campo non esiste lo crei;
2. Cerchi il primo record che ha il campo NomeDiCampo vuoto. Se lo trovi lo
riempi altrimenti aggiungi un record e ne riempi il campo NomeDicampo. Ma
qui sorge anche un altro problema: primo rispetto a che? all'ordine di
inserimento?
Insomma, devi cambiare approccio. Io adesso esco e se questa notte dormo
poco ti scrivo le quattro righe di codice che ti servono. Intanto spero che
ci pensi qualcun altro. Che ne dici di provarci anche tu? Ci fai sapere?
--
Ciao.
Maurizio

 ci pensi qualcun altro. Che ne dici di provarci anche tu? Ci fai sapere?
Che ci sto provando puoi giurarci...
Che poi scusa...visto che sembra cosi complicato, non c'e' un modo
utilizzando il codice originale che fa l'effetto scaletta di fare un
ordinamento? esempio:
Campi da ordinare:
Nome_campo1        Nome_campo2
[    testo1         ]        [                        ]
[                        ]        [  testo1           ]
[                        ]        [                        ]
[                        ]        [  testo2           ]
Campi ordinati:
Nome_campo1        Nome_campo2
[    testo1         ]        [  testo1            ]
[                        ]        [  testo2           ]
[                        ]        [                        ]
[                        ]        [                        ]
......e perdonatemi se dico cavolate...
Saluti e grazie ancora.

 wrote in message 7gq93q$rlr$1...@nslave1.tin.it...
Ho creato il file di testo Test.Txt:
Campo2
Campo3
Campo1
Campo2
Campo4
Campo1
Ho creato il file di Access Test.Mdb, la tabella Tabella1 con un campo di
testo Campo1.
Poi ho eseguito 3 volte questo codice:
Option Explicit
DefBool B
DefCur C
DefDbl D
DefSng F
DefInt I-K
DefLng L
DefObj O
DefStr S
DefDate T
DefVar V
DefByte Y
Public Sub Main()
Dim MyDb As Database
Dim MyFd As Field
Dim MyRs As Recordset
Dim b
Dim i
Dim iFF
Dim sCriteria
Dim sDatabaseName
Dim sFileName
Dim sTableName
Dim sTextLine
  Let sDatabaseName = "C:\Progetti\Access\Test.Mdb"
  Let sTableName = "Tabella1"
  Let sFileName = "C:\Progetti\Access\Test.Txt"
  Set MyDb = Workspaces(0).OpenDatabase(sDatabaseName)
  Set MyRs = MyDb.OpenRecordset(sTableName, dbOpenDynaset)
  Let iFF = FreeFile
  Open sFileName For Input As iFF
  Do While Not EOF(iFF)
    Line Input #iFF, sTextLine
    Let b = False
    With MyDb.TableDefs(sTableName)
      For i = 0 To .Fields.Count - 1
        If StrConv(sTextLine, vbUpperCase) = StrConv(.Fields(i).Name,
vbUpperCase) Then
          Let b = True
          Exit For
        Else
        End If
      Next
    End With
    If b = True Then
    Else
      MyRs.Close
      Set MyFd = New Field
      With MyFd
        .Name = sTextLine
        .Type = dbText
      End With
      Call MyDb.TableDefs(sTableName).Fields.Append(MyFd)
      Set MyFd = Nothing
      Set MyRs = MyDb.OpenRecordset("Tabella1", dbOpenDynaset)
    End If
    sCriteria = "IsNull([" & sTextLine & "])"
    MyRs.FindFirst sCriteria
    If MyRs.NoMatch Then
      MyRs.AddNew
    Else
      MyRs.Edit
    End If
    MyRs(sTextLine) = Format$(Now(), "hh.mm.ss")
    MyRs.Update
  Loop
  Close
  MyRs.Close
  MyDb.Close
  Set MyRs = Nothing
  Set MyDb = Nothing
End Sub
E questo e' il risultato:
[Campo1] [Campo2] [Campo3] [Campo4]
03.23.42 03.23.42 03.23.42 03.23.42
03.23.42 03.23.42 03.23.47 03.23.47
03.23.47 03.23.47 03.23.51 03.23.51
03.23.47 03.23.47
03.23.51 03.23.51
03.23.51 03.23.51
Ci siamo?
--
Ciao.
Maurizio

Funziona alla grande Massimo tranne che dopo un po da errore di record too
large ma non posso chiedere troppo dalla vita hehehe :)))
Grazie ancora!!!!!!!!!

 large ma non posso chiedere troppo dalla vita hehehe :)))
A me invece questa non va giu'. Si puo' consocere qualche dettaglio?
--
Ciao.
Maurizio

> A me invece questa non va giu'. Si puo' consocere qualche dettaglio?
Hehehehe .)))
Dunque...praticamente (dalla documentazione che ho letto al riguardo) un
record non puo' contenere piu' di 2kb (boh' a me sembra veramente
pochino...). Percio' dopo un po che aggiungi qualche campo e il record
cresce in lunghezza da questo erroe. Basta fare anche una prova velocemente
dentro excell...fai una tabella con 10 campi, e nello stesso record per ogni
campo ci scrivi una stringa di 255 byte (la lunghezza massima che puoi
scrivere in una cella) . Questa operazione la potrai fare fino al campo
8....gia' nel nono non puoi scrivere nemmeno una virgola..dopo tutto 255*8
fa  2040...i torni contano...emmmm i conti tornano...
Saluti...
p.s.
Non essendo un esperto di database sicuramente diro' una boiata....pero solo
2kb per un record mi pare una gran schifezza...

 2kb per un record mi pare una gran schifezza...
Piano prima di parlare di schifezza: meno si conosce, piu' limiti si trovano
agli strumenti che abbiamo a disposizione. Con questo non voglio dire che
non ci si debba lamentare dei prodotti Microsoft: e' un nostro diritto,
visto che li paghiamo.
Che versione di Excel usi?
E di Access?
In Excel non si puo' fare una tabella con 10 campi, la si puo' simulare con
un Elenco o un Database, termine, questo, da non confondere con un Database
Access.
--
Ciao.
Maurizio

 E di Access?
97
Ma tu hai provato da te?
Saluti

 wrote in message 7h7pkc$1rc$1...@nmaster.tin.it...

Ovviamente si'. Nulla di quello che segnali succede. Ne' dovrebbe succedere.
Non puoi spiegare meglio? Per esempio, quella faccenda dei 255 caratteri mi
puzza. Che non si possano piu' inserire dall'ottava cella, poi... e di che
riga? Quanta RAM? Disco fisso?
Vedi, io ho fatto cosi':
_|___A___|___B___|___C___|___D___|___E___|
1 Campo0  Campo1  Campo2  Campo3  Campo4
2
_|___F___|___G___|___H___|___I___|___J___|
1 Campo5  Campo6  Campo7  Campo8  Campo9
2
In A2 ho inserito una stringa lunga 1040 caratteri che poi ho copiato a
destra fino a J2, quindi ho selezionato A2:J9 ed ho ricopiato in basso per
999 righe. Salvato, chiuso Excel, riaperto... tutto a posto.
No, c'e' qualcosa che non mi torna.
--
Ciao.
Maurizio