Newsgroup: it.comp.appl.access
Titolo: Access MSDE

Salve a tutto il NG.
Avrei bisogno di sapere come cambia questa espressione che in access va bene
invece in MSDE non va.
E' un'espressione di una query:
PrezzoTotale: IIf([PrezzoVendita] Is Null Or [Quantità] Is
Null;0;CCur([PrezzoVendita]-([PrezzoVendita]*[Sconto]/100))*([Quantità])+([I
mporto]))
Se lo scrivo sul MSDE mi dà prima errore dicendomi che il CCur non lo
riconosce, poi non gli piace nemmeno il IIf......allora ho controllato i
riferimenti e mancavano quelli del DAO e li ho inseriti...ma nulla non gli
piace lostesso.....come ne potrei uscire?
Grazie a tutti!
Ultra

 ha scritto nel messaggio
news:iTfPa.19294$qa5.4...@news2.tin.it...

MSDE non supporta le funzioni di Access nè tantomeno quelle definite nelle
maschere. Potresti crearti delle UDF ma solo con Access 2002.
In alternativa devi studiarti le T-SQL. In particolare lo statement CASE e
crearti un sp dal progetto adp.
Per quanto riguarda la funzione Is Null la corrispondente e IFNULL o
COALESCE.
Se vuoi posso darti il link per scaricarti la documentazione in linea di SQL
(sono 39 Mb)
Ciao
Ciao

 ha scritto nel messaggio
news:iTfPa.19294$qa5.4...@news2.tin.it...

Prova così
CASE WHEN ([PrezzoVendita] Is Null Or [Quantità] Is Null)
     THEN 0
     ELSE
CONVERT(MONEY,([PrezzoVendita]-([PrezzoVendita]*[Sconto]/100))*([Quantità])+
([Importo]))
     END AS PrezzoTotale
Fai attenzione alle parentesi non l'ho provata e soprattutto agli
arrotondamenti Money come Currency ha 4 decimali, in SqlServer la funzione
ROUND funzione bene (sempre che tu non abbia utilizzato il tipo di dato
float).
Ciao Giorgio

(sono 39 Mb)
Posso chiederti io il link?
Thanx

 ha scritto nel messaggio
news:bek4c8$o0p$1...@lacerta.tiscalinet.it...

Ciao Giorgio, ho provato quello che tu mi hai mandato ma stranamente non
riconosce CASE. Poi il mio PrezzoVendita non è Money visto che potrebbe
essere indifferentemente dollari/euro ho preferito lasciarlo numerico
precisione doppia con 2 decimali.
Hai un'altra idea??

 ha scritto nel messaggio
news:2htPa.22716$qa5.5...@news2.tin.it...

Il case lo usi in una vista o in una stored procedure?
Usalo in una stored procedure...

 ha scritto nel messaggio
news:u5ergv4rc8mnunupc...@4ax.com...

http://www.microsoft.com/italy/sql/techinfo/productdoc/2000/books.asp
Prima di installare tutto leggi attentamente le note per non avere sorprese
in Access.
Ciao

 ha scritto nel messaggio
news:2htPa.22716$qa5.5...@news2.tin.it...

Ciao ultrareflex
1) Togli i riferimenti a DAO non servono a nulla la query viene valutata dal
server e non da Access.
2) L'istruzione CASE è un'istruzione di SqlServer e viene riconosciuta, se
utilizzi una Vista devi inserire l'istruzione in basso dove c'è il codice
SQL e quando confermi riceverail l'avviso "La finestra di progettazione non
supporta il costrutto SQL CASE." e in ogni caso ti permette di salvare ed
eseguire la vista.
3) L'equivalente di Ccur (usato nel tuo post) è Money che è un tipo di dato
preciso con quattro decimali, Access lo visualizza con il simbolo dell'euro.
Se devi usare un campo con due decimali utilizza Decimal dove puoi indicare
il numero delle cifre totali e il numero dei decimali.
4) Il tipo di dato Doppia precisione (che in Sql è float) è a virgola mobile
(anche se mettendo 2 decimali nell'apposita casella viene visualizzato come
voluto al suo interno il numero mantiene tutti i decimali del caso)  e
utilizzarlo in Sqlservedr per i calcoli monetari vuoi dire andare incontro a
guai sicuri.
Quindi...
-------------------
CASE WHEN ([PrezzoVendita] Is Null Or [Quantità] Is Null)
           THEN 0
           ELSE
ROUND([PrezzoVendita]-([PrezzoVendita]*[Sconto]/100))*([Quantità])+([Importo
]),2)
          END AS PrezzoTotale
----------------------
Ripeto l'arrotondamento funziona bene per campo con tipo di dato preciso e
non a virgola mobile.
Ciao Giorgio.


Dopo quello che ti ho scritto sopra tra i punti che mi hai messo....veniamo
a quello dolente:
La store non mi funziona.....mi dà errore sia in vista che in store di
procedure.
L'errore è:
Errore DAO: The round function requires 2 to 3 arguments
Allora ti posto come ho scritto io ok?
--------------------------------------------------------------------
Alter Procedure StoredProcedure1
/*
 (
  @parameter1 datatype = default value,
  @parameter2 datatype OUTPUT
 )
*/
As SELECT Clienti.IDCliente, Clienti.Contratto,
    DettaglioOfferta.IDOfferte, DettaglioOfferta.IDProdotto,
    DettaglioOfferta.Fornitore, DettaglioOfferta.Quantità,
    DettaglioOfferta.PrezzoVendita, DettaglioOfferta.ColoreMerce,
    DettaglioOfferta.Operazione, DettaglioOfferta.CausaleImporto,
    DettaglioOfferta.Importo, DettaglioOfferta.DescrizioneIta,
    DettaglioOfferta.Lingua, DettaglioOfferta.Riga,
    Prodotto.Annullato, Prodotto.Elemento, Prodotto.NomeInglese,
    Prodotto.NomeFrancese, Prodotto.NomeProdotto,
    CASE WHEN ([PrezzoVendita] IS NULL OR
    [Quantità] IS NULL)
    THEN 0 ELSE ROUND([PrezzoVendita] - ([PrezzoVendita] * [Sconto]
     / 100)) * ([Quantità]) + ([Importo]), 2)
