Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] Quesito su import da file di testo

Ciao a tutti,
ho un problema nel realizzare un piccolo tool di importazione dati in un 
db, spiego:
 
Ho un file di testo con i seguenti campi
 
DescrizioneProduttore | CodiceArticolo | DescrizioneArticolo | IVA | ...ecc
 
 
mentre nel mio db di destinazione ho due tabelle: Produttori e Articoli
 
La tabella Produttori ha solo 2 campi:
 
Codice | Descrizione
 
mentre la tabella Articoli è più articolata:
 
 
Codice | Descrizione | IVA | Costo | ... | ID_Produttore
 
 
il mio scopo è caricare dal file di testo nella tabella Articoli, ma nel 
file il campo relativo al produttore è la sola denominazione, quindi 
dovrei, per ogni riga, effettuare una ricerca all'interno della tabella 
Produttori e confrontare la stringa presente nel file di testo con 
quella nella tabella e ricavarne il codice ad esso associato per poter 
inserire il record nella tabella Articoli. Come posso fare per 
effettuare questo genere di lettura/confronto?
 
Grazie a tutti in anticipo,
Francesco

 Francesco
 
Beh, ti sei già risposto da solo: devi appunto, ad ogni riga, isolare il campo descrizione, fare una query nella tabella Produttori e poi unire il codice risultante agli altri dati della riga per fare l'inserimento in Articoli
 
Supponendo che tu stia usando i normali strumenti di accesso ai dati per VB6 (ADO, DAO, OLEDB ecc..), parliamo appunto di una banale coppia di operazioni SELECT+INSERT, niente di particolarmente originale...  esattamente quale è il problema?


Ehm, il problema è che non so come mettere "in codice" questo 
ragionamento. In pratica leggo nel file di testo il campo produttore, 
dopo averlo separato con la funzione Split, e poi devo confrontare ciò 
che ho letto con ciò che ho nella tabella Produttori del database. Se il 
confronto è positivo, allora devo ricavarne il codice, sempre dal 
database. Quindi i punti da risolvere sono:
 
1. Come confrontare in maniera efficace il campo del file di testo con 
quello nel db
2. Se il confronto è positivo devo leggerne il codice, altrimenti magari 
pongo a 0
 
Come fare?

 Francesco
 
MMMMMM brutto.....comunque....
 
SELECT Codice FROM Produttori WHERE descrizione = 'tuoNomeRecuperato'
 
MA ... :
1) ricordati gli APICI ...cerchi testo ...non funziona altrimenti!
2) l'uTonto fa sempre casini
     se in archivio hai Armellini Mario e ti hanno scritto Armellini (3 
spazi)   Mario...non lo trovi! Ecco perchè si preferisce mettere un 
input guidato...ed un numero di codice invece della descrizione!!!
 

 guidato...ed un numero di codice invece della descrizione!!!
 
Già...
 
Alberto
 
 

 Come fare?
 
Scusa se insisto, ma forse sto fraintendendo la questione... il punto è che non hai dimestichezza, in generale, sull'accesso a database con VB6, oppure c'è qualcosa di particolare del problema che mi sfugge?
 
Perchè da come ne parli mi pare che sul database già ci metti le mani, per cui se sai come fare una generica query e un inserimento con ADO (per dire), hai già tutto pronto... prepari una funzioncina che, dato un parametro stringa, torna un valore numerico e al cui interno esegui l'equivalente di
 
SELECT Cod FROM Produttori WHERE Descrizione='<la tua descrizione>'
 
e, nel ciclo di lettura del file, la chiami di volta in volta prima di preparare la tua INSERT.
 
In pseudo-codice:
 
Dim CampiArticolo() As String
Dim CodProduttore As Long
 
Open File
While Not EOF()
  CampiArticolo=Split(RigaFile,"|")
  CodProduttore=GetProduttore(CampiArticolo(0))
 
  If CodProduttore è Valido Then
    INSERT INTO X VALUES (CodProduttore, CampiArticolo(1), CampiArticolo(2), ...
  Else
    Salti la riga o inserisci con un default
  End If
Loop
Close File

 Close File
 
Beh Luca in realt� credo che tu abbia centrato in pieno la questione. In 
genere una query la so completare, cos� come l'accesso ai dati mi � 
noto, ma non sapevo come formulare una query che fosse il pi� efficace 
possibile: semplicemente non avevo pensato che bastasse
 
SELECT Cod FROM Produttori WHERE Descrizione='<la tua descrizione>'
 
per avere un risultato attendibile, a prescindere poi dal fatto che i 
dati nel file di testo devono essere 'precisi', cio� senza avere 2 
produttori uguali ma con descrizioni diverse, del tipo ABACO o Abaco.
 
Sempre con questa query credo poi di aver capito come impostare la 
funzione GetProduttore che tu citi per ottenere il codice produttore e 
proseguire poi con l'importazione.
 
Grazie,
Francesco

 produttori uguali ma con descrizioni diverse, del tipo ABACO o Abaco.
 
Piano, piano ho colto qual'era la tua perplessità... si, questo è un dubbio legittimo; che la query proposta sia efficace o meno, dipende chiaramente dalla bontà dei dati di ingresso
 
Se il problema è solo quello delle maiuscole o minuscole, te la cavi senza patemi; a seconda del DB che usi potrebbe essere del tutto ininfluente, oppure facilmente risolvibile applicando un confronto case-insensitive (UPPER con Oracle e robe simili..)
 
Se i dati sono più "pasticciati" allora la cosa si complica, e bisogna analizzare un po' la faccenda... potresti cavartela con ricerche aggiuntive basate su pattern matching, o decidere di fare prima una passata che normalizzi i nomi del Produttori (incluse eventuali casi particolari gestiti a mano, se la dimensione dei record lo rende pratico... anche qui, da valutare sul caso reale), e poi quella di importazione effettiva