Problema query

di il
28 risposte

Problema query

Buongiorno, mi trovo di fronte una situazione che non so risolvere nel modo che vorrei.
Ho una tabella collegata in azienda (lavorazioni esterne che devo mettere in join con altre) ma mi si propone questo problema.

I campi che devo estrarre dalla tabella sono:

Codice Articolo, Commessa; Fase Lavorazione e, da qui il problema, conto contabile del fornitore (ne ho solo 2 per la fase che mi interessa)
All'ora se tutti gli articoli della stessa commessa vanno da un fornitore, nessun problema.

Se invece ho, per motivi che non sto qui a spiegare, un articolo codice X che, a parità di commessa con codice Y, va da 2 fornitori diversi (K e M) e nella mia query di selezione nel campo calcolato C/L: IIf([CONTCP]='2401002639';'M';"K") ottengo chiaramente che la riga si duplica.

Ho provato quindi a creare due campi nuovi in questo modo
C/LM: IIf([CDFOEO1]='2401002722';"M")
C/LK: IIf([CDFOEO1]='2401002639';"K")

ma ancora non ci siamo perchè non mi raggruppa in riga duplica sempre ottenendo:

Codice C/LM C/LF
x M
x F

Spero di essermi spiegato, quello che no so e come ottenere questo: (una riga unica)

Codice C/LM C/LF
x M F

