60 messaggi dal 30 dicembre 2006
che dire .. grazie (e non so se sei più vecchio ;) ), ma di sicuro non è la semplice differenza anagrafica a fare la .. "differenza".
mi rassicura sapere che se sono talvolta 'approssimativo' (magari anche solo per amor di brevità) ci sei tu in agguato!
i tuoi contributi, tra i tanti pur ottimi, restano i miei preferiti per il tono e la precisione: imparo molto ... e con i violini la chiudo qui!
saluti
16 messaggi dal 11 settembre 2009
Buongiorno a tutti. Nel frattempo sono andato avanti da solo per consolidare le conoscenze. Ora ho un dubbio su come risolvere un problema, penso banale:

Quando inserisco un nuovo record, nel campo data/ora devo inserire la data/ora del server in modo da avere il campo aggiornato sull'ora del server e non dei client.

Come procedere?

Grazie in anticipo, Giuseppe
1.976 messaggi dal 27 luglio 2005
Contributi
salve Giuseppe,
grigon wrote:
Buongiorno a tutti. Nel frattempo sono andato avanti da solo per consolidare le conoscenze. Ora ho un dubbio su come risolvere un problema, penso banale:

Quando inserisco un nuovo record, nel campo data/ora devo inserire la data/ora del server in modo da avere il campo aggiornato sull'ora del server e non dei client.


quando cambi "argomento" rispetto ad un thread iniziato, e' bene aprire un nuovo corrispondente thread, in quanto questo (come nel caso corrente) non ha nulla a che spartire con il precedente...

detto cio', puoi tranquillamente definire un DEFAULT constraint per la colonna, in modo che, in assenza di valorizzazione, questa venga assegnata, ad esempio, con la data corrente....
se vuoi anche proseguire valorizzando l'attributo nel caso di aggiornamenti successivi, devi invece ricorrere ad un trigger, che verifichi come nell'esempio sottostante, che la riga venga modificata ma l'attributo in esame, invece, resti immutato, provvedendo in questo caso a valorizzarlo sistematicamente sempre con la data corrente...

SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.t (
Id int NOT NULL,
dt datetime NOT NULL DEFAULT GETDATE()
);
GO

PRINT 'utilizzo di un DEFAULT a livello di colonna';
PRINT 'che va utilizzato senza specificare alcun valore';
PRINT 'al momento dell''inserimento della nuova riga;';
PRINT 'ovviamente vale solo per gli inserimenti';
PRINT 'e non ha effetti sulle variazioni successive';
INSERT INTO dbo.t ( Id ) VALUES ( 1 );
INSERT INTO dbo.t ( Id, dt ) VALUES ( 2, DEFAULT );

SELECT * FROM dbo.t;

WAITFOR DELAY '00 0 5';
UPDATE dbo.t
SET Id = Id + 10;
GO
SELECT * FROM dbo.t;
GO
CREATE TRIGGER tr_U_t_UpdateTimeStamp ON dbo.t
FOR UPDATE
AS BEGIN
IF @@ROWCOUNT = 0 RETURN;

MERGE dbo.t AS target
USING (SELECT Id, dt
FROM inserted
WHERE NOT UPDATE(dt)
OR dt IS NULL ) AS i
ON i.Id = target.Id
WHEN MATCHED THEN
UPDATE SET dt = GETDATE();
END;
GO
PRINT 'trigger su UPDATE per modificare il valore,';
PRINT 'se la modifica non imposta anche il ''timestamp''';
UPDATE dbo.t
SET Id = Id + 50
WHERE Id <= 11;

UPDATE dbo.t
SET dt = '20091231'
WHERE Id = 12;

GO
SELECT * FROM dbo.t;
GO
DROP TABLE dbo.t;

saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
16 messaggi dal 11 settembre 2009
Grazie Andrea, il problema da me sollevato, pensavo fosse sempre "incluso nel pacchetto" anche per non essere troppo dispersivo....
Adotterei piuttosto la procedura di eliminare i post che non contengono notizie utili (nel thread che ho aperto io, se si può), naturalmente.
Grazie ancora.
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
grigon wrote:
Grazie Andrea, il problema da me sollevato, pensavo fosse sempre "incluso nel pacchetto" anche per non essere troppo dispersivo.... Adotterei piuttosto la procedura di eliminare i post che non contengono notizie utili (nel thread che ho aperto io, se si può), naturalmente. Grazie ancora.

