Newsgroup: it.comp.appl.access
Titolo: sintassi per il percorso nella subform

ciao a tutti
 
se nella form ho
SM_Email.Tag = Me.Name
 
qual'è la sintassi per la subform?
 
 
grazie

It happens that Franco dellavalle formulated :

1 - Il Me quando non è funzione può essere sempre omesso:
    Msgbox Name restituisce il Form-Name come Msgbox Me.Name
 
2 - Form-Name, non ha importanza
    subForm-Name = ABC
    subForm-Control = Costo, quindi:
    Msgbox [ABC].Form![Costo]
 
3 - Qual'è in italiano non si apostrofa: qual è.
 
Bruno

 Bruno
 
grazie Bruno


e se dalla subform devo leggere name form?
grazie

Franco dellavalle explained :

Msgbox Parent.Name
 
Bruno


ciao Bruno
e nella Form su apertura devo scrivere
Forms!MiaForm.Tag = Name ?


è qui che faccio l'errore
 
-->If Parent.Tag > "" Then 
     strFrm = Parent.Name
 
   End If
 
Come va impostato Tag nella subform?

Franco dellavalle has brought this to us :

Fino a cinque minuti fa di Tag non conoscevo nemmeno l'esistenza.
Ho consultato l'Help ma proprio non ne ho inteso l'utilità.
Spiacente.
 
Bruno


grazie Bruno


ciao Bruno
nella subfrom ho:
 
Dim strFrm As String    
strFrm = Parent.Name
 
Select Case strFrm
ecc. ecc.
 
però se la apro singolarmente senza aprire la form
mi da: riferimento alla proprietà Parent non valido
nell'espresione...
perchè? è ugualmente corretto?


Metti la gestione ERRORI come dovresti già conoscere da tempo... e se genera l'errore specifico lo gestisci sapendo che NON è una SubForm e che di conseguenza non puoi richiamare Parent...
 
Altrimenti determina prima se la Form è SubForm o no... e gestisci di conseguenza...
 
Public Function fIsSubForm(mF As Access.Form) As Boolean
    On Error Resume Next
    Dim varName             As Variant
    varName = 
mF.Parent.Name
 
    fIsSubForm = (Err.Number = 0)
End Function
 
 
If fIsSubForm(Me) Then
 
Else
 
End if
 
@Alex


grazie Alex

Il giorno lunedì 12 dicembre 2016 02:39:34 UTC+1, Bruno Campanini ha scritto:

ciao Bruno 
come faccio a capire quando è funzione e qunado non lo é?

Franco dellavalle wrote :

Dall'Help:
In Visual Basic, a function procedure performs
a task and then returns control to the calling
code, and it also returns a value.
 
Esempio:
Supponi di avere in una Form 4 Textbox: Text1, Text2, Text3, Text4.
 
Per leggerne il contenuto puoi fare:
Msgbox Me![Text1]
Msgbox Me![Text2]
Msgbox Me![Text3]
Msgbox Me![Text4]
qui Me è un Method e lo puoi anche omettere.
 
Oppure puoi fare:
For i = 1 To 4
    Msgbox Me("Text" & i)
Next
qui Me è una Function e non lo puoi omettere, ovvero
omettendolo non ottieni di ciascuno il Value ma il Name.
 
Usa l'Help... c'è quasi tutto.
Poi lavora con la tua testa sul codice, perché
la MS svolge gli esempi considerandoci tutti
un branco d'imbecilli, come fanno di solito
i programmatori.
 
Bruno

 come faccio a capire quando è funzione e qunado non lo é?
 
Me non è mai una funzione.
Invece è una parola chiave che rappresenta l'istanza della classe dove 
il codice attuale viene eseguito. Vuol dire che Me prende il posto di un 
oggetto. (ca. come descritto qui per VS2008: 
https://msdn.microsoft.com/en-us/library/7e58sbke(v=vs.90).aspx
)
 
Se la puoi ommettere dipende della sintassi usata e delle circostanze, 
cioè se usi Me in un contesto univoco o no.
 
Ha almeno due funzioni:
 
1) Si usa Me come variabile per non sempre deve esplicitamente scrivere 
il riferimento e il nome della classe/del oggetto attuale 
(Forms!NomeForm, Report("NomeReport"), NomeClasse.Metodo ecc.).
 
2) Si usa Me per concretizzare che questo che segue al Me (proprietà, 
insieme, oggetto, metodo) si riferisce proprio all'istanza/oggetto 
attuale non ad una variabile, costante, parola chiave o un contesto diverso.
 
