Oppure

Loading
10/11/10 13:41
Iohoilpotere
Salve, sto armeggiando un po con le stringhe SQL su Access utilizzando il codice VBA. Purtroppo non sto avendo buoni risultati... per cui chiedo consiglio a voi, se mi potete correggere dove sbaglio.

La stringa seguente dovrebbe inserire in una tabella 3 campi, presi da un altra tabella e manipolati al fine di ottenere questo:

* Il primo campo NON deve avere uno zero in seconda posizione, e copiare nel caso il primo, il terzo, il quarto e il quinto carattere, nel cas altro i primi 5 dal campo F1 di una tabella.

* Il secondo campo deve contenere i restanti caratteri (per una questione di formattazione del testo so che non deve prendere i primi 12 caratteri del campo) dallo stesso campo di cui sopra.

* Il terzo campo è uguale al primo, differenziato dal fatto che deve essere escluso l'ultimo carattere.

La condizione è che nelle celle della tabella di origine siano presenti un certo numero di spazi (per la precisione 5) prima del testo.

Il codice da me eseguito è il seguente:

Set rs = DB.OpenRecordset("insert into TB_ATC4(ATC4, ATC4_DESCRIZIONE, ATC3) " _
& "select if(mid(trim(f1), 2, 1) = 0, left(trim(f1),1) + mid(trim(f1), 3, 3), left(trim(f1), 3)) as RC1, " _
& "right(f1, len(f1) -12) as DESCR, " _
& "left(RC1, len(RC1) -1) as ATC3 " _
& "from TB_Import where (len(F1) - len(ltrim(F1))) = 5")


Non so se ho fatto bene ad usare degli alias...

EDIT: Dimenticavo l'errore che mi ritorna: "Errore di run-time 3219: operazione non valida"
Ultima modifica effettuata da Iohoilpotere 10/11/10 13:50
aaa
10/11/10 14:20
GrG
Postato originariamente da Iohoilpotere:

Set rs = DB.OpenRecordset("insert into TB_ATC4(ATC4, ATC4_DESCRIZIONE, ATC3) " _
& "select if(mid(trim(f1), 2, 1) = 0, left(trim(f1),1) + mid(trim(f1), 3, 3), left(trim(f1), 3)) as RC1, " _
& "right(f1, len(f1) -12) as DESCR, " _
& "left(RC1, len(RC1) -1) as ATC3 " _
& "from TB_Import where (len(F1) - len(ltrim(F1))) = 5")


Non so se ho fatto bene ad usare degli alias...

EDIT: Dimenticavo l'errore che mi ritorna: "Errore di run-time 3219: operazione non valida"


Non capisco per quale motivo hai messo le funzioni di vb all'interno della query... ti faccio un esempio, tu hai scritto:

& "right(f1, len(f1) -12) as DESCR, " _

ma così mi pare non sia corretto, per avere una query corretta devi scrivere:

& right(f1, len(f1) -12) & "as DESCR, " _