28 Risposte

  • Re: Problema query

    superkairo ha scritto:


    I campi che devo estrarre dalla tabella sono
    Come si chiama la tabella?

    superkairo ha scritto:


    Codice Articolo, Commessa; Fase Lavorazione e, da qui il problema, conto contabile del fornitore (ne ho solo 2 per la fase che mi interessa)
    I primi 3 campi li ho capiti, poi l'altro o gli altri campo/i quali sono?

    Se questa tabella ha relazioni con altre tabelle, puoi esplicitarlo?

    superkairo ha scritto:


    Codice C/LM C/LF
    x M
    x F

    Spero di essermi spiegato, quello che no so e come ottenere questo: (una riga unica)

    Codice C/LM C/LF
    x M F
    Tutto il discorso io non l'ho capito bene bene. Ma se il problema è soltanto questo, direi che devi servirti della Funzione di concatenazione di Allen Browne
    http://allenbrowne.com/func-concat.htm
  • Re: Problema query

    Ciao Osvaldo, cerco di spiegarmi meglio.
    Credo sia ininfluente sapere il nome tabella ma diciamo righelavest (righe lavorazione esterna) composta da n campi ma a me servono solo questi:
    codice, articolo, commessa, fornitore.
    Diciamo che in una query di selezione dove entro a commessa, il gioco regge se e solo se a parità di commessa, tutti i miei codici sono andati dal fornitore A. Dico inoltre che sulla stessa commessa potrei avere 2 codici uguali (una rettifica di magazzino mi costringe a staccare sulla stessa commessa un altro ordine di produzione sul medesimo codice).

    Se però, questo nuovo ordine di produzione va dal fornitore B, la mia query di selezione chiaramente mi restituisce una cosa del genere:

    Codice....Commessa....Fornitore
    ___1_______x___________A
    ___1_______x___________B

    Se provo a battezzare 2 colonne con la funzione Iff ottengo

    Codice....Commessa....FornitoreA....FornitoreB
    ___1_______x___________A
    ___1_______x________________________B

    Mentre io vorrei ottenere:
    Codice Commessa FornitoreA FornitoreB
    ___1_______x________A________B

    Ho dato un occhio al link postato e credo sia l'unica strada percorribile, anche se non riesco a capire come non possa aggirare il problema, in modo più semplice
  • Re: Problema query

    Considera che è proprio il tentare di ragionare in "orizzontale" come proponi tu che urta con la logica generale di Access. Pertanto la funzione di concatenazione di Allen Browne diventa un "artificio costruito". Non conosco altre soluzioni.
    Un'alternativa sarebbe, se il massimo di Fornitori-Commessa è 2, aggiungere un campo Fornitore2 alla tabella che compili solo in quei casi "particolari".
  • Re: Problema query

    Certo, ma per fare così dovrei chiamare i sistemisti, fargli scrivere un po di RPG su AS400 per aggiungere alla tabella lav esterne un secondo campo fornitore e gestire il caso.
    Mi sa che sono più economico io!!!!!

    Grazie.
  • Re: Problema query

    OsvaldoLaviosa ha scritto:


    superkairo ha scritto:


    I campi che devo estrarre dalla tabella sono
    Come si chiama la tabella?

    superkairo ha scritto:


    Codice Articolo, Commessa; Fase Lavorazione e, da qui il problema, conto contabile del fornitore (ne ho solo 2 per la fase che mi interessa)
    I primi 3 campi li ho capiti, poi l'altro o gli altri campo/i quali sono?

    Se questa tabella ha relazioni con altre tabelle, puoi esplicitarlo?

    superkairo ha scritto:


    Codice C/LM C/LF
    x M
    x F

    Spero di essermi spiegato, quello che no so e come ottenere questo: (una riga unica)

    Codice C/LM C/LF
    x M F
    Tutto il discorso io non l'ho capito bene bene. Ma se il problema è soltanto questo, direi che devi servirti della Funzione di concatenazione di Allen Browne
    http://allenbrowne.com/func-concat.htm

    Osvaldo, ho parlato troppo presto, non riesco ad ottenere quello che voglio. Ho cercato in questo forum ma sembra che nessuno abbia mai questa necessità (mi sembra stranissimo)
    Provo a spiegarmi, ho letto la guida //allenbrowne.com/func-concat.html ma non capisco una cosa.
    Io ho la mia query di selezione sulla tabella riglaveste (una normale query che mi porta a duplicare la riga se ho stessa commessa e stesso codice articolo ma 2 fornitori diversi) ora, la sql di tale query è:
    SELECT RIGHELAVEST.COMMESSA, RIGHELAVEST.CODICE, RIGHELAVEST.FASE, RIGHELAVEST.FORNITORE
    FROM RIGHELAVEST
    WHERE (((RIGHELAVEST.COMMESSA)<>'') AND ((RIGHELAVEST.FASE)="050"));
    
    Domanda: devo modificare la sql della query o come dice la guida creare un modulo sulla query? Scusa ma questo passaggio non mi è chiaro per niente.
  • Re: Problema query

    Un'alternativa che ti suggerisco é mandare in join la tabella su se stessa facendo combaciare i record a parità di articolo e commessa ma vincolando il fornitore diverso.

    Una cosa tipo: [CODE] SELECT TA.Codice, TA.Commessa, TA.Fornitore, TB.Fornitore FROM RIGHELAVEST AS TA LEFT JOIN RIGHELAVEST AS TB ON (TA.Commessa = TB.Commessa) AND (TA.Codice = TB.Codice) AND (TA.Fornitore <> Tb.Fornitore) Where TA.Fornitore = "A" Ovviamente, come già detto da Osvaldo, questo approccio è parecchio contrario alla logica dei Database, pertanto funziona in contesti molto limitati ad esempio se i fornitori sono soltanto due.
    Bisogna anche gestire l'eventualità in cui il fornitore sia soltanto "B".
  • Re: Problema query

    Come da te suggerito ho messo in join le 2 tabelle ma mi scontro con un problema (lascio per il momento stare la tua istruzione SQL), quando provo a fare questo:
    C/LA: IIf([RIGHELAVEST]![FORNITORE]='2401002639';"A")
    Naturalmente la seconda tabella in join è RIGHELAVEST_1 con lo stesso campo FORNITORE e la sintassi mi sembra corretta, classico esempio da guida MS
    [Employees]![Last Name]....perchè non funziona???
  • Re: Problema query

    superkairo ha scritto:


    Come da te suggerito ho messo in join le 2 tabelle ma mi scontro con un problema (lascio per il momento stare la tua istruzione SQL)
    E come le metti in JOIN? Se lasci stare il mio predicato (che comunque è un prototipo... Non farebbe male vedere come lo hai adattato al tuo caso specifico, prima di discutere di problemi che può dare), specifica come hai strutturato i vincoli.

    superkairo ha scritto:


    , quando provo a fare questo:
    C/LA: IIf([RIGHELAVEST]![FORNITORE]='2401002639';"A")
    Ma dove provi? Nella query? In una maschera? In un report?

    superkairo ha scritto:


    Naturalmente la seconda tabella in join è RIGHELAVEST_1 con lo stesso campo FORNITORE e la sintassi mi sembra corretta, classico esempio da guida MS
    [Employees]![Last Name]....perchè non funziona???
    Non funziona vuol dire poco... Dà errore? Se si, quale? Oppure da un risultato non atteso?
  • Re: Problema query

    Attualmente le 2 tabelle in join (sono in join i campi chiave delle due tabelle)
    SELECT  LEMOO01F.CMSAEO1,  LEMOO01F.CDAREO1,  LEMOO01F.CDFAEO1,  LEMOO01F.CDFOEO1, IIf([LEMOO01F]![CDFOEO1]='2401002639',"A") AS Espr1
    FROM  LEMOO01F INNER JOIN  LEMOO01F AS  LEMOO01F_1 ON ( LEMOO01F.NSRGEO1 =  LEMOO01F_1.NSRGEO1) AND ( LEMOO01F.NRRGEO1 =  LEMOO01F_1.NRRGEO1) AND ( LEMOO01F.NROREO1 =  LEMOO01F_1.NROREO1) AND ( LEMOO01F.TDOCEO1 =  LEMOO01F_1.TDOCEO1) AND ( LEMOO01F.CDDTEO1 =  LEMOO01F_1.CDDTEO1) AND ( LEMOO01F.CDFAEO1 =  LEMOO01F_1.CDFAEO1) AND ( LEMOO01F.CMSAEO1 =  LEMOO01F_1.CMSAEO1) AND ( LEMOO01F.CDAREO1 =  LEMOO01F_1.CDAREO1)
    GROUP BY  LEMOO01F.CMSAEO1,  LEMOO01F.CDAREO1,  LEMOO01F.CDFAEO1,  LEMOO01F.CDFOEO1, IIf([LEMOO01F]![CDFOEO1]='2401002639',"A")
    HAVING ((( LEMOO01F.CMSAEO1)="B3735") AND (( LEMOO01F.CDFAEO1)="050"));
    
    
    Dove:
    LEMOO01F= Tabella collegata via ODBC
    LEMOO01F_1= Tabella collegata via ODBC

    CMSAEO1= Commessa
    CDAREO1= Codice
    CDFAEO1= Fase
    NRRGEO1= Numero Riga
    NROREO1= Numero Ordine
    TDOCEO1 = Tipo documento


    Ma quando lancio la query di selezione mi appare la maschera di inserimento parametro su questo passaggio:

    IIf([LEMOO01F]![CDFOEO1]='2401002639',"A")

    ma a me sembra che la sintassi sia giusta Tabella (LEMOO01F) Campo CDFOEO1.....
  • Re: Problema query

    Non sono un profondo conoscitore di access, ma quel messaggio vuol dire che il campo non esiste ed interpreta [LEMOO01F]![CDFOEO1] come parametro. Quindi hai di sicuro un errore nella sintassi... Escluderei la tabella, altrimenti ti segnalerebbe già il primo campo della SELECT. Sicuro che sia solo nella Iif? Anche il quarto campo della SELECT coincide. Prova a fare una SELECT solo su quel campo:
    SELECT [LEMOO01F]![CDFOEO1]
    FROM LEMOO01F
    Secondo me ti richiede lo stesso il parametro...
  • Re: Problema query

    Scusa sono un pollo!!!!
    Per postare codice il più pulito possibile ho omesso, prima del nome tabella, anche la libreria da dove la scelgo, tipo così [XXXXX_LEMOO01F]![CDFOEO1] ed ora la query sembra funzionare, domani provo per vedere se soddisfa le mie necessità.
  • Re: Problema query

    Niente da fare, anche mettendo in join le 2 tabelle tra di loro, ottengo sempre un risultato così:

    Codice....Commessa....FornitoreA....FornitoreB
    ___1_______x___________A
    ___1_______x________________________B

    L'unico modo che ho per risolvere apparentemente, è con una query a campi incrociati, ma da qui poi non riesco a creare una tabella con la stessa struttura (ovvero torno sempre a duplicare il record quando i 2 fornitori sono diversi e ricapito nell'esempio appena sopra)
  • Re: Problema query

    superkairo ha scritto:


    Niente da fare, anche mettendo in join le 2 tabelle tra di loro, ottengo sempre un risultato così:...
    A me sembra strano, se non impossibile. Ho fatto più di un test con i tuoi dati di esempio e ho ottenuto il risultato che cercavi.
    Sicuro che la tua Select sia simile a:
    SELECT TA.Codice,
           TA.Commessa,
           TA.Fornitore,
           TB.Fornitore
    FROM        LEMOO01F AS TA
    INNER JOIN  LEMOO01F AS TB ON <condizioni di join>
    WHERE<condizioni di filtro>
    GROUP BY <campi>
    Perché se non specifichi TB.Fornitore è ovvio che non te lo seleziona.
  • Re: Problema query

    Ho provato ancora a lavorarci su ma sicuramente questa SQL è errata in quanto manca la condizione di WHERE (ora ho lasciato anche la libreria, il codice è un po' meno leggibile)
    SELECT DEN90DAT_LEMOO01F.CMSAEO1, DEN90DAT_LEMOO01F.CDAREO1, DEN90DAT_LEMOO01F.CDFAEO1, IIf([DEN90DAT_LEMOO01F]![CDFOEO1]='2401002639',"A") AS [C/LD], IIf([DEN90DAT_LEMOO01F_1]![CDFOEO1]='2401002722',"B") AS [C/LF]
    FROM DEN90DAT_LEMOO01F INNER JOIN DEN90DAT_LEMOO01F AS DEN90DAT_LEMOO01F_1 ON (DEN90DAT_LEMOO01F.NROREO1 = DEN90DAT_LEMOO01F_1.NROREO1) AND (DEN90DAT_LEMOO01F.CMSAEO1 = DEN90DAT_LEMOO01F_1.CMSAEO1) AND (DEN90DAT_LEMOO01F.CDAREO1 = DEN90DAT_LEMOO01F_1.CDAREO1)
    GROUP BY DEN90DAT_LEMOO01F.CMSAEO1, DEN90DAT_LEMOO01F.CDAREO1, DEN90DAT_LEMOO01F.CDFAEO1, IIf([DEN90DAT_LEMOO01F_1]![CDFOEO1]='2401002722',"B"), DEN90DAT_LEMOO01F.CDFOEO1
    HAVING (((DEN90DAT_LEMOO01F.CMSAEO1)="B3735") AND ((DEN90DAT_LEMOO01F.CDFAEO1)="050"));
    
    poi su tuo consiglio ho modificato così
    SELECT DEN90DAT_LEMOO01F.CMSAEO1, DEN90DAT_LEMOO01F.CDAREO1, DEN90DAT_LEMOO01F.CDFAEO1
    FROM DEN90DAT_LEMOO01F INNER JOIN DEN90DAT_LEMOO01F AS DEN90DAT_LEMOO01F_1 ON (DEN90DAT_LEMOO01F.NROREO1 = DEN90DAT_LEMOO01F_1.NROREO1) AND (DEN90DAT_LEMOO01F.CMSAEO1 = DEN90DAT_LEMOO01F_1.CMSAEO1) AND (DEN90DAT_LEMOO01F.CDAREO1 = DEN90DAT_LEMOO01F_1.CDAREO1)
    [u][b]WHERE ((([DEN90DAT_LEMOO01F]![CDFOEO1])<>([DEN90DAT_LEMOO01F_1]![CDFOEO1])))[/b][/u]
    GROUP BY DEN90DAT_LEMOO01F.CMSAEO1, DEN90DAT_LEMOO01F.CDAREO1, DEN90DAT_LEMOO01F.CDFAEO1
    HAVING (((DEN90DAT_LEMOO01F.CMSAEO1)="B3735") AND ((DEN90DAT_LEMOO01F.CDFAEO1)="050"));
    
    
    Oltre a ricevere l'errore che mi avvisa di deselezionare la casella di controllo Mostra, e non so il perchè, mi viene da pensare che devo usare due condizioni di where, una per la colonna a e una per la colonna b (in A va solo un fornitore, in B l'altro).

    Dove mi sto incartando?
Devi accedere o registrarti per scrivere nel forum
28 risposte