Newsgroup: it.comp.appl.access
Titolo: problema di sinatssi

ciao a tutti
 
ho problema di sinatssi
 
Dim X As String, Y As Long    
vEmail = Eval("UnisciValEmail" & (X) & "('" & Me.Name & IIf(Me.OpenArgs = 3, "1')" & "," & Y & ")")
 
grazie


Perche' non /spezzi/ la istruzione quando le cose diventano nebbiose?
 
Dim Z as string
Z=IIf(Me.OpenArgs = 3, "1","")
vEmail = Eval("UnisciValEmail" & (X) & "('" & Me.Name & Z "'," & Y & ")")
-- 
ac (x=y-1)
Aborro il Killfile
(La violenza e' l'ultimo rifugio degli incapaci -Salvor Hardin-)

 vEmail = Eval("UnisciValEmail" & (X) & "('" & Me.Name & Z "'," & Y & ")")
 
Manaccia!
vEmail = Eval("UnisciValEmail" & (X) & "('" & Me.Name & Z & "'," & Y & ")")



grazie Alessandro


è qui la sinatssi....
anche perche' cosi non funziona
 
  Dim X As String
 
  Select Case Me.Controls("Cornice1").Value
    Case Is = 1
      X = "Cliente"
    Case Is = 2
      X = "Fornitore"
    Case Is = 3
      X = "Trasportatore"
    Case Is = 4
      X = "Agen"
 
  End Select
 
  Eval "Etichetta" & (X)
  Eval "EmailEtich" & (X) & (ottenere qui, dinamicamente il nome subform) 
  Eval "Cbo" & (X).Visible = True
  Eval "Cbo" & (X).SetFocus
 


Questa roba /non/ si fa con la Eval
Me o quello che e' : 
obj(nomevariabilechecontieneilnomecontrollo).proprieta'ometodo
Sul sito di Karl dovrebbe esserci spiegazione ed esempi.
 
i.e
var="Cbo" & X
me(var).Visible = True
oppure
Me("Cbo"&X).Visible=true



questa come va fatta?
 
Eval ("EmailEtich" & (X) & "('" & SM_Etichetta & "')") <--qui non va bene
in piu' vorrei ricavare il 
subform.name
 senza doverlo scrivere


Avevo preparato un post a suo tempo. Vediamo se lo trovo
Eccolo: Era per il 3D come trovo il subform
----------------------------------------
Una subform e' una /Form/
 
Spero di farti un esempio chiarificatore.
Ipotizziamo che tu hai un form con 150 subform /nidificate/ .
Cioe' ogni form ne contiene un' altra (subform).
Ammettiamo che hai il focus sulla 75'.
Quella e' il Me del momento.
Per andare /su/ c'e' la parolina Parent
Me.Parent.Parent.Parent.Name
 significa che vuoi salire di tre livelli
Andare quindi alla 72' e prelevare la proprieta' .Name
 
Viceversa, se vuoi andare /giu/
Me!Sub76!Sub77!Sub78.Name
Dove Subxx e' il nome che hai assegnato al controllo SubForm nel Form
contenitore (cioe' a partire dal Form/subform attivo (quindi  Me))
....SE non funziona
Me!Sub76.Form!Sub77.Form!
Sub78.Form.Name
 
 
Se....
Indovina cosa fa questa
Me.Parent.Parent!
Subboh.Form.Name
 
Che struttura rappresenta?
----------------------------------------------------------
Un subform lo trovi nella collezione Forms oppure come
descritto nel pezzo soprariportato.
L'importante e' che tu sappia quale e' il /Me/ corrente a da li
muoverti su/giu nel modo che ho descritto
 
Ritornando a:
Eval ("EmailEtich" & (X) & "('" & SM_Etichetta & "')")
Non ho ben capito quale sia la tua esigenza.
Torno a ripetere forse /non ti serve/ la chiamata /dinamica/
(l'Eval tanto per intenderci)
 
La cosa da te scritta dovrebbe chiamare una funzione
EmailEtichBoh("Nomediunalabel")
dove sta SM_Etichetta?
Sul form corrente[Me]?O da qualche altra parte?
Cosa vuoi prendere il Name o la Caption?
(se non ricordo male le Label non hanno la .Value bensi' la .Caption)
e dovresti specificare la proprieta' che ti interessa.
 
Una roba del tipo:
Eval ("EmailEtich" & (X) & "('" & Me!SM_Etichetta.caption & "')")
Dove X lo hai impostato con la Case e cio'significa che devi avre
le quattro funzioni /dichiarate e pubbliche/



grazie Alessandro
 
prima di spiegare la form "M_Etichette" volevo
mostrarti questo codice che all'apertura
della form, mi si blocca
_________
su apertura della form
Dim X As String
 
Me.Controls("Inter" & Me.Cornice1).ForeColor = vbRed
 
Select Case Me.Controls("Cornice1").Value <- si blocca su questo punto
  Case Is = 1
    X = "Cliente"
  Case Is = 2
    X = "Fornitore"
  Case Is = 3
    X = "Agen"
 
End Select
 
Call miaSub(X)
Me("Cbo" & X).Visible = True
Me("Cbo" & X).SetFocus


 
Che vuol dire /si blocca/ ? Cornice1 che tipo di Control e'?


 
 
è un gruppo di opzioni
e quando apro la maschera
mi si apre sul codice



mentre questo è il codice che avevo prima
 
  Me.Controls("Inter" & Me.Cornice1).ForeColor = vbRed
 
  If Me.Controls("Cornice1").Value = 1 Then
    Call miaSub("Cliente")
    CboCliente.Visible = True
    CboCliente.SetFocus
  ElseIf Me.Controls("Cornice1").Value = 2 Then
    Call miaSub("Fornitore")
    CboFornitore.Visible = True
    CboFornitore.SetFocus
  Else
    Call miaSub("Agen")
    CboAgen.Visible = True
    CboAgen.SetFocus
 
  End If


E tu mettila in una variabile e vedi che succede
Dim i as long
i=Me.Controls("Cornice1").Value
Select case i
 
Ti fa vedere il codice? E tu mandalo in Run.
Un qualsiasi errore deve pur  tirarlo fuori.


Ciao,
c'è la possibilità che tu abbia posto, in precedenti sessioni di debug, un breakpoint sulla riga in cui il codice si blocca? 
Se la risposta è sì il breakpoint potrebbe essere ancora attivo anche se non si vede più: prova a copiare il blocco Case, incollalo alcune righe più sotto rispetto a dove è ora, poi elimina il blocco originale. 
Compila, salva, compatta.
Vedi se si è risolto.
Ciao
Mat.


;-)
 
In genere era sufficiente la Run (dopo un metti breakpoint / leva 
breakpoint)



e leggere la caption del gruppo di opzioni?
come?
grazie

 come?
 
https://msdn.microsoft.com/en-us/library/office/ff821461.aspx
 
 
Non mi sembra che OptionGroup abbia la proprieta' .Caption
 
https://msdn.microsoft.com/en-us/library/office/ff193237.aspx
 
 
Da qualche parte  c'e' una Label che contiene il valore che a te credo 
interessa



ciao Alessandro
esatto
ma com è il codice per recuperare il nome nella Label?

 ma com è il codice per recuperare il nome nella Label?
 
La sintassi è questa:
Me.Cornice.Controls(0).Caption
 
per funzionare la label deve essere parte dei controls della cornice.
 
Mi permetto:
1 all'interno di un 3d non si passa da un argomento all'altro altrimenti non si capisce più niente, se si ha una domanda nuova si apre un nuovo 3d (magari dopo aver speso 2 minuti su Google a cercare l'informazione che ci serve);
2 quando un problema è risolto (o non risolto) due righe per dire se la soluzione ha funzionato aiuta chi arriva dopo;
 
Grazie, ciao
Mat.


grazie Potone
hai ragione.
 


la form per cui abbiamo iniziato il thread è così
strutturata;
 
Form "M_Etichette"
SubForm "SM_Etichetta"
 
sulla Form ho un gruppo di Opzioni "Cornice1"
con 4 pulsanti
nome: Inter1, Inter2, ecc.
etichetta: Cliente, Fornitore, ecc
con 4 combo
CboCliente, CboFornitore, ecc.
 
su dopo aggiornamento delle combo ho:
Call ShowAllClienti(Me) 'mostra tutti i record dopo averli filtrati su modifica
PremCbo
Call EmailEtichCliente(0)
 
dove "PremCbo" è
  Dim ctl As Control
  Dim Cont As Integer
 
  For Each ctl In SM_Etichetta.Form ' questa toglie le spunte 
    If ctl.Tag = "CC" Then ctl = 0
  Next
 
  Set ctl = SM_Etichetta.Form!LstEmail
 
  If ctl.ItemsSelected.Count <> 0 Then
    For Cont = 0 To ctl.ListCount - 1
      ctl.Selected(Cont) = False
    Next Cont
 
  End If
 
  SM_Etichetta.Requery
  ctl.Requery
 
  SM_Etichetta.Form!CboAltraNota.Value = Null
  SM_Etichetta.Form!CboAltraNota.Requery
  SM_Etichetta.Form!MiaNota = Null
 
 
____________
su apertura della Form:
  Dim X As String, Y As String
 
la form per cui abbiamo iniziato il thread è così
strutturata;
 
Form "M_Etichette"
SubForm "SM_Etichetta"
 
sulla Form ho un gruppo di Opzioni "Cornice1"
con 4 pulsanti
nome: Inter1, Inter2, ecc.
etichetta: Cliente, Fornitore, ecc
con 4 combo
CboCliente, CboFornitore, ecc.
 
su dopo aggiornamento delle combo ho:
Call ShowAllClienti(Me) 'mostra tutti i record dopo averli filtrati su modifica
PremCbo
Call EmailEtichCliente(0)
 
dove "PremCbo" è
  Dim ctl As Control
  Dim Cont As Integer
 
' toglie le spunte da caselle di controllo
  For Each ctl In SM_Etichetta.Form 
    If ctl.Tag = "CC" Then ctl = 0
  Next
 
  Set ctl = SM_Etichetta.Form!LstEmail
 
' deseleziona tutte le email per non farle visualizzare sul report
  If ctl.ItemsSelected.Count <> 0 Then
    For Cont = 0 To ctl.ListCount - 1
      ctl.Selected(Cont) = False
    Next Cont
 
  End If
 
  SM_Etichetta.Requery
  ctl.Requery
 
  SM_Etichetta.Form!CboAltraNota.Value = Null
  SM_Etichetta.Form!CboAltraNota.Requery
  SM_Etichetta.Form!MiaNota = Null
 
 
____________
su apertura della Form:
  Dim X As String, Y As String
 
  Select Case Me.Controls("Cornice1").Value
    Case Is = 1
      X = "Cliente"
    Case Is = 2
      X = "Fornitore"
    Case Is = 3
      X = "Trasportatore"
    Case Is = 4
      X = "Agen"
 
  End Select
 
  Eval ("Etichetta" & X & "()")
  Eval ("EmailEtich" & X & "('SM_Etichetta')")
  Me("Cbo" & X).Visible = True
  Me("Cbo" & X).SetFocus
 
  SM_Etichetta.Form.RecordSource = SM_Etichetta.Form.RecordSource
  SM_Etichetta.Form!LstEmail.RowSource = SM_Etichetta.Form!LstEmail.RowSource
__________________
 
SubForm
con diversi controlli, tra cui una casella di riepilogo
"LstEmail" con selezione multipla semplice e con origine da "Qry_EmailEtichetta"
__________________
 
ho poi modificato queste sub in function
per poter utilizzare Eval
 
1-_____questa è una delle quattro 
 
Public Function EtichettaCliente()
 
  Dim strSql As String
 
  strSql = vbNullString
  strSql = strSql & "SELECT "
  strSql = strSql & "IdCliente As Id, "
  strSql = strSql & "NomeCliente As Nome, "
  strSql = strSql & "IndirizzoCliente As Indirizzo, "
  strSql = strSql & "CAPCliente As CAP, "
  strSql = strSql & "CittàCliente As Città, "
  strSql = strSql & "NazioneCliente As Nazione, "
  strSql = strSql & "IndirizzoPostale, "
  strSql = strSql & "LocalitàIndirizzoPostale, "
  strSql = strSql & "PIVACliente As PIVA, "
  strSql = strSql & "TelefonoCliente As Telefono, "
  strSql = strSql & "FaxCliente As Fax, "
  strSql = strSql & "CellulareCliente As Cellulare "
  strSql = strSql & "FROM TbClienti "
  strSql = strSql & "WHERE IdCliente = Forms!M_Etichette!CboCliente.Value"
 
  DBEngine(0)(0).QueryDefs("Qry_Etichetta").SQL = strSql
 
End Function
 
2-_____questa è una delle quattro
 
Public Function EmailEtichCliente(strSFrm 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 strSFrm
    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 Function

Il giorno mercoledì 21 dicembre 2016 11:02:51 UTC+1, Potone ha scritto:

Il suggerimento è RELATIVAMENTE corretto... nel senso che va bene se creato il controllo non lo si tocca...
Ma se Cancelli(o tagli ed incolli) la label e po la rimetti... gli ITEMS della collection Controls sono giustamente shiftati, ed l'ITEM(0) diventa la prima OPTION...
 
A mio avviso, sarebbe meglio scrivere codice più ROBUSTO...
 
Esempio buttato li...
 
 
    Dim ctl As Access.Control
    For Each ctl In MainControl.Controls
        If TypeOf ctl Is Label Then
            If 
ctl.Parent.Name
 = MainControl.Name Then MsgBox ctl.Name
        End If
    Next
 
Dove MainControl è il Riferimento all'OptionButton
 
Saluti
@Alex


grazie Alex
ora lo provo

Il 21/12/2016 11:18, Franco dellavalle ha scritto:
 
Potone di ha appena dato il /sano/ consiglio di aprire un altro 3D con
oggetto appropriato.
 
Un altro consiglio.
Non mettere chilometrate di codice non lo legge nessuno!
Spiega la tua richiesta se, poi, e' necessario il codice
(ma /pezzetti/ ) lo si chiede.



ok
grazie

 @Alex
 
Grazie @Alex per la precisazione,
in questo caso la collection controls dell'OptionGroup può ospitare solo un contollo (solo di tipo Label, altri tipi non sono consentiti), quindi per amor di robustezza del codice effettuare un ciclo su una collection che conterrà al massimo un elemento e fare il test sul tipo quando non può che contenere un solo tipo forse è eccesso di zelo.
Nel mio post iniziale avevo anche indicato che "per funzionare la label deve essere parte dei controls della cornice", certo senza specificare in quale caso e perchè avrebbe potuto non funzionare.
Comunque non posso che essere d'accordo sulla necessità di scrivere codice quanto più robusto possibile, ma trovare il giusto compromesso trà robustezza del codice e praticità nel codificare penso sia anch'essa qualità positiva.
Ciao
Mat.

 Mat.
 
Questo vale sempre, da fare molta attenzione sono proprio le convinzioni che quel codice possa funzionare sempre, poi con azioni BANALI come appunto il Taglia/Incolla di una LABEL, questo fa cadere i miti... e credimi che capire che il problema è quello poi non è per tutti semplicissimo...
 
Saluti
@Alex

 @Alex
 
Ciao @Alex,
mi sono fatto forviare dalla domanda originale:
"leggere la caption del gruppo di opzioni"
 
ho risposto come se stessimo parlando di una textbox che può contenere una singola label nella propria collection controls, errore mio.
 
Come dici tu, giustamente, una optiongroup può contenere diversi controlli tra cui la propria caption che è in posizione 0 quando si inserisce il controllo optiongroup in un form e li rimane a meno di taglia e incolla successivi, anche in questo caso dici bene.
 
Perfettamente d'accordo sul fatto che trovare errori di esecuzione causati da operazioni a cui non si da peso, come spostare un controllo nell'interfaccia, possa essere un'impresa difficile.
 
Grazie ancora per le precisazioni.
 
Mat.

 Mat.
 
Bene, mi pare quindi di non essere stato eccessivo nel mio zelo...
 
Saluti
@Alex


ciao Alex
se per l interuttore (gruppo di opzioni)
in questo modo trovo la caption
  Dim X As Long, Y As String
 
  X = Me.Controls("Cornice1").Value
  Y = Me.Cornice1.Controls(X - 1).Caption
 
nel pulsante (gruppo di opzioni)
come devo fare per trovare la caption?
Perchè in questo modo
Y = Me.Cornice1.Controls(X - 1).Caption
anzichè darmi il nome dei singoli
pulsanti, mi da il nome dell etichetta
del gruppo

 @Alex
Sei stato zelante al punto giusto.
Ciao
Mat.
 
 

Quello che hai scritto è ASSOLUTAMENTE SENZA ALCUN SENSO.
Di conseguenza io non ho capito nulla.
 
@ALEX


 
Stai facendo un po di confusione.
Per favore apri un /nuovo/ 3D con oggetto appropriato e ne riparliamo.



 
Non e' vero.
La tua e' solo una "ritirata strategica" (stai scappando ;-) )


Guarda che è Natale non Carnevale... sono piu buono(e si vede), ma non ci credo agli scherzi...
 
@ALEX