Newsgroup: it.comp.lang.delphi
Titolo: Problema SQL

Ho questa select SQL:
 
Select BANCA, B."Descrizion",sum(Importo) from MOVIM, BYTD B where BANCA<>'' 
and (BANCA=B."banca") group by BANCA,B."Descrizion"
 
All'esecuzione dà errore perchè non gli piace l'espressione BANCA<>'' 
(mentre con BANCA='xxx' è tutto ok).
Il mio obiettivo sarebbe di ottenere un totale per ciascun codice BANCA, per 
cui a rigore non avrei bisogno di questo criterio di selezione. Però se 
rimuovo il criterio BANCA <>'' (col quale tutti i cod banca sarebbero 
estratti), lo stesso dà errore.
 
Uso il LocalSQL del BDE, se questo ha rilevanza per capire l'errore ..
 
PS: Anche usando la sintassi con la join, c'è lo stesso problema:
Select BANCA, B."Descrizion",sum(Importo) from MOVIM join BYTD B
on (BANCA=B."banca") [where banca is not null] group by BANCA,B."Descrizion"
 
 


Che errore ti da di preciso?
 
Riesci a riprodurre il problema in una aplicazione minimale, con una
form, con dentro la query e un bottone che apre la query?
 
ciao
Giacomo

"Giacomo Degli Esposti"  ha scritto nel messaggio 
news:24b90e73-e0d6-4782...@googlegroups.com...
Che errore ti da di preciso?
Riesci a riprodurre il problema in una aplicazione minimale, con una
form, con dentro la query e un bottone che apre la query?
ciao
Giacomo
 
Mi da: eAccessViolation at address 000000. Read of address 000000
 
Ho fatto ulteriori indagini e ho scoperto che la stessa query sullo stesso 
file di qualche mese fa funziona correttamente, ma non sono riuscito a 
vedere differenze tra i files (sono delle tabelle dBase III). L'unica 
differenza è che nella versione attuale, c'è un campo in più, character, di 
una posizione (nel file denominato Movim). Ho provato a reindicizzare i 
files, a fare un restructure, a togliere il campo aggiunto. Nessun 
risultato. Può avere a che fare con il contenuto ? 
 

Ha certamente a che are con il contenuto. Ho duplicato il file e provato a 
cancellarne i records in blocchi di 100. Ho continuato ad avere errore fino 
al terzo blocco, poi tutto ok.
Questo è veramente un problema che non avevo mai incontrato. Esaminando i 
records a vista, non si scorge niente fuori dal normale. Continuo 
l'analisi... 
 

Credo di aver raggiunto la conclusione che il problema sia nel numero di 
records del file, perchè ho eseguito la query problematica sia cancellando 
gli ultimi 300 records, sia (ripristinando questi visto che non vedevo dati 
corrotti) cancellando i primi 300. In entrambi i casi la query si esegue 
correttamente.
Il problema però non deve essere semplicemente il numero dei records del 
file MOVIM (ridotto a circa 13700 records per far eseguire la query), perchè 
a quanto so il numero dei records ammessi in una tabella dBase dovrebbe 
essere addirittura 1 miliardo..
Potrebbe essere perchè è in join con un altro file (di poche decine di 
records però) ? 
 

 records del file
 
So che è un consiglio del cavolo, ma forse è ora che tu abbandoni dBaseIII per
qualcosa di più avanzato, ovvero un RDBMS serio. Se l'accesso ai dati non sono
così tanti, puoi usare SQLite senza problemi (testato con più di un milione
di record per tabella)
 
Enrico

So che è un consiglio del cavolo, ma forse è ora che tu abbandoni dBaseIII 
per
qualcosa di più avanzato, ovvero un RDBMS serio. Se l'accesso ai dati non 
sono
così tanti, puoi usare SQLite senza problemi (testato con più di un milione
di record per tabella)
Enrico
 
Lo so, dovrei... Ho una cinquantina di files da convertire in questa 
applicazione, ma soprattutto ho l'applicazione che adesso funziona e se ci 
metto anno dovrei anche migrare a unicode. Non mi so decidere a toccare 
quello che va bene, anche se ogni tanto, in occasione di qualche estensione, 
vorrei averlo fatto. Avevo anche cominciato con SQLite e poi mi sono fermato 
perchè non sapevo come trasformare tutte le date. 
 

 perchè non sapevo come trasformare tutte le date.
 
perche sei giovane
 
definisci un campo integer ci sbatti dentro per esempio 20160925 ovvero 
la data nel formato aaaammgg  e poi ti scrivi un paio di rutinette che 
ti danno la data nel formato che vuoi, se bisestile o no, che giorno è, 
etc, etc.
In questo modo non hai piu problemi di conversione in nessun DB in 
futuro ma soprattutto le query vanno svelte.
Piu riesci a lavorare a basso livello con le date e meglio è.
 
Pero come dice qualche saccente io sono antico e adesso ci sono tutti i 
DB che gestiscono le date.
 
-- 
Ripristinare il trattato di Vienna è imperativo!
W IL LOMBARDO-VENETO.
W LA LIBERTA'.
ONORE E GLORIA A S.M. CARLO D'ASBURGO-LORENA!!!


ma hai provato la query in un client/administration di db?



Ciao Stark,
 
