Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Visual Basic 6 - Stringa SQL e operazione non valida.
Forum - Visual Basic 6 - Stringa SQL e operazione non valida.

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Iohoilpotere (Ex-Member)
Pro


Messaggi: 80
Iscritto: 13/09/2009

Segnala al moderatore
Postato alle 14:41
Mercoledì, 10/11/2010
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:

Codice sorgente - presumibilmente Delphi

  1. Set rs = DB.OpenRecordset("insert into TB_ATC4(ATC4, ATC4_DESCRIZIONE, ATC3) " _
  2. & "select if(mid(trim(f1), 2, 1) = 0, left(trim(f1),1) + mid(trim(f1), 3, 3), left(trim(f1), 3)) as RC1, " _
  3. & "right(f1, len(f1) -12) as DESCR, " _
  4. & "left(RC1, len(RC1) -1) as ATC3 " _
  5. & "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 il 10/11/2010 alle 14:50
PM
Avatar
GrG (Member)
Guru^2


Messaggi: 3430
Iscritto: 21/08/2007

Up
0
Down
V
Segnala al moderatore
Postato alle 15:20
Mercoledì, 10/11/2010
Testo quotato

Postato originariamente da Iohoilpotere:

Codice sorgente - presumibilmente Delphi

  1. Set rs = DB.OpenRecordset("insert into TB_ATC4(ATC4, ATC4_DESCRIZIONE, ATC3) " _
  2. & "select if(mid(trim(f1), 2, 1) = 0, left(trim(f1),1) + mid(trim(f1), 3, 3), left(trim(f1), 3)) as RC1, " _
  3. & "right(f1, len(f1) -12) as DESCR, " _
  4. & "left(RC1, len(RC1) -1) as ATC3 " _
  5. & "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, " _



PM
Avatar
Iohoilpotere (Ex-Member)
Pro


Messaggi: 80
Iscritto: 13/09/2009

Up
0
Down
V
Segnala al moderatore
Postato alle 15:31
Mercoledì, 10/11/2010
Le operazioni su stringhe sono supportate da SQL, ad esempio:
Codice sorgente - presumibilmente Visual Basic 6

  1. 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 il 10/11/2010 alle 15:33
PM
Avatar
Iohoilpotere (Ex-Member)
Pro


Messaggi: 80
Iscritto: 13/09/2009

Up
0
Down
V
Segnala al moderatore
Postato alle 16:51
Mercoledì, 10/11/2010
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));

PM
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Up
0
Down
V
Segnala al moderatore
Postato alle 23:33
Mercoledì, 10/11/2010
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

PM
Avatar
Iohoilpotere (Ex-Member)
Pro


Messaggi: 80
Iscritto: 13/09/2009

Up
0
Down
V
Segnala al moderatore
Postato alle 9:12
Giovedì, 11/11/2010
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.

PM
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Up
0
Down
V
Segnala al moderatore
Postato alle 20:06
Giovedì, 11/11/2010
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...

PM
Avatar
Iohoilpotere (Ex-Member)
Pro


Messaggi: 80
Iscritto: 13/09/2009

Up
0
Down
V
Segnala al moderatore
Postato alle 17:02
Giovedì, 18/11/2010
Codice sorgente - presumibilmente Php

  1. ssql = ssql & " SELECT HY_Name, .ID_MERCATO, TU_MKT.MERCATO, NULL, TB_CONFEZIONE.ID , TB_CONFEZIONE.NOME , TB_CONFEZIONE.DATA_LANCIO, " _
  2.     & " TB_PRODOTTO.ID AS ID_PRODOTTO, TB_PRODOTTO.PRD_DESCRIZIONE,TB_PRODOTTO.DATA_LANCIO, " _
  3.     & " TB_AZIENDA.ID AS ID_AZIENDA, TB_AZIENDA.AZIENDA_IMS, TB_AZIENDA.AZIENDA_DESCR_ABBR, TB_AZIENDA.MNF, " _
  4.     & " TB_CORP_AZIE.PERC, TB_CORP_AZIE.OWN, TB_CORPORATION.ID AS ID_CORPORATION, TB_CORPORATION.CORPORATION, " _
  5.     & " 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, " _
  6.     & " 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, " _
  7.     & " TB_MOLECOLA.ID AS ID_MOLECOLA, TB_MOLECOLA.MOLECOLA, " _
  8.     & " null, null, " _
  9.     & " QU_SUBMERCATI.TU_SUBMER_CONF.SUBMERCATO AS ID_SUB, QU_SUBMERCATI.TU_SUBMERCATI.SUBMERCATO AS SUB_MKT " _
  10.     & " FROM (((" & HY_Name & " INNER JOIN ((TB_ATC1 INNER JOIN (TB_FRM2 INNER JOIN (((TB_ATC3 INNER JOIN " _
  11.     & " ((TB_MOLECOLA RIGHT JOIN (TB_AZIENDA INNER JOIN (TB_PRODOTTO INNER JOIN TB_CONFEZIONE ON TB_PRODOTTO.ID = TB_CONFEZIONE.PRODOTTO) " _
  12.     & " ON TB_AZIENDA.ID = TB_PRODOTTO.AZIENDA) ON TB_MOLECOLA.ID = TB_CONFEZIONE.MOLECOLA) INNER JOIN TB_ATC4 ON " _
  13.     & " TB_CONFEZIONE.ATC4 = TB_ATC4.ATC4) ON TB_ATC3.ATC3 = TB_ATC4.ATC3) INNER JOIN TB_ATC2 ON TB_ATC3.ATC2 = TB_ATC2.ATC2) " _
  14.     & " 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) " _
  15.     & " 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 " _
  16.     & " " & HY_Name & ".ID_CONFEZIONE = TB_CONFEZIONE.ID) LEFT JOIN QU_SUBMERCATI ON TB_CONFEZIONE.ID = QU_SUBMERCATI.CONFEZIONE) " _
  17.     & " INNER JOIN TU_MKT ON " & HY_Name & ".ID_MERCATO = TU_MKT.ID) INNER JOIN (TB_CORPORATION INNER JOIN TB_CORP_AZIE ON " _
  18.     & " TB_CORPORATION.ID = TB_CORP_AZIE.CORPORATION) ON TB_AZIENDA.ID = TB_CORP_AZIE.AZIENDA" _
  19.     & " WHERE (((" & HY_Name & ".ID_MERCATO)=" & idMkt & ") AND ((QU_SUBMERCATI.MERCATO)=" & idMkt & " Or (QU_SUBMERCATI.MERCATO) Is Null));"
  20.  
  21. 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 il 18/11/2010 alle 17:03
PM
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Up
0
Down
V
Segnala al moderatore
Postato alle 19:43
Giovedì, 18/11/2010
il mio capo mi licenzierebbe all'istante se gli presentassi una roba simile....
non importa se un guru di sql(o uno che ne conosce abbastanza) possa capirla o no, la questione è che se fosse necessario cambiare alcune join(ci sono n join innestati, un suicidio dal punto di vista della manutenzione) sarebbe necessario riscrivere la query.

Queste cose, specialmente in SQL, è sempre meglio farle separate, magari usando tabelle di appoggio.
Lo dico per esperienza personale.

Ultima modifica effettuata da lorenzo il 18/11/2010 alle 19:46
PM
Pagine: [ 1 2 ] Precedente | Prossimo