Newsgroup: it.comp.appl.access
Titolo: Query su righe ordini...

Per spiegare questo problema userò un banale esempio:
tbl_Ordini   (testate ordini)
    NrOrd
    DataOrd
    CodCli
    ...
tbl_DetOrdini   (righe ordini)
    IDDetOrd
    NrOrd
    CodArt
    Descriz
    ...
Ho preparato una form che da la possibilità all'utente di effettuare delle
ricerche personalizzate chiedendo facoltativamente la digitazione/scelta
del:
CodCli
DataOrd (da... a...)
CodArt
Descriz (con like ...)
In pratica l'utente può ricercare gli ordini di un determinato cliente,
volendo in un determinato periodo, di un particolare articolo e/o con una
descrizione simile a...
Componendo la stringa SQL però mi trovo ad avere
strSQL = "" & "SELECT Ordini.NrOrd, Ordini.DataOrd, Ordini.CodCli,
DetOrdini.CodArt , DetOrdini.Descriz"
strSQL = strSQL & " FROM Ordini INNER JOIN DetOrdini ON Ordni.NrOrdine =
DetOrdini.NrOrd"
strSQL = strSQL & " WHERE Data >= #" & vntDataIni & "# AND Data <= #" &
vntDataFin & "#"     'vntDataIni/Fin lo passo da un controllo della form
If strCodCli <> "" Then
    strSQL = strSQL & " AND Ordini.CodCli ='" & strCodCli & "'"
'strCodCli lo passo da un controllo della form
End If
If strCodArt <> "" Then
    strSQL = strSQL & " AND DetOrdini.CodArt ='" & strCodArt & "'"
'strCodArt lo passo da un controllo della form
End If
If strDescrArt <> "" Then
    strSQL = strSQL & " AND DetOrdini.Descriz LIKE '" & strDescrArt & "'"
'strDescrArt lo passo da un controllo della form
End If
... Group by... Order By
In questo modo però ottengo dei record ripetuti per ogni riga del DetOrdini.
Anche mettendo, ovviamente, tutti i campi selezionati con il SELECT nel
GROUP BY.
Potrei risolvere ricercando prima nella tbl_Ordini e poi se l'utente ha
digitato anche un CodArt e/o Descrizione ripassare anche le righe degli
Ordini già estratti.
Vorrei però sapere se esiste un metodo più "elegante".
Spero di essere stato esauriente.
------------
Grazie
UJ

 ha scritto nel messaggio
news:94i5bm$2r0$1...@fe1.cs.interbusiness.it...

Presupposti
------------
1) Il campo NrOrd è numerico
2) Il campo DataOrd è di tipo Data/ora
3) Il campo CodCli è numerico
4) Il campo CodArt è numerico
5) Il campo Descriz è di tipo testo
Creati una maschera chiamata Maschera1 ch abbia come origine record
tbl_Ordini e una visualizzazione a Maschere continue.
Creati una seconda maschera chiamata Maschera2 che NON abbia origine record
e visualizzazione a Maschera singola.
Maschera2 deve contenere 5 caselle di testo non associate chiamate
rispettivamente Cliente, DataDa, DataA, Articolo e Descrizione.
Inserisci in Maschera2 anche un pulsante di comando (chiamalo Cerca) per
lanciare la ricerca dopo che avrai digitato le chiavi di ricerca  nelle
caselle di testo non associate.
A fronte dell'evento "Dopo aggiornamento" del controllo DataDa genera il
seguente codice VBA:
Private Sub DataDa_AfterUpdate()
Me!DataA = Me!DataDa
End Sub
Creati un modulo che abbia i seguenti contenuti:
Option Compare Database
Option Explicit
Public gstr As String
Creati un altro modulo che contenga la seguente funzione:
Option Compare Database   'Use database order for string comparisons
Option Explicit
Function IsNothing(varToTest As Variant) As Integer
'  Tests for a "logical" nothing based on data type
'  Empty and Null = Nothing
'  Number = 0 is Nothing
'  Zero length string is Nothing
'  Date/Time is never Nothing
    IsNothing = True
    Select Case VarType(varToTest)
        Case vbEmpty
            Exit Function
        Case vbNull
            Exit Function
        Case vbBoolean
            If varToTest Then IsNothing = False
        Case vbByte, vbInteger, vbLong, vbSingle, vbDouble, vbCurrency
            If varToTest <> 0 Then IsNothing = False
        Case vbDate
            IsNothing = False
        Case vbString
            If (Len(varToTest) <> 0 And varToTest <> " ") Then IsNothing =
False
    End Select
End Function
A fronte dell'evento "Su clic" del pulsante di comando genera il seguente
codice VBA:
Private Sub Cerca_Click()
Dim db As Database, rst As Recordset
Dim strArt As String, strDescr As String
gstr = ""
If Not IsNothing(Me!Cliente) Then
    If IsNothing(gstr) Then
        gstr = "[CodCli] = " & Me!Cliente
    Else
        gstr = gstr & " AND [CodCli] = " & Me!Cliente
    End If
End If
If Not IsNothing(Me!DataDa) Then
    If IsNothing(gstr) Then
        gstr = "[DataOrd] >= #" & Format$(Me!DataDa, "mm/dd/yy") & "#"
    Else
        gstr = gstr & " AND [DataOrd] >= #" & Format$(Me!DataDa, "mm/dd/yy")
& "#"
    End If
End If
If Not IsNothing(Me!DataA) Then
    If IsNothing(gstr) Then
        gstr = "[DataOrd] <= #" & Format$(Me!DataA, "mm/dd/yy") & "#"
    Else
        gstr = gstr & " AND [DataOrd] <= #" & Format$(Me!DataA, "mm/dd/yy")
& "#"
    End If
End If
If Not IsNothing(Me!Articolo) Then
    strArt = "[CodArt] =" & Me!Articolo
    If IsNothing(gstr) Then
        gstr = "[NrOrd] IN (Select NrOrd From tbl_DetOrdini Where " _
          & strArt & ")"
    Else
        gstr = gstr & " AND [NrOrd] IN (Select NrOrd From tbl_DetOrdini
Where " _
          & strArt & ")"
    End If
End If
If Not IsNothing(Me!Descrizione) Then
    strDescr = "[Descriz] Like " & Chr$(34) & "*" & Me!Descrizione & "*" &
Chr$(34)
    If IsNothing(gstr) Then
        gstr = "[NrOrd] IN (Select NrOrd From tbl_DetOrdini Where " _
          & strDescr & ")"
    Else
        gstr = gstr & " AND [NrOrd] IN (Select NrOrd From tbl_DetOrdini
Where " _
          & strDescr & ")"
    End If
End If
Me.Visible = False
Set db = CurrentDb
Set rst = db.OpenRecordset("SELECT DISTINCTROW " & _
    "tbl_Ordini.NrOrd " & _
    "FROM tbl_Ordini" & _
    " WHERE " & gstr & ";")
If rst.RecordCount = 0 Then
    MsgBox "Non ci sono Ordini che soddisfano i criteri", _
        vbExclamation, "Esito ricerca"
    gstr = ""
    Me.Visible = True
    rst.Close
    Exit Sub
End If
rst.Close
DoCmd.OpenForm FormName:="Maschera1", _
 WhereCondition:=gstr
DoCmd.Close acForm, Me.Name
End Sub
Ora apri Maschera2, digita le sole chiavi in base alle quali effettuare la
ricerca, pigia il pulsante di comando.
Spero che era ciò che ti serviva.
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://members.xoom.it/it_db_access/
---------------------------------------------