Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Base e formato date

38 views
Skip to first unread message

riccardor

unread,
Nov 11, 2010, 11:19:36 AM11/11/10
to
Ciao a tutti,
vi spiego i problemi che incontro con la lettura e la scrittura delle
date in BASE.
Il datbase che sto creando ha un formulario in cui con una macro
vorrei generare il numero progressivo e la data da assegnare a dei
verbali di riunione.
E' fatto così: http://img99.imageshack.us/img99/8730/vdr01odbfnuovoverbaleop.jpg
La macro, associata al pulsante,
1) legge la data dal controllo data apribile (non è collegato a
nessuna tabella): "data_emissione"
2) la confronta con la più recente tra quelle già presenti nel
database (campo "Data" del controllo tabella)
3) se l'anno è lo stesso incrementa il numero precedente di un'unità
4) se l'anno è superiore al più recente presente nei record esistenti
riparte da 1

A parte i miglioramenti che si possono fare sul criterio per assegnare
il numero, il problema vero è che non riesco a far scrivere la data
letta dal campo "data_emissione" nel campo "Data" della grid.
La macro si interrompe dicendo che il tipo di dato è errato
http://img220.imageshack.us/img220/2109/openofficeorg3211112010.png

Il formato della date è in entrambi i controlli GG/MM/AAAA, nella
definizione del campo della tabella su cui scrive la maschera ho
indicato in Tipo campo Data [Date].

Per leggere e scrivere faccio così:

...
' Legge data di emissione
rem legge
oForm = ThisComponent.DrawPage.forms.Dati
data=oForm.GetByName("data_emissione")
d_em=data.date
print "emissione:" + d_em
...
http://img600.imageshack.us/img600/6962/acquisizioneaschermoint.png

...
oConn = ThisDatabaseDocument.DataSource.GetConnection("","")
oStatement = oConn.createStatement()
...
sinsert = " update ""T_Dati_verbale"" set ""progr_annuo"" = '"& a &"'
where ""ID_gen"" = '"& numero_generale_verbale &"' "
oStatement.execute(sinsert)

sinsert = " update ""T_Dati_verbale"" set ""anno"" = '"&
anno_emissione &"' where ""ID_gen"" = '"& numero_generale_verbale &"'
"
oStatement.execute(sinsert)

sinsert = " update ""T_Dati_verbale"" set ""Data"" = '"& d_em &"'
where ""ID_gen"" = '"& numero_generale_verbale &"' "

oStatement.execute(sinsert)
...

i primi due update funzionano, mentre al terzo (quello sul campo
"Data") compare l'errore del formato dato.

La variabile d_em l'ho definita come:
global d_em
notare che se la definisco
global d_em as date

mi da
http://img560.imageshack.us/img560/6962/acquisizioneaschermoint.png

Qualcuno saprebbe dove può essere l'errore e come fare per farlgielo
scrivere?

N.B.
ovviamente se scrivessi la data direttamente nella tabella il problema
non si porrebbe, ma mi sembrava meglio così per poter fare il test
sulle date prima di scrivere e poi vorrei comunque capire se uso
metodi sbagliati...
Grazie, Riccardo


martello

unread,
Nov 11, 2010, 12:48:18 PM11/11/10
to

> ovviamente se scrivessi la data direttamente nella tabella il problema
> non si porrebbe, ma mi sembrava meglio cos� per poter fare il test

> sulle date prima di scrivere e poi vorrei comunque capire se uso
> metodi sbagliati...

Vado a memoria ...
La data in hsqldb va introdotta in un formato tipo questo:

2010-12-21

> Grazie, Riccardo

