Newsgroup: it.comp.lang.visual-basic
Titolo: [?] CONSIGLIO per MERGE di mdb.

ciao,
forse qualche d'uno mi può consigliare su come procedere o possa fare per
avere un IMPORT-MERGE:
-Ho un'applicazione database.mdb access2000.
-Avrei ora la necessità di poter importare "miscelando a determinate
condizioni" due database con stessa struttura, diciamo creati dalla mia
applicazione, ma per determinati record's NON già presenti nel DATABASE1.
Dunque, se riesco a spiegarmi:
- Sono nella mia applicazione con il DATABASE1.MDB aperto
- Ho un DABABASE2.MDB con dei dati che dovrei importare ma a determinate
condizioni
   quindi LEGGO IL DATABASE2 record per record dal primo all'ultimo
   condizione 1 - se non presente in modo identico nel database1.mdb
                          campo=campo importa e accoda il record da
Dbase2.mdb in Dbase1
   condizione 2 - se è presente, verifico che la data di salvataggio (che ho
nel campoX o
                          altro dato IF THEN nella sequenza di conferma)
                          è + aggiornata rispetto allo stesso e quindi in
questo caso:
                          cancello il record dal DATABASE1 e SALVO il
                          RECORD dal DATABASE2 in DATABASE1
                          mentre in caso contrario SALTO al prossimo
diciamo na roba del genere... ma prima di inoltrarmi in cose più difficili
di quanto mai sappia fare... "sorry",,... chiedo sempre i consigli di come
possa fare per evitare i classici loop... a chi finora sul NG mi ha aiutato
in modo SUPER!!!
GRAZIE E3 per qualsiasi consiglio o idea di come procedere e come intavolare
il tutto.
Anto.
-----= Posted via Newsfeeds.Com, Uncensored Usenet News =-----
http://www.newsfeeds.com
 - The #1 Newsgroup Service in the World!
-----==  Over 80,000 Newsgroups - 16 Different Servers! =-----

In brevi parole:
DATABASE2.mdb entra in DATABASE1.mdb controllando e aggiungendo o
sostituendo record "vecchi" a determinate condizioni IF THEN....
Della serie che se
DBASE1 >>> DBASE2
oppure
DBASE2 >>> DBASE1
Il dbase risultante dei due casi dovrebbe essere identico!!
Qualche consiglio di strada da prendere?
Grazie_E3
Anto


> Qualche consiglio di strada da prendere?
Ah... dimenticavo,... non in ACCESS ma tutto in VB6 nel quale sto
"lavorando" !!!
sry... mi sembrava evidente ma si sa mai... hi ;-)))
ciao
Anto.


cerca nella guida sql di access
select * from ... where ...
insert into ...
tip: cerca con un loop di girare in una stringa i campi del record da
selezionare, escludendo eventuali contatori.
se non ci riesci ci sentiamo lunedi'.
ciao, j.
"ApipApip" <Chied...@AskMe.com> ha scritto


Ciao.
Potresti postare la struttura della tabella da getire, così da poter
identificare campi chiave, indici, campi univoci ecc.?
In linea di massima personalmente realizzerei un programma che lavora più o
meno come hai descritto te (ricerca record uguali, altrimenti controllo
record più recente ecc.) sicuramente lavorando sotto transazione, però ci
sono vari fattori da tenere presente.
Ad esempio, è un programma "usa-e-getta" nel senso che ti serve per riunire
una volta per tutte 2 DB e poi non lo useresti più, altrimenti servirà
spesso, e quando verrebbe usato (in contemporanea al lavoro di un utente o
in task notturno?)
Tutto questo per stabilire se si deve fare attenzione alla velocità di
esecuzione piuttosto che alla stabilità...
Cmq il controllo di "ugualianza" record andrebbe fatto su tutti i campi o
esistono uno o più campi per cui si può definire univoco il record?
Byez
Tango

 esistono uno o più campi per cui si può definire univoco il record?
=================================================
Ciao Tango, grazie mille per la risposta, magari puoi proprio aiutarmi,
te ne sarei infinitamente grato!
Premetto che con i database sono piuttosto "duro" nel capire le varie
modalità d'uso... puoi capire fare un merge... e mi scuso per qualche
forte banalità o peggio che possa dire.
Dunque, sono 50 campi per record strutturati come classico
"archivio" DATABASE.MDB contenente una tabella LOG che creo con:
---cut---
    'Definisce il nome del database
    Set cat = New ADOX.Catalog
    cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" &
Log_DB_NameB & ";"
    'Crea un nuovo oggetto tabella
    Set tbl = New ADOX.Table
    With tbl
        .Name = "Log"
        'seguono le 50 colonne dei campi record
    [...]
--cut---
come indicizzazione utilizzo alla fine del processo di creazione delle
colonne nella tabella:
---cut---
    cat.Tables.Append tbl
    Idx.Name = "Indici"
    Idx.Columns.Append "TDate"     ' DATA e ORA
    Idx.Columns.Append "S_Call"    ' nome comune tipo "string"
    Idx.IndexNulls = adIndexNullsAllow
    tbl.Indexes.Append Idx
