Aide - Recherche - Membres - Calendrier
Version complète : Ajout de datas dans la db
Les Forums de PalmAttitude.org > GENERAL PalmOS > Développement sous PalmOS > Développement HB++
gouzoul
Bonjour

Je suis nouveau en développement sous mobile.
Bien qu'informaticien à la base, je manque de pratique dans le monde de l'orienté Objet. En effet, je travaille exclusivement sous Oracle 10g et le VB ca remonte à mes études ...

Bref, je n'ai plus les réflexes du POO

Je suis en train de développer une application pour encoder ma consommation d'essence.
J'ai donc un DB classique sous HB++ : tbl_consommation

Les champs obligatoires
Nb_km Long
Nb_litre Long
Prix_litre Long
Total Long
Date Date

J'ai une form d'encodage dont voici le code source :

CODE
Private db as New Tbl_Consommation

' Paramétrage du menu
Private Sub Menu_information_Click()
  Dim f As New frmInformation
  f.Show hbFormModeless+hbFormGoto
End Sub

Private Sub Menu_nouveau_Click()
  Dim f As New frmNew
  f.Show hbFormModeless+hbFormGoto
End Sub

Private Sub Menu_resume_Click()
  Dim f As New frmResume
  f.Show hbFormModeless+hbFormGoto
End Sub

' Encodage automatique de la date
Private Sub Form_Load()

  fld_date.Text = format(Now, "dd/mm/yyyy")

End Sub

Private Sub Form_Unload()
  db.Close
End Sub

' Paramametrage boutton Sauver
Private Sub Btm_save_Click()

  dim total as Double
    dim litre as Double
    dim prix  as Double
    dim date  as String
    dim km    as Double

    prix  = CDbl (DelocalizeNumber (fld_prix.Text ) )
    litre = CDbl (DelocalizeNumber (fld_litre.Text) )
    date  = CDate (fld_date.Text)
    km = CDbl (DelocalizeNumber (fld_km.Text) )

    total = CDbl (CDbl(litre) * CDbl(prix))
  fld_total.Caption = CDbl(total)


  msgbox ("Prix : " & prix)
    msgbox ("litre : " & litre)
    msgbox ("date : " & date)
  msgbox ("km : " & km)
    msgbox ("total : " & total)

    db.OpenTable hbModeOpenAlways+hbModeReadWrite
    
  db.AddNew
    db.UniqueID   = format(now, "yymmddhh")
    db.Date             = date
    db.Nb_KM             = km
    db.nb_litre   = litre
    db.Prix_litre = prix
    db.Total             = total

  msgbox ("litre : " & db.nb_litre)

    db.Update
    db.Requery

    Dim f As New frmResume
  f.Show hbFormModeless+hbFormGoto

End Sub

Private Sub Lbl_Total_GotFocus()
  dim total as Double
    dim litre as Double
    dim prix  as Double

    prix  = CDbl (DelocalizeNumber (fld_prix.Text ) )
    litre = CDbl (DelocalizeNumber (fld_litre.Text) )

    total = CDbl (CDbl(litre) * CDbl(prix))
  fld_total.Caption = CDbl(total)
End Sub


Parallèlement j'ai une autre form qui elle affiche un listing

Le problème est le suivant :
Quand je sauve mon record, le db.addnew fait bien sont boulot mais je n'ai pas d'update qui se fait ...
Les nouvelles infos encodées refusent d'être sauvées.

J'obtiens à chaque fois : 01/01/1904 pour la date et des 0 pour le reste

Quelqu'un peut il m'aider?
Je sèche vraiment.

Merci beaucoup

Je vous souhaite à tous un bonne et heureuse année 2008 (vu que c'est un des dernier post de 2007) sleep.gif
palmgaulois
plusieurs choses je vois:
1°) db.UniqueID = format(now, "yymmddhh"),
le uniqueID est traité par l'OS c'est pas à toi de lui donner une valeur, utilise un autre identifiant si tu veux dater l'enregistrement.

2°) dim "Date" as date
Date est un mot réservé, tu ne peux l'utiliser comme variable.

3°) ensuite tu déclare 2 fois les meme variable,
(
dim total as Double
dim litre as Double
dim prix as Double
)