END AS PrezzoTotale
FROM Prodotto INNER JOIN
    DettaglioOfferta ON
    Prodotto.IDProdotto = DettaglioOfferta.IDProdotto INNER JOIN
    Offerta ON
    DettaglioOfferta.IDOfferte = Offerta.IDOfferte INNER JOIN
    Clienti ON Offerta.IDCliente = Clienti.IDCliente
WHERE (Prodotto.Annullato = 0)
 /* set nocount on */
 return
 Non capisco cosa c'è che non va.......
Grazie a tutti per il Vostro preziosissimo aiuto!!!!!
Ultra


[CUT]

Ciao
E solo un errore di parentesi
ROUND(([PrezzoVendita] - [PrezzoVendita] * [Sconto]/ 100) * [Quantità] +
[Importo], 2)
Ciao Giorgio.

 ha scritto nel messaggio
news:beltuh$cl7$1...@lacerta.tiscalinet.it...

Ciao Giorgio ora funziona! :)
Certo che potevo anche accorgermene che mancava una parentesi.......solo che
è la prima volta che uso MSDE e mi trovo veramente spiazzato!
Da access avevo creato tante query che ora mi ritrovo inutili oltretutto
devo anche capite questo benedetto T-SQL.
Una cosa che ti volevo chiedere. Ora questa store funziona solo che all'atto
visivo, vedo che il PrezzoTotale (oggetto di tutta questa store) è senza
numeri decimali, è normale questo? Lo si può vedere solo dalla maschera?
Grazie ancora per la tua grande e immensa pazienza!
Ciao Ultra.

 ha scritto nel messaggio
news:xggPa.164131$lK4.4...@twister1.libero.it...

Si mi interesserebbe il link per scaricare la documentazione in linea grazie
mille!!!!
Ciao
Ultra


Ciao ultrareflex
La Sp deve ritornare il totale con i decimali del caso, se ad esempio
moltiplichi due campi con tipo di dato DECIMAL(28,2) tra di loro la Sp rende
il risultato nel tipo di dato DECIMAL(38,4) . Access arriva al max a
DECIMAL(28,x) e non riesce ad interpretare DECIMAL(38,x) quindi lo converte
in stringa e tu lo vedi come 12500.32, non è un grosso problema in maschera
o in report metterai nel'origine dati del controllo =Val(([PrezzoVendita]) e
quindi lo vedrai come 12500,32.
Un altra causa per cui non vedi i decimali può essere quella di non aver
messo la scala nel campo. Hai impostato correttamente i campi decimal ? Che
valori ai inserito in corrispondenza di Precisione e di Scala ?. Precisione
indica il max numero di cifre memorizzabili decimali compresi e Scale indica
il numero di decimali. Io di solito utilizzo DECIMAL(28,2) ovvero 26 cifre
intere e due decimali.
Prova a postarmi che tipo di dato hai utilizzato per :
[PrezzoVendita] , [Sconto], [Quantità] e [Importo]
Così vediamo di scoprire perchè non ti rende decimali.
Ciao Giorgio.

 ha scritto nel messaggio
news:XOvPa.24038$qa5.5...@news2.tin.it...

http://www.microsoft.com/italy/sql/techinfo/productdoc/2000/books.asp


 ha scritto nel messaggio
news:bem1t7$ehd$1...@lacerta.tiscalinet.it...

Eccomi a te Giorgio, dunque lo sconto come tutti gli altri hanno:
Lunghezza: 9
Precisione: 18
Scala: 2
Ovviamente sono DECIMAL.
Anche sulla tabella li vedo sempre e comunque senza decimali.
Grazie ancora per il tuo aiuto!
Grazie
Ultra


Ciao Ultra
I campi sono OK quindi se sulla tabella non vedi i decimali significa che la
cifra è stata memorizzata senza decimali. Ho provato a simulare la tua sp e
questo è il risultato.
Prezzovendita|Quantità|Sconto|Importo|  Prezzo totale
        25         |      100 |     10 |    1000 |  3250.000000
        12         |          8 |       2 |        16 |  110.080000
        16         |          1 |    8,5 |        18 |   32.640000
Come vedi se imputo cifre senza decimali vengono visualizzate senza decimali
(la formattazione è compito del form o del report) e il Prezzo totale viene
reso nel tipo di dato Decimal Precisione 38 scala 6 che Access2K  non
interpreta in modo corretto, ma questo non è un problema perché in form o in
report basta mettere in origine controllo =Val([Prezzo totale]).
Prova ad inserire nella tabella importi con decimali, esegui la Sp
direttamente dala sezione Query di  Access e controlla i risultati. Se hai
problemi prova a postare il risultato come ho fatto io.
Un piccolo appunto, se togli il flag Ammetti Null per i campi [Prezzo
vendita] e [Quantità] dalla struttura tabella puoi evitare l'istruzione
CASE, ma questo non ha nulla a che fare con i decimali.
Ciao Giorgio.

 ha scritto nel messaggio
news:bem939$igd$1...@lacerta.tiscalinet.it...

Ciao Giorgio, ok ho provato, ma i decimali rimangono sempre gli
stessi......sto cercando di cancellare le vecchie informazioni che ho
incollato in questo db...tante volte le avesse lette male.....
Appena lo faccio ti metto al corrente!
Grazie ancora
Ultra!

 ha scritto nel messaggio
news:kfsQa.26544$it4.7...@news1.tin.it...

Ciao Giorgio, scusa se ti rompo le scatole di nuovo.......
Ho fatto tutto quello che potevo per far funzionare l'MSDE ora che lancio la
maschera non posso passare ai nuovi record......mi dà questo messaggio:
La maschera è di sola lettura perchè la proprietà tabella univoca non è
impostata
Che vuol dire? La tabella l'ho controllata e va bene....... mi sai dire
qualcosa tu?
Ciao e grazie
Ultra


Ciao
Per poterti aiutare dovrei conoscere l'origine record della maschera, prova
a postare il contenuto della proprietà Origine record, e se è una vista il
codice Sql Della vista. Forse l'origine record della maschera è la famosa
StoredProcedure1 ?
Ciao Giorgio.

 Ciao Giorgio.