---cut---
Per l'utilizzazione della routine diciamo che dovrebbe essere un'opzione del
e nel programma stesso che permetta di avere ad esempio due database (uno in
ufficio e uno sul portatile) che aggiornati separatamente saltuariamente,
siano in grado di rimescolare i loro dati in un unico database con un
"mixing" di tutti e due.
In pratica, nel database del laptop "mergio" (che parolaccia...) quello
dell'ufficio e nell'ufficio mescolo quello del laptop con il risultato di
due database identici sulle due macchine.
Il rimescolamento potrebbe arrivare anche tra due database con 50'000
record, attualmente, in media, siamo sui 10'000 record di 50 campi ognuno.
Per la velocità, calcola che attualmente per ricreare un database con
---cut---
CreateDatabaseX  'Crea ExportMDB
StrSQL = "INSERT INTO Log  IN '" & App.Path & "\data\ExportDT.mdb' SELECT *
FROM Log "
StrSQL = StrSQL & Filtro & ";"
CnnList.Execute StrSQL
---cut---
e con 10'000 record, su PIII500 impiego solo 10 secondi, dalla creazione al
INSERT TO con filtro "" ma senza controllare nulla e in un database vuoto di
tutti i 10'000 records.
Come struttura praticamente ci sono nei 50 campi.
CAMPO1 - CAMPO2 - CAMPO3 - CAMPO4 - CAMPO5 - DATAORA1
Dove CAMPOx sono delle variabili  "adVarWChar"
mentre DATAORAx variabile adDate  '(data e ora)
Solo se CAMPO1/DATAORA1 (database1) = CAMPO1/DATAORA1(database2) sono uguali
passo al controllo nei successivi campi per verificare l'uguaglianza.
Quindi:
-Se CAMPO2-3-4-5 sono diverse AGGIUNGERE e passare next record
-Se queste condizioni sono IDENTICHE dovrebbe controllare un DATAORA2
inserito appositamente come riferimento di "differenza per campi
identici/aggiornati" (sempre adDate) che aggiorno ad ogni SAVErecord quindi:
- if DATAORA2(database1) = oppure < DATAORA2(database2) then salta al
prossimo record
- if DATAORA2(database1) > DATAORA2(database2) then sovrascrivi (nel senso
cancella e aggiungi)
Comunque, a parte la "spatafiata" descritta, anche piuttosto incasinata, per
cominciare sarebbe sufficiente prima di tutto trovare di:
LEGGERE DATABASE2
LEGGERE OGNI SINGOLO RECORD CAMPO1-50
SALVARE IN DATABASE1 DOPO CONTROLLO di CAMPO1 come verifica di uguaglianza
oppure SALTARE al prossimo record o cancellare e/o aggiornare l'update del
record
Ma già qui mi perdo...hihi... sry!
scusa la lunghezza!
ciao e ancora grazieE3 per qualsiasi aiuto.


 ha scritto nel messaggio
news:ac61gc$mosim$1...@ID-51318.news.dfncis.de...



Ciao, beh non è troppo difficile l'operazione.
Ci sono vari modi per farlo.
- Aprire con Recordset contemporaneamente sui 2 DB e lavorare sui recordset
facendo select (con campi di controllo), insert o update classici.
- Scaricare un DB su un file di tipo BCP e poi scandirlo facendo i soliti
controlli (scelta consigliata, così hai un solo DB aperto alla volta)
Cmq, in linea di massima dei usare le connessioni ADO e realizzare un loop
in cui o apri tutto un DB e scandisci i singoli record che confronti con
l'altro DB, o un loop fino a che non hai letto tutto il file BCP.
Es.
While not l_adoRSdb2.EOF
    l_sSQL = "SELECT COUNT(*) as tot_rec FROM TABELLA WHERE ..." 'Elenco
campi di controllo presi da l_adoRSdb2
    set l_adoRSdb1 = new Recordset
    l_adoRSdb1.Open l_sSQL, g_adoConnectionDB1
    If l_adoRSdb1!tot_rec = 0 Then 'Record non trovato lo aggiungo
        l_sSQL = "INSERT INTO TABELLA (campo1, campo2, campo3, ..., campoN)
VALUES (..." 'Valori presi da l_adoRSdb2
    Else 'Record Trovato, controllo la data...
        .
        .
        .
    End If
    l_adoRSdb1.Close
    Set l_adoRSdb1 = Nothing
    l_adoRSdb2.MoveNext
Wend
Se invece usi un file le cose cambiano di poco, dato che il loop appunto è
sull'EOF del file e ogni volta che leggi una riga devi splittarla in un
vettore, utilizzando il campo separatore, e considerare tale vettore come
una specie di Recordset dove ogni cella è un campo.
Byez
Tango

 Tango
Urka urka... qui devo studiare bene il tutto, grazie mille, passo alla
strutturazione di quanto mi hai allegato.
Grazie mille ancora...
Provo se riesco a completare il tuo ottimo scritto adattandolo al mio caso.
In caso di classici orrori da parte mia mi permetterò chiederti un
aiutino...
Non preoccuparti se ti riscrivo fra un mese :--)))) il problema è il mio nel
tradurre e adattare il codice... della serie... più imbranato di così si
muore... alla faccia degli mdb...:-)))
4TOmoment GRAZIE MILLE!!!!!!
Anto
