Trovare valori mancanti in tabelle DB2

martedì 18 luglio 2017 - 11.35
Tag Elenco Tags  Access (.mdb)

Tempestaxmen Profilo | Newbie

Ciao,
non so se questa domanda è già stata fatta perchè non riesco a fare una ricerca nel forum.
Io ho una tabella DB2 cui accedo tramite Access, che ha un campo di tipo testo (in particolare una lettera da A a Z).
Devo riuscire a trovare il primo "buco" disponibile per inserire un nuovo record.
Cioè:
se sotto certe condizioni trovo che i record sono valorizzati con
A
B
D
E
...
voglio che la query mi torni il valore C.
In sql ho scritto questa query (funzionante):

select top 1 char(ascii(m.progressivo) + 1) as PrimoBuco
from RTP_Richiesta as m
left outer join RTP_Richiesta as r on ascii(m.progressivo) + 1 = ascii(r.progressivo)
where r.progressivo is null
and m.CodDirigente = '0217307'
and m.anno = 2015
and m.trimestre = 4

Non riesco a scrivere l'equivalente in Access per lavorare sulla tabella DB2.
Ho scritto questo, ma non funziona:

select chr(ascii(m.DD33_PROGR) + 1) as PrimoBuco
from FASIADMN.FDDTBS33 as m
left outer join FASIADMN.FDDTBS33 as r on ascii(m.DD33_PROGR) + 1 = ascii(r.DD33_PROGR)
where r.DD33_PROGR is null
and m.DD10_COD_DIR = '0217307'
and m.DD23_ANNO = '2015'
and m.DD33_BIMES = '4'

Potete aiutarmi?

renarig Profilo | Expert

Quello che proponi sembrerebbe perfetto :)
ma restituisce degli #Errore stranissimi
ancora non riesco a comprenderli


vediamola diversamente:

Asc(NomeCampo) presuppone che nel campo ci sia un solo carattere
ma se per esempio c'è scritto Pappa ?????

Poi gli Asc(n) ha 256 valoro da 0 a 255
e include anche caratteri tipo:
; : _ spazio ? eccetera

se la tua sequenza di caratteri dell'alfabeto va da
(sparo dei numeri a caso) 67 a 105
rischi di trovarti assente il 66 che è il DuePunti (sempre a caso)


Pensiamo una soluzione alternativa :)
quanti record ha la tua tabella ???
se fai per esempio un: SELECT DISTINCT Left(NomeCampo, 1) FROM NomeTabella
ottieni TUTTI i caratteri dell'alfabeto che ti interessano
oppure si tratta di una tabella piccola dove potremme mancare un carattere


questo è per evitare di consigliarti di creare appositamente una BRUTTA (ma funzionale) tabellina ad hoch


.












Tempestaxmen Profilo | Newbie

Guarda il campo contiene sicuramente SOLO i valori che vanno dalla A alla Z e null'altro.
Alla fine per girare intorno al problema mi sono fatta una distinct che mi restituisce tutti i valori presenti e poi la logica l'ho messa lato codice.
Quello che non capisco è come mai la query scritta così funziona perfettamente su sql, ma non su db2 che cmq supporta le stesse parole chiave.

Grazie mille per il tuo supporto.

renarig Profilo | Expert

>Quello che non capisco è come mai la query scritta così funziona perfettamente su sql, ........

Mhhhh!!!!!
sicura che funziona ?????

Io la ho testata su SQLServer e con i valori K, D, Z, H, L
mi ha restituito E
Ma forse tu volevi una A ?????


Poi la ho testata con TUTTE le lettere maiuscole dell'alfabeto e mi ha
restituito [ perché evidentemente la parentesi quadra
è il primo carattere dopo l'alfabeto maiuscolo

Certo che mi ci sto "intestardendo" anch'io
(forse mi sto arrugginendo :( :( )

se hai risolto via codice è certamente un ottimo ripiego :)

.

Tempestaxmen Profilo | Newbie

Oddio, effettivamente io avevo fatto le prove avendo sempre la A come prima lettera e quindi mi restituiva correttamente il primo buco che trovava,
ma evidentemente parte a considerare la prima lettera utile che trova (nel tuo caso la D).
Quindi al momento ho "fallito" sia su sql che su db2!!!!

renarig Profilo | Expert

>......... cui accedo tramite Access, ...........

Mi ci sono intestardito anch' io e alla fine sembra che funziona

Lavorando con Access chè è il tuo Client

Hai una tabella di nome "T1"
con un solo e unico campo testo di nome "aax"

ho costruito questa serie di piccole query a catena che poi saranno da nidificare in una unica

ho considerato solamente i caratteri dell'alfabeto dalla "A" alla "Z" e dalla "a" alla "z"
unificandoli nella serie maiuscola
(significa che i minuscoli vengono assimilati al maiuscolo)

ripeto poi le query dovranno essere nidificate
poi dovrai filtrare per anno trimestre e per CodDipendente






questa la catena di qyery:

q00
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

q01
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

q10
SELECT q00.aax, q00.asx0 FROM q00 LEFT JOIN q01 ON q00.asx0 = q01.asx1 WHERE (((q01.aax) Is Null)) ;

q15
SELECT (IIf((SELECT Min(asx0) FROM q00)=65,Min([q10].[asx0]),64))+1 AS asy FROM q10 ;

q16
SELECT q15.asy FROM q15 WHERE (((q15.asy)<90.5)) ;

q20
SELECT Chr([asy]) AS PrimoMancante FROM q16 ;



Facci sapere

.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5