Ciao Giorgio,
Innanzi tutto grazie per il tuo aiuto.
Allora la maschera Offerte ha una vista come origine record (prende la
tabella clienti e la tabella Offerte), dentro questa maschera ci sono 2
sottomaschere, una  si chiama dettaglioOfferte (ed ha la famosa store1 come
origine record  e l'altra dettaglioOfferteVisivo che ha la stessa store1.
Ora ho controllato nella maschera le sue proprietà e ho visto che esiste una
proprietà chiamata Tabella Univoca, mi fa vedere Clienti e offerte, ma se
inserisco l'una o l'altra nella maschera non mi fa inserire i dati nella
Sottomaschera DettaglioOfferte. Tantomeno poi quando con la maschera
principale vado a nuovo record, la sottomaschera rimane invariata....
Non ci capisco più nulla.
Qualche idea?
Grazie Ultra

 ha scritto nel messaggio
news:ZStQa.43253$qa5.1...@news2.tin.it...

Ciao Ultra
Un SubForm o un SubReport non può avere una Sp come origine record (devi
usare una vista) in quanto una Sp non può essere utilizzata nella clausola
FROM di una query (Query che access compone ad ogni cambio record).
Per quanto riguarda il form principale la Tabella univoca è quella delle
offerte e comunque dovrebbe funzionare, a tale proposito ti invito ad
analizzare l'esempio NorthWindCs.Adp disponibile nella cartella
\Programmi\Microsoft Office\Office 10\Samples, o premendo ?-->Database di
esempio-->Progetto di esempio NorthWind.
Ciao Giorgio.

 ha scritto nel messaggio
news:beu66s$ljc$1...@lacerta.tiscalinet.it...

Ciao Giorgio, ora funziona come dicevi tu..solo che mi trovo male con le
routine, ne ho una con un'istruzione SELECT che non va a buon fine. Devo
modificarle tutte vero? Che stranezza dover modificare tutto......
Per esempio questa:
Dim strFiltro As String, strSQL As String
  Dim rs As Recordset
    ' Valuta il filtro prima di passarlo alla funzione DLookup.
    strFiltro = "IDProdotto = " & Me!IDProdotto
    strSQL = "SELECT CondizioniContratto.ValidoDal,
CondizioniContratto.FinoAl, CondizioniContratto.Elemento,
Contratti.IDContratti, CondizioniContratto.Prezzo"
    strSQL = strSQL & " FROM CondizioniContratto INNER JOIN Contratti ON
CondizioniContratto.IDSconti = Contratti.IDSconti"
    strSQL = strSQL & " WHERE (((CondizioniContratto.ValidoDal)<=#" & Date &
"#) AND ((CondizioniContratto.FinoAl)>=#" & Date & "#) AND
((CondizioniContratto.Elemento)= '" &
Forms!Offerte01!DettaglioOrdiniComplessivo3!IDProdotto.Column(4) & "') AND
((Contratti.IDContratti)='" & Me!Contratto & "'))"
    Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
    If rs.EOF And rs.BOF Then
        ' Cerca il prezzo unitario del prodotto e lo assegna al controllo
PrezzoUnitario.
        Me!PrezzoVendita = DLookup("Prezzo", "SelezionaPrezzoUnitario",
strFiltro)
    Else
        Me!PrezzoVendita = rs!Prezzo
    End If
Di questa mi dà errore e mi dice che non è impostato il valore With. (che
accidenti centra........)
Grazie ancora di tutto!
Ultra



Ciao Ultra
Con SqlServer non puoi passare le date con  #Data#,  non le capisce,  il
modo più comodo è utilizzare la conversione implicita da stringa a data nel
formato aaaammgg
.....CondizioniContratto.ValidoDal<=" & Format(Date,"yyyymmdd") & " AND
......
O utilizzare la funzione CONVERT (Hai scaricato il manuale di SqlServer ?)
ma è più scomoda.
Troverai altre sistuazioni da sistemare, il passaggio non è indolore, ma la
conta dei vantaggi è nettamante superiore agli svantaggi e ripaga lo sforzo
iniziale.
Ciao Giorgio


Scusa ho scritto conversione imlicita da stringa ma ho dimenticato di
racchiuderla tra apici
 .....CondizioniContratto.ValidoDal<='" & Format(Date,"yyyymmdd") & "' AND
ecc...
Ciao Giorgio

 ha scritto nel messaggio
news:beurd2$43p$1...@lacerta.tiscalinet.it...

Ciao Giorgio, ho provato a rifare tutto come mi hai detto tu ma nulla da
fare ho sempre un blocco e non riesco a capire il perchč, oltre alla data
che non riconosceva non capisco cosa blocchi la form......
ti riposto il codice.....
Dim strFiltro As String, strSQL As String
 Dim Db As Database
  Dim rs As Recordset
    ' Valuta il filtro prima di passarlo alla funzione DLookup.
    strFiltro = "IDProdotto = " & Me!IDProdotto
    strSQL = "SELECT CondizioniContratto.ValidoDal,
CondizioniContratto.FinoAl, CondizioniContratto.Elemento,
Contratti.IDContratti, CondizioniContratto.Prezzo"
    strSQL = strSQL & " FROM CondizioniContratto INNER JOIN Contratti ON
CondizioniContratto.IDSconti = Contratti.IDSconti"
    strSQL = strSQL & " WHERE (((CondizioniContratto.ValidoDal<='" &
Format(Date, "yyyymmdd") & "' AND((CondizioniContratto.FinoAl)>='" &
Format(Date, "yyyymmdd") & "' AND ((CondizioniContratto.Elemento)= '" &
Forms!Offerte01!DettaglioOrdiniComplessivo3!IDProdotto.Column(8) & "') AND
((Contratti.IDContratti)='" & Me!Contratto & "'))"
    Set rs = Db.OpenRecordset(strSQL, dbOpenSnapshot)
    If rs.EOF And rs.BOF Then
        ' Cerca il prezzo unitario del prodotto e lo assegna al controllo
PrezzoUnitario.
        Me!PrezzoVendita = DLookup("Prezzo", "SelezionaPrezzoUnitario",
strFiltro)
    Else
        Me!PrezzoVendita = rs!Prezzo
    End If