no, i post vengono eliminati penso solo in caso siano offensivi o simili.. una discussione deve poter essere vista anche a posteriori nella sua interezza.. quando l'argomento cambia, si apre altra discussione.. non "facciamo" offerte "tutto incluso".. ogni pezzo "si paga e si legge a parte"

personalmente ti leggo in nntp e capirai che, con il passare del tempo, scrolli molto in basso, ma questo e' comunque un problema mio e del "mezzo" di accesso nntp..
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
16 messaggi dal 11 settembre 2009
Ok, proseguiamo qui, sperando d'azzeccare......

Lo script in calce mi crea 3 tabelle, Prodotti, CaricoMateriePrime e LottiProduzione. Quest'ultima sarà popolata con circa 900000 record.

Dovrò poi eseguire delle query che coinvolgono i LottiProduzione, ad esempio:

Per un dato Cliente (Vendite di ProdottoFinito), per una data MateriaPrima, in un intervallo di tempo, il peso totale della MateriaPrima utilizzata. (alcune tabelle mancano ancora!)

Ammettiamo di scrivere una procedura per fare ciò, passando i parametri Cliente, MateriaPrima, Intervallo di tempo, SQLServer dovrà filtrare le vendite del cliente nell'arco di tempo, dai ProdottiFiniti venduti, mediante il LottoProduzione, filtrare i LottiProduzione sulla MateriaPrima in selezione quindi calcolare la parte sul totale effettivamente usata per il cliente stesso (in quanto il lottoProduzione sarà sicuramente stato fatto per più clienti). Ora il fatto che più mi spaventa è la query sui 900000 record dei LottiProduzione. Il risultato deve essere veloce il più possibile quindi la mia domanda è:
Qual'è la tecnica migliore per fare questo? Si deve indicizzare qualcosa per rendere veloce la ricerca?
Un'ultima cosa, il campo TempoDosaggio volevo dichiararlo time(2) in modo da occupare solo 3 byte ma, mi dà un'errore. Forse và dichiarato in una maniera che non conosco?

Thanks a lot! Giuseppe

Qui lo script:

/*
** G.Rigon
*/

SET NOCOUNT ON
GO

USE master
GO

if exists (select * from sysdatabases where name='TestDB')
drop database TestDB
go

DECLARE @device_directory NVARCHAR(520)
SELECT @device_directory = SUBSTRING(filename, 1, CHARINDEX(N'master.mdf', LOWER(filename)) - 1)
FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1

