* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Aprile 16, 2024, 05:16:58 pm

Inserisci il nome utente, la password e la durata della sessione.

63 Visitatori, 0 Utenti

Autore Topic: [RISOLTO] query SQLite3 per importi assunti in valore assoluto  (Letto 728 volte)

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Oggi ho costruito una query SQLite per estrarre da una tabella del mio DB tutti record con la colonna Importi contenuti, in valore assoluto fra 20 e 30 €.

Come faccio sempre, prima di mandare in esecuzione il programma, ho eseguito la query in DBBrowse e, con mia sorpresa ho riscontrato l'estrazione di tutti i record con importi positivi.
Ho fatto la controprova, inserendo nella formula il segno "-". Questa volta sono stati estratti, sempre con l'opzione "abs", soltanto i record con importi negativi.

A questo punto mi sono deciso a provare il programma e, naturalmente, anche il programma ha risposto nella stessa maniera.

Quindi, in definitiva, le istruzioni funzionano, quello che non funziona è, secondo le mie attuali conoscenze, la gestione dell'opzione "abs"

Riporto, per completezza, la Select che poi ho dato in pasto al programma:
Codice: [Seleziona]
sql:= 'SELECT movimgg.CoVocMovvgg AS coVoMovg, movimgg.DtCoMovgg AS dtContMov, movimgg.DescrMovvgg AS causale, movimgg.ImpMovvgg AS Importo, movimgg.MonMovvgg AS lirEur, ';
        sql:= sql + 'piancont.NumVoce AS coVoPianCont, piancont.NomeVoce AS nmVocePianCont, piancont.ContrPartSiNo AS flgCtoColleg  FROM movimgg, piancont WHERE coVoMovg = coVoPianCont ';
        sql:= sql + ' AND dtContMov >= ' +  dataIni + ' AND dtContMov <= ' + dataFin + ' AND Importo >= ' + FloatToStr(abs(impMin)) + ' AND Importo <= ' + FloatToStr(abs(impMax));
        sql:= sql + ' ORDER BY Importo, dtContMov, movimgg.DtSolMovgg, movimgg.OraSolMovgg';
        swOpenErro:= OpenDbQuery1F1(sql);
        if swOpenErro then
        begin
          ShowMessage('*** RICERCA PER IMPORTO ***' + LineEnding + LineEnding + 'OPEN di ContabFamDB NON riuscita' + LineEnding + '(sql= "' + sql + '")' + LineEnding + LineEnding + 'Il Programma verrà chiuso');
          Halt;
        end
        else begin
          Form1.ZReadOnlyQuery1.First;
          while not Form1.ZReadOnlyQuery1.EOF do
          begin
            nuVoceCorr:= Form1.ZReadOnlyQuery1.FieldByName('coVoMovg').AsString;
            descr:= Form1.ZReadOnlyQuery1.FieldByName('causale').AsString;
            impMov:= Form1.ZReadOnlyQuery1.FieldByName('Importo').AsString;
            dataMov:= Form1.ZReadOnlyQuery1.FieldByName('dtContMov').AsString + chr(9);
            numPro:= numPro + 1;
            WriteLn(inttoStr(numPro) + ' - impMov= "' + impMov + '" | dataMov= "' + dataMov + '" | coVoMovg= "' + nuVoceCorr + '" | causale= "' + descr + '"');
            Form1.ZReadOnlyQuery1.Next;
          end;
        end;
        Form1.ZReadOnlyQuery1.Close;   

Non ci sono errori formali, ma il mio proposito è di estrarre con una sola query tutti i record con importo compreso fra: -30 e -20, nonchè quelli con importo compreso fra 20 e 30.

In base a quanto riscontrato, sono costretto ad eseguire 2 query, distinte, considerando separatamente le due fasce di importo.

C'é qualcosa che dovrei sapere e che non so?
 ??? :-\


« Ultima modifica: Giugno 28, 2022, 02:56:32 pm da petrusic »
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:query SQLite3 per importi assunti in valore assoluto
« Risposta #1 il: Giugno 28, 2022, 01:29:56 am »
E' tardi e magari dico stupidaggini, ma non puoi usare un paio di parentesi e duplicare (una con il + e una con il -) la parte riguardante l'importo mettendoci un OR tra le due clausole ?

Tipo:

Codice: [Seleziona]
AND ((Importo >= ' + FloatToStr(abs(impMin)) + ' AND Importo <= ' + FloatToStr(abs(impMax)))+ ' OR (Importo >= ' + FloatToStr(abs(impMin)*-1) + ' AND Importo <= ' + FloatToStr(abs(impMax)*-1)))

Ciao
« Ultima modifica: Giugno 28, 2022, 01:31:28 am da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:query SQLite3 per importi assunti in valore assoluto
« Risposta #2 il: Giugno 28, 2022, 08:38:56 am »
Oppure puoi usare una union e gestire il set di dati con qualcosa di simile a:

select 1 tipo, campo1 from tabella where campo1 between -20 and -30
union all
select 2 tipo, campo1 from tabella where campo1 between 20 and 30

Così quando scorri il recordset giochi con il campo tipo.
La funzione abs = absolute che io sappia rende positivo qualsiasi valore negativo
abs(20) = 20
abs(-20) = 20

Spero di essere stato d'aiuto
Ieri è passato, domani è futuro, oggi è un dono...

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:query SQLite3 per importi assunti in valore assoluto
« Risposta #3 il: Giugno 28, 2022, 09:21:15 am »
ciao
il problema è che la funzione abs(), nella clausola where, la devi applicare anche al campo "Importo" della tabella e non solo all'espressione di confronto ( mi riferisco a FloatToStr(abs(impMin)) ).


quindi devi scrivere:
Codice: [Seleziona]
...
AND abs(Importo) >= ' + FloatToStr(abs(impMin)) + ' AND abs(Importo) <= ' + FloatToStr(abs(impMax));
...
Imagination is more important than knowledge (A.Einstein)

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:query SQLite3 per importi assunti in valore assoluto
« Risposta #4 il: Giugno 28, 2022, 02:55:59 pm »
ciao
il problema è che la funzione abs(), nella clausola where, la devi applicare anche al campo "Importo" della tabella e non solo all'espressione di confronto ( mi riferisco a FloatToStr(abs(impMin)) ).
quindi devi scrivere:
Codice: [Seleziona]
...
AND abs(Importo) >= ' + FloatToStr(abs(impMin)) + ' AND abs(Importo) <= ' + FloatToStr(abs(impMax));
...

Ho provato come mi hai detto tu e come mi ha detto DragoRosso.
Funzionano tutte e due.

La possibilità di utilizzare la funzione abs mi permette di rimanere aderente alla mia idea iniziale.

Grazie a tutti per le vostre illuminazioni.
 :D
ciao ciao

 

Recenti

How To

Utenti
  • Utenti in totale: 785
  • Latest: gmax
Stats
  • Post in totale: 18769
  • Topic in totale: 2232
  • Online Today: 80
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 63
Total: 63

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.