L'errore che continua a venire č: Variabile oggetto o variabile del blocco
with non impostata.
E' strano visto che č tutto normale....almeno su access......
Grazie ancora
Ultra


Ciao Ultra
E' normale ricevere questo tipo di errore quando non si valorizza la
variabile Db, quando fai  "Set rs = Db.OpenRecordset(strSQL,
dbOpenSnapshot)", Db a che cosa si riferisce ???.
Ad ogni modo stai utilizzando DAO e a meno di non ricorrere ai drivers ODBC
non può colloquiare con il server.
Togli i riferimenti a DAO e metti quelli a ADO e cominciamo a sistemare
l'apertura del recordset:
-------------------------------------
Dim strFiltro As String,  strSQL As String
'Dichiaro la variabile Rs come ADODB.Recordset
Dim Rs As ADODB.Recordset
'La valorizzo ovvero viene inizializzata in memoria
Set Rs = New ADODB.Recordset
' Valuta il filtro prima di passarlo alla funzione DLookup.
   strFiltro = "IDProdotto = " & Me!IDProdotto
'Componi la query
   strSQL = "SELECT ... ecc... ecc...."
'Apro il recordset sulla connessione al database già aperta dal progetto di
access
Rs.Open strSQL, CurrentProject.Connection
If rs.EOF And rs.BOF Then
     ' Cerca il prezzo unitario del prodotto e lo assegna al controllo
PrezzoUnitario.
     Me!PrezzoVendita = DLookup("Prezzo",
"SelezionaPrezzoUnitario",strFiltro)
Else
     Me!PrezzoVendita = rs!Prezzo
End If
Rs.close
Set Rs=Nothing
-------------------------

 ha scritto nel messaggio
news:bf0c3n$knk$1...@lacerta.tiscalinet.it...

Ciao Giorgio ora funziona....
Grazie mille per la tua pazienza, denoto che fai tutto ciò con passione,
quando (e se) consegnerò il db ti darò una parte del compenso :))))
Volevo chiederti un'altra cosa...come si fa sulle viste a far vedere non
solo 10000 record? Sulle maschere c'è il pulsante e va bene oppure lo
imposto sulla proprietà maschera ma sulle viste??
Per quanto riguarda prima, io avevo lasciato tutto impostato come in access
(è difficile togliersi il vizio dopo 4 anni!!)
io avevo valorizzato il Set DB as Database (invece non è così).
Grazie ancora per tutto!!
Ultra

 ha scritto nel messaggio
news:%BPQa.32509$it4.8...@news1.tin.it...

Ciao Ultra
Per togliere il limite del numero record restituiti (vale per tutti gli
oggetti del db maschere,Report,Tabelle,Viste,StoredProc, Funzioni ) devi
mettere a 0 il valore in "Numero massimo record predefinito" dal menu
Strumenti-->Opzioni quindi scheda Avanzate, un altro parametro importante è
TimeOut OLE/DDE che indica il tempo max in secondi dopo il quale la
connessione và in errore se non c'è risposta dal server. Io ho impostato
questo valore a 0 (infinito)  perchè se il server è molto occupato
preferisco attendere che ripetere l'operazione.
Non c'è bisogno di ringraziare, nell' Ng tutti insegnano e tutti imparano.
Ciao Giorgio.

 Ciao Giorgio.
Ciao Giorgio, vista la tua disponibilità, ti chiedo una cosa ulteriore,
nella SubForm di Offerte01 ossia dettaglioOfferta, l'origine record è una
vista. Solo che l'ho creata con il codice SQL visto che c'era quel discorso
della CASE WHEN.......
Ora all'interno di questa subform ho una combo box scegliendo un dato al suo
interno, di norma si dovrebbero riempire anche gli altri campi, che fanno
parte di quel record, invece no, non me li visualizza, lo fa solo dopo che
io cambio record. Nella form principale ho un'altra combo che funziona alla
perfezione, solo che la vista l'ho creata manualmente, ossia senza codice
SQL. Come mai questo problema? Si può risolvere?
Grazie
Ultra

 ha scritto nel messaggio
news:kZSQa.34039$it4.8...@news1.tin.it...

Ciao Ultra
Se guardi l'esempio NorthWindCS.Adp noterai che nell'evento After Update
della combobox viene eseguito il codice RunCommand acCmdSaveRecord per
scrivere il record e rendere visibili nei controlli il contenuto dei campi.
A tale proposito c'è anche una KB della Microsoft che in questo momento non
riesco a trovare, comunque è un comportamento normale.
Ciao Giorgio.

 Ciao Giorgio.
Ciao Giorgio, ho visto l'esempio, e va bene....insomma....mi aggiorna tutto
ancora prima di confermare l'articolo......
Non esiste un modo per fare il RunCommand solo per la finestra attiva e non
per tutta la form?
Ciao e grazie
Ultra


Ciao Ultra
In casi come questo io preferisco la ridondanza dei dati  all'avere come
origine record due o più tabelle che comportano le implicazioni a cui stai
andando incontro, per esempio l'impossibilità di eseguire i controlli del
caso nell'evento Before Update.
O se un campo non deve essere  assolutamente ridondante all'origine del
controllo inserisco un bel =Dlookup(....) o una funzione VBA che mi rende il
valore dalla tabella, l'aspetto negativo è l'aumento del traffico in rete ma
non vedo altra strada.
Non ho mai tentato di sistemare gli inconvenienti del sistema suggerito
nell'esempio di NorthWind in quanto vedo più svantaggi che altro.
Ciao Giorgio.


