Newsgroup: it.comp.appl.access
Titolo: Scambio dati tra due campi

Salve a tutto il n.g.
Ho posto lo stesso quesito all'altro forum ma non ho avuto nessuna
risposta; per cui provo con voi anche perchè non credo sia poi così
complicato (almeno per chi ne sa più del sottoscritto).
Riferimento campionato di calcio dilettanti.
Ho 4 campi n; n1; A; B.
"n" è un progressivo di un gruppo di records (squadre che si
affrontano nella stessa giornata) e va da 1 al totale delle giornate
da giocare;
"n1" è uguale a "n" solo che va da 1 al totale delle giornate di
andata e riparte da 1 fino al totale delle giornate di ritorno per cui
ad esempio la dodicesima giornata di andata che equivale a 12 è uguale
alla dodicesima giornata di ritorno che equivale sempre a 12.
Delle volte capita di dover invertire il campo delle squadre perchè
magari il campo ospite non è disponibile ed allora eseguo la seguente
routine:
Me.A.Value = Me.B.Value
Me.B.Value = Me.A.OldValue
Me.Requery
Quello che non riesco a fare, è invertire allo stesso tempo le stesse
due squadre che si affronteranno al girone di ritorno.
Ho provato ad agire sul recordset con un do loop inserendo nella
Select Order By n1; ma non ci sono riuscito.
Grazie e ... a presto.
Ciao Vladimiro.

 
-- 
ac
y-1=x

  .findfirst "n1=2 & controllon1
errore di battitura
.findfirst "n1=" & controllon1
(e' numerico immagino)
altro orrore
  findfirst "n1=" & cntrollon1 + numerogiornate
-- 
ac
y-1=x


wrote:

Ciao Alessandro.
Innanzi tutto grazie per avermi risposto ma ... non funziona.
I campi reali che ho sono "A", "B", "G_A_R" , "G"
A e B sono campi stringa per l'inserimento delle squadre (so che lo
sai, ma lo scrivo per gli altri che leggono),
G_A_R va da 1 fino al girone di andata e poi ricomincia da 1 fino al
girone di ritorno,
G è il numero progressivo delle giornate.
Ho provato a modificare mettendo al posto di G_A_R  n1 ed al posto di
numerogiornate il DCount(ecc...),
ma mi cambia solo il primo record anche se faccio clic sul pulsante
posto a fianco degli altri records.
In definitiva ... non riesco a farlo funzionare :-(
Ciao Vladimiro


Stamattina sono piu sveglio (e buono, in genere evito la pappa pronta)
Ricapitoliamo
--------
nG = dmax("G","tabcalendario")  '(G e' in sequenza a partire da uno si 
spera, cmq va bene anche la dcount)
nGAR = nG/2
'Cosi' ci siamo fatti dare i dati di riferimento
'Tu sei posizionato su un record e quidi conosci il "G" corrente
'Riprendiamo quello di ieri
with recordsetclone
  .recordsetclone
  .findfirst "G=" & G '(il G corrente dovresi averlo)
  .edit
  !a = b.value
  !b = a.value
  .update
  .findfirst "G=" & (G + nGar)
  .edit
  !a=a.value
  !b=b.value
  .update
end with
  'qui invece di una requery prova
  refresh
---------
non c'e' verso o cambia due records o va in errore (a patto che non ci 
sia una "on error resume next")
-- 
ac
y-1=x

 - Mostra testo tra virgolette -
Ciao Vladimiro.

>   .findfirst "G=" & G '(il G corrente dovresi averlo)
se ADO
allora questa diventa .find "G=" & ME.G & " and G_A_R =" & Me.G_A_R
Attenzione: a suo tempo con i recordset di tipo ADO ho avuto problemi 
con le condizioni multiple se dovesse verificarsi troveremo un 
"girargliintorno"
e l'altra diventa
	.find "G=" & (ME.G + nGar) & " and G_A_R =" & Me.G_A_R
immagino che stiano nella stessa posizione all'interno del gruppo.
Altrimenti tocchera' fare la ricerca per "A" o "B"
[cut]
-- 
ac
y-1=x

Alessandro Cara wrote:
P.S.
Scusa la mia confusione.
la istruzione
  ".recordsetclone" toglila non serve e' stato un mio errore di scrittura.
  e' logico che vada in errore ed a questo punto dimentica tutto cio' 
che ho scritto per "ADO"
-- 
ac
y-1=x


wrote:

Credo che stiamo abbastanza lontani dalla soluzione.
Ho provato con l'inserimento di 6 squadre; se provo con il primo
incontro (primo record) non si muove nulla, neanche il record
suddetto; se provo con il secondo, il secondo medesimo resta fermo,
mentre mi cambia il primo ed un altro diverso dal secondo e se
continuo mi dà l'errore sul refresh.


 
Allora "non" siamo lontani dalla soluzione.
C'e' solo un errore di puntamento del record.
E mi sembra strano e come se il record puntato fosse a -1 rispetto al 
corrente. Ma la richiesta di modifica attraverso cosa la fai?
Sul refresh che errore ti da? (arisostituiscilo con la requery)
Sai usare il debugger?
-- 
ac
y-1=x

 Sai usare il debugger?
