Conversione di una query .mdb in SQL per un db .gdb

di il
5 risposte

Conversione di una query .mdb in SQL per un db .gdb

Buonasera,
devo convertire una query funzionante di un db.mdb.
Per essere sintetico vi mostro solo una parte della query...
IIf(Len(merce_documenti.sconto)<2,0,CInt(Left(merce_documenti.sconto,Len(merce_documenti.sconto)-1))) AS Expr1, IIf(documenti.tipo=3,-prezzo_listino*(100-Expr1)/100,prezzo_listino*(100-Expr1)/100) AS Netto_Singolo
La mia traduzione e' arrivata qui:
CREATE VIEW DTCALCOLOPROVVIGIONI2020A
(
  NOTE,
  RAGIONE_SOCIALE,
  MAXDIDATA_PAGAMENTO,
  NUMERO,
  "DATA",
  CODICE,
  DESCRIZIONE,
  QUANTITA,
  LISTINO_A,
  PREZZO_LISTINO,
  SCONTO,
  ULTIMO_PREZZO,
  EXPR1
)
AS SELECT anagrafiche.note, anagrafiche.ragione_sociale, Max(pagamenti_rate.data_pagamento) AS MaxDidata_pagamento, documenti.numero, documenti.data, magazzino.codice, merce_documenti.descrizione, merce_documenti.quantita, magazzino.listino_a, merce_documenti.prezzo_listino, merce_documenti.sconto, magazzino.ultimo_prezzo,
IIf(CHARACTER_LENGTH(merce_documenti.sconto)<2,0,CAST(Left(merce_documenti.sconto, CHARACTER_LENGTH (merce_documenti.sconto)-1) AS INTEGER)) AS EXPR1
Fino a qui funziona, ora devo tradurre il secondo IIF ma mi da errore. Mi dice che non riconosce la colonna Expr1.
Siccome questa View serve per un db.gdb e poichè non so se Firebird SQL supporta le colonne virtuali, mi devo fermare in attesa di un vostro suggerimento.

Cosa bisogna fare in simili casi?
Grazie
Buona serata

