[Résolu][Base] Enregistrer des données automatisées

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur: Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !

[Résolu][Base] Enregistrer des données automatisées

Messagepar Dominique Pautrel » 01 Fév 2009 18:09

Bonjour,

J'aimerais insérer dans la table, sur modification d'un enregistrement, la date et l'heure de dernière modification.

L'exemple est la base sur ce petit projet :
viewtopic.php?f=26&t=14074

Pour ce faire j'ai assigné la macro au sous-formulaire à l'évènement
Avant l'opération d'enregistrement
Code : Tout sélectionner   AgrandirRéduire
Sub DateDerniereModif ' Insère la date et l'heure
' courante après modification d'une traduction.
Dim Form1 As Object, Form3 As Object, CtrlDate As object
Form1 = thisComponent.DrawPage.Forms.getByName(sFm1)
Form3 = Form1.getByName(sFm2).getByName(sFm3)
CtrlDate = Form3.getByName("txtTrdDate")
CtrlDate.text = Now
End Sub

Ensuite je m'attends à ce qu'il poursuive l'opération d'enregistrement et insère cette donnée dans la table, mais non ...

J'ai essayé Form3.Write mais il me répond : Argument len(gth) differ ...
J'imagine que la réponse tient en une ligne. Mais une fois de plus je sèche ... :?:

Merci d'avance,
Dominique
Dernière édition par Dominique Pautrel le 04 Fév 2009 16:26, édité 1 fois.
OpenOffice.org 3.2 sous Debian Squeeze/Sid et OpenOffice.org 3.2 sous Windows XP SP3.
Le logiciel libre représente selon moi une grande famille où l'union fait la force ...
Battons les escrocs à leur petit jeu
Avatar de l’utilisateur
Dominique Pautrel
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 210
Inscrit le : 02 Déc 2008 22:22
Localisation : Laval, Pays de Loire

Re: [Base] Enregistrer des données automatisées

Messagepar reserve34 » 02 Fév 2009 09:38

Bonjour à tous,

Désolé Dominique, je ne viens pas à ton aide, mais rencontrant le même problème je me permets de faire un ajout à ton post.

Quoi que, peut être trouveras tu des éléments qui vont te permettre d'avancer.

Avec le bouton "Marche" de mon formulaire de menu "1_Menu_Marche" j'appelle mon formulaire "Form_saisie_Marche".

Dans ce formulaire je voudrais cumuler mes montants des lignes dans le lot correspondant. Je mets bien à jour mon champ "Montant HT" dans le sous formulaire "Lot", mais je n'arrive pas à répercuter la mise à jour dans la table.

Ma macro rattachée au sous formulaire "Form_saisie_Marche" est déclenchée après le mise à jour du champ "Montant HT" du sous formulaire "Lignes", et se trouve dans le module "Mar_s_calculs".

Ci joint copie de la base.
Pièces jointes
MarcheV2_forum_OOo.odb
copie de la base
(164.97 Kio) Téléchargé 239 fois
Dernière édition par reserve34 le 02 Fév 2009 09:49, édité 1 fois.
OpenOffice 2.4 sous Windows XP SP2
reserve34
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 21
Inscrit le : 06 Oct 2008 08:39

Re: [Base] Enregistrer des données automatisées

Messagepar Dude » 02 Fév 2009 09:43

Salut,

Dominique Pautrel a écrit:J'aimerais insérer dans la table, sur modification d'un enregistrement, la date et l'heure de dernière modification.

Pourquoi ne pas utiliser le type de champ [TIMESTAMP] directement dans ta table ?

Cela se ferait alors automatiquement.

:idea:
AOO 4.1.7 sous Windows 7 Pro x64

Poser une question, c'est bien. Répondre aux autres, c'est encore mieux.
Améliorez AOO et votez pour les issues
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 21265
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

Re: [Base] Enregistrer des données automatisées

Messagepar Dominique Pautrel » 02 Fév 2009 15:20

Bonjour,

reserve34 a écrit:peut être trouveras tu des éléments qui vont te permettre d'avancer.
J'ai bon espoir. Ou il me manque une commande, ou ...

Dude a écrit:Pourquoi ne pas utiliser le type de champ [TIMESTAMP] directement dans ta table ?

C'est bien un type de champ Date/Heure[TIMESTAMP] que j'ai assigné à tblTrad.trdDate. Et dans les propriétés du champ, Exemple de format affiche 01/01/1900 00:00:00