EXECUTE (N'CREATE DATABASE TestDB
ON PRIMARY (NAME = N''TestDB'', FILENAME = N''' + @device_directory + N'TestDB.mdf'')
LOG ON (NAME = N''TestDB_log'', FILENAME = N''' + @device_directory + N'TestDB.ldf'')')
go

exec sp_dboption 'TestDB','trunc. log on chkpt.','true'
exec sp_dboption 'TestDB','select into/bulkcopy','true'
GO

set quoted_identifier on
GO

SET DATEFORMAT dmy
GO

USE TestDB
GO

if exists (select * from sysobjects where id = object_id('dbo.Prodotti') and sysstat & 0xf = 3)
drop table "dbo"."Prodotti"
GO

if exists (select * from sysobjects where id = object_id('dbo.LottiProduzione') and sysstat & 0xf = 3)
drop table "dbo"."LottiProduzione"
GO

/* TABELLA PRODOTTI */

CREATE TABLE "Prodotti" (
[ProdottoID] "int" NOT NULL ,
"AnagraficaProdotto" nvarchar (40) NOT NULL ,
"DescAgg" nvarchar (60) NOT NULL ,
"Versione" "int" NOT NULL ,
"MinimoMagazzino" "int" not NULL DEFAULT (0),
"TempoRiordino" "smallint" NULL ,
"CollMul" "int" NULL ,
"CollMag" "int" NULL ,
"b_BIO" "bit" NOT NULL DEFAULT (0),
"b_NAT" "bit" NOT NULL DEFAULT (1),
"b_COR" "bit" NOT NULL DEFAULT (0),
"b_MateriaPrima" "bit" NOT NULL DEFAULT (0),
"b_Mangime" "bit" NOT NULL DEFAULT (0),
"Attivo" "bit" NOT NULL DEFAULT (1),
CONSTRAINT "PK_Prodotti" PRIMARY KEY CLUSTERED
(
[ProdottoID]
)
)
GO

/* TABELLA CARICO MATERIE PRIME */

CREATE TABLE "CaricoMateriePrime" (
[LottoCaricoID] int NOT NULL ,
[ProdottoID] "int" NOT NULL ,
"Attivo" "bit" NOT NULL DEFAULT (1),
CONSTRAINT "PK_CaricoMateriePrime" PRIMARY KEY CLUSTERED
(
[LottoCaricoID]
),
CONSTRAINT "FK_CaricoMateriePrime_Prodotti" FOREIGN KEY
(
[ProdottoID]
) REFERENCES "dbo"."Prodotti" (
"ProdottoID"
)
)
GO

/* TABELLA LOTTI DI PRODUZIONE */

CREATE TABLE "LottiProduzione" (
[LottoProduzioneID] int NOT NULL ,
[ProdottoID] int NOT NULL ,
[LottoCaricoID] int NOT NULL ,
DataDosaggio "datetime" NOT NULL ,
TempoDosaggio "datetime" NOT NULL ,
Ciclo tinyint NOT NULL ,
PesoFormula real NOT NULL ,
PesoTara real NOT NULL ,
PesoDosato real NOT NULL ,
PesoVolo real NOT NULL ,
Bilancia tinyint NOT NULL ,
Silo int NOT NULL ,
b_Esito "bit" NOT NULL DEFAULT (1),
b_Abort "bit" NOT NULL DEFAULT (0),
b_ManualeAutomatico "bit" NOT NULL DEFAULT (0),
b_Visualizza1 "bit" NOT NULL DEFAULT (1),
b_Visualizza2 "bit" NOT NULL DEFAULT (1),
b_Visualizza3 "bit" NOT NULL DEFAULT (1),
b_Visualizza4 "bit" NOT NULL DEFAULT (1),
b_Dosato "bit" NOT NULL DEFAULT (0),
CONSTRAINT "PK_LottiDiProduzione" PRIMARY KEY CLUSTERED
(
[LottoProduzioneID]
),
CONSTRAINT "FK_LottiProduzione_Prodotti" FOREIGN KEY
(
[ProdottoID]
) REFERENCES "dbo"."Prodotti" (
"ProdottoID"
),
CONSTRAINT "FK_LottiProduzione_LottoCarico" FOREIGN KEY
(
[LottoCaricoID]
) REFERENCES "dbo"."CaricoMateriePrime" (
"LottoCaricoID"
)
)
GO
Modificato da grigon il 10 ottobre 2009 10.10 -
Modificato da grigon il 10 ottobre 2009 10.11 -
1.976 messaggi dal 27 luglio 2005
Contributi
salve Giuseppe,
grigon wrote:
Ok, proseguiamo qui, sperando d'azzeccare......

a quanto pare non ci capiamo..
"PER OGNI NUOVA DOMANDA, APRI UN NUOVO TRHEAD!!!!!"


Lo script in calce mi crea 3 tabelle, Prodotti, CaricoMateriePrime e LottiProduzione. Quest'ultima sarà popolata con circa 900000 record.

clienti). Ora il fatto che più mi spaventa è la query sui 900000 record dei LottiProduzione. Il risultato deve essere veloce il più possibile quindi la mia domanda è:
Qual'è la tecnica migliore per fare questo? Si deve indicizzare qualcosa per rendere veloce la ricerca?

sicuramente si.. dovrai eseguire un tuning ed indicizzare dove necessario senza possibilmente fare attivita' di over-indexing in modo da non appesantire le operazioni CRUD..

Un'ultima cosa, il campo TempoDosaggio volevo dichiararlo time(2) in modo da occupare solo 3 byte ma, mi dà un'errore. Forse và dichiarato in una maniera che non conosco?

e' richiesto SQL Server 2008:

SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.t (
Id int NOT NULL,
TempoDosaggio time(2)
);
GO
DROP TABLE dbo.t;

saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.