Ciao Ultra
Mi sono spiegato male, nell'esempio NorthWindCs viene scritto il record non
appena si è selezionato il cliente (vedi evento CustomerID_AfterUpdate della
combo del cliente), questo per far comparire indirizzo città ecc. Questa
tecnica rende inutile i vari controlli software che fai nell'evento
Form_BeforeInsert e Form_BeforeUpdate perchè di fatto sei costretto a
scrivere il record anche se tutti i campi non sono compilati secondo le
regole del caso.
Passiamo al tuo problema del valore predefinito, il filtro LIKE in SqlServer
ha caratteri jolli differenti da Access quindi la tua Dmax  rileva sempre
null. Ti posto la tabella dei caratteri Jolly
Da Book On Line
----------------------------------
Carattere jolly Descrizione Esempio
% Stringa di zero o più caratteri WHERE title LIKE '%computer%' consente di
individuare tutti i titoli di libri che contengono la parola "computer".
_ (carattere di sottolineatura) Carattere singolo WHERE au_fname LIKE '_ean'
consente di individuare tutti i nomi di persona composti da quattro lettere
che terminano in "ean" (Dean, Sean e così via).
[ ] Carattere singolo compreso nell'intervallo ([a-f]) o set ([abcdef])
specificato WHERE au_lname LIKE '[C-P]arsen' consente di individuare tutti
gli autori il cui cognome termina in "arsen" e inizia con un carattere
compreso tra C e P, ad esempio Carsen, Larsen, Karsen e così via.
[^] Carattere singolo non compreso nell'intervallo ([^a-f]) o set
([^abcdef]) specificato WHERE au_lname LIKE 'de[^l]%' consente di
individuare tutti gli autori il cui cognome inizia con "de" e la lettera
successiva è diversa da "l".
---------------------------------
Come vedi * è sostituito da % e ? è sostituito da _.
Hai Scaricato il manuale di SqlServer ? ti verrà utile, ad esempio le
funzioni Mid()  Instr() esistono sotto altri nomi.
Ciao Giorgio.

 ha scritto nel messaggio
news:bf385h$ufj$1...@lacerta.tiscalinet.it...

Ciao Giorgio,
Ho letto il tuo post almeno 4 volte....ma l'unica cosa che ho capito è stata
solo che devo sostituire il ? con _
Per il resto il like che mi hai dato non l'ho capito visto che la mia
"stringa" come valore predefinito utilizza like è vero ma solo per
identificare il valore di riga....almeno credo.....e non capisco quale dei
tanti casi dovrei utilizzare.....il manuale l'ho scaricato ma ci capisco ben
poco....ci sto mettendo tutta la buona volontà e prima o poi lo imparo!!
Grazie ancora
Ultra

 ha scritto nel messaggio
news:EHrRa.80966$qa5.1...@news2.tin.it...

Ciao Giorgio, forse ho trovato la soluzione, volevo creare una vista oppure
una store di procedure per far si che mi visualizzi i numeri delle righe che
sono state impegnate nella tabella DettaglioOfferta. A questo proposito,
questa vista o store dovrebbe visualizzarmi solo i numeri riga di quella
determinata offerta (una volta si usava il classico criterio
Forms!Offerta01!IDOfferte)
Ora questa cosa non funziona ahimè e guardando la guida in linea ho notato
che con la store lo si può fare...solo che mi sono leggermente perso nei
meandri delle chioccioline (@) non è che ancora ci capisco granchè!)
In poche parole io dovrei avere una sola tabella chiamata DettaglioOfferta
da li ricavare solo 2 campi: IDOfferte e Riga.
Da questi dire alla store di visualizzarmi solamente i record che hanno
l'IDOfferta uguale a quello aperto in quel momento nella maschera Offerte01.
Secondo te si può fare?
Grazie ancora
Ultra


Ciao Ultra
Se utilizzi una subform per il dettaglio offerta il funzionamento è identico
ai db di Access ovvero nella proprietà della subform Campi secondari metti
IDOfferte che è relativo alla tabella dettaglio e in campi master metti
IDOfferta che è relativo alla tabella Offerte e il tutto funziona
automaticamente.
Se invece usi una form staccata per il dettaglio allora puoi utilizzare la
Stored procedure che ha come parametro in input IDOfferta.
Esempio di Sp
-------------------------
CREATE PROCEDURE usp_DettaglioOfferta
(@IdOfferte int)
AS
SELECT     *
FROM       DettaglioOfferta
WHERE     (IDOfferta = @IdOfferte)
Order By Riga
-------------------------
Nella Form Dettaglio inserirai nella proprietà Parametri input
?=Forms!Offerta01.T_IDOfferte dove T_IDOfferte è il controllo visibile o
nascosto associato al campo IdOfferte. A questo punto ad ogni cambio di
record del Form Offerta01 devi eseguire una requery del form
DettagioOfferta.
Ciao Giorgio

 ha scritto nel messaggio
news:bf6s0e$p7i$1...@lacerta.tiscalinet.it...

Ciao Giorgio,
grazie per la tua risposta, ma scusami mi sono espresso male io e non mi
sono purtroppo fatto capire.
Io ho già la subform DettaglioOfferta collegata alla form principale tramite
IDOfferte in Master e secondari.
Quello che serviva a me era una query (come quelle di access). In questa
query (che non deve essere origine record della subform) devo inserire tre
campi della tabella DettaglioOfferta: IDOfferte e Riga mettendo magari anche
il campo Esercizio per avere dei risultati veramente Univoci.
Hai in mente che nelle query di access, nei criteri è possibile inserire
anche il campo di un'altra form per far si che visualizzi dei dati
particolari giusto?. Tipo nei criteri il Forms!Offerte01!IDOfferte. In modo
che quando apri la query questa ti mostra (sempre che la form Offerte01 sia
aperta) i dati che vengono filtrati da quell'IDOfferte messo nei criteri
query. Questo mi serve perchè:
Nella subform DettaglioOfferte c'è il campo riga, Questa riga deve indicarmi
quante righe di
dettaglio inserirò nell'offerta. Tu mi chiederai che potrei fare
CurrentRecord. Ma il mio cliente dopo aver inserito metti 40 righe, si
accorgesse che deve inserirne magari una sopra alla riga 4, come potrebbe
fare? Sarebbe impossibile in questo modo. Allora ho progettato questo
sistema che su access funziona benissimo ma su SQL no. Sul controllo
Before_Update della subform DettaglioOfferta, inserisco una routine che
utilizza il DMax. Se il Dmax lo faccio lavorare sulla Tbl_DettaglioOfferta,
lui mi darà come risultato il valore + grande di tutta la tabella
indifferentemente dal numero offerta. Invece se io il dmax gli e lo faccio
calcolare su una query che mi si apre filtrando i dati sul numero di offerta
che in quel
momento è aperta, se non trova nulla mi restituisce null (ed io gli dico che
se è null mi inserisce 3 nella casella) se invece trova <>Null allora mi dà
il numero maggiore delle righe che effettivamente ho inserito in
quell'offerta e non di tutte. Questo mi permette di avere: Il campo Riga
azzerato ad ogni cambio di Offerta, la possibilità di inserire righe 3x3
invece che come un contatore 1 per 1 in modo da lasciare un buco per
eventuali inserimenti.
Quindi quello di cui ho bisogno è di una query (Store in questo caso) che
basi il tutto sulla Tbl_DettaglioOfferte. che metta 3 campi: IDOfferte,
Riga, Esercizio. Poi con una formula (non sò quale) che dica alla store di
Restituirmi tutti i record in cui l'IDOfferta sia uguale all'IDOfferta della
form_Offerte01 che è aperta in quel momento (Su access2000 nella query nei
criteri si mette Forms!Offerte01!IDOfferte).
Spero di essermi spiegato...avvolte è difficile, ho in mente tante cose e
con il tempo trovo anche delle belle soluzioni, ma ci  vuole tempo e
soprattutto tanta dedizione.
Grazie ancora
Ultra

 ha scritto nel messaggio