Ho provato a mettere il punto di interruzione, ho eseguito
l'istruzione, ma non è successo niente.
In definitiva credo di non saperlo usare :-(



In genere non lo faccio.
Se non ti disturba mandami il db perche' la cosa mi sembra un po' 
incasinata soprattutto per la storia del refresh che non riesco ad 
inquadrare. Ed anche la storia del report non la ho capita.
Gli do una occhiata e poi si continua la discussione magari cercando di 
utilizzare il debugger in modo piu' "aiutevole"
-- 
ac
y-1=x



Ho usato il seguente indirizzo
alessandro.cara"chiocciola"
ay-1asistemi.it
ma mi è tornata indietro la notifica di errore.
Eventualmente non dovessi scrivermi l'indirizzo, mandami un'e-mail a
vladileon"chiocciola"
libero.it
 e ti invio il db.
Ciao Vladimiro.

 Ciao Vladimiro.
-- 
ac
y-1=x
Questo serve proprio a risolvere il problema della e-mail.
Devi sostituire y-1 con x

 due squadre che si affronteranno al girone di ritorno.
1) Almeno da quello che ho visto le sequenze sono impostate male.
O meglio il "G" gruppo giornata e' corretto
il G_A_R e' errato.
devi avere
1  1
1  2
1  3
e non
1  1
1  1
1  1
Metti e rendi visibili G e G_A_R sul formato cosi' ti rendi conto della 
cosa. Per come e' adesso neanche un consulto plenario dei primari del NG 
ne sarebbe venuto a capo.
2) Quando si riceve un messaggio bisogna raccontarla tutta
E' vero che, a fronte della refresh, ti citava la copia negli appunti e' 
altresi vero che la cosa piu' importante era "un altro utente sta 
cercando di modificare il record" e questo avrebbe fatto capire dov'era 
il problema
3)
questo dovrebbe essere quanto.Non funziona come vorresti per la 
questione di cui al punto 1
--------
Private Sub Inversione_Partita_Click()
Dim nG As Integer
Dim nGar As Integer
nG = DMax("G", "CalendarioPartite")
nGar = nG / 2
If G > nGar Then
     MsgBox "Partita non invertibile", vbExclamation
     Inversione_Partita = Not Inversione_Partita
     Exit Sub
End If
With RecordsetClone
   .FindFirst "G=" & (G + nGar) & " and G_A_R=" & G_A_R
   .Edit
   !A = A.Value
   !B = B.Value
   !Inversione_Partita = Inversione_Partita
   .Update
End With
With Recordset
   .FindFirst "G=" & G & " and G_A_R=" & G_A_R
   .Edit
   !A = B.Value
   !B = A.Value
   .Update
End With
   Me.Refresh
End Sub
-------
-- 
ac
y-1=x

 questione di cui al punto 1
Comunque a parte tutto ed a prescindere da un tantino di
arroganza  :-)
 ti ringrazio lo stesso anche se non abbiamo risolto il problema.

Ciao Vladimiro.

>    .FindFirst "G=" & G & " and G_A_R=" & G_A_R
-- 
ac
y-1=x

 .FindFirst "G=" & (G + nGar) & " and A=" & A
A tra apici e' alfanumerico
-- 
ac
y-1=x


wrote:

Ciao Alessandro.
Nell'usare "non abbiamo risolto", volevo in qualche modo farti
partecipe; tutto qua.
Comunque sto pensando una cosa, visto che neanche così va bene; anzi,
voglio prima spiegarti come ho interpretato il db (nell'eventualità
non l'avessi guardato con attenzione).
Ponendo maschera con sottomaschera, ho la possibilità di vedere
contemporaneamente tutte le squadre che giocano nella stessa giornata
e contemporaneamente inserire i risultati senza "voltare mai pagina".
Va da se che la stessa cosa la faccio per invertire le squadre, per
cui agisco con il recordset attivo.
Allora, pensavo una cosa:
popolando un campo nuovo con i numeri che vanno da 1 a n totali
giocate (in definitiva un numero progressivo) eviterei il G_A_R che ha
come il G il progressivo a gruppi di records(se leggi bene il primo
post ti accorgerai che avevo in qualche modo spiegato la differenza
dei 2 campi) e mettere mano alla tua routine.
Che dici, potrebbe andare?
Purtroppo non posso lavorarci sopra per mancanza di tempo, ma è una
cosa che farò sicuramente.
Ciao e grazie
Vladimiro.


Non serve piu' di tanto modificare le cose. E sufficiente fare una 
update diretta.
il pezzo che riguarda il recordsetclone (with.... end with) va 
sostituito con:
docmd.runsql "update calendariopartite set a='" & a & "', b='" & b & " 
where g=" & g & " and A='" & B & "'"
non la ho provata sul tuo db ma ho capacita' teleologiche.
-- 
ac
y-1=x

 ac



se e' cosi' questa e' errata (ma non avevo scritto di toglierla?)
 >    .FindFirst "G=" & (G + nGar) & " and A=" & A
sostituire. (da qualche  parte avevo scritto la questine degli apici)
     .FindFirst "G=" & (G + nGar) & " and A='" & B  & "'"
Per evitare la conferna sull'aggiornamento in 
strumenti-->opzioni-->Modifica/trova
togliere la spunta su "query comando"
--
ac
-- 
ac
y-1=x

 - Mostra testo tra virgolette -
Questa è la routine che ancora non funziona.
Dim nG As Integer
Dim nGar As Integer
nG = DMax("G", "CalendarioPartite")
nGar = nG / 2
If G > nGar Then
     MsgBox "Partita non invertibile", vbExclamation
     Inversione_Partita = Not Inversione_Partita
     Exit Sub
End If
With Recordset
   .FindFirst "G=" & (G + nGar) & " and A='" & B & "'"
   .Edit
   !A = B.Value
   !B = A.Value
   .Update
End With
Me.Refresh
Il problema è sempre lo stesso, aprendo la maschera con sottomaschera,
oltre al fatto che non mi cambia quello per cui ho fatto clic, mi
cambia solo il primo record (che non ha nulla a che vedere); se vado
solo in sottomaschera vedo dei cambiamenti complicati a
raccapezzarmici... ma poi inuti per quello che mi serve.
Ti auguro una buonanotte.
 Vladimiro.

Scusami, il codice usato è questo:
Private Sub Inversione_Partita_Click()
Dim nG As Integer
Dim nGar As Integer
nG = DMax("G", "CalendarioPartite")
nGar = nG / 2
With Recordset
   .FindFirst "G=" & (G + nGar) & " and A='" & B & "'"
   .Edit
   !A = B.Value
   !B = A.Value
   .Update
End With
Me.Refresh
End Sub
Ma il risultato non cambia.
Di nuovo, Vladimiro.

questa la ho provata e fuziona
-------
Private Sub Inversione_Partita_Click()
Dim nG As Integer
Dim nGar As Integer
Dim sSQL As String, bx As String
nG = DMax("G", "CalendarioPartite")
nGar = nG / 2
If G > nGar Then
     MsgBox "Partita non invertibile", vbExclamation
     Inversione_Partita = Not Inversione_Partita
     Exit Sub
End If
bx = Replace(B, "'", "''")
sSQL = "Update calendariopartite set A='" & Replace(A, "'", "''") & "'"
sSQL = sSQL & ", B  ='" & bx & "'"
sSQL = sSQL & ",Inversione_Partita = " & Inversione_Partita
sSQL = sSQL & " where G=" & (G + nGar) & " and A ='" & bx & "'"
DoCmd.RunSQL sSQL
With Recordset
   .Edit
   !A = B.Value
   !B = A.Value
   .Update
End With
   Me.Refresh
End Sub
-------
Le replace sono per gestire nomi con l'apice
C'e' un errore che si verifica sul primo record della sottomaschera (non 
sempre,3021-Nessun record corrente). Non ho capito per quale motivo.
se si dovesse verificare metti la seguente come ultima istruzione della
Private Sub CasellaCombinata48_AfterUpdate()
nella form Inserimento risultati
Istruzione da inserire:
Me.SottomascheraCalendarioPartite.Form.Recordset.MoveFirst
-- 
ac
y-1=x


wrote:

Perfetto.
Mi hai tolto un peso dallo stomaco... sei un grande!
Senti, ho un altro problema piuttosto stupido che non riesco a
risolvere se non in modo arronzato.
Per conteggiarmi le discipline uso questo sistema.
Premetto:
prima ammonizione vale 1
seconda ammonizione equivalente a diffida vale 2
terza ammonizione equivalente ad espulsione vale 3
ma poi ricomincia, per cui 4 vale a prima ammonizione, 5 vale a
seconda ammonizione(diffida), 6 vale a terza ammonizione(espulsione) e
cosi via.
Per il momento ho risolto in questo modo:
Penalizzazione: IIf([n_penalizzazioni]=1 Or [n_penalizzazioni]=4 Or
[n_penalizzazioni]=7 Or [n_penalizzazioni]=10 Or
[n_penalizzazioni]=13;"Ammonito";IIf([n_Penalizzazioni]=2 Or
[n_Penalizzazioni]=5 Or [n_Penalizzazioni]=8 Or [n_Penalizzazioni]=11
Or [n_Penalizzazioni]=14;"Diffidato";IIf([n_penalizzazioni]=3 Or
[n_Penalizzazioni]=6 Or [n_Penalizzazioni]=9 Or [n_Penalizzazioni]=12
Or [n_Penalizzazioni]=15;"Espulso";0)))
Dovrei impostare un ciclo for next ma non riesco a metterlo giù.
Mi puoi aiutare o debbo riformulare un altro post?
Grazie Vladimiro.

 Grazie Vladimiro.
Altra situazione, altro post con un soggetto degno, questa e' la regola.
Il problema che hai posto, non ti do' adesso la soluzione, si risolve 
semplicemente con una operazione di modulo ed una select case con 0,1,2
-- 
ac
y-1=x