Sviluppare funzionalita su Microsoft Office con VBA Query con e senza nome: comportamento diverso?

LoginRegistrati
Stai vedendo 4 articoli - dal 1 a 4 (di 4 totali)
  • Autore
    Articoli
  • #19770 Risposta

    roberto21
    Partecipante
      2 pts

       Quacuno sa dirmi il motivo per cui di questi due pezzi di codice uno funziona e uno no?

      `****** CODICE 1 
      ...............
      Set qdf = CurrentDb.CreateQueryDef("InsertPrimaNota", "PARAMETERS p1 INT, p2 Text, p3 Text, p4 Datetime, p5 Float, p6 Float, p7 Text, p8 Text; " & _
                  "INSERT INTO PrimaNota (Ricevuta, [Conto N], Descrizione, Data, Entrate, Uscite, [Note], Mese) " & _
                  "VALUES (p1, p2, p3, p4, p5, p6, p7, p8);")
      .............-...
      With CurrentDb.QueryDefs("InsertPrimaNota")
              !p1 = numrec
              !p2 = NumConto
              !p3 = NDescrizione
              !p4 = NData
              If NEU = "E" Then
                  !p5 = NTotale
                  !p6 = Null
              Else
                  !p5 = Null
                  !p6 = NTotale
              End If
              !p7 = NNote
              !p8 = NMoName
      End With
          
              CurrentDb.Execute "InsertPrimaNota", dbFailOnError
      
      *****************************************************
      CODICE 2
      
      ...............
      Set qdfInsert = CurrentDb.CreateQueryDef("", "PARAMETERS p1 INT, p2 Text, p3 Text, p4 Datetime, p5 Float, p6 Float, p7 Text, p8 Text; " & _
                  "INSERT INTO PrimaNota (Ricevuta, [Conto N], Descrizione, Data, Entrate, Uscite, [Note], Mese) " & _
                  "VALUES (p1, p2, p3, p4, p5, p6, p7, p8);")
      .............-...
      With qdfInsert
              !p1 = numrec
              !p2 = NumConto
              !p3 = NDescrizione
              !p4 = NData
              If NEU = "E" Then
                  !p5 = NTotale
                  !p6 = Null
              Else
                  !p5 = Null
                  !p6 = NTotale
              End If
              !p7 = NNote
              !p8 = NMoName
      End With
          
              qdfInsert.Execute dbFailOnError`

      Il Codice 2 funziona. Il codice 1 no. L'errore del  codice 1 consiste nel fatto che ognuna delle variabili !px non prende valore, e il debugger segnala "Object variable or With block variable not set" e l' Execute finale va in runtime error  "too few arguments, expected 8 ". La differenza consiste nel fatto che la prima querydef dà nome alla query, mentre la seconda no: il riferimento con with dovrebbe essere equivalente, ma sembra che non lo sia. Ho provato anche ad usare 

      With CurrentDb.QueryDefs("InsertPrimaNota").Parameters

      .....

       

      ma non cambia niente. Non trovo documentazione su questa differenza di comportamento fra query named e unnamed, quindi la cosa deve  essere ovvia. O no?

      #19836 Risposta

      vecchio frac
      Senior Moderator
      • Sfida #1
        168 pts

        E' solo concettualmente sbagliato. 

        La prima query (che chiami "named") pretende che ogni suo parametro venga espresso direttamente come membro della querydef. La seconda invece lo crea al volo nel modo che conosci.

        La prima sequenza di codice va riscritta così:

        'CODICE 1
        
        Set qdf = CurrentDb.CreateQueryDef("InsertPrimaNota", "PARAMETERS p1 INT, p2 text, p3 Text, p4 Datetime, p5 Float, p6 Float, p7 Text, p8 Text; " & _
                    "INSERT INTO PrimaNota (Ricevuta, [Conto N], Descrizione, Data, Entrate, Uscite, [Note], Mese) " & _
                    "VALUES (p1, p2, p3, p4, p5, p6, p7, p8);")
            
            qdf.Parameters(0) = numrec
            qdf.Parameters(1) = numConto
           ' seguono le definizioni degli altri otto parametri
          
           qdf.Execute

        Tra parentesi ho imparato che CurrentDb non andrebbe usato perchè crea un'istanza del database ad ogni invocazione. Andrebbe utilizzato DbEngine(0)(0). Me la vedo grigia a riprendere in mano tutti i miei codici... lo farò man mano.

        Infine in questi giorni sto lottando contro il maledetto tipo di dati memo: Access quando riceve del testo da un textbox non vuole saperne di memorizzarlo come testo lungo (ho provato a chiamarlo nella query come LongText, Text, Memo e mille altri modi). Lo tronca sempre a 255 caratteri come fosse un testo corto. Alla fine ho rinunciato a DAO (ci sarà un motivo se lo hanno abbandonato...) e sto riscrivendo tutto in ADO commands. La sintassi è più macchinosa ma è tutto più sicuro.

        #19852 Risposta

        roberto21
        Partecipante
          2 pts

          Grazie mille, come al solito: non avevo pensato all'uso di Parameters(), anche se in qualche post l'avevo visto usato ma non ho ho fatto il collegamento con il mio problema.

          Per il tuo, non credo di essere in grado di aiutarti, avrai  certo pensato a tutto. Solo un dubbio: hai provato, in design view, oltre a mettere long text, ad eliminare "@" e/o mettere rich text invece di plain text?  A me non serve testo lungo, ma ho vaghi ricordi...

          #19863 Risposta

          vecchio frac
          Senior Moderator
          • Sfida #1
            168 pts

            roberto21 ha scritto:

            Solo un dubbio: hai provato, in design view,

            Non è un problema di tipo di dato nel database. E' un problema del motore Jet + DAO che converte automaticamente il testo lungo in testo corto quando si usano le QueryDef ( naturalmente usando SQL iniection la cosa cambia, quindi DoCmd.RunSQL "insert into table (field1) values ('" & textbox1 & "')" con texbox1 over 300 caratteri, tutto fila liscio). Inoltre nemmeno utilizzo il carattere @ e il tipo di formato RTF riguarda una proprietà interna del campo, non il suo data type.

            Conclusione: appena pronto scriverò un articoletto su questo argomento 🙂

          LoginRegistrati
          Stai vedendo 4 articoli - dal 1 a 4 (di 4 totali)
          Rispondi a: Query con e senza nome: comportamento diverso?
          Gli allegati sono permessi solo ad utenti REGISTRATI
          Le tue informazioni:



          vecchio frac - 2564 risposte

          albatros54
          albatros54 - 680 risposte

          patel
          patel - 585 risposte

          Marius44
          Marius44 - 480 risposte

          Luca73
          Luca73 - 476 risposte