news:dGNRa.49060$it4.1...@news1.tin.it...

Ciao Ultra
Di solito per numerare un contatore utilizzavo questo metodo  (Metodo che
funziona sia in Access che in Sqlserver) ovvero creo una funzione nel
subform interessato, ti faccio un esempio mirato al tuo problema...
Funzione da inserire nel subform
-------------------------
Function Get_New_Riga() As Long
    Dim Result As Variant
    Result=Dmax("Riga", _
                          "Tbl_DettaglioOfferte", _
                          "IDOfferta = " & Me.Parent!IdOfferta & _
                          " AND Esercizio=" & Me.Parent!Esercizio)
   'Se esercizio è stringa racchiudilo tra singili apici
    Result=Nz(Result,1)+3
    Get_New_Riga = Result
End Function
A Fronte dell'evento BeforeInsert della subform inserisci
---------------------------------------------
Private Sub Form_BeforeInsert(Cancel As Integer)
   'Se l'operatore non ha inserito nessun valore
    If Nzz(Me.T_Riga, 0) = 0 Then
       'Leggo valore Max+3
       Me.T_Riga = Get_New_Riga()
    End If
End Sub
----------------------------------------------
Me.T_Riga è il controllo associato al campo Riga, io distinguo sempre il
nome del controllo dal nome del campo associato per evitare confusione.
La stessa cosa è possibile farla fare direttamente dal server con un
Trigger, ma non vorrei mettere troppa carne sul fuoco.
Spero di aver capito il tuo problema
Ciao Giorgio.

 ha scritto nel messaggio
news:bf8e2j$9ca$1...@lacerta.tiscalinet.it...

Ciao Giorgio, la tua idea è OTTIMA :)
però senti, non è possibile creare un criterio su SQL come si faceva con
Query di access2000? Intendo il forms!etc.etc.....
Grazie ancora!!
Luigi

 ha scritto nel messaggio
news:xlTRa.94566$qa5.1...@news2.tin.it...

Con Jet di Access tu potevi inserire in una query i riferimenti a un
controllo di una maschera o una funzione in un modulo bas o una istruzione
vba. Con SqlServer scordati tutto questo devi passargli la stringa SQL già
composta di tutti i valori e i riferimenti al linguaggio sono strettamente
istruzioni T-Sql. Questa differenza è data dal fatto che jet non è un
Database Server e il tutto gira nella memoria del tuo Pc. Prova a pensare a
un ServerSql che sta in Giappone, che lavoro dovrebbe fare per recuperare i
riferimenti remoti dalla memoria dei vari client ??
Ciao Giorgio

 ha scritto nel messaggio
news:bf94vo$mt2$1...@lacerta.tiscalinet.it...

Ciao Giorgio,
anche questa volta non posso darti torto.
Quindi mi devo dimenticare tutte quelle "belle" formulette che tanto aiutano
in questi casi...invece adesso devo girare intorno
alla cosa per fargli fare la stessa operazione. Spesso e volentieri non
posso dare alla vista o alla store degli input fissi quindi devo collegarla
alla maschera.
Volevo chiederti un'altra cosa. Nella vista orgine record della famosa
subform DettaglioOfferte, ho sulle proprietà maschera Su evento "Dopo
conferma cancellazione" una routine di questo tipo:
Me.Parent![DettaglioVisivoOfferta].Requery
Non comprendo come mai avvolte funziona avvolte no, più spesso non funziona
e non ne capisco il motivo. La vista è sempre la stessa quindi a rigor di
logica se mi si aggiorna da una parte dovrebbe farlo anche su ques'altra
maschera no?
Ho provato a mettere anche RunCommand acCmdSaveRecord ma nulla da fare. Sto
sbagliando qualcosa?
Grazie
Ultra


Ciao Luigi
Forse è una questione di ritardo, prova a inserire un Doevents per dare
spazio agli altri processi
----------------
Doevents
Me.Parent![DettaglioVisivoOfferta].Requery
---------------
Oppure più mirato al subform
----------------
Doevents
Me.Parent![DettaglioVisivoOfferta].Form.Requery
---------------
Per quanto riguarda le comodità del buon vecchio Jet posso dirti che ti
mancano perché stai cercando di utilizzare SqlServer come se fosse Jet. E'
una cosa normalissima e ci siamo passati tutti. Con l'incremento delle
conoscenze sul nuovo strumento, ti accorgerai che potrai girare il 90% del
codice che attualmente scrivi in Vba direttamente sul Server, sfruttando la
sua  robustezza in ambiente multiutente. Quindi utilizzerai Access
prevalentemente come interfaccia grafica e per le sue stupende proprietà (I
SubForm e i SubReport di Access sono una cosa unica).
Ciao Giorgio

 ha scritto nel messaggio
news:bf9d4j$rsk$1...@lacerta.tiscalinet.it...