Insomma Me spesso non è "necessario" per eseguire il codice ma rende il 
codice più robusto (perché evita malintesi) e Me rende il codice molto 
più leggibile, soprattutto per gente che deve leggere il codice di altri 
programmatori, perché è sempre e subito chiaro cosa è inteso.
 
Nel mio lavoro spesso devo leggere codice di altri per fare 
rielaborazioni ecc. ed è faticoso se il programmatore non ha usato Me 
per disambiguire il contesto, come purtroppo lo fanno molti.
 
Per questo ti consiglio di usare Me dovunque possibile e non mai 
risparmiare queste due lettere benedette.
 
-- 
Ciao
Karl
*********
Access FAQ:  
http://www.donkarl.com/it
 


grazie Bruno


grazie Karl

 contesto, come purtroppo lo fanno molti.
Ti stimo troppo Karl per credere a quel che dici.
Access usa di default il Me così come usa di default il
VarType Variant tutte le volte che scrivi Dim ABC.
 
Tant'è vero che sei obbligato a precisare con
CodeContextObject l'oggetto sul quale deve agire
la procedura se tale oggetto è diverso da Me.
 
Comunque siamo d'accordo su un punto: il più delle
volte Me non è necessario e in tali circostanze
abbiamo ragione tutt'e due.
 
Ciao Karl e Buon Natale.
 
Bruno


chiedo scusa, ma da form, non riesco a recuperare il SubForm-name
grazie

 grazie
 
Fai attenzione al CONTAINER rispetto al nome dell'oggetto...
 
Me!
NomeContainer.Form.Name
 
 
@Alex

 chiedo scusa, ma da form, non riesco a recuperare il SubForm-name
 
 Dim i
 For Each i In Controls
    If i.ControlType = acSubform Then
        MsgBox i.Name
    End If
 Next
 
Bruno


grazie Bruno


grazie Alex

CUT
 
ho fatto in questo modo,
però non è bello a vedersi
 
Dim i
For Each i In Controls
  If i.ControlType = acSubform Then
    If Me.Controls("Cornice1").Value = 1 Then
      Call EtichettaCliente
      Call EmailEtichCliente(i.Name)
      CboCliente.Visible = True
      CboCliente.SetFocus
    ElseIf Me.Controls("Cornice1").Value = 2 Then
      Call EtichettaFornitore
      Call EmailEtichFornitore(i.Name)
      CboFornitore.Visible = True
      CboFornitore.SetFocus
    ElseIf Me.Controls("Cornice1").Value = 3 Then
      Call EtichettaTrasportatore
      Call EmailEtichTrasportatore(i.Name)
      CboTrasportatore.Visible = True
      CboTrasportatore.SetFocus
    Else
      Call EtichettaAg
      Call EmailEtichAg(i.Name)
      CboAg.Visible = True
      CboAg.SetFocus
 
    End If
 
  End If
 
Next
 
___________
p.e.
Public Sub EmailEtichCliente(strFrm As String)
 
  Dim strSql As String
 
  strSql = vbNullString
  strSql = strSql & "SELECT "
  strSql = strSql & "IdEmailCliente As IdEmail, "
  strSql = strSql & "EmailCliente As Email "
  strSql = strSql & "FROM TbEmailClienti "
  Select Case strFrm
    Case Is = "SM_Etichetta"
    strSql = strSql & "WHERE IdCliente = Forms!M_Etichette!CboCliente.Value "
    strSql = strSql & "ORDER BY EmailCliente"
    GoTo Fine
 
  End Select
  strSql = strSql & "WHERE IdEmailCliente IN(0)"
Fine:
  DBEngine(0)(0).QueryDefs("Qry_EmailEtichetta").SQL = strSql
 
End Sub

Il giorno mercoledì 14 dicembre 2016 12:51:49 UTC+1, Franco dellavalle ha scritto:
CUT
 
è per avere il nome del controllo
p.e. form+id?

Franco dellavalle wrote on 14-12-16 :

Così hai tagliato un po' troppo... non si capisce a chi tu
stia rispondendo.
 
Comunque non t'addormentar sul piatto, da questa che ti ho inviato:
 Dim i
 For Each i In Controls
    If i.ControlType = acSubform Then
        MsgBox i.Name
    End If
 Next
 
desumi quest'altra:
 Dim i
 For Each i In Controls
     MsgBox i.Name
 Next
 
Bruno


grazie Bruno