Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Pages: 1
Bonjour,
Le changement de transaction sur une datawindow affecte-il les ItemStatus ? Je m'explique
dw_1.setTransObject(SQLCB) dw_1.InsertRow(0) [...] If dw_1.Update(True, False) = 1 Then // J'EFFECTUE UN INSERT DANS MA BASE SUR SQLCB COMMIT USING SQLCB; Else ROLLBACK USING SQLCB; End If dw_1.ResetUpdate() dw_1.setTransObject(SQLCA) dw_1.setItem(dw_1.getRow(), "monChamp", maValeur) If dw_1.Update(True, False) = 1 Then // NORMALEMENT ON DEVRAIT AVOIR UN UPDATE SUR SQLCA ? COMMIT USING SQLCA; Else ROLLBACK USING SQLCA; End If dw_1.ResetUpdate()
Dernière modification par sbouvetJD (30-09-2008 11:29:55)
Hors ligne











Bonjour,
Il ne manquerait pas le CONNECT USING SQLCA dans ce code, par hasard?
Hors ligne














Bonjour, tu n'as pas testé ton code ?
Hors ligne
en faisant 2 fois le update ?
tu vois si le setitemstatus se fait...
si tu rencontres un duplicate key, c'est non... s'il fait un update apres le insert...c'est oui...
donnes nous des nouvelles.

Hors ligne
En fait c'est notre hypothèse de travail car nous avons un comportement particulier ; le CONNECT USING... est fait (mais je ne l'ai pas mis ici). En effet nous avons parfois sur la base locale des "INSERT" intempestifs alors même que la connexion initiale est sur une base distante (SQLCB) où les INSERT se sont aussi correctement effectués. Or dans notre traitement, dans le cas "au pire", on devrait générer un UPDATE en local et non un INSERT. Ma question "globale" est : le changement de Transaction affecte-t-il les ItemStatus ?
Hors ligne
je viens de faire un test... simple et basique...
j'insere une nouvelle ligne de données.... et puis update() il me crée la donnée.
je modifie ensuite cette ligne, sans avoir fait de retrieve ou reset.... et puis update()... il modifie la donnée...
donc, ca marche pour moi.
A+++

Hors ligne






Bonjour,
Je pense éventuellement à un problème sur les propriétés de mise à jour ("update properties") de la datawindow :
=> Use delete then insert ou Use Update ?
Hors ligne
key and updatable columns et use delete then insert...

Hors ligne
sbouvetJD a écrit:
Bonjour,
Le changement de transaction sur une datawindow affecte-il les ItemStatus ? Je m'expliqueCode: pb
dw_1.setTransObject(SQLCB) dw_1.InsertRow(0) [...] If dw_1.Update(True, False) = 1 Then // J'EFFECTUE UN INSERT DANS MA BASE SUR SQLCB COMMIT USING SQLCB; Else ROLLBACK USING SQLCB; End If dw_1.ResetUpdate() dw_1.setTransObject(SQLCA) dw_1.setItem(dw_1.getRow(), "monChamp", maValeur) If dw_1.Update(True, False) = 1 Then // NORMALEMENT ON DEVRAIT AVOIR UN UPDATE SUR SQLCA ? COMMIT USING SQLCA; Else ROLLBACK USING SQLCA; End If dw_1.ResetUpdate()
Attention dans ton cas le premier InsertRow(0) affecte un statut New! à ta ligne. A la première affectation de donnée à un des champs, elle passeta à NewModified!
Le ResetUpdate effectué après le premier Update sur SQLCB repasse donc le statut de la ligne à New! et non à NotModified! (voir aide de ResetUpdate)
Lorsque tu vas faire ton setitem après être connecté à SQLCA, elle va passer à NewModified! de nouveau et non à DataModified! ce qui va générer un ordre Insert sur SQLCA.
Pour executer un ordre update sur SQLCA il faut statut DataModified! à la ligne. Tu peux l'obtenir en retirant le ResetUpdate() ou en faisant un SetItemStatus sur la ligne, en respectant les contraintes du tableau ci-dessous :
Original status Specified status
— New! New Modified! Data Modified! Not Modified!
New! - Yes Yes No
NewModified! No - Yes New!
DataModified! NewModified! Yes - Yes
NotModified! Yes Yes Yes -
Hors ligne
L'aide en ligne signale "After update flags are cleared, all rows have the status NotModified! or New! and the delete buffer is empty"
Qu'est-ce qui décide du status NotModified! ou New! ?
Merci pour vos réponses qui éclairent nos lanternes !
Hors ligne



Une ligne NotModified! est une ligne qui, à l'origine, a été lue depuis la base de données. Une ligne New! a été ajoutée (InsertRow()) depuis PB et n'existe pas dans la base.
Après modification de la ligne dans ta DataWindow, le statut passe respectivement à DataModified! et NewModified!
Ainsi, quand plus tard tu commandes un Update(), PB saura immédiatement s'il faut générer en interne respectivement un ordre SQL UPDATE ou INSERT, sans devoir tester la pré-existence de la ligne dans la base.
Hors ligne
Petit tableau de synthèse des statuts pour ceux qui en auront besoin :
Liste des statuts possibles :
New! => Lorsque la ligne est issue d'un InsertRow()
NotModified! => lorsque la ligne est issue d'un retrieve()
NewModified! => lorsqu'il y a modification d'une valeur sur une ligne de la DW nouvellement insérée (donc à New !)
DataModified! => lorsqu'il y a modification d'une valeur sur une ligne de la DW lu depuis la base (donc à NotModified!)
Génération des ordres SQL en fonction des statuts :
New! => aucun
NotModified! => aucun
NewModified! => INSERT
DataModified! => UPDATE
En changeant le statut de la ligne on change l'ordre SQL. Donc attention a ne pas générer l'insert d'une ligne déjà existante en base (contrainte d'intégrité sur la clé primaire) ou un update sur une ligne inexistante...
Le resetupdate() réinitialise les statuts comme suit (statut avant modification d'une valeur) :
NewModified! => New!
DataModified! => NotModified!
La fonction update() réinitialise les satuts comme suit (les lignes sont en base et aucune modif n'est encore faite) :
NewModified! => NotModified!
DataModified! => NotModified!
Ce qu'il faut retenir :
Les lignes avec New! et NewModified! n'existe pas en base de données.
Les lignes avec NotModified! et Datamodified! existent en base de données.
La fonction SetItemStatus() permet de changer le statut d'une ligne en respectant le tableau suivant :
Original status ---> Specified status
— New! New Modified! Data Modified! Not Modified!
New! - Yes Yes No
NewModified! No - Yes New!
DataModified! NewModified! Yes - Yes
NotModified! Yes Yes Yes -
ASTUCE: pour passer de New! à NotModified! il fait passer par le statut DataModified! : New! -> DataModified! -> NotModified!
Hors ligne
Pages: 1