Ciao Giorgio,
Scusa per il ritardo nella mia risposta, comunque ho provato con il Doevents
ma nulla da fare....non capisco appena lo metto funziona poi appena chiudo e
salvo non funziona più, devo per forza di cose chiudere la finestra per
vedere i risultati della query giusti.
E' una cosa molto strana ma non riesco a cancellare qualcosa e vedere
immediatamente l'altra finestra aggiornata.
Non credo che sia ritardi di rete visto che sono solo io per il momento
l'unico utente.......
Grazie ancora
Ultra


Ciao Ultra
Ho provato a simulare la tua situazione e effettivamente non si ottiene il
risultato sperato.
La sequenza degli eventi durante una cancellazione è : BeforeDelConfirm;
AfterDelConfirm; Delete.
Nell'ultimo evento Delete è ancora possibile via codice annullare la
cancellazione con Cancel=true quindi di fatto il record non è ancora
cancellato e il requery comprende anche il record che si vuole cancellare.
Se vuoi puoi risolvere in questo modo
1) Crei una variabile booleana, esempio
Dim Cancellato As Boolean
a livello di form , per intenderci subito sotto Option explicit
2)Nell'evento AfterDelConfirm setti la variabile a true se è stata data
conferma alla cancellazione, esempio
Private Sub Form_AfterDelConfirm(Status As Integer)
    Cancellato = (Status = acDeleteOK)
End Sub
2)Nell'evento Current esegui la requery del secondo subform solo se è stato
cancellato un record, esempio
Private Sub Form_Current()
    If Cancellato Then 'Se è stato cancellato il record
       Me.Parent![DettaglioVisivoOfferta].Requery
    End If
   Cancellato = False 'Resetto il flag
End Sub
Ciao Giorgio

 ha scritto nel messaggio
news:bfh1bk$r80$1...@lacerta.tiscalinet.it...

Ciao Giorgio,
Funziona tutto adesso. Infatti il problema era proprio quello :)
Ora almeno quella cosa è risolta. Solo che devo cambiare ancora tante cose.
Volevo chiederti, ho visto tra strumenti la possibilità di fate un Backup.
Questo file è salvato in un .DAT
Come si utilizza il .DAT? Voglio dire, metti che mi servisse il file di
backup un giorno, come posso utilizzarlo?
Grazie
Ultra


Ciao Ultra
Dal menu strumenti oltre alla voce backup database Sql c'è anche ripristina
database Sql, come spiegato nel manuale copiano il file (o meglio i files)
del database, il progetto ADP non viene interessato in questo processo.
Se invece desideri eseguire il restore di un backup precedente su un'altro
database per estrarre solo determinate tabelle, allora la cosa si complica,
adesso è un po tardi per spiegarla ma qualora ti servisse puoi chiedere
aiuto su questo ng o su microsoft.public.it.sql
Ciao Giorgio.

 ha scritto nel messaggio
news:bfhshq$ai4$1...@lacerta.tiscalinet.it...

Ciao Giorgio,
proverò ad utilizzarlo, ti volevo chiedere dove posso scaricare il manuale
di SQL visto che mi sono solo scaricato la guida in linea.
Grazie ancora
Ultra

 ha scritto nel messaggio
news:bfiuod$k9k$1...@lacerta.tiscalinet.it...

Ciao Giorgio,
Senti una cosa, usando l'MSDE sono costretto a lavorare (programmarlo)
direttamente dal pc dove è installato il server oppure esiste una
possibilità remota che io possa lavorare da un altro pc non collegato in
rete e salvare i dati poi sul server?
Mi spiego meglio magari facendo un backup potrei utilizzarlo per installarlo
in un altro pc fare le mie dovute modifiche poi ricreare un altro backup e
riportarlo nel server definitivo credi che tutto questo sia possibile??
Grazie
Ultra

 ha scritto nel messaggio
news:MKcUa.23732$Za4.5...@news2.tin.it...

Si puoi farlo ma ovviamente il backup ricopre interamente il db di
destinazione.
Oltre al backup puoi copiare direttamente i file NomeDb.mdf e Nomedb.ldf
(devono essere copiati assieme)  tra un computer e l'altro, ovviamente il
servizio Sqlserver deve essere fermo.
Ciao Giorgio


Ciao Giorgio, io ci ho provato a fare il backup e a portarlo a casa nel mio
laptop solo che quando il tutto è stato salvato (senza intoppi) ed ho aperto
il programma, mi sono accorto che in una vista (quella benedetta che
conteneva il CASE WHEN..........) il valore che mi restituiva era:
.00000000
anche se il campo è vuoto il valore predefinito è quello...cosa che non mi
va bene essendo un campo Decimal. Può essere stato causato dal ripristino
del backup oppure può essere causato dal fatto che a casa ho office xp e in
ufficio office 2000 professional? Ti specifico che il .ADP è stato creato
con 2000.
Grazie ancora
Ultra

 ha scritto nel messaggio
news:oK6Va.22933$Df5.6...@news1.tin.it...

ah ah !!
Ora capisco perchè non mi hai fatto prima questa domanda.
Anche io ho AccessXp, e quando inserisco in un form o in un report un
controllo che ha come Origine Controllo un campo calcolato e il campo
calcolato eccede dalla precisione 28,x  AccessXp non lo interpreta
correttamente e lo visualizza come una stringa.
Comunque basta che alla voce origine controllo metti =Val([PrezzoTotale]) e
il tutto va a posto.
Evidentemente è un Bug implementato con la versione Xp.
Ciao Giorgio

 ha scritto nel messaggio
news:bg34qm$ofn$1...@lacerta.tiscalinet.it...

Ciao Giorgio,
infatti ora tutto è apposto :) Si evidentemente è un bug solo su office xp e
non sull'altro. Infatti anche io non capivo la prima volta quello che
intendevi con queste precisioni.....28,x etc..... ORA l'ho capita! :)
Volevo chiederti un'altra cosa. Quello che mi hai spiegato è che MSDE come
pure l'SQL ha bisogno di tabelle al cui interno ci sia almento una chiave
primaria. (funziona anche con un index basta che sia unique) e così ho
fatto. Solo che ora mi trovo un dilemma da risolvere. I numeri fatture,
oppure ordini o fatture hanno bisogno di un campo unique (i numeri non
possono ripetersi giusto?) Solo che all'apertura dell'anno successivo, i
numeri per legge ricominciano da 1.......e se sono unique.......questo non
me li accetta! Che accidenti si può fare? ti è mai capitata questa cosa?
Come l'hai risolta?
Ho visto quello che anche io usavo (0001/02) ma al cliente non piace molto.
Anche perchè devi dire tu di quanti numeri possono essere le
fatture........ossia 0001 arriva fino a 9999 fatture....e se poi metti caso
in un anno questo mi arriva a 10000?
Grazie ancora
Ultra

 ha scritto nel messaggio