passes les en private dans ta form pour ne les déclarer qu'une fois pour tout:
Private total as double, litre as double, prix as double 'en haut du code de form

4°)
fld_date.Text = format(Now, "dd/mm/yyyy")
utilise un champ "selector" que tu nome sDate et non un field text pour passer une date,
ainsi tu n'a rien à saisir mais tu click sur le champs pour y faire apparaitre un calendrier.
sDate.text=format(now,"dd/mm/yy")
sDate.date=now
gouzoul
Bonjour (enfin vu l'heure c'st plutot bonne nuit sleep.gif ) et bonne année 2008

Merci beaucoup pour tes réponses.

1) J'ignorai que l'OS s'occupait de cela tout seul comme un grand. J'en suis fort aise, ca me simplifie la vie

2) Evidement, Date c'est un mot réservé ... j'aurais du m'en souvenir. Penses tu que c'est cela qui empeche que ca sauve?

3) Ok pour la déclaration "publique" à la form mais privée à l'application des variables, j'y ai pas pensé.

4) Pour la date, je suis pas trop d'accord avec toi. Je prévois de pouvoir modifier la date car je peux faire un encodage postposé à la date réele.

Je vais tester ca dans le courrant de la journée (là je vais au dodo après un bon réveillon).

Si j'ai des problèmes, je vous recontacterai.

Pour la suite, je devrai gérer l'update, le delete
Faire des graphiques
Trier les résultats en fonction de critères défini (date et autres)

Bref, du boulot, du boulot et j'aurais surement encore des questions.

Si le programme vous intéresse, je le metterai en ligne.
gouzoul
Bonjour c'est re moi

Je viens de modifier mon code comme suggéré et ... ca fonctionne toujours pas.
Le grid ne l'affiche pas les résultats encodés ...

Je me plante dans mon code ou quoi?
A titre d'infos voici le code de ma 2eme forme :

CODE
Private db as New Tbl_Consommation

'---------------------------- Form Load ------------------------
Private Sub Form_Load()
    db.OpenTable hbModeReadOnly +hbModeOpenAlways
    Grd_consommation.Populate db
End Sub

Private Sub Form_Unload()
  db.Close
End Sub


' Paramétrage du menu
Private Sub Menu_information_Click()
  Dim f As New frmInformation
  f.Show hbFormModeless+hbFormGoto
End Sub

Private Sub Menu_nouveau_Click()
  Dim f As New frmNew
  f.Show hbFormModeless+hbFormGoto
End Sub

Private Sub Menu_resume_Click()
  Dim f As New frmResume
  f.Show hbFormModeless+hbFormGoto
End Sub


Private Sub Grd_consommation_LoadItem(ByVal iRow As Integer, ByVal lItemData As Long, ByVal vValue() As Variant)
vValue(0) = format (db.Date, "dd/mm/yyyy")
vValue(1) = db.UniqueID
vValue(2) = db.Nb_litre
vValue(3) = db.Prix_litre
vValue(4) = db.Total

End Sub


C'est peut etre la dedans aussi que je me plante

Bien à vous
PascalGL
Bonjour,

Petite précision : Date n'est pas un mot réservé, c'est un nom de type. Il est tout à fait possible d'utiliser un nom de type comme nom de variable, vu qu'il n'y a aucune ambiguité ensuite dans l'usage de l'un et de l'autre. On peut parfaitement écrire Dim Byte As Byte ou même Dim Byte As Integer ! Mais c'est un peu "confusant" et donc peu recommandé...

Ton Requery sur la première form ne sert à rien. Cette méthode recalcule quels records inclure dans le recordset, or le recordset en question (ta variable db déclarée Private) n'est jamais utilisée pour accéder en lecture à la table (sauf s'il y a du code que tu nous caches !). Il n'est donc pas utile d'actualiser les records qu'elle contient.

Sur ta seconde form, le problème est dans l'événement Grd_consommation_LoadItem : tu ne charges jamais le record à afficher avant de lire les champs. Ton recordset n'est donc jamais positionné et ses champs contiennent toujours les valeurs par défaut. Il faut que tu ajoutes un db.LookupByUniqueID(lItemData) au début de l'événement.