La première fois que j'ai déposé le contrôle sur le formulaire (mais je ne sais plus comment j'avais fait précisement :oops: ) j'ai obtenu un groupe de deux champs et deux étiquettes. Depuis et parce que je n'y arrivais pas, j'ai refait un contrôle "Zone de texte" - en vert -, puis supprimé ce fameux groupe de 4 contrôles, puis remis un "Champ de date" - en jaune - et un "Champ horaire" - en rouge - (Je nettoierai quand j'aurais compris.)

Dude a écrit:Cela se ferait alors automatiquement.
Je suis content de te "l'entendre dire", mais alors moi j'ai un problème entre la chaise et le clavier. J'essaie des "trucs" divers, mais ne vois pas la bonne façon de faire :tesfou: En même temps c'est encore flou pour moi la différence entre le champ TIMESTAMP et les champs DATE et TIME. La touche F1 (Base ou Basic) ne m'apporte aucun résultat sur Timestamp ...

Pour la date de création de l'enregistrement ce serait simple, une valeur par défaut et voilà.
Là, j'aimerais que ça fonctionne de façon transparente pour l'utilisateur. Grosso-modo, quand l'enregistrement est modifié (peut-être le formulaire possède une propriété "dirty" ?), le champ TIMESTAMP = Now, puis l'enregistrement est stocké.

Viens de faire une recherche sur TIMESTAMP, j'ai exécuté la requête citée ici : viewtopic.php?p=52751#p52751 , ce qui me donne :
Code : Tout sélectionner   AgrandirRéduire
ALTER TABLE "tblTrad" ALTER COLUMN "trdDate" SET DEFAULT CURRENT_TIMESTAMP

Et avec CURRENT_TIMESTAMP, cela fonctionne pour un enregistrement ou le champ est vierge. :) Mais s'il y a déjà quelque chose, il ne met pas à jour ...

Désolé pour la tartine et merci de votre aide à un mal-comprenant :arrow: ,
(Merci également à M. Pierre Desproges)
J'ai mis à jour sur le fil : viewtopic.php?p=78498#p78498
Cordialement,
Dominique.
OpenOffice.org 3.2 sous Debian Squeeze/Sid et OpenOffice.org 3.2 sous Windows XP SP3.
Le logiciel libre représente selon moi une grande famille où l'union fait la force ...
Battons les escrocs à leur petit jeu
Avatar de l’utilisateur
Dominique Pautrel
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 210
Inscrit le : 02 Déc 2008 22:22
Localisation : Laval, Pays de Loire

Re: [Base] Enregistrer des données automatisées

Messagepar Dude » 02 Fév 2009 18:18

Dominique Pautrel a écrit:Mais s'il y a déjà quelque chose, il ne met pas à jour ...

Bon, je viens de regarder rapidement et effectivement, c'est la misère pour mettre un champ TIMESTAMP à jour.

Le seul moyen que j'ai trouvé est de faire une requête UPDATE.

:?
AOO 4.1.7 sous Windows 7 Pro x64

Poser une question, c'est bien. Répondre aux autres, c'est encore mieux.
Améliorez AOO et votez pour les issues
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 21265
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

Re: [Base] Enregistrer des données automatisées

Messagepar Dominique Pautrel » 02 Fév 2009 18:45

Dude a écrit:Le seul moyen que j'ai trouvé est de faire une requête UPDATE.

Dans ce cas, il faut que je code la chaine SQL avec le "brouillard" du formulaire (sous forme de variables) :?:

Je m'attendais plutôt avoir à "enregistrer" le RowSet sur lequel le sous-formulaire est fondé pour l'enregistrement courant :?:
OpenOffice.org 3.2 sous Debian Squeeze/Sid et OpenOffice.org 3.2 sous Windows XP SP3.
Le logiciel libre représente selon moi une grande famille où l'union fait la force ...
Battons les escrocs à leur petit jeu
Avatar de l’utilisateur
Dominique Pautrel
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 210
Inscrit le : 02 Déc 2008 22:22
Localisation : Laval, Pays de Loire

Re: [Base] Enregistrer des données automatisées

Messagepar Pierre-Yves Samyn » 04 Fév 2009 15:50

Bonjour