news:%4pVa.26343$Df5.8...@news1.tin.it...

Ciao Ultraflex
La soluzione è semplice,devi usare un indice composto da due campi.
Esempio di tabella Bolle
Id_bolla    INT,  contatore PRIMARY KEY
Numero    INT,  NO NULL, DEFAULT 0
Data         Datetime, NO NULL
Anno        INT, NO NULL, DEFAULT 0
Come chiave primaria si utilizza un contatore autogestito dal computer che
ci server per le relazioni con il corpo bolla.
Poi si crea un secondo indice univoco composto dai campi Anno e Numero, in
questo modo un numero bolla è univoco solo nell'anno in corso.
Naturalmente bisogna assegnare il valore al campo Anno ovvero YEAR([Data]),
questa operazione potresti farla da codice nell'evento Before_Update del
form Bolle, ma se vuoi un consiglio fallo fare a SqlServer tramite un
trigger.
Esempio di trigger per compilare automaticamente il campo Anno
------------------------------------------
CREATE TRIGGER Bolle_Trigger1
ON dbo.Bolle
FOR INSERT, UPDATE
AS
-- Eseguo l'update solo se è stato toccato il campo DataDoc
IF UPDATE (Data) BEGIN
    UPDATE Bolle SET Anno=Year(I.Data)
    FROM Bolle B INNER JOIN INSERTED I
    ON B.Id_Bolla=I.Id_Bolla
END
----------------------------------------
Come dicevo per quanto riguarda la relazione con la tabella dettaglio_bolla
devi utilizzare il campo Id_Bolla che essendo contatore si incrementa
automaticamente.
Se vuoi un consiglio prevedi anche un campo tipo_bolla CHAR(1)  da inserire
nell'indice, ti da la possibilità di avere bolle 1/A o 1/B (e prima o poi te
lo chiederanno)
Ciao Giorgio.


Ciao Giorgio,
ho subito provato a fare quello che mi hai detto....e tutto va bene solo che
il campo DataOfferta (che tu hai chiamato DATA) quando ho messo come valore
predefinito YEAR([DataOfferta]) il pc quando cambio anno ad esempio 2004 lui
scrive 1905.....come mai? Forse per il discorso che l'SQL usa la data
americana o per il fatto che è meglio usare il trigger per questo motivo?
stranissimo perchè usando altri valori me li riporta tutti giusti.
Un'altra cosa che mi chiedono... di collegare un registratore di cassa con
access (SQL) a questo punto.
Ma non sono riuscito a trovare nulla nel sito comune....possibile che non
sia mai servito a nessuno?
Grazie
Ultra

 ha scritto nel messaggio
news:WYvVa.28086$Df5.8...@news1.tin.it...

Ciao Ultraflex
Vediamo se ho capito.
Tu hai il controllo ANNO che ha come valore predefinito YEAR([DataOfferta]).
In questo modo il Controllo Anno viene valorizzato solo se sei in
inserimento di una nuova offerta generando un BUG se ti variano la data (con
anno diverso) in fase di variazione record.
Se non vuoi usare un trigger Assegna il valore al campo o al controllo Anno
nell'evento  Form_BeforeUpdate.
Per quanto riguarda l'assegnazione dell'anno con data in formato gg/mm/aa
devi modificare le impostazioni del Pannello di controllo nella sezione
"Impostazioni Internazionali" quindi "scheda data" voce "quando viene
immesso un anno a due cifre consideralo compreso tra" .....
Per la comunicazione tra Access e il registratore di cassa puoi prendere
spunto da questa Kb della Microsoft.
Esempio di uso delle API per la comunicazione seriale
http://support.microsoft.com/default.aspx?scid=kb;it;639415
L'ho usata anche io per i registratori di cassa, ovviamente devi avere le
informazioni sul protocollo di comunicazione che ti fornirà la casa
costruttrice del registratore.
Ciao Giorgio

 ha scritto nel messaggio
news:bg65b5$a42$1...@lacerta.tiscalinet.it...

Ciao Giorgio,
Grazie per le informazioni sul registratore di cassa, ne farò buon uso :)
Riguardo l'indice per la numerazione delle offerte / ordini / bolle, io ho
inserito il doppio indice anche su DettaglioOfferte, solo che non me lo
accetta........mi dice che non mi è permesso duplicare il valore
dell'indice...... forse il campo Data non viene automaticamente inserito,
quindi lui si trova solamente il numero duplicato non credi?
Un'altra cosa, ho trasportato l'SQL a casa per lavorarci con più comodità, e
ti ho detto di quel bug per quanto riguarda i campi calcolati, e fin quì
tutto ok, solo che adesso ho creato una store in ufficio collegata ad una
routine,
la store è questa:
Alter PROCEDURE usp_DettaglioOfferta
(@IDOfferte int)
AS SELECT * FROM DettaglioOfferta
WHERE (IDOfferte = IDOfferte)
Order By Riga
e la routine questa:
Dim strFiltro As String
strFiltro = "IDOfferte = " & Me.IDOfferte
Me.Riga.Value = IIf(IsNull(DMax("Riga", "DettaglioOfferta", strFiltro) + 3),
3, DMax("Riga", "DettaglioOfferta", strFiltro) + 3)
End Sub
Allora, in ufficio funziona con il 2000 a casa con l'xp no. Mi dice Syntax
error on line 1 near ')'
Ho controllato le parentesi, la punteggiatura, qualsiasi cosa, ma non c'è
niente da fare non funziona.
La stessa identica cosa a casa non funziona....sai di qualche bug nell'xp?
Grazie
Ultra