aaa
10/11/10 14:31
Iohoilpotere
Le operazioni su stringhe sono supportate da SQL, ad esempio:
        Set rs2 = DB.OpenRecordset("select ID, F1 from TB_IMPORT where (len(F1) - len(ltrim(F1))) = 3 and ID between ...



(un altra stringa del codice) viene letta correttamente e non ritorna errore.

Se dovessi togliere quei valori dalla stringa immagino che l'option explicit mi avvertirebbe che la variabile f1 non è stata dichiarata (in quanto campo della tabella DB_Import).
Ultima modifica effettuata da Iohoilpotere 10/11/10 14:33
aaa
10/11/10 15:51
Iohoilpotere
Ok, problema risolto con:


INSERT INTO TB_ATC4 ( ATC4, ATC3, ATC4_DESCRIZIONE )
SELECT IIf(Mid(Trim([TB_Import]![F1]),2,1)=0,Left(Left(Trim([TB_Import]![F1]),4),1)+Right(Left(LTrim([TB_Import]![F1]),5),3),Left(Trim([TB_Import]![F1]),5)) AS Espr1, IIf(Mid(Trim([TB_Import]![F1]),2,1)=0,Left(Left(Trim([TB_Import]![F1]),4),1)+Right(Left(LTrim([TB_Import]![F1]),4),2),Left(Trim([TB_Import]![F1]),4)) AS Espr2, Trim(Right([TB_Import]![F1],Len([TB_Import]![F1])-12)) AS Espr3
FROM TB_Import
WHERE (((Len([F1])-Len(LTrim([F1])))=7));
aaa
10/11/10 22:33
lorenzo
tu stai mischiando le cose.

O utilizzi SQL (come hai fatto tu) e viene fuori un vero casino - quella Query non è ne modificabile ne capibile, dai! - oppure usi VBA e ti fai le modifiche PRIMA di comporre la query
aaa
11/11/10 8:12
Iohoilpotere
La query è sia modificabile che capibile, basta saper leggere. Utilizzare VBA per fare le modifiche non mi servirebbe a niente, già fatto, composto codice con 2 cicli, ma è troppo lenta l'esecuzione.
aaa
11/11/10 19:06
lorenzo
non prenderla male, ma se questa per te è "capibile" allora non voglio sapere quali sono quelle "non capibili".

Pensa di doverla modificare tra 6 mesi... secondo te ci capirai qualcosa?? Secondo me no...
aaa
18/11/10 16:02
Iohoilpotere
    ssql = ssql & " SELECT HY_Name, .ID_MERCATO, TU_MKT.MERCATO, NULL, TB_CONFEZIONE.ID , TB_CONFEZIONE.NOME , TB_CONFEZIONE.DATA_LANCIO, " _
    & " TB_PRODOTTO.ID AS ID_PRODOTTO, TB_PRODOTTO.PRD_DESCRIZIONE,TB_PRODOTTO.DATA_LANCIO, " _
    & " TB_AZIENDA.ID AS ID_AZIENDA, TB_AZIENDA.AZIENDA_IMS, TB_AZIENDA.AZIENDA_DESCR_ABBR, TB_AZIENDA.MNF, " _
    & " TB_CORP_AZIE.PERC, TB_CORP_AZIE.OWN, TB_CORPORATION.ID AS ID_CORPORATION, TB_CORPORATION.CORPORATION, " _
    & " TB_NFC3.NFC, TB_NFC3.NFC_DESCRIZIONE, TB_NFC2.ID AS ID_NFC2, TB_NFC2.NFC_2, TB_NFC1.ID AS ID_NFC1, TB_NFC1.NFC_1,  TB_FRM2.FRM2, TB_FRM2.FRM2_DESCRIZIONE, " _
    & " TB_ATC4.ATC4, TB_ATC4.ATC4_DESCRIPTION, TB_ATC3.ATC3, TB_ATC3.ATC3_DESCRIPTION, TB_ATC2.ATC2, TB_ATC2.ATC2_DESCRIPTIONS, TB_ATC1.ATC1, TB_ATC1.ATC1_DESCRIPTIONS, " _
    & " TB_MOLECOLA.ID AS ID_MOLECOLA, TB_MOLECOLA.MOLECOLA, " _
    & " null, null, " _
    & " QU_SUBMERCATI.TU_SUBMER_CONF.SUBMERCATO AS ID_SUB, QU_SUBMERCATI.TU_SUBMERCATI.SUBMERCATO AS SUB_MKT " _
    & " FROM (((" & HY_Name & " INNER JOIN ((TB_ATC1 INNER JOIN (TB_FRM2 INNER JOIN (((TB_ATC3 INNER JOIN " _
    & " ((TB_MOLECOLA RIGHT JOIN (TB_AZIENDA INNER JOIN (TB_PRODOTTO INNER JOIN TB_CONFEZIONE ON TB_PRODOTTO.ID = TB_CONFEZIONE.PRODOTTO) " _
    & " ON TB_AZIENDA.ID = TB_PRODOTTO.AZIENDA) ON TB_MOLECOLA.ID = TB_CONFEZIONE.MOLECOLA) INNER JOIN TB_ATC4 ON " _
    & " TB_CONFEZIONE.ATC4 = TB_ATC4.ATC4) ON TB_ATC3.ATC3 = TB_ATC4.ATC3) INNER JOIN TB_ATC2 ON TB_ATC3.ATC2 = TB_ATC2.ATC2) " _
    & " INNER JOIN TB_NFC3 ON TB_CONFEZIONE.NFC = TB_NFC3.NFC) ON TB_FRM2.FRM2 = TB_NFC3.FRM2) ON TB_ATC1.ATC1 = TB_ATC2.ATC1) " _
    & " INNER JOIN (TB_NFC2 INNER JOIN TB_NFC1 ON TB_NFC2.NFC_1 = TB_NFC1.ID) ON TB_NFC3.NFC_2 = TB_NFC2.ID) ON " _
    & " " & HY_Name & ".ID_CONFEZIONE = TB_CONFEZIONE.ID) LEFT JOIN QU_SUBMERCATI ON TB_CONFEZIONE.ID = QU_SUBMERCATI.CONFEZIONE) " _
    & " INNER JOIN TU_MKT ON " & HY_Name & ".ID_MERCATO = TU_MKT.ID) INNER JOIN (TB_CORPORATION INNER JOIN TB_CORP_AZIE ON " _
    & " TB_CORPORATION.ID = TB_CORP_AZIE.CORPORATION) ON TB_AZIENDA.ID = TB_CORP_AZIE.AZIENDA" _
    & " WHERE (((" & HY_Name & ".ID_MERCATO)=" & idMkt & ") AND ((QU_SUBMERCATI.MERCATO)=" & idMkt & " Or (QU_SUBMERCATI.MERCATO) Is Null));"

DB.Execute ssql


Questa è una query (per me) non capibile, poi chi ha un po più conoscenza dell'SQL ci capisce benissimo.
Ultima modifica effettuata da Iohoilpotere 18/11/10 16:03
aaa