Désolé je n'ai pu que jeter un oeil mais il me semble qu'il suffit de rajouter le commit (mais pour tester il faut bien sûr saisir les champs obligatoires (trdRefUser) sinon rien n'est enregistré...

Code : Tout sélectionner   AgrandirRéduire
Sub DateDerniereModif ' Insère la date et l'heure courante après modification d'une traduction.

Dim Form1 As Object, Form3 As Object, CtrlDate As object
Form1 = thisComponent.DrawPage.Forms.getByName(sFm1)
Form3 = Form1.getByName(sFm2).getByName(sFm3)
CtrlDate = Form3.getByName("txtTrdDate")
CtrlDate.text = CDate(Now)
CtrlDate.commit

End Sub ' ensuite comment enregistrer l'enregistrement ?
Pièces jointes
BdDoc.odb
(108.21 Kio) Téléchargé 211 fois
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 11276
Inscrit le : 02 Mai 2006 09:42

Re: [Résolu][Base] Enregistrer des données automatisées

Messagepar Dominique Pautrel » 04 Fév 2009 17:00

Bonjour,

Merci beaucoup à vous deux. Deux canards d'un coup de fusil ! :mrgreen:

Date de création d'un enregistrement : viewtopic.php?p=52751#p52751
Merci Dude, effectivement, ALTER TABLE ... SET DEFAULT CURRENT_TIMESTAMP permet d'entrer la valeur par défaut dans un champ.

Date de modification d'un enregistrement :
Oui, PYS, tu as (encore :lol: ) raison : La solution est :
Code : Tout sélectionner   AgrandirRéduire
MonContrôle.Commit
(D'ailleurs, j'ai bien envie de renommer ce fil "Gérer Dates de création / modification")

Pierre-Yves Samyn a écrit:mais pour tester il faut bien sûr saisir les champs obligatoires (trdRefUser) sinon rien n'est enregistré...
Ou je trouve la solution assez rapidement, ou ce sera bientôt l'objet d'un autre fil :aie:
Mais il m'est d'avis qu'avec ce .commit, je vais pouvoir commettre quelques essais ... avant de défricher ma future question ... :P

Merci à vous deux ! :D
OpenOffice.org 3.2 sous Debian Squeeze/Sid et OpenOffice.org 3.2 sous Windows XP SP3.
Le logiciel libre représente selon moi une grande famille où l'union fait la force ...
Battons les escrocs à leur petit jeu
Avatar de l’utilisateur
Dominique Pautrel
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 210
Inscrit le : 02 Déc 2008 22:22
Localisation : Laval, Pays de Loire

Re: [Résolu][Base] Enregistrer des données automatisées

Messagepar LoloSon » 16 Nov 2017 00:22

... pour le "rapidement" (8 ans plus tard ^^) .. c'est rapé !
..En revanche ça pourra en aider d'autres (date et heure de dernière modif) :
Tout est écrit là : https://forum.openoffice.org/en/forum/viewtopic.php?f=13&t=2002

Super tutoriel (en anglais, mais pas trop compliqué).
La macro est en complément du code déjà cité plus haut : ALTER TABLE ... SET DEFAULT CURRENT_TIMESTAMP

Je me permets de recopier bien humblement le code de la macro fourni par DrewJensen (Thanks' ! :super: )
Code : Tout sélectionner   AgrandirRéduire
    Sub onUpdateRecord( oEvent as object )
        dim oDataForm as variant
        dim oStatement as variant
        dim oResultSet as variant

        if oEvent.Source.SupportsService( "com.sun.star.form.component.DataForm" ) then
            if oEvent.Action = com.sun.star.sdbc.ChangeAction.UPDATE then
                oDataForm = oEvent.Source
                oStatement = oDataForm.ActiveConnection.CreateStatement
                oStatement.EscapeProcessing = False
                oResultSet = oStatement.executequery( "CALL CURRENT_TIMESTAMP" )
                oResultSet.next
                oDataForm.updateTimeStamp( oDataForm.FindColumn( "LastEdit" ), oResultSet.getTimestamp( 1 ) )
            end if
        end if

    End Sub

Il faut éventuellement juste remplacer "LastEdit" par le nom du champ timestamp.
On appelle la macro directement au niveau du formulaire (MainForm => propriétés => Evènements => Avant l'action d'enregistrement)

:o Et le tour est joué ! :bravo:
(et big-merci à DrewJensen !)
biz++
LibreOffice 5.4.5.1 sous Windows 7
Avatar de l’utilisateur
LoloSon
Fraîchement OOthentifié
 
Message(s) : 4
Inscrit le : 09 Nov 2017 02:12


Retour vers Macros et API

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 6 invité(s)