Sinon, palmgaulois a raison, tu devrais utiliser un Selector pour saisir les dates. C'est étudié pour et c'est beaucoup pratique que de saisir une date à la main.

Pascal
gouzoul
Ah oui bien sur voila pourquoi ca marchait pas ...
Merci beaucoup de ton aide sourire.gif

Par contre, ai 2 questions supplémentaires :

1/ Je vois à présent correctement les données mais ... tout ce qui est en flottant est ramené à sa plus simple expresion --> 123,456 devient 123
Je perds donc toutes mes décimales. Une idée d'ou ca peut venir?

2/ Comment fonctionne un selector? Qu'est ce qui doit y avoir comme code derrière? On peut initialiser avec une valeur par défaut (date du jour)

Encore merci pour votre aide sleep.gif

gouzoul
on oublie la question 1 ... je suis le roi des andouilles ninja.gif icon_bla.gif ... si ma DB est configurée pour accueillir un long, au lieu d'un double, ca ne fonctionnera jamais ...

par contre la 2eme question m'intéresse sleep.gif

Une autre question tant que j'y suis. Y a moyen de faire un tri sur un populate? Ca me simplifierai la vie.
En effet je coudrais que les dates apparaisent de manière décroissante.

Si quelqu'un sait m'aiguiller, je lui serai infiniment reconnaissant
PascalGL
La méthode Populate insère les records dans l'ordre où ils se présentent. Tri ton recordset, et les records seront triés dans la grid ! Il suffit d'ouvrir le recordset avec une clause ORDER BY.

Pour le Selector, aucun code à écrire, il suffit de le configurer correctement et de lire sa property Date pour connaître la date sélectionnée par l'utilisateur. N'hésite pas à consulter la doc et les samples, ils contiennent de nombreuses infos sur les contrôles disponibles. Etudie aussi comment sont concues les UI des applications en ROM sur ton Palm : il est souvent bien de s'en inspirer... En l'occurrence, le panneau de config de réglage de la date, de l'heure et du fuseau horaire utilise des Selectors.
gouzoul
Coucou c'est encore moi

Tout d'abord merci pour les explication, ca fonctionne très bien.
Je consulte toujours les exemples avant de vous demander mais je passe souvent à coté de beaucoup de choses.

J'ai réussi à faire le tri comme tu le dis mais j'aimerai avoir un critère de sélection supplémentaire.
En effet je voudrais toutes les informations pour une année choisie.

Donc j'utilise une popup pour choisir une année (jusque la tout va bien) qui me retourne une année

Mais, quand je veux faire la query elle ne fonctionne pas et me retourne une erreur 34

voici la query (qui fonctionne en SQL)
CODE
" Year (Date) = '" & cint (year (now)) & "'"



j'en conclus donc que l'SQL embarqué est limité ... ou alors j'utilise une mauvaise fonction

Quelqu'un peut éclairer ma lanterne? Je vous en remercie
D2P
Sous réserve de ne pas me planter, tu ne peux effectivement faire une requête que sur les valeurs d'un champ, et nom le résultat d'une fonction sur les valeurs d'un champ.

Donc il te faudrait créer un champ année dans ta table anim_sorry.gif
Orabig
En l'occurence, la documentation de HB++ (qui est très complète et bien faite) est ton amie...

Je lis sur la page 'SQL Queries' :
CITATION
It is not possible to use expressions inside a condition. The types of data must be compatible: it is not possible to compare a Boolean fields with an Integer field, for example.


Et un peu plus loin :
CITATION
If necessary, you can convert a Date value to a properly formatted string using the Format function. For example, provided d is a variable containing a date:

tbl.OpenRecordset "Date < '" & Format(d,"iso") & "'"

Je te conseille de faire une double comparaison de date, et vérifier que la date est comprise entre le 1er janvier et le 31 décembre à 23h59, ce qui te permettra de faire ce que tu veux sans modifier la structure de ta table comme le suggère notre ami D2P.
gouzoul
C'est bien ce que je craignais ...

Merci pour l'info et le tuyau sleep.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.