5 Risposte

  • Re: Conversione di una query .mdb in SQL per un db .gdb

    IronButterfly ha scritto:


    Fino a qui funziona, ora devo tradurre il secondo IIF ma mi da errore. Mi dice che non riconosce la colonna Expr1.
    Siccome questa View serve per un db.gdb e poichè non so se Firebird SQL supporta le colonne virtuali, mi devo fermare in attesa di un vostro suggerimento.
    Io proverei prima l'istruzione di SELECT in separata sede all'interno di uno script SQL, in modo da verificare che funzioni e che tutte le istruzioni siano convertite a dovere e che, pertanto, venga generata la tabella dei risultati.

    Da quel punto, si può quindi procedere nella codifica della vista (CREATE VIEW) che si basa su quella SELECT.

    Se qualcosa restituisce errore, allora verifica nella documentazione di Firebird qual è l'istruzione equivalente a quella usata nel database Access e correggi la riga.

    In caso di difficoltà, analizziamo la riga in sé assieme, però devi riportare qualche informazione sulla tabella di origine e qual è l'obiettivo dell'espressione che stai scrivendo, giusto per chiarire meglio lo scenario (oltre a formattare il codice), altrimenti per chiunque è avulso dal contesto risulta difficile entrarci e darti un aiuto pratico e concreto.

    Ciao!
  • Re: Conversione di una query .mdb in SQL per un db .gdb

    Buonasera,

    Ciao Alka e grazie per la risposta veloce.
    Io proverei prima l'istruzione di SELECT in separata sede all'interno di uno script SQL, in modo da verificare che funzioni e che tutte le istruzioni siano convertite a dovere e che, pertanto, venga generata la tabella dei risultati.


    La View di Firebird funziona e restituisce questa Table:



    Ecco la query di Access, anch'essa funzionante:
    SELECT anagrafiche.note, anagrafiche.ragione_sociale, Max(pagamenti_rate.data_pagamento) AS MaxDidata_pagamento, documenti.numero, documenti.data, magazzino.codice, merce_documenti.descrizione, merce_documenti.quantita, magazzino.listino_a, merce_documenti.prezzo_listino, merce_documenti.sconto, magazzino.ultimo_prezzo, IIf(Len(merce_documenti.sconto)<2,0,CInt(Left(merce_documenti.sconto,Len(merce_documenti.sconto)-1))) AS Expr1, IIf(documenti.tipo=3,-prezzo_listino*(100-Expr1)/100,prezzo_listino*(100-Expr1)/100) AS Netto_Singolo…….qui va avanti con ………….Netto_Singolo*quantita AS Ricavo_Netto, IIf(anagrafiche.listino=0 And Netto_Singolo=magazzino.listino_a*90/100,(magazzino.listino_e)*quantita,0) AS StaccoUgualeA e poi va ancora avanti con altre colonne virtuali………
    
    In Access questa query funziona perché la colonna virtuale Expr1 viene riconosciuta automaticamente e viene tenuta in considerazione per il calcolo della colonna successiva (il secondo IIF) che si chiama Netto_Singolo….e cosi’ via…per le successive.

    Ecco la Tabella di Access:



    Firebird riconosce le colonne virtuali, ma io non so come fare, e quindi mi ritorna un errore di colonna Expr1 non riconosciuta e quindi si ferma qui.
    Da quel punto, si può quindi procedere nella codifica della vista (CREATE VIEW) che si basa su quella SELECT.
    OK se mi dai una dritta vado avanti.
    Se qualcosa restituisce errore, allora verifica nella documentazione di Firebird qual è l'istruzione equivalente a quella usata nel database Access e correggi la riga.
    Per il momento la traduzione delle istruzioni non ha dato errore. E’ stato convertito bene.
    In caso di difficoltà, analizziamo la riga in sé assieme,
    OK
    però devi riportare qualche informazione sulla tabella di origine e qual è l'obiettivo dell'espressione che stai scrivendo, giusto per chiarire meglio lo scenario (oltre a formattare il codice), altrimenti per chiunque è avulso dal contesto risulta difficile entrarci e darti un aiuto pratico e concreto.
    Qua ti ho risposto prima. Vedi query di Access.

    Il punto e’ questo.
    Come dire a Firebird di tener conto del valore della colonna Expr1 quando deve calcolare la colonna successiva?

    Grazie
    ciao

    P.S. alcuni importi della Tabelle sono stati modificati
  • Re: Conversione di una query .mdb in SQL per un db .gdb

    IronButterfly ha scritto:


    In Access questa query funziona perché la colonna virtuale Expr1 viene riconosciuta automaticamente e viene tenuta in considerazione per il calcolo della colonna successiva (il secondo IIF) che si chiama Netto_Singolo….e cosi’ via…per le successive. [...]
    In effetti, non ho mai definito una query che "proiettasse" un valore associato a un nome di colonna da utilizzare nel contempo anche in un'altra colonna della stessa query.

    Io andrei a creare una vista che estragga le colonne principali e il valore che viene poi memorizzato nel campo "Expr1", andando a usare un nome più significativo e sensato di questo; andrei poi a creare una vista che utilizzi la precedente estraendo i valori del cosiddetto "Expr1" (assieme agli altri due che si basano su questo campo).

    L'alternativa (anche se più lenta) potrebbe essere quella di scandire la tabella con una FOR SELECT all'interno di una stored procedure ed effettuare per ogni riga i calcoli richiesti, andando a spedire poi in output i campi desiderati con il relativo valore finale.

    Ciao!
  • Re: Conversione di una query .mdb in SQL per un db .gdb

    Buonasera,

    Access riconosce i nomi delle colonne virtuali (cioe' delle espressioni nelle query), e quindi se abbiamo 2 colonne virtuali possiamo moltiplicarle fra di loro ed avere una terza colonna virtuale.

    Alcuni DBSM riconoscono le colonne virtuali, ma non credo piu' di una come invece fa Access.

    Il quiz si risolve in questo modo.

    Nel secondo IIF dove c'e' il nome della colonna virtuale, non e' possibile indicare il nome della colonna (in Access si), ma bisogna ripetere l'espressione. E tutto va.

    Grazie per l'aiuto.
    Saluti
  • Re: Conversione di una query .mdb in SQL per un db .gdb

    IronButterfly ha scritto:


    Nel secondo IIF dove c'e' il nome della colonna virtuale, non e' possibile indicare il nome della colonna (in Access si), ma bisogna ripetere l'espressione. E tutto va.
    Questa è la prima soluzione a cui ho pensato, ovviamente, ma non l'ho proposta perché onestamente non mi sembra ottimale: l'espressione è abbastanza complessa e in fase di modifica successiva occorre ricordarsi di tenerle allineate entrambe, e per indole personale tendo sempre ad evitare le duplicazioni, quindi - fosse stato un mio problema - avrei senz'altro evitato (per quanto possibile) questa strada, perché è senz'altro sbrigativa ma - per esperienza - già saprei i problemi che potrebbe darmi in futuro.

    Ciao!
Devi accedere o registrarti per scrivere nel forum
5 risposte