Prego (sempre che l'abbia azzeccata)

VITRIOL

unread,
Nov 11, 2010, 12:57:11 PM11/11/10
to
Il 11/11/2010 18.48, martello ha scritto:

> La data in hsqldb va introdotta in un formato tipo questo:
>
> 2010-12-21

Che dovrebbe chiamarsi ISO 8601. E' anche l'unico formato che nelle
versioni recenti di Calc � accettato come conversione automatica stringa
> data delle formule.

--
news:it-alt.comp.software.openoffice : Il newsgroup dedicato a
OpenOffice.org, la suite open source di applicazioni per ufficio.
Scarica "OpenOffice.org 3: Soluzioni a raccolta", molto pi� di semplici
FAQ! http://it.openoffice.org/doc/manuali/

riccardor

unread,
Nov 11, 2010, 3:35:09 PM11/11/10
to

vi ringrazio, ma io vorrei che fosse la macro a scrivere la data dopo
averla letta; devo quindi usare qualcosa tipo data=format(d_em, "yyyy-
mm-dd")?

riccardor

unread,
Nov 11, 2010, 3:54:33 PM11/11/10
to
On 11 Nov, 18:57, VITRIOL <vitriol_vitriolTOGL...@katamail.com> wrote:

bontà divina funzionaaaaaa! Vi devo una birra. Grazie davvero ci ho
passato su tanto di quel tempo....

ho usato questo sistema:

anno=mid(d_em,1,4)
'anno=year(d_em)
mese=mid(d_em, 5,2)
giorno=mid(d_em, 7,2)

data= anno & "-" & mese & "-" & giorno
sinsert = " update ""T_Dati_verbale"" set ""Data"" = '"& data &"'


where ""ID_gen"" = '"& numero_generale_verbale &"' "

ricordo un post di Roberto Montaruli in cui ritieneva un pò
inaffidabile estrarre e rimescolare la data in quel modo, perchè
dipende dalle impostazioni del sistema in uso, ma se faccio

anno=year(d_em)
print anno

mi restituisce 9999

come si può fare allora ad applicare quella funzione in modo corretto?

Roberto Montaruli

unread,
Nov 11, 2010, 4:25:34 PM11/11/10
to

Dunque vediamo un po' il tuo codice.

data=oForm.GetByName("data_emissione")
d_em=data.date
print "emissione:" + d_em

E qui ti appare emissione:20101113

Solo che quel 20101113 che cos'e'? Una data o una stringa?

la variabile data, che inizializzi con
data=oForm.GetByName("data_emissione")
di che tipo e'?

Deve essere di un tipo particolare visto che possiede una
proprieta' .date

Poi tu assegni data.date ad una variabile d_em che e' quella che poi
visualizzi.
E anche questa d_em di che tipo e'?

Da qualche parte nell'oggetto "data_emissione" o nelle variabili
coinvolte in seguito, ci deve essere un oggetto di tipo data, non
stringa, ma data, un qualcosa che ti permetta di ricavare facilmente
il giorno, il mese, l'anno, il giorno della settimana, etc...

E' da quell'oggetto che devi partire, non dalla stringa che e' una
mera rappresentazione del dato secondo un formato impostato chissa'
dove.

Adesso ci provo io a mettere in una form di calc quel coso col
calendario e poi ti dico.

riccardor

unread,
Nov 11, 2010, 4:47:30 PM11/11/10
to

credo che questo sia il punto: immetto una data (selezionandola dal
calendarietto) e poi il print restituisce quella stringa


>
> la variabile data, che inizializzi con
> data=oForm.GetByName("data_emissione")
> di che tipo e'?

il controllo "data_emissione" è definito come campo data; perciò io
credo che debba essere riconosciuto come data...no?


>
> Deve essere di un tipo particolare visto che possiede una
> proprieta' .date
>
> Poi tu assegni data.date ad una variabile d_em che e' quella che poi
> visualizzi.
> E anche questa d_em di che tipo e'?

d_em la definisco come
global d_em
anche perchè se definisco
global d_em as date
mi restituisce una serie di caratteri senza significato


>
> Da qualche parte nell'oggetto "data_emissione" o nelle variabili
> coinvolte in seguito, ci deve essere un oggetto di tipo data, non
> stringa, ma data, un qualcosa che ti permetta di ricavare facilmente
> il giorno, il mese, l'anno, il giorno della settimana, etc...
>
> E' da quell'oggetto che devi partire, non dalla stringa che e' una
> mera rappresentazione del dato secondo un formato impostato chissa'
> dove.
>
> Adesso ci provo io a mettere in una form di calc quel coso col
> calendario e poi ti dico.

grazie anche a te per il tempo che ci metti

martello

unread,
Nov 11, 2010, 5:25:54 PM11/11/10
to

> mi restituisce una serie di caratteri senza significato

Quindi è una stringa ...
Trattala come tale e vivi felice.

Roberto Montaruli

unread,
Nov 12, 2010, 3:49:43 AM11/12/10
to

Sarebbe tuttavia interessante sapere se esiste un oggetto di tipo data
e operare su quello.
Ieri sera ho provato a cercare quel calendario da usare come selettore
di data ma non l'ho mica trovato.

Nel basic di OpenOffice c'e' la funzione Now che ritorna la data di
sistema, e usando le funzioni Year(Now), Month(Now), Day(Now) e'
possibile ottenere anno mese e giorno.

Possibile che non vi sia un oggetto di formulario in grado di
restituire un oggetto di tipo data?
Perche' una volta trasformato in stringa si perde un sacco di
informazione.

riccardor

unread,
Nov 12, 2010, 5:14:03 AM11/12/10
to
On 12 Nov, 09:49, Roberto Montaruli <rmontar...@gmail.com> wrote:
> On 11 Nov, 23:25, martello <"martelozzo1(martello)"@tin.it> wrote:

> Ieri sera ho provato a cercare quel calendario da usare come selettore
> di data ma non l'ho mica trovato.

si deve messere si alla proprietà "apribile" del controllo data:
http://img844.imageshack.us/img844/7582/acquisizioneaschermointn.jpg

>
> Nel basic di OpenOffice c'e' la funzione Now che ritorna la data di
> sistema, e usando le funzioni Year(Now), Month(Now), Day(Now) e'
> possibile ottenere anno mese e giorno.

quando compilo il verbale nello stesso giorno della seduta va bene, ma
non è sempre così....spesso devo indicare una data precedente

> Possibile che non vi sia un oggetto di formulario in grado di
> restituire un oggetto di tipo data?

non lo so....:-(

Roberto Montaruli

unread,
Nov 12, 2010, 11:28:28 AM11/12/10
to
On 12 Nov, 11:14, riccardor <rrave...@gmail.com> wrote:
> On 12 Nov, 09:49, Roberto Montaruli <rmontar...@gmail.com> wrote:
>
> > On 11 Nov, 23:25, martello <"martelozzo1(martello)"@tin.it> wrote:
> > Ieri sera ho provato a cercare quel calendario da usare come selettore
> > di data ma non l'ho mica trovato.
>
> si deve messere si alla proprietà "apribile" del controllo data:http://img844.imageshack.us/img844/7582/acquisizioneaschermointn.jpg
>
>

Ho trovato questa pagina:
http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Basic/Date_Field

Direi che chiarisce tutto.
La proprieta' .Date di quell'oggetto li' contiene una stringa in
formato ISO che rappresenta la data, in formato YYYYMMDD

Ci sono due funzioni: CDateToIso() e CDateFromIso() che servono per
gestire la data.
http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Basic/Date_and_Time_Functions

CDateToIso vuole come argomento un oggetto data, tipicamente la
funzione Date(), e ritorna una stringa in formato YYYYMMDD
Invece la CDateFromIso() vuole come oggetto la stringa YYYYMMDD,
restituita da quel calendario per esempio, e la trasforma in un
oggetto di tipo data, dal quale e' possibile estrarre Year() Month()
Day() e tutto il resto, in modo piu' preciso che manipolando
beceramente la stringa.

martello

unread,
Nov 12, 2010, 1:21:12 PM11/12/10
to

> Ho trovato questa pagina:
> http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Basic/Date_Field
>
> Direi che chiarisce tutto.
> La proprieta' .Date di quell'oggetto li' contiene una stringa in
> formato ISO che rappresenta la data, in formato YYYYMMDD

Veramente leggo tipo 'long'.
Strano ...
O riccardor ha omesso di copiare una trasformazione in stringa della
data nel suo codice oppure viene da chiedersi come hanno fatto a
funzionare le funzioni di elaborazione di stringa.

riccardor

unread,
Nov 13, 2010, 3:35:10 AM11/13/10
to
On 12 Nov, 17:28, Roberto Montaruli <rmontar...@gmail.com> wrote:
> On 12 Nov, 11:14, riccardor <rrave...@gmail.com> wrote:
>
> > On 12 Nov, 09:49, Roberto Montaruli <rmontar...@gmail.com> wrote:
>
> > > On 11 Nov, 23:25, martello <"martelozzo1(martello)"@tin.it> wrote:
> > > Ieri sera ho provato a cercare quel calendario da usare come selettore
> > > di data ma non l'ho mica trovato.
>
> > si deve messere si alla proprietà "apribile" del controllo data:http://img844.imageshack.us/img844/7582/acquisizioneaschermointn.jpg
>
> Ho trovato questa pagina:http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Basic...

>
> Direi che chiarisce tutto.
> La proprieta' .Date di quell'oggetto li' contiene una stringa in
> formato ISO che rappresenta la data, in formato YYYYMMDD
>
> Ci sono due funzioni: CDateToIso() e CDateFromIso() che servono per
> gestire la data.http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Basic...

>
> CDateToIso vuole come argomento un oggetto data, tipicamente la
> funzione Date(), e ritorna una stringa in formato YYYYMMDD
> Invece la CDateFromIso() vuole come oggetto la stringa YYYYMMDD,
> restituita da quel calendario per esempio, e la trasforma in un
> oggetto di tipo data, dal quale e' possibile estrarre Year() Month()
> Day() e tutto il resto, in modo piu' preciso che manipolando
> beceramente la stringa.

Perfetto, CDateFromIso() è la soluzione; ad esempio:

....oForm = ThisComponent.DrawPage.forms.Dati
data=oForm.GetByName("data_emissione")
d_em=data.date

anno_emissione=Year(CDateFromIso(d_em))
print anno_emissione
.....
http://img251.imageshack.us/img251/2452/acquisizioneaschermointh.png

riccardor

unread,
Nov 13, 2010, 3:47:09 AM11/13/10
to
On 12 Nov, 19:21, martello <"martelozzo1(martello)"@tin.it> wrote:
> > Ho trovato questa pagina:
> >http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Basic...

>
> > Direi che chiarisce tutto.
> > La proprieta' .Date di quell'oggetto li' contiene una stringa in
> > formato ISO che rappresenta la data, in formato YYYYMMDD
>
> Veramente leggo tipo 'long'.
questo è vero; Xray dice che d_em è un 'long'
> Strano ...
anche questo è vero :-)

> O riccardor ha omesso di copiare una trasformazione in stringa della
> data nel suo codice oppure viene da chiedersi come hanno fatto a
> funzionare le funzioni di elaborazione di stringa.

in effetti non ho fatto (almeno non consapevolmente ...) nesuna
trasformazione in stringa; d_em la ricavo così:
...


oForm = ThisComponent.DrawPage.forms.Dati
data=oForm.GetByName("data_emissione")
d_em=data.date

.....

poi applicavo

...
anno=mid(d_em,1,4)
mese=mid(d_em, 5,2)
giorno=mid(d_em, 7,2)
...
e restituiva rispettivamente (ad es.) 2010 , 11 , 15

Forse perchè ho definito
global d_em (senza dire "as date") ?

Riserviamoci di fare i necessari approfondimenti, ma ricordo che
qualcuno sosteneva: "non importa che il gatto sia bianco oppure nero,
l'importante è che prenda il topo..."

Roberto Montaruli

unread,
Nov 13, 2010, 9:11:20 AM11/13/10
to

O ancora meglio:

d_em=CDateFromIso(oForm.GetByName("data_emissione").date)
YYYY=Year(d_em)
...

Le variabili si usano quando servono.
Se non servono, si puo' scrivere anche in modo piu' compatto.

Con questo approfondimento, ho imparato pure io che esiste
CDateFromIso() e CDateToIso().

martello

unread,
Nov 13, 2010, 12:07:15 PM11/13/10
to

> l'importante è che prenda il topo..."

In questo caso che prenda il ... tipo ...

Battutaccia da quattro soldi :-)

martello

unread,
Nov 13, 2010, 12:20:24 PM11/13/10
to

> poi applicavo

Udite ... Udite

Sub Main
dim a as double
a=45.7856
print left(a,2)
print a*2
End Sub

Provare per credere ... strano eh?

pablo

unread,
Nov 13, 2010, 6:25:17 PM11/13/10
to

Non vedo nulla di strano.

pablo


riccardor

unread,
Nov 13, 2010, 7:21:19 PM11/13/10
to

la cosa strana è che left agisca anche su una variabile tipo double
( e non una string) ? Le mie (poche) certezze vacillano....

martello

unread,
Nov 13, 2010, 7:28:22 PM11/13/10
to

> Non vedo nulla di strano.

Sar� ... ma io ho sempre pensato che anche l'argomento dovesse essere
una stringa.

pablo

unread,
Nov 14, 2010, 12:09:23 PM11/14/10
to

Non c'è nulla di strano, Left agisce su una stringa in effetti.

E' l'interprete basic che effettua una conversione implicita della
variabile double prima di passarla alla funzione Left
Questo succede anche in VB e in VBA.

In effetti questa gestione "intelligente" dei tipi di variabile è molto
comoda perchè consente di evitare un sacco di codice per le conversioni
di tipo esplicite, ma non deve mai mancare la consapevolezza di quello
che accade dietro le quinte.

Ecco un paio di variazioni sul tema che mostrano il comportamento
polimorfico dell'operatore +

Print 2 + Left(45.1234, 2)
Print Left(45.1234, 2) + 2

Infine ecco un comportamento davvero inconsueto:
Print "True" = True

;)

ciao
pablo

Roberto Montaruli

unread,
Nov 15, 2010, 3:52:56 AM11/15/10
to
On 14 Nov, 18:09, pablo <inva...@mail.org> wrote:

> In effetti questa gestione "intelligente" dei tipi di variabile è molto
> comoda perchè consente di evitare un sacco di codice per le conversioni
> di tipo esplicite,

A me me pare una str....! (cit.)

> ma non deve mai mancare la consapevolezza di quello
> che accade dietro le quinte.

L'unico modo sicuro per non far mancare mai la consapevolezza e'
quello di PRETENDERLA.

Le conversioni di tipi e i cast devono a mio parere essere SEMPRE
richiesti.

martello

unread,
Nov 15, 2010, 9:58:03 AM11/15/10
to

> E' l'interprete basic che effettua una conversione implicita della
> variabile double prima di passarla alla funzione Left
> Questo succede anche in VB e in VBA.

Si ... va bene ... ma allora ditelo ...

0 new messages