Newsgroup: it.comp.appl.access
Titolo: qualche riga di troppo

ciao a tutti
ho creato questa function,
ma anche se funziona
vorrei migliorarla, perchè
c'è qualche riga di codice 
di troppo...
Grazie per l'aiuto. 
 
Public Function fctConf_Chiusura( _
  ByRef frm As Form) As Boolean
 
  Dim rsCheck As DAO.Recordset
  Dim CheckArray(1 To 3) As String, J As Byte
  Dim campo1 As Byte, campo2 As Byte, campo3 As Byte
  Dim X As String
 
  Set rsCheck = frm!SM_DettCarichi.Form.RecordsetClone
 
  If rsCheck.BOF Then 'se non ci sono record nel recordset
    MsgBox "Non ci sono record.", vbExclamation, "Attenzione!"
  Else
    rsCheck.FindFirst "nColli=0"
    campo1 = IIf(rsCheck.NoMatch, 1, 0)
 
    rsCheck.FindFirst "Quantità=0"
    campo2 = IIf(rsCheck.NoMatch, 1, 0)
 
    rsCheck.FindFirst "Prezzo=0"
    campo3 = IIf(rsCheck.NoMatch, 1, 0)
 
    If IsNull(frm!DataChiusura) Then
      frm!DataChiusura.SetFocus
    ElseIf IsNull(frm!TargaCamion) Then
      frm!TargaCamion.SetFocus
    Else
      CheckArray(3) = "nColli"
      CheckArray(2) = "Quantità"
      CheckArray(1) = "Prezzo"
 
    For J = 1 To 3
      rsCheck.FindFirst CheckArray(J) & " = 0"
 
      If Not rsCheck.NoMatch Then
        frm!SM_DettCarichi.Form.Bookmark = rsCheck.Bookmark
        frm!SM_DettCarichi.SetFocus
        frm!SM_DettCarichi.Form(CheckArray(J)).SetFocus
 
      End If
 
    Next
    End If
 
    X = IIf(IsNull(frm!DataChiusura), ", data Chiusura", "") _
      & IIf(IsNull(frm!TargaCamion), ", Targa", "") _
      & IIf(campo1 = 0, ", n°Colli", "") _
      & IIf(campo2 = 0, ", Quantità", "") _
      & IIf(campo3 = 0, ", Prezzo", "")
 
    If (X) <> "" Then
      MsgBox "Attenzione manca:" & Mid(X, 2) & ".", vbExclamation, "Attenzione!"
    Else
      fctConf_Chiusura = True
 
    End If
 
  End If
 
  Set rsCheck = Nothing
 
End Function
 

Franco, mi spiace ma è più forte di me quando vedo certe cose...
Scrivi codice che di tecnico NON HA NULLA, sembra una accozzaglia di cose senza senso.
Che poi restituisca l'effetto richiesto è un dettaglio, quasi casuale,... ma è assolutamente INCOMPRENSIBILE per i comuni mortali.
 
Contiene errori concettuali enormi e tecnici altrettanto enormi...
 
Function Public che poi ha riferimenti FISSI a SubForm ed a Campi.... non ha senso sia Public.
Usi un ARRAY inutilmente sono 3 Elementi che nei FindFirst usi in modo esplicito poi invece, su condizione popoli un Array e fai la stessa cosa che hai fatto sopra nel RS della SubForm, ma senza array...
 
Secondo me ti manca la logica razionale, tu scrivi codice iserendolo in Function e pensi faccia già il 90% del lavoro... ma non è così...!
 
Queste osservazioni te le feci oltre un anno fa... ed il tuo metodo di strutturazione del codice NON E' MIGLIORATO DI NULLA.
 
Ora, critica a parte che un po soddisfano il mio sadismo, mi chiedo se hai provato a studiare qualche testo tecnico che spiega da zero come dichiarare variabili, oggetti, come usare i cicli, come condizionare le scelte, come usare gli Oggetti, i Recordset...?
 
Credimi che leggere il tuo codice è IMPOSSIBILE, presenta fattori di estrema ILLOGICITA' che per chi invece scrive codice in modo più strutturato è estremamente fuorviante...!
 
Si fa prima, come accade spesso, se spieghi cosa devi fare, e riscrivere il codice da ZERO... ma questo non è proprio quello che si chiede nel NG.
 
@Alex


ciao Alex e grazie
Infatti se ero convinto di quello che avevo
fatto, non chiedevo aiuto.
Ora io vorrei realizzare una function tipo
questa sotto, che credo sia corretta.
In pratica su di un pulsante,
prima dell'apertura del report,
se ci sono controlli non compilati
o con valore "=0" il Msgbox
me li elenca e il cursore si posiziona
sul primo controllo da compilare.
 
Private Function fctConf_Carico( _
  ByRef frm As Form) As Boolean
 
  Dim rsCheck As DAO.Recordset
  Dim strFrm As String, vData As Variant
  Dim X As String
 
  Set rsCheck = frm!SM_DettCarichi.Form.RecordsetClone
 
  If rsCheck.BOF Then 'se non ci sono record nel recordset
    MsgBox "Non ci sono record.", vbExclamation, "Attenzione!"
  Else
    strFrm = frm.Name
 
    If strFrm = "M_GestioneOrdini" Then
      vData = frm!SM_CarichiFornitori.Form!DataCarico
      frm!SM_CarichiFornitori.SetFocus
      frm!SM_CarichiFornitori.Form!DataCarico.SetFocus
    Else
      vData = frm!DataCarico
      frm!DataCarico.SetFocus
 
    End If
 
    rsCheck.FindFirst "nBancali=0 And nColli=0"
 
    If Not rsCheck.NoMatch Then
      frm!SM_DettCarichi.Form.Bookmark = rsCheck.Bookmark
      frm!SM_DettCarichi.SetFocus
      frm!SM_DettCarichi.Form!nBancali.SetFocus
 
    End If
 
    X = IIf(IsNull(vData), ", data Carico", "") _
      & IIf(Not rsCheck.NoMatch, ", n°Bancali", "")
 
    If (X) <> "" Then
      MsgBox "Attenzione manca:" & Mid(X, 2) & ".", vbExclamation, "Attenzione!"
    Else
      fctConf_Carico = True
- nascondi testo citato -


Prima di dare la spiegazione avevo solo il dubbio non andasse bene... ora ho la certezza... e tu dici che è corretta...?
 
Ma se vuoi verificare i controlli perché stai a controllare il recordsetclone...(poi veniamo alla Subform che spero sia in modalità continua)... 
Nella form si cicla la collection Controls ma se hai 3 controlli verifica quelli in modo esplicito... su BeforeUpdate oppure su evento prima di stampare.
per la subform mi chiedo perché non verifichi i dati al momento dell'inserimento dove hai il singolo record invece che alla stampa che ti tocca colare tutto...?
In tutti i casi... se usi il recordsetclone poi devi spostare il bookmark altrimenti non va bene... e se i controlli non hanno lo stesso nome del campo... Non lo trovi più se non con un nuovo ciclo...
boh... 
 
mi fermo.
@Alex

 @Alex
 
 
grazie