anche a me anni fa con i dbf era capitato un problema simile, cercando un determinato record ( che c'era ) mi andava in errore il programma, controllando il dbf sembrava tutto ok, togliendo il record funzionava tutto correttamente.
Credimi, sono diventato matto per cercare di capire cos'era, alla fine ho risolto il problema, era un carattere strano all'interno del record non visibile all'interno del dbf. L'ho scoperto facendo un export del dbf su un file di testo, ed è qui che ho visto il carattere incriminato.
Sinceramente non ti so dire come è entrato all'interno del campo, sta di fatto che successivamente non ho più avuto problemi.
 
Per la cronaca dopo tale episodio e dopo vari problemi di index corrupt sono passato a Firebird e da qui mi è stata una pacchia.
 
Ciao da Enrico c/o Anthelios

 perchè non sapevo come trasformare tutte le date.
 
Anche questo ti era stato gia` detto. Con SQLite, hai piu` opzioni: se non hai bisogno di timestamp troppo precisi, puoi usare una colonna INTEGER con uno Unix epoch time UTC. Bada che data e ora devono essere in UTC. Dire 26/09/2016 alle 12.55 non significa niente, se non specifichi il time zone.
 

 perchè non sapevo come trasformare tutte le date. 
 
https://www.sqlite.org/lang_datefunc.html
 
 
Enrico

Ultima analisi del problema. Applicando la stessa query :
- sul dataset originale di 15500 records fallisce
- progressivamente cancellandone i records (gli ultimi o i primi, non c' è 
differenza; ho provato in entrambi i modi), quando arrivo a 15320 records la 
query non fallisce.
 
Se tolgo il join con la seconda tabella di pochi records da cui prelevo dati 
come il saldo iniziale e la descrizione, lo stesso non c'è problema.
Lo so che mi è stato detto tante volte di cambiare, ma questo è il primo 
"vero" problema che incontro con dBase ..
 

 
https://www.sqlite.org/lang_datefunc.html
 
 
Per aggiungere un po' di dettagli, SQLite supporta CURRENT_TIMESTAMP, che
di default scrive la data in YYYY-MM-DD HH:MM:SS . In ogni caso, SQLite si
aspetta le date secondo questa logica:
http://www.sqlite.org/datatype3.html#date_and_time_datatype
 
 
Enrico

Grazie, sto leggendo un pò ..., ma intanto ho sempre il problema da 
risolvere. Non lo posso risolvere con la conversione che chissà quanto tempo 
mi porterà via. 
 

Ci ho messo tempo, perchè ho provato tute le cose suggerite. Non ho trovato 
corruzioni nei campi nè negli indici e sicuramente la query ricomincia a 
funzionare correttamente portando il dataset a un numero di records di poco 
inferiore. Ne avevo concluso che il problema era il numero di records (poco 
più di 15000), anche se le specifiche dicono che un dataset dBase può avere 
1 miliardo di records.
Ma c'è un join con un'altra tabella di riferimento (di pochi records) e 
questo meccanismo può averci a che fare.
Ma ora ho visto che una query molto simile con un join su un campo diverso 
funziona regolarmente.
 
Questa è la query che fallisce (Dataset MOVIM in Join con BYTD):
 
Select BANCA, B."Descrizion", B."saldo_ini", sum(IMPORTO), 
sum(IMPORTO)+B."saldo_ini", B."saldo", 
B."saldo"-(sum(IMPORTO)+B."saldo_ini"), B."saldo_ia"
from MOVIM M, BYTD B
where M."banca"=B."banca"
group by BANCA,B."Descrizion",B.Saldo,B."saldo_ia",B."saldo_ini"
 
Questa è la query che è OK (stesso dataset MOVIM in Join con BUDGET):
 
SELECT AA, CONTRO, B."Descrizion", B."saldo", sum(IMPORTO)*-1
from MOVIM M, BUDGET B
WHERE (M.AA=B.ANNO) and (trim(M.CONTRO)=trim(
B.ID
)) and (M.T_MOV="U") and 
(M.CONTO<>"GIR") and (B.SOR="S")
group by M."AA",M."CONTRO",B.DESCRIZION, B."saldo"
 
So che è quasi impossibile che qualcuno possa aiutarmi da lontano, comunque 
grazie lo stesso. Spiegare ad altri mi aiuta a chiarirmi le idee .. 
 

Aggiungi il qualificatore di nome tabella davanti a TUTTI i campi e vedi cosa succede.
 
A.
 

Aggiungi il qualificatore di nome tabella davanti a TUTTI i campi e vedi 
cosa succede.
A.
Ho provato subito e dà lo stesso risultato. Ma ho scoperto una cosa 
incredibile. Ho aggiunto nella estrazione un campo del file MOVIM (un campo 
che non cambia il risultato perchè va in concerto con BANCA) e FUNZIONA.
 
In sostanza, semplificando la query:
Select M.BANCA, B."Descrizion", sum(M.IMPORTO)
from MOVIM M, BYTD B
where M."banca" = B."banca" group by M.BANCA,B."Descrizion"
(NON FUNZIONA)
 
Select M.BANCA, M.contro, B."Descrizion", sum(M.IMPORTO)
from MOVIM M, BYTD B
where M."banca" = B."banca" group by M.BANCA,M.contro,B."Descrizion"
(FUNZIONA)