Pas de problème (pb), que du PowerBuilder (PB) ^^

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 25-03-2009 14:37:27

micmx  
Membre Geek
Date d'inscription: 02-02-2009
Messages: 84
Pépites: 1,028
Banque: 1,383,846,119

[RESOLU] Update dynamique

Bonjour,

J'aimerais permettre l'update d'un tableau généré par un setSQLSelect..

J'ai :

Code: pb

  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

Code: pb

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

 

#2 25-03-2009 15:16:26

buck  
Modérateur
Lieu: Dijon
Date d'inscription: 31-07-2008
Messages: 747
Pépites: 1,028,843
Banque: 171,170,849,654

Re: [RESOLU] Update dynamique

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 :

Code: pb

// 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

 

#3 25-03-2009 15:28:35

micmx  
Membre Geek
Date d'inscription: 02-02-2009
Messages: 84
Pépites: 1,028
Banque: 1,383,846,119

Re: [RESOLU] Update dynamique

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

 

#4 25-03-2009 19:39:00

Chrnico  
N2I Power
Award: bf
Lieu: Vanves
Date d'inscription: 05-06-2007
Messages: 1206
Pépites: 12,884,901,943
Banque: 9,223,372,036,854,776,000
Site web

Re: [RESOLU] Update dynamique

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 ?


Tu dois donc tu peux (Kant)

Tu peux donc tu dois (N2i)
www.n2i.fr

Hors ligne

 

#5 26-03-2009 08:01:53

micmx  
Membre Geek
Date d'inscription: 02-02-2009
Messages: 84
Pépites: 1,028
Banque: 1,383,846,119

Re: [RESOLU] Update dynamique

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

 

#6 26-03-2009 08:45:40

micmx  
Membre Geek
Date d'inscription: 02-02-2009
Messages: 84
Pépites: 1,028
Banque: 1,383,846,119

Re: [RESOLU] Update dynamique

Donc ça n'est pas possible si je fais :

Code: pb

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

Code: pb

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

 

#7 26-03-2009 08:47:06

buck  
Modérateur
Lieu: Dijon
Date d'inscription: 31-07-2008
Messages: 747
Pépites: 1,028,843
Banque: 171,170,849,654

Re: [RESOLU] Update dynamique

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

 

#8 26-03-2009 08:50:26

buck  
Modérateur
Lieu: Dijon
Date d'inscription: 31-07-2008
Messages: 747
Pépites: 1,028,843
Banque: 171,170,849,654

Re: [RESOLU] Update dynamique

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

 

#9 26-03-2009 09:30:24

micmx  
Membre Geek
Date d'inscription: 02-02-2009
Messages: 84
Pépites: 1,028
Banque: 1,383,846,119

Re: [RESOLU] Update dynamique

Voilà comment j'ai procédé pour ceux que ça intéresserait :

Code: pb

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

 

#10 26-03-2009 09:51:15

micmx  
Membre Geek
Date d'inscription: 02-02-2009
Messages: 84
Pépites: 1,028
Banque: 1,383,846,119

Re: [RESOLU] Update dynamique

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)

Code: pb

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

 

Pied de page des forums

Propulsé par FluxBB 1.2.22