Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
J'aimerais permettre l'update d'un tableau généré par un setSQLSelect..
J'ai :
is_current_sstable=this.object.stable_op[row] ls_newSQL="select * from pjtx."+ is_current_sstable dw_detail.dataobject=("dw_sous_oper") dw_detail.settransObject(sqlca) li_i=dw_detail.SetSQLSelect(ls_NewSQL) if(li_i > 0 ) then dw_detail.retrieve( )
Et donc dans "dw_detail" j'obtiens certains enregistrements , seulement , ceux-ci ne sont pas éditable.
Pas possible d'aller dans les "update properties" de la DW puisqu'on ne connait pas à l'avance le nom de la table..
J'ai bien essayé de passer par du SQL manuel du genre
select.. from :ls_notable where.. using sqlca;
Mais je n'y arrive pas.
Comment puis-je procéder svp ?
D'avance , merci !
Dernière modification par micmx (26-03-2009 09:52:14)
Hors ligne
Bonjour,
L'utilisation de SetSQLSelect interdit l'utilisation de "Retrievial arguments". Dans ton cas tu dois donc sélectionner toutes les propriétés de mise à jour de la datawindow par le code.
Dans mon appli, j'ai écrit une fonction qui construit dynamiquement des datastores en analysant les tables systèmes de la base de données. J'ai mis ci-dessous un petit extrait du code qui t'intéresse :
// Affectation des propriétés de la datastore pour permettre la sauvegarde des informations // Non de la table à mettre à jour dans la base de données ads_import.Object.DataWindow.Table.UpdateTable = as_table // Option pour la formulation de la requête de mise à jour // An integer indicating which columns will be included in the WHERE clause of the Update statement. // The value of UpdateWhere can impact performance or cause lost data when more than one user accesses // the same tables at the same time. Values are:· // 0 Key columns only (risk of overwriting another user's changes but fast).· // 1 Key columns and all updatable columns (risk of preventing valid updates and slow because SELECT statement is longer).· // 2 Key and modified columns (allows more valid updates than 1 and is faster but not as fast as 0). ads_import.Object.DataWindow.Table.UpdateWhere = 0 // Whether the key column can be updated in place or whether the row has to be deleted and reinserted. // This value determines the syntax PowerBuilder will generate when a user modifies a key field:· // Yes Use the UPDATE statement when the key is changed so that the key is updated in place.· // No Use a DELETE and an INSERT statement when the key is changed. ads_import.Object.DataWindow.Table.UpdateKeyInPlace = 'yes' // Positionner la clé primaire de la table FOR li_i = 1 TO UpperBound(as_primarycolumn) ads_import.Modify( as_primarycolumn[li_i] + ".Key=Yes") NEXT // Positionner toutes les colonnes pour la mise à jour FOR li_i = 1 TO li_nbrecol ads_import.Modify( lds_column_liste.GetItemString(li_i, 'cname' ) + ".update = 'yes'" ) NEXT
Hors ligne
Ahh merci , malheureusement je n'aurai pas le temps d'essayer aujourd'hui mais dès demain matin je suis deçu !
Merci beaucoup
Hors ligne
Ca me rappel un vieux problème. micmx tu utilises quelle version de PB ?
Il me semble que dans les dernières versions de PB, les DW dynamiques sont automatiquement updatable non ?
Hors ligne
Chrnico a écrit:
Ca me rappel un vieux problème. micmx tu utilises quelle version de PB ?
Il me semble que dans les dernières versions de PB, les DW dynamiques sont automatiquement updatable non ?
J'utilise la version 10.2.1
Dernière modification par micmx (26-03-2009 08:02:24)
Hors ligne
Donc ça n'est pas possible si je fais :
else is_current_sstable=this.object.stable_op[row] ls_newSQL="select * from pjtx."+ is_current_sstable dw_detail.dataobject=("dw_sous_oper3") dw_detail.settransObject(sqlca) li_i=dw_detail.SetSQLSelect(ls_NewSQL) dw_detail.Object.DataWindow.Table.UpdateTable= is_current_sstable dw_detail.Object.DataWindow.Table.UpdateWhere = 0 dw_detail.Object.DataWindow.Table.UpdateKeyInPlace = 'yes' as_primarycolumn[1]="id_tsop" as_primarycolumn[2]="nom_tsop" FOR li_i = 1 TO UpperBound(as_primarycolumn) dw_detail.Modify( as_primarycolumn[li_i] + ".Key=Yes") NEXT FOR li_i = 1 TO UpperBound(as_primarycolumn) dw_detail.Modify( as_primarycolumn[li_i] + ".update=Yes") NEXT dw_detail.retrieve( )
Il n'y a pas d'erreurs de cette manière mais les champs ne sont pas éditables..
Dois-je passer par
sqlvar = 'SELECT ... WHERE ...' dw_detail.Modify("DataWindow.Table.Select='" + sqlvar + "'")
?
Ou qu'elle est le problème ?
EDIT : Je me demande si le problème ne vient pas tout simplement du taborder qui serait à 0 pour tous les éléments ? :$
Dernière modification par micmx (26-03-2009 09:00:35)
Hors ligne
Bonjour,
Sauf que la ce n'est pas une datawindow dynamique, il modifie la requête existante d'un dataobject avec SetSQLSelect. Le nom de la table changeant, les "update properties" sont perdues.
Effectivement pour ton cas, il peut être préférable de générer une vrai datawindow dynamique.
La méthode concernée est alors SyntaxFromSQL.
Hors ligne
Bonjour,
J'étais en train de répondre lorsque tu as posé une nouvelle réponse.
Pour que les champs soient éditables, il faut que tu sélectionnes une valeur pour la propriété taborder de chaque colonne.
Hors ligne
Voilà comment j'ai procédé pour ceux que ça intéresserait :
else is_current_sstable=this.object.stable_op[row] ls_newSQL="select * from pjtx."+ is_current_sstable sql_syntax = ls_newsql presentation_str = "style(type=grid)" dwsyntax_str = SQLCA.SyntaxFromSQL(sql_syntax, & presentation_str, ERRORS) IF Len(ERRORS) > 0 THEN MessageBox("Caution", & "SyntaxFromSQL caused these errors: " + ERRORS) RETURN END IF dw_detail.Create( dwsyntax_str, ERRORS) IF Len(ERRORS) > 0 THEN MessageBox("Caution", & "Create cause these errors: " + ERRORS) RETURN END IF FOR li_i = 1 TO integer(dw_detail.Describe("DataWindow.column.count")) dw_detail.Modify(dw_detail.Describe("#"+string(li_i)+".Name")+".TabSequence = " + string(li_i * 10)) NEXT dw_detail.settransobject(sqlca) dw_detail.retrieve() end if end if
De cette manière , on créé dynamiquement le dataobject de la Datawindow , on compte le nombre de colonne et leur attribue un "tab order"
Reste à inclure les UPDATE CAPABILITIES
Merci à vous deux buck & Chrnico !
Dernière modification par micmx (26-03-2009 09:36:09)
Hors ligne
Voilà , je recolle ici le bout de code pour ne pas que ce soit brouillon..
J'ai juste , en gros , ajouté deux lignes dans la boucle pour pouvoir faire l'update..
Dans mon cas , le "trim()" est très important sinon cela provoque des erreurs ! (le genre d'erreur qui prend un temps bête pour rien grrr)
else is_current_sstable="pjtx."+ trim(this.object.stable_op[row]) ls_newSQL="select * from "+ is_current_sstable sql_syntax = ls_newsql presentation_str = "style(type=grid)" dwsyntax_str = SQLCA.SyntaxFromSQL(sql_syntax, & presentation_str, ERRORS) IF Len(ERRORS) > 0 THEN MessageBox("Caution", & "SyntaxFromSQL caused these errors: " + ERRORS) RETURN END IF dw_detail.Create( dwsyntax_str, ERRORS) IF Len(ERRORS) > 0 THEN MessageBox("Caution", & "Create cause these errors: " + ERRORS) RETURN END IF dw_detail.Object.DataWindow.Table.UpdateTable= is_current_sstable dw_detail.Object.DataWindow.Table.UpdateWhere = 0 dw_detail.Object.DataWindow.Table.UpdateKeyInPlace = 'yes' // 2 car on ne modifie jamais le champ ID (1) FOR li_i = 2 TO integer(dw_detail.Describe("DataWindow.column.count")) ls_column=trim(dw_detail.Describe("#"+string(li_i)+".Name")) dw_detail.Modify(ls_column +".TabSequence = " + string(li_i * 10)) dw_detail.Modify( ls_column + ".Key=Yes") dw_detail.Modify( ls_column + ".update=Yes") NEXT dw_detail.settransobject(sqlca) dw_detail.retrieve() end if end if
Voilà et merci
Dernière modification par micmx (26-03-2009 09:51:40)
Hors ligne